Modbus RTU 는 시리얼(RS-485·RS-232)로 주고받는 바이너리 프로토콜입니다. 마스터(PLC·HMI·PC)가 요청을 보내면, 주소가 맞는 슬레이브 하나만 답합니다. 장비 설명서의 레지스터 표만 있으면 직접 요청을 만들 수 있습니다.
요청: 보유 레지스터 2개 읽기
01 03 00 00 00 02 C4 0B
| 바이트 | 뜻 |
|---|---|
| 01 | 국번(슬레이브 ID) 1 |
| 03 | 함수 03 — 보유 레지스터 읽기 |
| 00 00 | 시작 주소 0 (높은 바이트 먼저) |
| 00 02 | 개수 2 |
| C4 0B | CRC16 — 낮은 바이트 먼저 |
응답: 값 100, 200
01 03 04 00 64 00 C8 BA 7A
| 바이트 | 뜻 |
|---|---|
| 01 03 | 같은 주소·함수 |
| 04 | 뒤따르는 데이터 바이트 수 (레지스터 2개 × 2) |
| 00 64 | 첫 레지스터 = 100 |
| 00 C8 | 둘째 레지스터 = 200 |
| BA 7A | CRC16 |
예외 응답
요청을 처리할 수 없으면 슬레이브는 함수 번호에 0x80 을 더하고 예외 코드를 붙여 답합니다. 아래는 «없는 주소(02)» 입니다.
01 83 02 C0 F1
- 01 — 지원하지 않는 함수
- 02 — 없는 주소(범위 밖)
- 03 — 잘못된 값(개수 초과 등)
- 04 — 장비 내부 오류
40001 은 주소 0 입니다
설명서의 «40001» 은 «보유 레지스터의 첫 번째» 라는 표기이고, 실제로 보내는 주소는 0 입니다. 40010 이면 9, 30001(입력 레지스터)은 함수 04 의 주소 0 입니다. 값이 한 칸씩 어긋나 보이면 이 표기부터 확인하세요.
CRC 와 바이트 순서
CRC16 Modbus 는 다항식 0xA001(역순), 초깃값 0xFFFF 로 주소부터 마지막 데이터까지 계산하고, 결과의 낮은 바이트를 먼저 보냅니다. 위 요청의 CRC 값은 0x0BC4 이고 줄에는 «C4 0B» 로 붙습니다. 직접 확인하려면 CRC·체크섬 계산기에 «01 03 00 00 00 02» 를 넣어 보세요.
프레임 사이 조용한 간격(끊김 시간)
RTU 는 3.5 문자 시간 동안 아무것도 오지 않으면 한 프레임이 끝난 것으로 봅니다. 한 문자는 11비트(시작·데이터 8·패리티 또는 정지·정지)입니다.
| 속도 | 1문자 | 3.5문자 | 8바이트 요청 전송 |
|---|---|---|---|
| 9600 | 1.15 ms | 4.0 ms | 9.2 ms |
| 19200 | 0.57 ms | 2.0 ms | 4.6 ms |
| 38400 | 0.29 ms | 1.0 ms | 2.3 ms |
| 115200 | 0.10 ms | 0.33 ms (규격 권장 1.75 ms) | 0.8 ms |
19200 bps 를 넘으면 규격은 3.5 문자 대신 1.75 ms 를 쓰도록 권합니다. USB 변환기를 쓰면 데이터가 몇 ms 단위로 묶여 오기 때문에 이 시간이 깨지기 쉽습니다 — 다음 글을 보세요.
작성 2026-10-17