02. I/O 통신
I/O 통신은 전선 한 가닥을 ON/OFF 시켜 로봇과 상대 장비(PLC·머신·센서)가 신호를 주고받는 가장 기본적인 통신입니다. 로봇이 출력($DO)을 켜면 상대가 입력으로 읽고, 상대가 응답을 켜면 로봇이 입력($DI)으로 읽는 핸드셰이크가 모든 자동화의 기초 패턴입니다. HIWIN 로봇 I/O 5종을 정리하고, 픽앤플레이스 한 사이클의 그립/언그립 핸드셰이크를 순수 Python 상태기계로 재현합니다.
이 강의에서 배우는 것
- 1HIWIN 로봇의 I/O 5종을 구분하고 채널 수·변수를 안다
- 2$DO[n]=TRUE 출력과 WAIT FOR $DI[n]==TRUE 대기로 핸드셰이크를 설계한다
- 3FI/O 기본 매핑(Start/Hold/Stop/Enable, Run/Held/Fault/Ready)을 읽는다
- 4픽앤플레이스 두 핸드셰이크(그립·언그립)를 Python 상태기계로 재현한다
소개
"전선 한 가닥 = 신호 1개". 로봇이 출력($DO)을 ON 하면 상대가 입력으로 읽고, 상대가 응답을 ON 하면 로봇이 입력($DI)으로 읽습니다. 이 주고받기(핸드셰이크)가 핵심입니다. 물리 배선·포트 없이 PC 한 대로 로직을 손에 익힙니다.
핵심 개념
1) I/O 5종 한눈에 보기
| 종류 | 변수 | 채널(6축) | 비고 |
|---|---|---|---|
| DI/O 디지털 | $DI/$DO | 24I/24O | PLC·머신·센서 일반 신호 |
| SI/O 필드버스 | $SI/$SO | 128I/128O | CC-Link/Profinet/EtherNet/IP 옵션 카드 |
| FI/O 기능 | (고정) | 8I/8O | Start·Hold·Stop·Enable·RSR |
| RI/O 로봇 | $RI/$RO | 6I/4O | 말단 배선. SCARA·Delta 불가 |
| MI/O 모듈 | $MI/$MO | 32I/32O | 여러 I/O를 묶어 감시 |
채널 수는 모델마다 다릅니다. 위 숫자는 6축 관절로봇(RA605 등) 기준이며 반드시 해당 로봇·컨트롤러 매뉴얼을 확인하세요.
2) 입출력 명령과 FI/O 매핑
출력은 `$DO[n]=TRUE/FALSE`, 입력 대기는 `WAIT FOR $DI[n]==TRUE`(조건이 참이 될 때까지 그 줄에서 멈추는 블로킹). 기능 I/O는 핀에 고정 기능이 있습니다: $SI[1]=Start·[2]=Hold·[3]=Stop·[4]=Enable·[5~8]=RSR / $SO[1]=Run·[2]=Held·[3]=Fault·[4]=Ready·[5~8]=ACK.
3) CN6 결선(NPN)
디지털 I/O는 컨트롤러 CN6 포트에서 단자대로 빠져나와 PLC·센서와 연결됩니다. 입력·출력 모두 NPN(싱크) 방식 — 신호선이 0V(GND)로 떨어질 때 ON. PNP 장비와 섞으면 동작하지 않으니 결선 방식을 맞춰야 합니다.
핵심 예제
물리 I/O는 PC로 못 만들므로, 로봇과 PLC가 신호를 주고받는 로직을 순수 Python 상태기계로 재현합니다(신호는 딕셔너리로 흉내).
def handshake(do_pin, do_value, di_pin):
robot_set_do(do_pin, do_value) # $DO[n]=TRUE/FALSE
plc_respond(do_pin, di_pin) # 잠시 뒤 $DI[n]=TRUE 응답
robot_wait_for(di_pin) # WAIT FOR $DI[n]==TRUE
handshake(do_pin=6, do_value=True, di_pin=1) # GRIP → $DI[1] 그립완료
handshake(do_pin=6, do_value=False, di_pin=4) # UNGRIP → $DI[4] 언그립완료실장비(HRSS)에서 이 두 핸드셰이크는 PTP/LIN 이동 사이에 들어가는 픽앤플레이스 프로그램의 일부입니다. P1/P3은 P2/P4 위 +50mm 접근점으로 워크피스에 수직 접근해 충돌을 막습니다.
자주 하는 실수
Q. WAIT FOR 에서 멈추지 않고 바로 통과해요.
A. 입력이 항상 ON으로 고정된 경우입니다(보통 NPN/PNP 결선 반대). CN6 결선을 NPN(싱크)으로 맞추고, 코드에서는 다음 핸드셰이크 전에 해당 $DI 비트를 False 로 초기화하세요.
Q. $DO 를 ON 해도 상대가 반응이 없어요.
A. 출력 채널·번호 오타이거나 외부 24V 전원 미인가입니다. 채널 번호와 단자대 전원을 점검하세요.
Q. $RI/$RO 또는 $SI/$SO 가 없다는 오류가 나요.
A. RI/O는 SCARA·Delta 미지원이라 DI/O·MI/O로 대체합니다. SI/O는 Fieldbus 옵션 카드가 장착돼야 동작합니다.
정리
- I/O 5종(DI/O·SI/O·FI/O·RI/O·MI/O)의 변수·채널·명령을 익혔다
- $DO 출력 → 상대 응답 → WAIT FOR $DI 핸드셰이크가 모든 자동화의 기본 패턴
- FI/O는 핀 고정 기능(Start/Hold/Stop/Enable, Run/Held/Fault/Ready)
- 다음 Modbus 편부터는 이 신호를 코일·레지스터 비트로 소프트웨어끼리 교환한다
과제
- 픽앤플레이스 사이클을 main.py 로 실행해 GRIP/UNGRIP 두 핸드셰이크가 순서대로 도는지 확인
- $DI 초기화를 빼면 WAIT FOR 가 즉시 통과하는 현상을 재현하고 원인 설명
- FI/O 매핑표에서 Start/Enable/Ready 가 각각 몇 번인지 적기