
Device Map과 Heartbeat보다 먼저 정해야 할 것은 누가 어떤 데이터를 소유하는가다.
AMR 개발 초기에 PLC 통신을 붙일 때는 가장 빠른 방법이 매력적이다. Coil 100은 AUTO, Coil 101은 MANUAL, Register 200은 Lift Position처럼 주소를 바로 Robot Software에 넣으면 금방 동작한다.
문제는 프로젝트가 커지고 PLC 제조사가 바뀌거나 Signal이 늘어날 때 시작된다. 상위 Software가 PLC Memory 구조를 직접 알고 있으면 Hardware 변경이 곧 Software 변경이 된다. 그래서 Interface를 단순 통신 설정이 아니라 Data Contract로 설계해야 한다.
Modbus TCP 사용법을 다시 설명하지 않는다. 실제 AMR에서 PC, PLC, Safety PLC가 어떤 역할을 나누고 Device Map과 Heartbeat를 어떻게 설계해야 유지보수가 쉬운지를 다룬다.
1. 처음에는 PLC Address를 Robot Software에 직접 넣었다
Robot App → Coil 100, Coil 101, D Register 200을 직접 Read/Write
PLC Vendor, Memory Map, Protocol이 바뀌면 Robot Application까지 수정해야 했다.
단기 개발에서는 빠르지만 장기 유지보수에는 약한 구조다. 여러 AMR Platform을 운영하거나 PLC Vendor를 바꿀 가능성이 있다면 상위 Software가 Vendor Memory를 직접 알지 않게 만드는 것이 좋다.
2. Common Signal Layer를 하나 두면 구조가 단순해진다
상위 Software는 Signal의 의미만 알고 실제 PLC 주소는 Configuration과 Driver에서 처리한다. 이렇게 하면 PLC를 교체해도 Robot Application을 크게 건드리지 않고 Mapping만 바꿀 수 있다.
3. Device Map은 Signal을 순서대로 나열하면 금방 무너진다
처음에는 0, 1, 2, 3 순서대로 Signal을 넣어도 문제가 없어 보인다. 하지만 Mode, Safety, Drive, Lift, PIO, Charger가 한 Map에 계속 추가되면 빈 Address를 어디에 써야 하는지부터 혼란이 생긴다.
| Block | 역할 | 예시 Signal |
|---|---|---|
| System | 기본 상태와 공통 제어 | Mode, Heartbeat, Reset |
| Safety | 상태 공유 | E-STOP, Bumper, Safety Ready |
| Drive | 주행계 | Brake, Motor Enable, Drive Fault |
| Lift | 기구부 | Lift Up, Down, Position |
| PIO | Handshake | Request, Busy, Complete |
| Charger | 충전 Interface | Ready, Charging, Voltage, Current |
Block 단위로 여유 Address를 두면 나중에 Signal이 추가되어도 구조가 깨지지 않는다.
4. Address보다 먼저 Data Ownership을 정해야 한다
통신이 꼬이는 프로젝트를 보면 같은 Signal을 PC와 PLC가 모두 Write하는 경우가 많다. 명령과 상태는 반드시 소유자를 정해야 한다.
주행 요청, Lift Command, Mode Request처럼 PC가 소유하는 Command
Input Status, Relay State, Local Interlock처럼 PLC가 소유하는 Status
Signal마다 최소한 Name, Description, Direction, Address, Data Type, Scale, Unit, Initial Value, Fault Value를 정의하면 Interface Specification이 실제 Data Contract 역할을 한다.
5. Heartbeat는 1이면 정상이 아니다
Heartbeat를 처음 만들 때 가장 흔한 방식은 PC가 정상일 때 1을 유지하는 것이다. 하지만 PC Application이 Hang되면 마지막 값 1이 PLC Memory에 그대로 남을 수 있다.
PC 정상 → HB = 1
Toggle Bit 또는 Increment Counter가 일정 시간 안에 계속 변하는지 감시
Network가 연결되어 있다는 것과 상대 Controller가 정상적으로 실행되고 있다는 것은 다른 문제다. Heartbeat는 Application이 실제로 살아 있는지를 감시해야 한다.
6. Safety PLC 데이터는 일반 Control과 역할을 분리한다
PC가 Safety PLC의 상태를 읽는 것은 진단과 UI에 도움이 된다. 하지만 일반 Network 통신으로 읽은 E-STOP Status Bit를 다시 Safety 판단에 사용하는 식으로 설계하면 안 된다.
Safety Function은 Safety Input, Safety Logic, Safety Output 안에서 완결하고 PC가 읽는 Safety Status는 Monitoring과 Diagnostic 용도로 사용하는 것이 이해하기 쉽다.
PC ↔ PLC와 PC ↔ Safety PLC가 모두 Modbus TCP를 사용하더라도 두 Interface의 의미는 다르게 관리하는 것이 좋다.
7. Timeout, Reconnect, Fault State까지 Interface에 포함해야 한다
통신은 항상 정상일 때보다 끊겼을 때 설계가 더 중요하다. Timeout이 나면 Command를 유지할지, 모두 해제할지, 자동 재접속 후 이전 Command를 복원할지 정책을 정해야 한다.
| 상황 | 권장 검토 |
|---|---|
| Heartbeat Timeout | Motion Command 무효화, Fault 기록 |
| TCP Disconnect | 재접속 주기와 Backoff 정의 |
| PLC Reboot | Initial Value와 Command 재전송 정책 정의 |
| PC Restart | Old Command가 남지 않도록 초기화 |
| Map Version 불일치 | Version Signal로 Compatibility 확인 |
8. 최종 Interface Specification에는 무엇이 있어야 할까?
마무리
AMR PLC Interface를 잘 설계한다는 것은 Modbus가 연결되는지 확인하는 수준을 넘는다. 상위 Software에서 PLC Vendor를 숨기고 Signal을 Domain별 Block으로 정리하고 Ownership과 Heartbeat, Timeout을 하나의 규칙으로 만드는 것이 핵심이다.
이 구조를 잡아두면 PLC가 바뀌거나 Signal이 늘어나도 Robot Software 전체를 다시 수정하는 일을 줄일 수 있다. 결국 좋은 Interface는 통신 Driver가 아니라 변경에 강한 시스템 경계다.
'【통신 실무】' 카테고리의 다른 글
| 【통신 실무】 Modbus Coil, Discrete Input, Holding Register 차이 | 주소와 Function Code 이해하기 (0) | 2026.09.19 |
|---|---|
| 【통신 실무】 산업용 Ethernet Switch와 일반 Switch 차이 | 왜 산업용이 비쌀까? (0) | 2026.09.19 |
| 【통신 실무】 RS-485에 120Ω 종단저항을 사용하는 이유 | 종단저항 위치와 측정 방법 (0) | 2026.09.18 |
| 【통신 실무】 Managed Switch와 Unmanaged Switch 차이 | AMR에는 어떤 제품이 필요할까? (0) | 2026.09.18 |
| 【통신 실무】 IP Address, Subnet Mask, Gateway 쉽게 이해하기 | 로봇 Ethernet 설정 (0) | 2026.09.17 |