PortDock

Modbus 실수(float)·32비트 값 읽기 — 워드 순서 맞추는 순서

float32·U32 는 레지스터 두 칸에 나뉘어 오고, 어느 칸이 먼저인지는 규격에 없어 장비마다 다릅니다. ABCD·CDAB 를 아는 값으로 가려내는 순서와 잘못 골랐을 때의 모양.

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)흔한 이름
ABCD41C8 00000001 86A0빅 엔디언 — 높은 워드 먼저
CDAB0000 41C886A0 0001워드 스왑 — 낮은 워드 먼저
BADCC841 00000100 A086바이트 스왑
DCBA0000 C841A086 0100리틀 엔디언

순서가 틀리면 이렇게 보입니다

레지스터 «41C8 0000» 을 네 순서로 풀면 맞는 순서(ABCD)만 25 이고 나머지는 엉뚱한 값이 됩니다.

풀어 본 순서float32U32
ABCD251103626240
CDAB2.36 × 10⁻⁴¹16840
BADC−1976323359703040
DCBA7.18 × 10⁻⁴¹51265

0 에 아주 가까운 수(10⁻³⁸ 아래)나 터무니없이 큰 수, 부호가 뒤집힌 값이 나오면 순서부터 의심합니다. 반대로 값이 그럴듯해 보여도 앞판 값과 맞춰 보기 전에는 확정하지 않습니다.

맞추는 순서

매뉴얼에서 찾을 말

매뉴얼에는 «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 에서는

작성 2026-10-22