SensorCatalog

Modbus 레지스터 디코더

홀딩 레지스터나 입력 레지스터의 원시 값을 모든 바이트·워드 순서로 숫자로 바꾸거나, 값을 레지스터로 바꿉니다.

레지스터

변환 방향

레지스터 값

입력 형식

모든 바이트 순서

ABCD · 빅 엔디언
1041 20 00 00
CDAB · 워드 스왑
2.3362448 × 10⁻⁴¹가능성 낮은 값 · 00 00 41 20
BADC · 바이트 스왑
1.6347736 × 10⁻¹⁹가능성 낮은 값 · 20 41 00 00
DCBA · 리틀 엔디언
1.1570521 × 10⁻⁴¹가능성 낮은 값 · 00 00 20 41

레지스터 주소

프로토콜 주소
00x0000 · 0부터 센 값(요청에 실리는 값)
데이터 테이블
홀딩 레지스터(4x)읽기 FC 03 · 쓰기 FC 06, 16
참조 번호
40001 · 4000015자리·6자리 표기, 1부터 셈
읽는 레지스터
0 … 1이 데이터 형식은 연속 2개 레지스터
공식 및 규격
ABCD: A B C D   CDAB: C D A B   BADC: B A D C   DCBA: D C B A
값 = raw × 배율 + 오프셋

Modbus는 16비트 레지스터를 상위 바이트부터 보냅니다. 여러 레지스터에 걸친 32비트·64비트 값의 순서는 프로토콜이 정하지 않습니다. 상위 레지스터를 먼저 보내는 기기(ABCD)가 많지만, 하위 레지스터를 먼저 보내는 기기(CDAB)도 있고, 레지스터 안의 바이트까지 바꾸는 기기(BADC, DCBA)도 있습니다. 각 행은 같은 레지스터를 이 순서 중 하나로 변환한 것이며, 문자는 값의 각 바이트가 어디에 오는지 보여 줍니다(A가 최상위).

부동소수점 값은 IEEE 754 binary32(FLOAT32) 또는 binary64(FLOAT64)입니다. 순서가 틀리면 대개 터무니없이 크거나 작은 값, 또는 NaN이 나오며 그런 행은 흐리게 표시됩니다. 공학 값은 원시값 × 배율 + 오프셋입니다. 40001 같은 참조 번호는 Modicon 관례로, 첫 자리가 테이블을, 나머지가 1부터 센 번호를 뜻하며 요청에는 0부터 센 주소가 실립니다.

Modbus RTU·TCP 출력 센서나 트랜스미터가 필요하신가요?

SensorSpan에 견적 요청

Modbus 레지스터 디코더의 원리

Modbus는 데이터를 16비트 레지스터로 나르며, 각 레지스터는 상위 바이트부터 보냅니다. 프로토콜이 정한 것은 여기까지입니다. 32비트 부동소수점으로 보내는 온도나 64비트 정수로 보내는 전력량 카운터는 레지스터 2개 또는 4개에 걸치며, 그 순서는 기기 제조사가 정합니다. 대부분의 기기는 상위 레지스터를 먼저 보내지만, 하위 레지스터를 먼저 보내는 기기도 있고 각 레지스터 안의 두 바이트까지 바꾸는 기기도 있습니다.

이 디코더는 마스터, 게이트웨이, 테스트 도구에 보이는 그대로 레지스터를 받아 네 가지 순서로 한꺼번에 변환합니다. 순서는 값의 바이트를 나타내는 문자로 씁니다(A가 최상위). ABCD는 빅 엔디언, CDAB는 흔한 워드 스왑, BADC는 각 레지스터 안의 바이트를 바꾼 것, DCBA는 완전한 리틀 엔디언입니다.

올바른 바이트 순서 찾기

기기가 대략 무엇을 보여야 하는지 아는 상태에서 레지스터 한 쌍을 읽고, 말이 되는 행을 찾으세요. 레지스터 0x4120 0x0000은 ABCD로 10.0입니다. CDAB로 읽으면 2.3 × 10⁻⁴¹이 나오는데, 어떤 센서도 보여 주지 않는 값이라 디코더는 이런 행을 흐리게 표시합니다. 기기가 하위 레지스터를 먼저 보내면 0x0000 0x4120이 보이고, CDAB 행에 10이 나옵니다.

한 값의 순서를 알면 같은 기기·같은 데이터 형식의 모든 값에 똑같이 적용됩니다. PLC 프로그램에서 바이트를 바꾸지 말고 마스터 설정에 적어 두세요.

배율과 데이터 형식

많은 기기가 암묵적인 배율이 있는 정수를 보냅니다. 12.34 bar를 뜻하는 1234라는 압력이나, 0.1도 단위의 온도 같은 것입니다. 레지스터 맵의 배율과 오프셋을 입력하면 원시값 옆에 공학 값이 표시되며, 값은 원시값 × 배율 + 오프셋입니다. 쓰기 위해 값을 인코딩할 때는 같은 배율을 거꾸로 적용합니다.

INT16과 UINT16은 최상위 비트를 읽는 방식만 다릅니다. 0xFFFF는 부호 없는 값으로 65535, 부호 있는 값으로 −1입니다. 대부분의 레지스터 맵은 주소마다 형식을 밝힙니다. 밝히지 않았다면, 음수가 될 리 없는 값은 대개 부호 없는 값입니다.

레지스터 번호와 주소

기기 매뉴얼은 레지스터를 40001, 30001, 400001처럼 적는 경우가 많습니다. 이것은 Modicon 관례로, 첫 자리가 테이블(4는 홀딩 레지스터, 3은 입력 레지스터, 0은 코일, 1은 이산 입력)을, 나머지가 1부터 센 번호를 뜻합니다. 회선의 요청에는 0부터 센 주소가 실리므로 40001은 홀딩 레지스터 주소 0이며 기능 코드 03으로 읽습니다. 참조 번호를 입력하면 프로토콜 주소, 기능 코드, 여러 레지스터 값이 차지하는 레지스터를 볼 수 있습니다.

여기서 하나가 어긋나는 것이 그럴듯하지만 틀린 값의 가장 흔한 원인입니다. 마스터가 한 값의 뒷부분과 다음 값의 앞부분을 읽게 됩니다.

자주 묻는 질문

일부 행에 NaN이 나오는 이유는?

지수 비트가 모두 1인 부동소수점은 숫자가 아니거나(NaN) 무한대입니다. 바이트 순서가 틀리면 이런 패턴이 자주 나오지만, 센서 고장을 일부러 NaN으로 알리는 기기도 있습니다. 후자라면 기기 매뉴얼을 확인하세요.

레지스터를 16진 문자열 하나로 입력해도 되나요?

됩니다. 공백 없는 8자리 또는 16자리 16진수는 4자리씩 레지스터로 나뉘므로, 41200000은 0x4120 0x0000으로 읽힙니다.

Modbus TCP는요?

레지스터 배치는 TCP와 RTU가 같고 프레임만 다릅니다. 여러 레지스터 값의 바이트 순서는 전송 방식이 아니라 기기가 정합니다.

↑ ↓ 선택 · Enter 열기 · Esc 닫기