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