Modbus 기능 코드 및 CRC Modbus
Modbus 통신을 구성하는 코드와 각 직렬 프레임을 감싸는 체크섬을 확인합니다.
| 코드 | 이름 | 동작 |
|---|---|---|
| 1 0x01 | 코일 읽기(Read Coils) | 읽고 쓸 수 있는 이산 출력 비트인 코일 1–2000개를 읽습니다. |
| 2 0x02 | 이산 입력 읽기(Read Discrete Inputs) | 읽기 전용 비트인 이산 입력 1–2000개를 읽습니다. |
| 3 0x03 | 홀딩 레지스터 읽기(Read Holding Registers) | 읽고 쓸 수 있는 16비트 워드인 홀딩 레지스터 1–125개를 읽습니다. |
| 4 0x04 | 입력 레지스터 읽기(Read Input Registers) | 읽기 전용 16비트 워드인 입력 레지스터 1–125개를 읽습니다. |
| 5 0x05 | 단일 코일 쓰기(Write Single Coil) | 코일 하나를 ON(0xFF00) 또는 OFF(0x0000)로 강제합니다. |
| 6 0x06 | 단일 레지스터 쓰기(Write Single Register) | 홀딩 레지스터 하나에 씁니다. |
| 7 0x07 | 예외 상태 읽기(Read Exception Status) | 직렬 통신 전용으로, 장치의 예외 상태 비트 8개를 읽습니다. |
| 8 0x08 | 진단(Diagnostics) | 직렬 통신 전용으로, 회선 진단과 루프백 하위 기능을 수행합니다. |
| 11 0x0B | 통신 이벤트 카운터 가져오기(Get Comm Event Counter) | 직렬 통신 전용으로, 상태 워드와 이벤트 개수를 읽습니다. |
| 12 0x0C | 통신 이벤트 로그 가져오기(Get Comm Event Log) | 직렬 통신 전용으로, 상태와 개수, 최근 이벤트 바이트를 읽습니다. |
| 15 0x0F | 다중 코일 쓰기(Write Multiple Coils) | 연속된 코일 블록을 한 번의 요청으로 씁니다. |
| 16 0x10 | 다중 레지스터 쓰기(Write Multiple Registers) | 연속된 홀딩 레지스터 블록을 씁니다. 10진수 16은 16진수 0x10입니다. 이를 16진수 16으로 잘못 해석하면 아래의 Mask Write 행과 혼동하게 됩니다. |
| 17 0x11 | 서버 ID 보고(Report Server ID) | 직렬 통신 전용으로, 장치 ID 문자열과 실행 상태 바이트를 읽습니다. |
| 22 0x16 | 마스크 레지스터 쓰기(Mask Write Register) | 홀딩 레지스터 하나에서 선택한 비트에 AND/OR 마스크를 적용합니다. |
| 23 0x17 | 다중 레지스터 읽기/쓰기(Read/Write Multiple Registers) | 한 트랜잭션에서 한 블록을 읽고 다른 블록에 씁니다. |
| 43 0x2B | 캡슐화 인터페이스 전송(Encapsulated Interface Transport) | 장치 식별 정보(MEI 유형 0x0E), 즉 벤더와 모델을 읽습니다. |
| 이 필터와 일치하는 기능 코드가 없습니다. | ||
코드는 네 가지 데이터 표에 걸쳐 나뉩니다. 코일과 이산 입력은 비트이고 홀딩 레지스터와 입력 레지스터는 16비트 워드입니다. 주소가 어느 표에 속하는지와 그 표를 나타내는 5자리 접두어는 Modbus 디코딩에서 설명합니다.
| 코드 | 이름 | 의미 |
|---|---|---|
| 1 0x01 | 잘못된 기능(Illegal Function) | 서버가 해당 기능 코드를 지원하지 않습니다. |
| 2 0x02 | 잘못된 데이터 주소(Illegal Data Address) | 주소 또는 요청한 범위가 이 장치에서 유효하지 않습니다. |
| 3 0x03 | 잘못된 데이터 값(Illegal Data Value) | 값 또는 수량이 해당 주소에서 허용하는 범위를 벗어났습니다. |
| 4 0x04 | 서버 장치 고장(Server Device Failure) | 요청을 실행하는 중 복구할 수 없는 오류가 발생했습니다. |
| 5 0x05 | 승인(Acknowledge) | 요청을 수락했지만 실행 시간이 깁니다. 다시 보내지 말고 완료 여부를 폴링하세요. |
| 6 0x06 | 서버 장치 사용 중(Server Device Busy) | 긴 프로그램 명령을 처리 중이므로 나중에 요청을 다시 보내세요. |
| 7 0x07 | 부정 승인(Negative Acknowledge, NAK) | 서버가 쿼리로 받은 프로그램 기능을 실행할 수 없습니다(FC 08/13/14 프로그램 명령). |
| 8 0x08 | 메모리 패리티 오류(Memory Parity Error) | 확장 파일 레코드 메모리에서 패리티 오류가 발생했습니다(FC 20/21). |
| 10 0x0A | 게이트웨이 경로 사용 불가(Gateway Path Unavailable) | 게이트웨이가 잘못 구성되었거나 과부하 상태라 대상까지 가는 경로가 없습니다. |
| 11 0x0B | 게이트웨이 대상 응답 실패(Gateway Target Failed to Respond) | 대상 장치에서 응답이 없습니다. 유닛 ID가 잘못된 경우가 많습니다. |
| 이 필터와 일치하는 예외 코드가 없습니다. | ||
예외 응답은 원래 기능 코드의 상위 비트를 설정해 되돌려 줍니다. 즉 FC + 0x80입니다. 홀딩 레지스터 읽기(FC 3, 0x03)가 실패하면 0x83으로 돌아오고, 그 다음 바이트가 위 표의 예외 코드입니다.
입력
프레임을 16진수 바이트로 붙여 넣으세요. 공백, 쉼표, 0x는 무시됩니다. Modbus RTU는 CRC-16(다항식 0xA001, 초기값 0xFFFF)을 사용합니다. ASCII 모드는 대신 LRC를 사용하고, Modbus TCP는 MBAP 헤더를 사용하므로 체크섬을 완전히 생략합니다.
출력
검사 방식
CRC는 유닛 ID, 기능 코드, 데이터를 포함한 프레임의 모든 바이트에 대해 계산한 다음 하위 바이트부터 추가합니다. 수신기는 CRC를 포함한 프레임 전체에 대해 같은 계산을 실행하며, 정상 프레임에서는 나머지가 0이 됩니다. 위의 추가 순서에는 프레임을 만들 때 추가할 두 바이트가 표시됩니다. 아래 판정은 붙여 넣은 값의 마지막 두 바이트를 CRC로 간주하고 캡처한 프레임이 유효한지 알려 줍니다.