PortDock

Modbus RTU 프레임 읽는 법 — 요청·응답·예외·CRC

«01 03 00 00 00 02 C4 0B» 한 줄을 바이트 하나씩 풀어 봅니다. 주소·함수·시작 주소·개수·CRC 순서와 예외 응답, 40001 표기까지.

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 0BCRC16 — 낮은 바이트 먼저

응답: 값 100, 200

01 03 04 00 64 00 C8 BA 7A
바이트뜻
01 03같은 주소·함수
04뒤따르는 데이터 바이트 수 (레지스터 2개 × 2)
00 64첫 레지스터 = 100
00 C8둘째 레지스터 = 200
BA 7ACRC16

예외 응답

요청을 처리할 수 없으면 슬레이브는 함수 번호에 0x80 을 더하고 예외 코드를 붙여 답합니다. 아래는 «없는 주소(02)» 입니다.

01 83 02 C0 F1

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바이트 요청 전송
96001.15 ms4.0 ms9.2 ms
192000.57 ms2.0 ms4.6 ms
384000.29 ms1.0 ms2.3 ms
1152000.10 ms0.33 ms (규격 권장 1.75 ms)0.8 ms

19200 bps 를 넘으면 규격은 3.5 문자 대신 1.75 ms 를 쓰도록 권합니다. USB 변환기를 쓰면 데이터가 몇 ms 단위로 묶여 오기 때문에 이 시간이 깨지기 쉽습니다 — 다음 글을 보세요.

작성 2026-10-17