함수/예외 코드 조회
function code, HEX 값, 대상 객체, exception 이름을 검색하세요. 대소문자/공백/기호를 무시하고 필터링합니다.
자주 쓰는 Modbus RTU function code, 요청 형식, exception response를 한 페이지에서 검색하고 비교할 수 있습니다.
function code, HEX 값, 대상 객체, exception 이름을 검색하세요. 대소문자/공백/기호를 무시하고 필터링합니다.
| 코드 | HEX | 이름 | 대상 | 접근 | 일반 요청 | 사용 예 |
|---|---|---|---|---|---|---|
| 01 | 0x01 | Read Coils | Coils | Read | start address + quantity | 디지털 출력(코일) 상태 읽기 |
| 02 | 0x02 | Read Discrete Inputs | Discrete inputs | Read | start address + quantity | 디지털 입력 상태 읽기 |
| 03 | 0x03 | Read Holding Registers | Holding registers | Read | start address + quantity | 쓰기 가능한 holding register 읽기 |
| 04 | 0x04 | Read Input Registers | Input registers | Read | start address + quantity | 입력 register(읽기 전용 값) 읽기 |
| 05 | 0x05 | Write Single Coil | Coil | Write | address + value | 코일 1개 쓰기 |
| 06 | 0x06 | Write Single Register | Holding register | Write | address + value | holding register 1개 쓰기 |
| 07 | 0x07 | Read Exception Status | Status byte | Read | function only | 비교적 드문 serial line 상태 조회 |
| 08 | 0x08 | Diagnostics | Diagnostics | Read/Write | sub-function + data | 진단/루프백 처리 |
| 11 | 0x0B | Get Comm Event Counter | Counter | Read | function only | serial line 이벤트 카운터 조회 |
| 12 | 0x0C | Get Comm Event Log | Event log | Read | function only | serial line 이벤트 로그 조회 |
| 15 | 0x0F | Write Multiple Coils | Coils | Write | start address + quantity + byte count + data | 여러 코일 쓰기 |
| 16 | 0x10 | Write Multiple Registers | Holding registers | Write | start address + quantity + byte count + data | 여러 holding register 쓰기 |
| 17 | 0x11 | Report Server ID | Server identification | Read | function only | 레거시 serial line 장치 식별 |
| 20 | 0x14 | Read File Record | File record | Read | sub-request reference + length | 드물게 쓰는 파일 레코드 읽기 |
| 21 | 0x15 | Write File Record | File record | Write | sub-request reference + data | 드물게 쓰는 파일 레코드 쓰기 |
| 22 | 0x16 | Mask Write Register | Holding register | Write | address + AND mask + OR mask | 비트 마스크 기반 단일 레지스터 갱신 |
| 23 | 0x17 | Read/Write Multiple Registers | Holding registers | Read/Write | read range + write range | 읽기/쓰기를 한 트랜잭션으로 결합 |
| 24 | 0x18 | Read FIFO Queue | FIFO queue | Read | FIFO pointer address | 서버 FIFO 큐 데이터 읽기 |
| 43 | 0x2B | Encapsulated Interface Transport | MEI / device identification | Read | MEI type + data | 장치 식별/MEI 전송 |
| 코드 | HEX | 이름 | 의미 | 흔한 원인 |
|---|---|---|---|---|
| 01 | 0x01 | Illegal Function | 장치가 해당 function code를 지원하지 않음 | 펌웨어가 지원하지 않는 function code 사용 |
| 02 | 0x02 | Illegal Data Address | 요청 주소가 유효 범위를 벗어남 | 레지스터 맵 기준 주소/오프셋/객체 타입 불일치 |
| 03 | 0x03 | Illegal Data Value | 요청 값 또는 개수가 허용 범위를 벗어남 | 수량/값 제한 위반 |
| 04 | 0x04 | Server Device Failure | 요청 처리 중 장치 내부 오류 발생 | 장치 내부 오류 또는 일시적 고장 |
| 05 | 0x05 | Acknowledge | 요청은 수락되었지만 처리 시간이 더 필요함 | 시간이 오래 걸리는 처리 명령 |
| 06 | 0x06 | Server Device Busy | 장치가 바빠서 지금 처리할 수 없음 | 장치가 다른 작업 처리 중 |
| 08 | 0x08 | Memory Parity Error | 메모리 패리티/무결성 오류 | 장치 메모리 무결성 문제 |
| 10 | 0x0A | Gateway Path Unavailable | 게이트웨이 경로 사용 불가 | 게이트웨이 라우팅/네트워크 세그먼트 문제 |
| 11 | 0x0B | Gateway Target Device Failed to Respond | 게이트웨이가 대상 장치 응답을 받지 못함 | 대상 서버 오프라인 또는 응답 경로 문제 |
Modbus function code는 PDU의 1바이트 연산 코드로, 서버가 어떤 객체를 어떤 방식으로 처리할지 지정합니다.
현장 장비에서는 01, 02, 03, 04, 05, 06, 15, 16 함수가 가장 많이 사용됩니다. 코일/레지스터 읽기·쓰기를 처리합니다.
요청 처리 실패 시 Modbus는 exception response를 반환하며, 예외 코드로 실패 원인을 표현합니다.
RTU 예외 응답에서는 원래 function code에 0x80을 더한 값이 반환됩니다. 예: 0x03 요청 오류 응답은 0x83.
Function 03은 holding register를, Function 04는 input register를 읽습니다. 유효 주소는 장치 레지스터 맵을 따릅니다.
Function 06은 단일 holding register를 쓰고, Function 16은 연속된 여러 register를 한 번에 씁니다.
요청 프레임
01 03 00 00 00 02 C4 0B
01은 서버/슬레이브 주소, 03은 Read Holding Registers, 0000은 시작 주소, 0002는 개수, C4 0B는 CRC low/high 바이트입니다.
요청 프레임
01 06 00 01 00 64 D9 E1
레지스터 0x0001에 값 0x0064를 씁니다. D9 E1은 CRC low/high 바이트입니다.
응답 프레임
01 83 02 C0 F1
0x83은 function 0x03의 예외 응답이며, 0x02는 Illegal Data Address를 의미합니다.
Function 03은 서버/슬레이브의 holding register를 읽습니다.
Function 03은 holding register, Function 04는 input register를 읽습니다. 실제 주소는 장치 문서를 확인해야 합니다.
Function 16(0x10)은 여러 holding register를 한 요청으로 씁니다.
Exception code 02는 Illegal Data Address로, 주로 잘못된 레지스터 범위를 요청했을 때 발생합니다.
Modbus 예외 응답은 원래 function code의 bit7을 세팅합니다. 그래서 0x03은 0x83이 됩니다.