Modbus 기능 코드 및 CRC Modbus

Modbus 통신을 구성하는 코드와 각 직렬 프레임을 감싸는 체크섬을 확인합니다.
기능 코드는 요청이 수행하려는 작업을 나타냅니다. 코일 읽기, 레지스터 쓰기와 10진수/16진수 혼동 주의점(FC 15 = 0x0F, FC 16 = 0x10)을 다룹니다. 예외 코드는 서버가 요청을 거부할 때 상위 비트가 설정된 기능 코드와 함께 돌려주는 값입니다. CRC-16은 RTU 프레임에 포함되는 오류 검사 바이트 2개를 생성하거나 확인합니다.
코드이름동작
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-16 —
추가 순서(하위 바이트 먼저) —
전체 프레임 + CRC —
기존 CRC를 확인하려면 바이트를 3개 이상 입력하세요.

CRC는 유닛 ID, 기능 코드, 데이터를 포함한 프레임의 모든 바이트에 대해 계산한 다음 하위 바이트부터 추가합니다. 수신기는 CRC를 포함한 프레임 전체에 대해 같은 계산을 실행하며, 정상 프레임에서는 나머지가 0이 됩니다. 위의 추가 순서에는 프레임을 만들 때 추가할 두 바이트가 표시됩니다. 아래 판정은 붙여 넣은 값의 마지막 두 바이트를 CRC로 간주하고 캡처한 프레임이 유효한지 알려 줍니다.

← 모든 도구