Modbus 디코딩 Modbus
Modbus 기초에서는 어느 장치에 어떤 기능 코드로 요청해야 하는지, 예외가 무엇을 뜻하는지 등 응답을 받기까지의 과정을 설명했습니다. 이 페이지는 그 동반 학습 자료로, 16비트가 도착한 뒤 무엇을 해야 하는지 다룹니다. Modbus는 읽기에 성공한 뒤에도 어딘가 잘못된 숫자가 돌아오는 것으로 유명합니다. 40001이 제조사 문서에 적힌 위치에 없거나, 온도가 −12로 읽히지만 올바른 값은 533이거나, 32비트 부동소수점 값이 알아볼 수 없는 값으로 돌아옵니다. 어느 것도 프로토콜 오류가 아닙니다. 프로토콜이 사용자에게 맡긴 해석 방식의 차이입니다. 이 페이지에서는 흔한 네 가지 해석 문제와 잘못되는 방식을 차례로 설명합니다.
5자리 번호 규칙의 함정
제조사의 Modbus 연계 표를 열면 40001, 30005, 10012, 00007 같은 주소가 보입니다. 도구에 40001을 입력하고 읽기를 실행하면 예외가 반환됩니다. 1만큼 어긋나는 현상은 실제로 존재하며 오류가 아닙니다. 이 문제를 디버깅하는 대부분의 사람보다 오래된 문서 표기 관례입니다.
맨 앞자리는 주소가 속한 데이터 테이블의 종류를 나타냅니다. 0은 코일, 1은 이산 입력, 3은 , 4는 입니다. 이 숫자는 통신상 주소에 포함되지 않습니다. 나머지 네 자리는 해당 테이블 안에서 1부터 시작하는 1 기반 인덱스입니다. 따라서 40001은 첫 번째 를 뜻하며, 통신상으로는 주소 0입니다. 40123은 123번째 , 즉 통신상 주소 122를 뜻합니다. 1부터 시작하는 문서 번호와 0부터 시작하는 통신 주소가 만나면서 1만큼 어긋납니다.
이와 관련해 알아 두어야 할 두 가지 관례가 있습니다.
- 일부 제조사는 접두사와 +1을 모두 생략합니다. "Modicon 방식" 주소표는 통신 주소를
0,1,2처럼 그대로 나열합니다. 테이블은 기능 코드가 지정하므로 맨 앞자리가 필요하지 않습니다. 같은 물리적 레지스터가 한 제조사 매뉴얼에는40001로, 다른 제조사 매뉴얼에는0으로 표시될 수 있습니다. - 레지스터 수가 9999개를 넘으면 일부 제조사는 6자리 "확장" 형식으로 전환합니다. 예를 들어
400001은 첫 번째 를 뜻합니다. 자릿수를 하나 늘렸을 뿐 같은 관례입니다.
현장에서 적용할 수 있는 경험칙은 다음과 같습니다. 제조사 주소가 4 또는 3으로 시작하고 뒤에 네 자리가 붙는다면 거의 확실히 5자리 Modbus 번호 체계입니다. 통신 주소는 문서 번호에서 1을 뺀 값이며, 맨 앞자리는 FC03/FC16(홀딩) 또는 FC04(입력)를 가리킵니다.
부호 있는 값과 부호 없는 값의 해석
올바른 레지스터가 응답했고 16비트가 도착했습니다. 이제 그 비트가 무엇을 뜻하는지 선택해야 합니다. 프로토콜은 비트를 저장할 뿐, 0부터 65535까지의 양수 값으로 읽을지 −32768부터 +32767까지의 부호 있는 값으로 읽을지 알려 주지 않습니다. 비트는 같지만 의도는 다릅니다.
부호 있는 값은 2의 보수 규칙에 따라 해석합니다. 최상위 비트인 "부호 비트"가 0이면 비트 패턴 자체가 숫자입니다. 부호 비트가 1이면 비트 패턴의 값에서 65536을 뺍니다. 따라서 위 예시의 0xFFF3은 부호 없는 값으로 읽으면 65523이고, 부호 있는 값으로 읽으면 65523 − 65536 = −13입니다.
단서는 제조사 문서에 있습니다. INT16은 부호 있는 값, UINT16은 부호 없는 값을 뜻합니다. 문서에 명시되지 않았다면 실제 값의 양상이 답을 알려 줍니다. 음수를 부호 없는 값으로 잘못 읽으면 값이 65535 부근으로 급격히 뜁니다. 센서가 표시한 65521은 어떤 물리량을 65521만큼 측정한 것이 아니라, 부호 있는 −15를 잘못된 자료형으로 읽은 것입니다. 0을 중심으로 오가는 오프셋 값에서도 규모만 작을 뿐 같은 함정이 나타납니다.
건물 제어에서는 외기 온도, 부호 있는 차이값, 오프셋 값, 기준선에 대한 상대값처럼 측정값이 음수가 될 수 있는 곳마다 부호 있는 값이 사용됩니다. 부호 없는 값은 일반적으로 카운터, 운전 시간, 백분율, 설정값, 여러 비트 플래그를 묶은 워드에 사용됩니다.
32비트 값과 네 가지 바이트 순서
16비트 레지스터에는 0.1도 분해능의 온도, 0–100 % 설정값, 작은 카운터를 담을 수 있습니다. 그러나 32비트 부동소수점 수, 32비트 부호 있는 정수, 4바이트 타임스탬프는 담을 수 없습니다. 제조사가 이런 값을 전달하려면 연속된 16비트 레지스터 두 개에 나누어 매핑합니다. Modbus 데이터 모델에는 바이트 순서를 강제할 32비트 자료형이 없습니다. 그 결과 현장에는 네 가지 순서가 모두 존재하고, 지금도 모두 출하되는 제품에 사용되며, 어느 하나도 유일한 "표준"은 아닙니다.
전송 순서대로 각 바이트를 A B C D라고 하고, 계산 예시로 0x12 0x34 0x56 0x78을 사용하겠습니다. 각 레지스터에는 바이트 두 개가 들어갑니다. 네 가지 순서는 장치가 바이트를 두 레지스터에 배치할 수 있는 네 가지 방식입니다.
ABCD · 엄격한 Modbus
빅 엔디언 워드, 빅 엔디언 바이트입니다. 바이트가 자연스러운 전송 순서대로 두 레지스터에 놓입니다. Modbus "표준"에 가장 가까운 방식으로, 현대의 IP 측 장비와 플랫폼 컨트롤러에서 흔합니다.
CDAB · Modicon 워드 스왑
리틀 엔디언 워드, 빅 엔디언 바이트입니다. 각 레지스터 안의 바이트는 네트워크 순서이지만 두 레지스터의 순서가 바뀝니다. 기존 Modicon PLC는 내부의 리틀 엔디언 워드 배치를 이 방식으로 통신망에 노출했습니다.
BADC · 워드 내 바이트 스왑
빅 엔디언 워드, 리틀 엔디언 바이트입니다. 워드 순서는 유지하고 각 워드 안의 바이트 순서를 뒤집습니다. 비교적 드물며 일부 특수 계측기와 오래된 산업 장비에서 보입니다.
DCBA · 전체 역순
리틀 엔디언 워드, 리틀 엔디언 바이트입니다. 32비트 값 전체의 바이트 순서를 뒤집습니다. 값을 CPU 고유 형식으로 저장하고 그대로 전달하는 x86 기반 장치에서 흔합니다.
장치가 어느 순서를 사용하는지 확인하려면 예상값을 아는 레지스터 쌍을 고릅니다. 이미 구성된 설정값, 교정 상수, 기준 측정값 등이 좋습니다. 두 레지스터를 읽습니다. 네 가지 방식으로 재구성하면 서로 크게 다른 십진수 값 네 개가 나오며, 그중 하나가 예상값과 일치합니다. 그것이 장치의 순서입니다. Modbus 레지스터 뷰어 도구의 32비트 쌍 탭은 바로 이 확인 작업을 위해 네 가지 결과를 나란히 보여 주므로 직접 계산할 필요가 없습니다.
장치의 순서를 한 번 확인하면 해당 장치의 모든 32비트 값에 동일하게 적용됩니다. 제조사는 한 제품 안에서 여러 순서를 섞어 쓰지 않습니다. 따라서 레지스터마다 결정하는 일이 아니라 한 번 확인한 뒤 현장 문서에 기록해 두는 일입니다.
스케일링과 공학 단위
마지막은 레지스터에 저장된 정수를 단위가 있는 값으로 변환하는 과정이며, Modbus가 의미 정보를 전혀 제공하지 않는 것으로 특히 유명한 부분입니다. 에는 숫자가 들어가지만, 프로토콜은 그 숫자가 0.1도 단위인지, 백분율에 10을 곱한 값인지, 원시 ADC 카운트인지, 전혀 다른 무엇인지 알지 못합니다. 제조사가 결정하며 제조사 문서만이 그 의미를 알려 줍니다.
알아 두어야 할 패턴은 다음과 같습니다.
- 암시적 소수점. 가장 흔한 패턴입니다. 제조사는 정수 레지스터에서 소수점 이하 한 자리나 두 자리를 보존하기 위해 값에 × 10 또는 × 100을 곱해 저장합니다. 읽은 값이
523이고 문서에 스케일 0.1, 단위 °F라고 적혀 있으면 52.3 °F를 뜻합니다. 값1024에 스케일 0.01을 적용하면 10.24입니다. - 오프셋 + 스케일. 덜 흔하지만 실제로 사용됩니다. 저장되는 값은
(actual − offset) × scale입니다. 문서에 두 수가 모두 기재되며 둘 다 적용해야 합니다. 교정값을 직접 노출하는 오래된 장비가 이 방식을 사용하는 경향이 있습니다. - 고유 단위. 일부 값은 문서에 명시된 단위 그대로 저장됩니다. 이벤트 카운터에는 스케일링이 필요하지 않고 정수 백분율 설정값도 대개 마찬가지입니다.
- 다중 필드 비트 패킹. 상태 워드는 하나의 레지스터 비트에 여러 플래그를 묶어 저장할 수 있으며, 문서에 각 비트의 의미가 기재됩니다. Modbus 레지스터 뷰어 도구의 이진수 표시는 이런 값의 해석을 위해 마련되었습니다.
스케일링은 Modbus 기초에서 설명한 "제조사 문서가 의미를 떠받친다"는 관점이 구체적으로 드러나는 지점입니다. 스케일 정보가 없는 원시 레지스터는 의미가 없으며, 잘못된 스케일로 읽은 레지스터는 의미가 없는 것보다 더 위험합니다. 대표적인 실패 사례는 실제로는 부호 있고 스케일링된 레지스터를 부호 없는 레지스터로 처리하는 것입니다. 온도가 6553.5(원시값 65535를 0.1로 스케일링)로 표시되지만 실제로는 −0.1(원시값 −1을 부호 있는 값으로 읽고 0.1로 스케일링)입니다. 잘못된 숫자도 경보 없이 기록될 만큼 그럴듯해 보이지만, 실제 값은 센서 측정 범위의 하한에 있습니다. 두 해석 방식이 모두 올바르게 선택되어야 합니다.
이 페이지에서 다루지 않은 내용
다음 두 주제는 의도적으로 범위에서 제외했습니다.
- 통신 회선상의 Modbus RTU — RS-485 멀티드롭 배선, 보드레이트, 패리티, 2바이트 CRC 계산, 문자 간 프레이밍 타임아웃입니다. 대부분의 BMS 기술자는 시운전 때만 이 계층을 다룹니다. 수요가 있다면 세 번째 Modbus 페이지에서 다룰 수 있습니다.
- 연계 과정 — Niagara 게이트웨이나 EBO 필드 컨트롤러가 Modbus 포인트를 BAS 객체 공간에 매핑하는 방법, 폴링 주기 설정 방법, 오래된 데이터 플래그가 전파되는 방법입니다. 이 내용은 플랫폼에 특화되어 있으므로 이곳이 아니라 향후 Niagara/EBO 페이지에서 다루는 것이 적합합니다.
두 페이지에서 장치 주소, 올바른 기능 코드, 올바른 레지스터, 올바른 부호 해석, 올바른 바이트 순서, 공학 단위로 변환하는 올바른 스케일까지 모두 다루었습니다. 이것이 처음부터 끝까지의 BMS 연계 순환 과정이며, 제조사의 Modbus 표를 읽고 구성을 작성하고 그래픽의 숫자를 신뢰하기에 충분합니다. 실무자용 대화형 기능인 부호 있음/없음 전환, 네 가지 순서 비교, 십진수/16진수/이진수 표시는 한 번의 클릭으로 열 수 있는 Modbus 레지스터 뷰어 도구에 있습니다.