통신·연동 · 기술 가이드

Modbus 주소 40001과 0의 차이, 실수값 바르게 읽기

작성 · program1472

핵심 요약

매뉴얼의 ‘40001’은 ‘4번 영역(Holding Register)의 1번째’라는 사람용 표기이고, 실제 통신 프레임에 들어가는 주소는 0입니다. 즉 4xxxx 표기에서 40001을 빼면 통신 주소가 됩니다(40100 → 99).

32비트 실수는 레지스터 2개를 합쳐 읽어야 하며, 장비마다 두 워드의 순서가 다르므로 첫 시험에서 순서를 확정해야 합니다.

레지스터 영역 표기법

Modbus 데이터 영역과 관례적인 주소 표기
표기영역크기·권한읽기 기능코드
0xxxx (00001~)Coil1비트, 읽기·쓰기01
1xxxx (10001~)Discrete Input1비트, 읽기 전용02
3xxxx (30001~)Input Register16비트, 읽기 전용04
4xxxx (40001~)Holding Register16비트, 읽기·쓰기03

맨 앞 숫자는 영역을 나타내는 관례일 뿐 통신 프레임에는 들어가지 않습니다. 프레임에는 기능코드와 0부터 시작하는 주소가 들어갑니다. 주소가 9999를 넘는 장비는 400001처럼 6자리로 표기하기도 합니다.

0부터인가, 1부터인가

같은 레지스터를 어떤 매뉴얼은 ‘40001’로, 어떤 매뉴얼은 ‘0x0000’이나 ‘주소 0’으로, 또 어떤 프로그램은 ‘1’로 적습니다. 표기는 달라도 가리키는 것은 같은 첫 번째 Holding Register입니다.

값이 한 칸씩 밀려 나온다면(옆 항목의 값이 보인다면) 0 기준과 1 기준이 섞인 것입니다. 매뉴얼에 16진수 주소(예: 0x0064)가 있다면 대개 그 값이 통신 주소 그대로입니다.

32비트 정수·실수 읽기

레지스터 하나는 16비트라서 32비트 정수(INT32)나 실수(FLOAT32)는 연속된 레지스터 2개에 나눠 담깁니다. 두 워드를 어떤 순서로 붙일지는 장비마다 달라, 상위 워드가 먼저 오는 장비와 하위 워드가 먼저 오는 장비(워드 스왑)가 있습니다.

예) 읽어 온 레지스터 2개: [0x41C8, 0x0000]

상위 워드 먼저 → 0x41C80000 → 25.0
하위 워드 먼저 → 0x000041C8 → 0에 아주 가까운 값

값이 터무니없이 크거나 0에 가깝게 나오면 워드 순서부터 바꿔 봅니다. 장비 표시창에 보이는 값과 비교하면 어느 순서가 맞는지 바로 알 수 있습니다.

배율과 부호

  • 온도 253이 25.3℃인 것처럼 정수에 배율(×0.1)을 적용해야 하는 값이 많습니다. 매뉴얼의 단위·소수점 항목을 확인합니다.
  • 음수가 나올 수 있는 값을 부호 없는 정수(UINT16)로 읽으면 −1이 65535로 보입니다. 이 경우 INT16으로 해석합니다.
  • 한 번에 읽을 수 있는 레지스터는 요청당 최대 125개입니다. 그 이상은 나눠서 요청합니다.

흔한 실수

  • 주소를 1 기준으로 넣고 값이 한 칸씩 밀린 것을 장비 고장으로 오해한다.
  • FLOAT32 값을 레지스터 하나만 읽고 변환한다.
  • 쓰기(06·16) 시험을 운전 중인 설비에 바로 한다 — 설정값이 즉시 바뀌므로 반드시 정지 상태나 승인된 시간에 시험합니다.