본문으로 건너뛰기

03. 핵심 알고리즘 및 구현 방식 설명

·656 단어수·4 분
산에사는가재
작성자
산에사는가재
광운대학교 컴퓨터정보공학부 학부 졸업생.

본 프로젝트는 KDT 과정인 AI 융합 로봇 SW 개발자(2기)의 교과인 PLC 프로그래밍을 수강하며 구현한 미니프로젝트이다. 우리는 기존에 배운것 이외의 명령어인 CALL, RET, DUTY, MIN 등을 추가로 학습하여 기존의 수업에서 배운 개발 방법을 확장하였다. 이를 통하여 낮은 가독성, 빈번한 이중코일, 낮은 확장성 문제를 개선하데 성공하였다.

1. PLC 모듈화와 구현법
#

모듈이란 독립된 하나의 소프트웨어 또는 하드웨어의 단위이다1. 모듈화라는 이름을 통해 알 수 있듯 모듈화는 전체 프로그램 혹은 하드웨어를 모듈 이라는 단위로 나누는 것을 의미한다. C, Java 등의 고급 언어에서는 파일을 분리하여 라이브러리를 만들거나, Class 와 같은 객체 지향 개념을 통해 이를 수행할 수 있었다. 우리가 PLC에서 구현한 모듈화는 아래의 그림과 같이 동작한다. 교과에서 배웠던 기존의 방법은 좌측과 같으며 메인 프로그램에서 센서와 실린더를 직접 사용하여 제어한다. 반면에 우측의 우리가 구현한 방식의 경우 실린더 제어를 모듈에 요청하고 종료를 기다린다. 공급 실린더의 동작이 캡슐화 된 것을 확인할 수 있다.

모듈화란

다만 교과에서 배운 PLC로 이를 구현하면 점프 혹은 브렌치와 유사한 CJ 명령어를 통해 구현해야 한다. 이는 동일 파일 내의 위치로만 실행 흐름을 변경할 수 있으며, 입력과 출력과 같은 매개변수 기능을 지원하지 않는다. 따라서 CJ 와 같은 실행 흐름 제어 명령어로만은 이를 구현하는데 어려움이 있다. 만약 이를 통해 구현하고자 한다면 어셈블리 언어로 함수를 구현하듯 Stack 자료구조를 구현해야 하며, 차피 이를 위한 다른 명령어와 Z 디바이스 를 추가로 학습 해야한다. 또한 이는 Stack 자료구조를 M 혹은 D 디바이스를 통해 구현하게 될 것이며 이는 OverFlow가 발생할 수 있고, PLC 의 디바이스 범위를 넘어설 위험이 있다.

우리는 이러한 문제점을 인지하고 미쯔비시에서 제공된 Q CPU 프로그래밍 메뉴얼을 탐색하였고, CALL, ECALL, RET 과 같은 함수 명령어(구조화 명령어)와 필요한 기타 명령어를 추가 학습하였다. CALLECALL은 모두 RET과 한 쌍으로 움직인다. 함수의 시작은 (E)CALL 함수의 끝은 RET 명령어를 통해 이루어 지며 RET 명령어는 END, FEND와 유사하게 사용, CALL, ECALL은 아래와 같이 사용한다. F는 함수 종료시 업데이트를 위해 사용한다. CALLECALL의 차이는 프로그램 즉 파일의 설정 가능 유무이다. 매개 인자 Snn은 입력된 순서이며, 비트 입력의 경우 FXn, 비트 출력은 FYn, 워드 디바이스의 경우 FDn으로 함수 내 구현부에서 사용할 수 있다. 다만 이는 모두 Call by Value 형식으로 CALL 시점에서 값을 복사하여 입력 매개변수를 형성하며, RET 시점에서 설정된 FYn, FDn을 매개 인자로 설정된 디바이스로 복사한다.

- (F)CALL(P) Pn [S0 S1 S2 S3 S4]
- (F)ECALL(P) "File Name" Pn [S0 S1 S2 S3 S4]

2. PLC 모듈화 구현 예시
#

본 프로젝트에서 구현한 모듈화 그중 실린더(ACTUATOR) 모듈를 예시로 기능에 대한 인터페이스는 아래의 그림과 같다. 시스템 구성도 에서는 ACTUATOR 모듈로 표기되어 있다. A는 공급 실린더를 의미하며, 아래 그림은 1. PLC 모듈화 구현법에서 본 그림의 실제 구현이다. 그림과 같이 구현하여 공급 실린더 전-후진 기능을 ACTUATOR 모듈에 구현, 이를 캠슐화하여 에러 탐지와 같은 부가 기능을 쉽게 기능을 사용하는 모든 부분에 적용할 수 있음을 볼 수 있다

모듈화 구현 예시

3. 핵심 기능
#

실린더의 경우 2. 모듈화 구현 예시를 통해 어떤 식으로 구현 되었는지를 확인 할 수 있었다. 해당 섹션은 화물을 적제, 배출하는데 필요한 SERVO 모터와 와 창고 데이터를 관리하는 STORAGE에 대한 것이다. SERVO 모듈의 경우 시스템 구성도에서 SERVO 모듈의 운반 기능이 본 프로젝트의 핵심 기능이다.

3.1. SERVO 모듈 운반 기능
#

해당 모듈의 운반 기능은 두 위치 a, b 에 대해 \(a \to b \)의 이동을 제공한다. 각 위치는 아래의 그림과 같이 설정하였고, 해당 모듈에서 이러한 이동을 하나의 ECALL을 통해 제공한다. 예제 1의 경우 적재, 예제 2의 경우 배출 동작을 그림으로 표현한 것이다.

Servo_Delivery

3.2. STORAGE 모듈 창고 관리 기능
#

아래의 그림은 창고에 적재, 배출시 필요한 데이터를 다루는 STORAGE 모듈의 정보 저장 Layout이다. M은 금속, NM은 비금속을 의미한다. 각 요소의 설명은 다음 표와 같다.

ElementComment
Count현재 설정된 비트(또는 노드)의 개수
Set Bits전체 활성화된 비트 집합을 나타내는 비트마스크
M-Set BitsM 그룹에 속한 활성 비트들의 마스크
NM-Set BitsNM 그룹에 속한 활성 비트들의 마스크
Last Order마지막으로 기록된 순서 값
M-OrderM 그룹 각 항목의 기록된 순서
NM-OrderNM 그룹 각 항목의 기록된 순서

실제 동작시 아래와 같이 데이터를 저장하고, 이를 통해 시스템 구성도에서의 STORAGE 모듈의 기능을 제공한다.

Storage Layout

4. 각주
#


  1. 모듈 (프로그래밍). (2025년 4월 5일). 위키백과. ↩︎