Modbus 레지스터 하나는 16비트이고, 그 안의 두 바이트는 높은 바이트가 먼저 갑니다(Modbus Application Protocol V1.1b3, 4.2 «big-Endian»). 그런데 32비트 정수(U32·S32)나 IEEE 754 실수(float32)는 레지스터 두 칸에, float64 는 네 칸에 나눠 싣고, 어느 칸에 어느 반쪽을 넣을지는 규격이 정하지 않습니다. 그래서 같은 값이 장비마다 다른 순서로 옵니다.
네 가지 순서
값의 바이트를 높은 쪽부터 A·B·C·D 라 하면, 레지스터 두 칸(낮은 주소 먼저)에 놓이는 모양은 네 가지입니다. 25.0(float32 = 0x41C80000)과 정수 100000(0x000186A0)으로 보면 이렇습니다.
| 순서 | 25.0 (float32) | 100000 (U32) | 흔한 이름 |
|---|---|---|---|
| ABCD | 41C8 0000 | 0001 86A0 | 빅 엔디언 — 높은 워드 먼저 |
| CDAB | 0000 41C8 | 86A0 0001 | 워드 스왑 — 낮은 워드 먼저 |
| BADC | C841 0000 | 0100 A086 | 바이트 스왑 |
| DCBA | 0000 C841 | A086 0100 | 리틀 엔디언 |
순서가 틀리면 이렇게 보입니다
레지스터 «41C8 0000» 을 네 순서로 풀면 맞는 순서(ABCD)만 25 이고 나머지는 엉뚱한 값이 됩니다.
| 풀어 본 순서 | float32 | U32 |
|---|---|---|
| ABCD | 25 | 1103626240 |
| CDAB | 2.36 × 10⁻⁴¹ | 16840 |
| BADC | −197632 | 3359703040 |
| DCBA | 7.18 × 10⁻⁴¹ | 51265 |
0 에 아주 가까운 수(10⁻³⁸ 아래)나 터무니없이 큰 수, 부호가 뒤집힌 값이 나오면 순서부터 의심합니다. 반대로 값이 그럴듯해 보여도 앞판 값과 맞춰 보기 전에는 확정하지 않습니다.
맞추는 순서
- 1. 값을 아는 칸을 고릅니다. 장비 앞판에 보이는 값이나 직접 써 넣은 설정값이 좋습니다. 계속 바뀌는 측정값보다 고정된 값이 비교하기 쉽습니다.
- 2. 그 칸의 시작 주소부터 레지스터 2개를 한 요청으로 읽습니다. 따로 두 번 읽으면 그 사이 값이 바뀌어 두 반쪽이 어긋날 수 있습니다.
- 3. 네 순서로 풀어 보고 앞판 값과 맞는 것을 고릅니다.
- 4. 넷 다 이상하면 주소를 의심합니다. 시작 주소가 한 칸 밀리면 앞 값의 뒤 반쪽과 이 값의 앞 반쪽을 섞어 읽습니다 — 0 기준·1 기준·40001 표기를 먼저 확인하세요.
- 5. 정한 순서를 다른 32비트 칸에 쓰기 전에, 매뉴얼에 칸마다 다른 순서가 적혀 있지 않은지 봅니다.
매뉴얼에서 찾을 말
매뉴얼에는 «Big-Endian», «상위 워드 먼저(high word first)», «Word swap», «Little-endian word» 같은 말로 적혀 있습니다. 루텍 Accura 3300E 매뉴얼은 32비트 값을 상위 워드가 낮은 주소인 Big-Endian 으로 적습니다(p.19). LS ELECTRIC GIMAC1000 은 Swap 설정에 따라 ABCD(100.0 → 42C8 0000)와 CDAB(0000 42C8)가 바뀝니다(사용설명서 p.42). 이처럼 장비 설정으로 순서가 바뀌기도 하니, 읽은 값으로 한 번은 확인하는 것이 안전합니다.
float32 의 자릿수
float32 는 가수가 24비트라 유효 숫자가 약 7자리입니다. 123.456 을 float32 로 저장하면 123.456001 로 읽힙니다 — 장비 오류가 아닙니다. 자릿수가 큰 값은 장비가 float64(레지스터 4칸)나 «U32 정수 + 배율» 로 주기도 합니다. float64 도 같은 원리로, 네 레지스터를 놓는 순서를 확인해야 합니다.
PortDock 에서는
- 웹 도구 «Modbus 실수 변환기»: 레지스터 2개·4개를 넣으면 ABCD·CDAB·BADC·DCBA 네 순서의 float32·float64·int32 를 한 표로 보여 주고, 값 → 레지스터도 계산합니다.
- Modbus Master: 칸마다 U32·S32·F32·F64 형식과 순서를 정합니다. 아는 값이 있는 칸을 F32 로 두고 순서를 바꿔 가며 말이 되는 값을 고르면 됩니다.
- Modbus Slave: «예제 채우기» 를 누르면 보유 레지스터 8~9 에 F32 CDAB 23.5 가 들어갑니다. 마스터로 읽어 보면 순서 설정이 맞는지 장비 없이 확인할 수 있습니다.
작성 2026-10-22