[{"content":"본 프로젝트는 KDT 과정인 AI 융합 로봇 SW 개발자(2기)의 교과인 PLC 프로그래밍을 수강하며 구현한 미니프로젝트이다. 우리는 기존에 배운것 이외의 명령어인 CALL, RET, DUTY, MIN 등을 추가로 학습하여 기존의 수업에서 배운 개발 방법을 확장하였다. 이를 통하여 낮은 가독성, 빈번한 이중코일, 낮은 확장성 문제를 개선하데 성공하였다.\n","date":"8 2월 2026","externalUrl":null,"permalink":"/projects/plc_mini_project/hmi_design/","section":"Projects","summary":"","title":"04. HMI 화면 구성과 설명","type":"projects"},{"content":" About Me # - 학력 - # 광운대학교 컴퓨터정보공학부 학부 졸업\n- 관심 분야 - # 시스템 소프트웨어 리눅스 임베디드 SW 파일시스템 인공지능 프로젝트 # 태그 # #PLC (1) ","date":"8 2월 2026","externalUrl":null,"permalink":"/","section":"Blog","summary":"","title":"Blog","type":"page"},{"content":"","date":"8 2월 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"8 2월 2026","externalUrl":null,"permalink":"/categories/plc/","section":"Categories","summary":"","title":"PLC","type":"categories"},{"content":"","date":"8 2월 2026","externalUrl":null,"permalink":"/tags/plc/","section":"Tags","summary":"","title":"PLC","type":"tags"},{"content":"","date":"8 2월 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"본 프로젝트는 KDT 과정인 AI 융합 로봇 SW 개발자(2기)의 교과인 PLC 프로그래밍을 수강하며 구현한 미니프로젝트이다. 우리는 기존에 배운것 이외의 명령어인 CALL, RET, DUTY, MIN 등을 추가로 학습하여 기존의 수업에서 배운 개발 방법을 확장하였다. 이를 통하여 낮은 가독성, 빈번한 이중코일, 낮은 확장성 문제를 개선하데 성공하였다.\n전체 코드 및 HMI, SERVO 파라미터, 발표자료는 다음 레파지토리를 참조 PLC_Mini_Project\n1. 프로젝트 소개 1.1. 개요 1.2. 목적 2. 프로젝트 영상 2.1. 장비에러 확인 밎 재기동 2.2. 소재 창고 적재 2.3. 입력한 가공 시간, 횟수만큼 소재 가공후 창고 적재 2.4. 지정한 창고 번호의 소재 배출 2.5. 금속, 비금속, 전체 배출 3. 하위 섹션 1. 프로젝트 소개 # 1.1. 개요 # 우리는 PLC를 사용하는 제어 프로그램과 HMI를 통해 사용자가 제어프로그램을 사용할 수 있도록 구현했다. 구현한 제어 프로그램은 소재를 공급, 가공하여 창고에 적재 후 사용자의 요청에 따라 배출한다.\n구현된 기능은 사전 점검, 가공 후 창고 적재, 창고 FIFO 배출, 실린더 자동 에러 점검이 있다. 각 기능이 의존하는 모듈화된 기능은 시스템 구성도을 통해 확인할 수 있다. 또한 해당 섹션에서는 구현된 모듈과 각 모듈이 어떠한 인터페이스, 즉 기능을 제공하는지 설명한다.\n1.2. 목적 # PLC 프로그래밍 교과는 해당 과정에서 큰 비중을 차지하지 않는걸로 보인다. 때문에 해당 과정에서 배우지는 않았지만 효과적으로 사용할 수 있는 다른 기능들이 많이 있을 것으로 판단했다. 특히 CALL 과같이 프로그램의 흐름을 변경하는 기능 본 프로젝트에서의 모듈화와 같이 다양한 방법으로 사용 될 수 있다고 판단했다. 이에 팀원과 같이 PLC 프로그래밍 메뉴얼을 참고하여 배우지 않은 기능들에 대해 학습하고, 이를 사용하기로 결정했다.\n특히 모듈화를 큰 주제로 잡은 이유는 기존의 방법의 빈번한 이중코일, 낮은 가독성과 확장성 때문이다. 실제 산업 현장이라면 더욱 많은 장비들을 사용할테고, 이들을 제어하기 위해 더욱 긴 PLC 코드를 작성할 것이다. 기존의 모듈화를 하지 않은 개발 방법으로는 수정사항 하나로도 많은 시간과 노력을 요구하며 이는 개발자로써 비효율적인 방법이다. 따라서 우리는 모듈화를 통해 이러한 문제를 개선하여 확장성과 안정성을 향상시키는 것을 목표로 하였고, 짧은 시간에도 불구하고 문제점이 개선될 수 있음을 확인할 수 있었다.\n2. 프로젝트 영상 # 구현된 기능의 결과 영상은 아래와 같다.\n2.1. 장비에러 확인 밎 재기동 # 2.2. 소재 창고 적재 # 2.3. 입력한 가공 시간, 횟수만큼 소재 가공후 창고 적재 # 2.4. 지정한 창고 번호의 소재 배출 # 2.5. 금속, 비금속, 전체 배출 # 3. 하위 섹션 # 다음글: 개발 환경\n","date":"8 2월 2026","externalUrl":null,"permalink":"/projects/plc_mini_project/","section":"Projects","summary":"","title":"모듈화 기반 PLC 제어 프로그램","type":"projects"},{"content":" 1. PLC 모듈화와 구현법 2. PLC 모듈화 구현 예시 3. 핵심 기능 3.1. SERVO 모듈 운반 기능 3.2. STORAGE 모듈 창고 관리 기능 4. 각주 본 프로젝트는 KDT 과정인 AI 융합 로봇 SW 개발자(2기)의 교과인 PLC 프로그래밍을 수강하며 구현한 미니프로젝트이다. 우리는 기존에 배운것 이외의 명령어인 CALL, RET, DUTY, MIN 등을 추가로 학습하여 기존의 수업에서 배운 개발 방법을 확장하였다. 이를 통하여 낮은 가독성, 빈번한 이중코일, 낮은 확장성 문제를 개선하데 성공하였다.\n1. PLC 모듈화와 구현법 # 모듈이란 독립된 하나의 소프트웨어 또는 하드웨어의 단위이다1. 모듈화라는 이름을 통해 알 수 있듯 모듈화는 전체 프로그램 혹은 하드웨어를 모듈 이라는 단위로 나누는 것을 의미한다. C, Java 등의 고급 언어에서는 파일을 분리하여 라이브러리를 만들거나, Class 와 같은 객체 지향 개념을 통해 이를 수행할 수 있었다. 우리가 PLC에서 구현한 모듈화는 아래의 그림과 같이 동작한다. 교과에서 배웠던 기존의 방법은 좌측과 같으며 메인 프로그램에서 센서와 실린더를 직접 사용하여 제어한다. 반면에 우측의 우리가 구현한 방식의 경우 실린더 제어를 모듈에 요청하고 종료를 기다린다. 공급 실린더의 동작이 캡슐화 된 것을 확인할 수 있다.\n다만 교과에서 배운 PLC로 이를 구현하면 점프 혹은 브렌치와 유사한 CJ 명령어를 통해 구현해야 한다. 이는 동일 파일 내의 위치로만 실행 흐름을 변경할 수 있으며, 입력과 출력과 같은 매개변수 기능을 지원하지 않는다. 따라서 CJ 와 같은 실행 흐름 제어 명령어로만은 이를 구현하는데 어려움이 있다. 만약 이를 통해 구현하고자 한다면 어셈블리 언어로 함수를 구현하듯 Stack 자료구조를 구현해야 하며, 차피 이를 위한 다른 명령어와 Z 디바이스 를 추가로 학습 해야한다. 또한 이는 Stack 자료구조를 M 혹은 D 디바이스를 통해 구현하게 될 것이며 이는 OverFlow가 발생할 수 있고, PLC 의 디바이스 범위를 넘어설 위험이 있다.\n우리는 이러한 문제점을 인지하고 미쯔비시에서 제공된 Q CPU 프로그래밍 메뉴얼을 탐색하였고, CALL, ECALL, RET 과 같은 함수 명령어(구조화 명령어)와 필요한 기타 명령어를 추가 학습하였다. CALL과 ECALL은 모두 RET과 한 쌍으로 움직인다. 함수의 시작은 (E)CALL 함수의 끝은 RET 명령어를 통해 이루어 지며 RET 명령어는 END, FEND와 유사하게 사용, CALL, ECALL은 아래와 같이 사용한다. F는 함수 종료시 업데이트를 위해 사용한다. CALL 과 ECALL의 차이는 프로그램 즉 파일의 설정 가능 유무이다. 매개 인자 Sn 의 n은 입력된 순서이며, 비트 입력의 경우 FXn, 비트 출력은 FYn, 워드 디바이스의 경우 FDn으로 함수 내 구현부에서 사용할 수 있다. 다만 이는 모두 Call by Value 형식으로 CALL 시점에서 값을 복사하여 입력 매개변수를 형성하며, RET 시점에서 설정된 FYn, FDn을 매개 인자로 설정된 디바이스로 복사한다.\n- (F)CALL(P) Pn [S0 S1 S2 S3 S4] - (F)ECALL(P) \u0026#34;File Name\u0026#34; Pn [S0 S1 S2 S3 S4] 2. PLC 모듈화 구현 예시 # 본 프로젝트에서 구현한 모듈화 그중 실린더(ACTUATOR) 모듈를 예시로 기능에 대한 인터페이스는 아래의 그림과 같다. 시스템 구성도 에서는 ACTUATOR 모듈로 표기되어 있다. A는 공급 실린더를 의미하며, 아래 그림은 1. PLC 모듈화 구현법에서 본 그림의 실제 구현이다. 그림과 같이 구현하여 공급 실린더 전-후진 기능을 ACTUATOR 모듈에 구현, 이를 캠슐화하여 에러 탐지와 같은 부가 기능을 쉽게 기능을 사용하는 모든 부분에 적용할 수 있음을 볼 수 있다\n3. 핵심 기능 # 실린더의 경우 2. 모듈화 구현 예시를 통해 어떤 식으로 구현 되었는지를 확인 할 수 있었다. 해당 섹션은 화물을 적제, 배출하는데 필요한 SERVO 모터와 와 창고 데이터를 관리하는 STORAGE에 대한 것이다. SERVO 모듈의 경우 시스템 구성도에서 SERVO 모듈의 운반 기능이 본 프로젝트의 핵심 기능이다.\n3.1. SERVO 모듈 운반 기능 # 해당 모듈의 운반 기능은 두 위치 a, b 에 대해 \\(a \\to b \\)의 이동을 제공한다. 각 위치는 아래의 그림과 같이 설정하였고, 해당 모듈에서 이러한 이동을 하나의 ECALL을 통해 제공한다. 예제 1의 경우 적재, 예제 2의 경우 배출 동작을 그림으로 표현한 것이다.\n3.2. STORAGE 모듈 창고 관리 기능 # 아래의 그림은 창고에 적재, 배출시 필요한 데이터를 다루는 STORAGE 모듈의 정보 저장 Layout이다. M은 금속, NM은 비금속을 의미한다. 각 요소의 설명은 다음 표와 같다.\nElement Comment Count 현재 설정된 비트(또는 노드)의 개수 Set Bits 전체 활성화된 비트 집합을 나타내는 비트마스크 M-Set Bits M 그룹에 속한 활성 비트들의 마스크 NM-Set Bits NM 그룹에 속한 활성 비트들의 마스크 Last Order 마지막으로 기록된 순서 값 M-Order M 그룹 각 항목의 기록된 순서 NM-Order NM 그룹 각 항목의 기록된 순서 실제 동작시 아래와 같이 데이터를 저장하고, 이를 통해 시스템 구성도에서의 STORAGE 모듈의 기능을 제공한다.\n4. 각주 # 모듈 (프로그래밍). (2025년 4월 5일). 위키백과.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"8 2월 2026","externalUrl":null,"permalink":"/projects/plc_mini_project/core_control_logic/","section":"Projects","summary":"","title":"03. 핵심 알고리즘 및 구현 방식 설명","type":"projects"},{"content":"본 프로젝트는 KDT 과정인 AI 융합 로봇 SW 개발자(2기)의 교과인 PLC 프로그래밍을 수강하며 구현한 미니프로젝트이다. 우리는 기존에 배운것 이외의 명령어인 CALL, RET, DUTY, MIN 등을 추가로 학습하여 기존의 수업에서 배운 개발 방법을 확장하였다. 이를 통하여 낮은 가독성, 빈번한 이중코일, 낮은 확장성 문제를 개선하데 성공하였다.\n1. 구현 모듈 2. 전체 시스템 구조 1. 구현 모듈 # 본 프로잭트의 주된 목적은 모듈화를 통해 기존 개발 방식의 문제를 해결함에 있다. 우리는 기능을 분리하여 구현한 모듈을 총 3개로 각각 다음과 같다.\nACTUATOR 모듈은 공급, 가공 등에 사용되는 실린더와 소재 운반을 위한 VC, 각종 모터의 기능을 포함한다. 추가로 만일 실린더에게 전, 후진 명령을 했음에도 5초 안에 완료하지 못했을 시 에러로 간주하고 자동으로 시스템을 비상 모드로 전환한다. SERVO 모듈은 SERVO 모터의 가동과 원점 복귀, 그리고 소재를 창고로 적재하거나 창고에서 배출하는 운반 기능을 포함한다. STORAGE 모듈은 창고에 소재를 적재, 배출시에 필요한 정보를 제공하며 또한 해당 정보들을 보다 쉽게 사용, 설정할 수 있는 기능을 포함한다. 아래의 그림과 같이 총 3개의 모듈을 구현하였으며, 그림은 각 모듈에 포함되어 메인 프로그램에서 사용할 수 있는 기능을 보여준다.\n2. 전체 시스템 구조 # 우리는 고급언어에서 제공하는 함수와 유사한 CALL, RET, ECALL PLC 명령어를 사용하여 해당 모듈내의 기능을 메인 프로그램에서 호출할 수 있도록 구현했다. 이를 통하여 사용자는 해당 기능의 동작 방식을 몰라도 보다 쉽게 사용할 수 있으며, 또한 동일한 기능을 하나의 함수로 만듬으로써 재사용성을 늘릴 수 있다. 만약 해당 모듈의 구현자가 안전 등의 이유로 동작을 바꾸더라도 이미 구현되어 있는 메인 프로그램의 수정이 불필요하여 높은 확장성 또한 보인다. 각 메인 프로그램에서의 모듈에 대한 의존은 아래의 그림과 같다. 해당 그림과 같이 각 메인 프로그램은 추가 구현 없이 간편하게 모듈에 기능을 요청함으로써 보다 쉬운 구현이 가능하다. 또한 실린더 에러 감지와 같은 부가 기능을 추가 구현 없이 모든 실린더 동작에 적용시킬 수 있다.\n","date":"8 2월 2026","externalUrl":null,"permalink":"/projects/plc_mini_project/system_architecture/","section":"Projects","summary":"","title":"02. 시스템 구성도","type":"projects"},{"content":" 본 프로젝트는 KDT 과정인 AI 융합 로봇 SW 개발자(2기)의 교과인 PLC 프로그래밍을 수강하며 구현한 미니프로젝트이다. 우리는 기존에 배운것 이외의 명령어인 CALL, RET, DUTY, MIN 등을 추가로 학습하여 기존의 수업에서 배운 개발 방법을 확장하였다. 이를 통하여 낮은 가독성, 빈번한 이중코일, 낮은 확장성 문제를 개선하데 성공하였다.\n1. 하드웨어 2. 소프트웨어 3. 메모리 맵 3.1. 센서 Input 3.2. Actuator 및 부저 Output 3.3. Servo 모터 I/O 3.3.1. 입력부 3.3.2. 출력부 3.3.3. 버퍼 메모리 할당표 3.4. 릴레이, 레지스터 할당 영역 3.4.1. Internal Relay 3.4.2. Data Register 3.4.3. Timer 3.4.4. Counter 1. 하드웨어 # CPU : Q03UDV 전원 모듈 : Q61P 입력 모듈 : QX40 출력 모듈 : QY10 네트워크 모듈 : QJ61BT11N 위키결정 모듈 : QD77MS2 HMI : GOT2000 2. 소프트웨어 # Programming and Maintenance Tool: Gx works2(Ver: 1.631H) GOT Screen Design Tool: MELSOFT GT Designer3(Ver: 1.256S) 3. 메모리 맵 # 3.1. 센서 Input # No. Address Comment 0 X00 공급 실린더 후진 완료 1 X01 공급 실린더 전진 완료 2 X02 분배 실린더 후진 완료 3 X03 분배 실린더 전진 완료 4 X04 가공 실린더 상승 완료 5 X05 가공 실린더 하강 완료 6 X06 배출 실린더 후진 완료 7 X07 배출 실린더 전진 완료 8 X08 스토퍼 실린더 상승 완료 9 X09 스토퍼 실린더 하강 완료 10 X0A 흡착 실린더 후진 완료 11 X0B 흡착 실린더 전진 완료 12 X0C 흡착모듈 공작물 여부 13 X0D 창고 실린더 후진 완료 14 X0E 창고 실린더 전진 완료 15 X0F 소재공급 센서1 (원형) 17 X11 용량형 센서 18 X12 유도형 센서 19 X13 스토퍼 감지 센서 3.2. Actuator 및 부저 Output # No. Address Comment 0 Y20 공급 실린더 전진 1 Y21 공급 실린더 후진 2 Y22 분배 실린더 전진 3 Y23 분배 실린더 후진 4 Y24 가공 실린더 전/후진 5 Y25 배출 실린더 전진 6 Y26 배출 실린더 후진 7 Y27 스토퍼 실린더 전/후진 8 Y28 흡착 실린더 전진 9 Y29 흡착 실린더 후진 10 Y2A 흡착 모듈 ON/OFF 11 Y2B 창고 실린더 전진 12 Y2C 창고 실린더 후진 13 Y2D 드릴 모터 ON/OFF 14 Y2E 컨베이어 모터 ON/OFF 22 Y37 부저(Buzzer) 3.3. Servo 모터 I/O # SERVO 모터의 경우 위치 결정 모듈인 QD77MS2을 통해 제어한다. 본 프로젝트에서는 해당 모듈은 6번 슬롯에 마운트 되었으며 XY 시작 주소를 70으로 갖는다. 따라서 아래와 같이 I/O가 할당 되었다. 위치결정 기동의 경우 ZP.PSTRT1을 사용하여 SERVO 모터 동작을 구현하였다.\n3.3.1. 입력부 # No. Address Comment 0 X70 QD77 준비완료 1 X71 동기용 플래그 8 X78 축1 에러검출 3.3.2. 출력부 # No. Address Comment 0 Y70 PLC Ready 1 Y71 전체축 서보 ON 4 Y74 축1 정지 3.3.3. 버퍼 메모리 할당표 # No. Buffer Address PLC 표현 기능 0 G802 U7\\G802 현재 위치 데이터 1 G804 U7\\G804 현재 속도 데이터 2 G806 U7\\G806 서보 상태/피드백 데이터 3 G807 U7\\G807 알람/상태 코드 4 G1502 U7\\G1502 기동 명령/스타트 트리거 3.4. 릴레이, 레지스터 할당 영역 # 본 프로젝트는 모듈화를 통해 문제를 해결하는 것이 목표이다. 따라서 각 기능 단위로 모듈을 분리하여 구현되었으며 모듈에서 사용하는 범위 내의 릴레이, 레지스터의 경우 외부에서 사용하지 말아야 한다. 기존의 C++와 같은 고급 프로그래밍 언어와 달리 PLC 에서는 특정 범위 내의 릴레이, 레지스터의 접근을 숨길 수 없다. 따라서 각 모듈에서 사용하는 릴레이, 레지스터의 범위를 명시하여 다른 개발자가 사용하지 않도록 해야한다. 아래는 각 모듈에서 사용한 릴레이, 레지스터의 범위를 릴레이, 레지스터 기능으로 나누어 표로 나타낸 것이다. 구현된 서브 프로그램(모듈은) SERVO, ACTUATOR, STORAGE 가 총 3가지가 있으며, 메인 프로그램으로 MAIN, PART1, PART2, PART3, PART4, LAMP가 있다. 아래의 표는 메인 프로그램은 Program, 모듈은 Module로 표기하여 할당 영역을 표기한 표이다.\n3.4.1. Internal Relay # No. Internal Relay range Program 0 \\([M50, M59]\\) LAMP 1 \\([M200, M202]\\) 비상(전체 프로그램) 2 \\([M500, M599]\\) PART1 3 \\([M600, M699]\\) PART2 4 \\([M700, M799]\\) PART3 5 \\([M800, M899]\\) PART4 6 \\([M990, M999]\\) MAIN No. Internal Relay range Module 0 \\([M100, M199]\\) SERVO 0 \\([M240, M299]\\), \\([M1000, M1009]\\) ACTUATOR 0 \\([None]\\) STORAGE 3.4.2. Data Register # No. Internal Relay range Program 0 \\([None]\\) LAMP 1 \\([None]\\) 비상(전체 프로그램) 2 \\([None]\\) PART1 3 \\([D600, D699]\\) PART2 4 \\([D700, D799]\\) PART3 5 \\([D800, D899]\\) PART4 6 \\([D1000, D1099]\\) MAIN No. Internal Relay range Module 0 \\([D100, M199]\\) SERVO 0 \\([None]\\) ACTUATOR 0 \\([D300, D399]\\), \\([D0, D30]\\) STORAGE 3.4.3. Timer # No. Internal Relay range Program 0 \\([None]\\) LAMP 1 \\([None]\\) 비상(전체 프로그램) 2 \\([None]\\) PART1 3 \\([T600, T699]\\) PART2 4 \\([T700, T799]\\) PART3 5 \\([T800, T899]\\) PART4 6 \\([None]\\) MAIN No. Internal Relay range Module 0 \\([T100, T199]\\) SERVO 0 \\([T1000, T1009]\\) ACTUATOR 0 \\([None]\\) STORAGE 3.4.4. Counter # No. Internal Relay range Program 0 \\([None]\\) LAMP 1 \\([None]\\) 비상(전체 프로그램) 2 \\([None]\\) PART1 3 \\([C600, C699]\\) PART2 4 \\([C700, C799]\\) PART3 5 \\([C800, C899]\\) PART4 6 \\([None]\\) MAIN No. Internal Relay range Module 0 \\([None]\\) SERVO 0 \\([None]\\) ACTUATOR 0 \\([None]\\) STORAGE ","date":"8 2월 2026","externalUrl":null,"permalink":"/projects/plc_mini_project/development_environment/","section":"Projects","summary":"","title":"01. 개발환경","type":"projects"},{"content":"","date":"1 1월 2020","externalUrl":null,"permalink":"/projects/","section":"Projects","summary":"","title":"Projects","type":"projects"},{"content":"","externalUrl":null,"permalink":"/posts/","section":"","summary":"","title":"","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/posts/os/filesystem/","section":"","summary":"","title":"FS","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/linux/","section":"","summary":"","title":"Linux","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/os/","section":"","summary":"","title":"OS","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/plc/","section":"","summary":"","title":"PLC","type":"posts"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]