← 전체 글
Modbus/약 8분 읽기/ 조회

폴은 깨끗한데 값이 틀렸다: SCADA가 믿기 전에 Modbus 레지스터 맵 시운전하기

소켓은 열리고 unit ID도 응답하고 폴도 정상인데 화면 값만 틀린 경우. SCADA와 히스토리안이 신뢰하기 전에 레지스터 맵을 검증하는 방법.

ModbusSCADA태그문제 해결체크리스트

소켓은 열렸고 unit ID 1도 응답했고 폴은 40ms 안에 돌아왔는데, 1200kPa에서 트립하는 압축기의 토출 압력이 HMI에 6124kPa로 떠 있었습니다. "다운"된 건 아무것도 없었습니다. 32비트 float의 워드 순서가 뒤집혀서, 드라이버가 내부적으로는 일관되지만 완전히 틀린 값을 착실하게 돌려준 것뿐입니다.

끊어진 링크는 잡기 쉽습니다. 타임아웃이 나고 빨간 배너가 뜨니까요. 문제는 폴은 깨끗한데 디코딩이 틀린 경우입니다. 이 값은 트렌드에 쌓이고, 알람 한계에 들어가고, 사람들이 믿어 버립니다. 그러니 레지스터 맵은 가져다 쓰는 스프레드시트가 아니라 시운전해서 사인오프하는 인터페이스로 다뤄야 합니다.

주소 표기 방식부터 확정한다

off-by-one이 사는 곳입니다. MODBUS Application Protocol Specification(V1.1b3)에서 PDU 주소는 0부터 65535까지이므로 첫 홀딩 레지스터의 프로토콜 주소는 0이고, 전통적인 40001 표기가 바로 이 주소 0에 대응합니다. 벤더는 40001, 40000, raw offset 0 등 제각각으로 문서화하고, 일부 게이트웨이는 base를 알아서 빼 주고 일부는 안 뺍니다.

데이터시트를 믿지 말고 값을 바꿔 가며 어느 주소가 움직이는지 확인하세요.

  • 장비 로컬 화면에서 볼 수 있는 값 하나를 고른다.
  • 실제로 배포할 드라이버 설정 그대로 읽는다.
  • 위아래 레지스터도 하나씩 읽는다.
  • 실제 값을 바꿔서 어느 주소가 따라 움직이는지 확인한다.
  • 확정된 표기 방식을 임포트 시트에 말로 적어 둔다.

워드 순서는 튜닝하지 말고 증명한다

Modbus는 레지스터 내부에서 big-endian이라 상위 바이트가 먼저 옵니다. 스펙이 명시합니다. 하지만 32비트 값에서 두 워드의 순서는 스펙이 정의하지 않습니다. 그래서 ABCD, CDAB, BADC, DCBA가 현장에 다 존재하고, 같은 벤더 장비 두 대에서 다를 때도 있습니다.

숫자가 그럴듯해 보일 때까지 순서를 뒤집는 건 최악입니다. 워드가 뒤집힌 float는 그 순간엔 멀쩡해 보이다가 다른 값에서 어긋납니다. 대신 아는 값을 강제하거나 관찰하세요.

  • 16비트 정수: signed를 unsigned로 읽으면 작은 음수가 65000쯤으로 튄다.
  • 32비트 정수/float: 워드 순서와 바이트 순서가 겹쳐 네 조합이 나온다.
  • 상태 워드: bit 0을 bit 1로 세는 시스템 차이.
  • 문자열: 바이트 짝과 끝의 null.

강제할 수 없으면 로컬 HMI, 휴대용 계측기, 드라이브 키패드처럼 독립된 소스와 대조하고, 무엇과 대조했는지 기록하세요. "눈으로 봤다"는 증거가 아닙니다.

값·품질·통신 상태는 서로 다른 태그다

원시 프로세스 값은 그 값을 믿어도 되는지 알려주지 않습니다. Modbus에는 품질 플래그가 없으니 직접 만들어야 합니다. 장비마다 최소한 폴 성공 여부, 마지막 정상 폴 시각, 연속 타임아웃 횟수, 게이트웨이 진단 코드, 장비 상태 워드, local/remote 상태를 같이 두세요.

여기서 나오는 철칙 하나: 읽기 실패가 프로세스 알람을 울리게 두지 마세요. 죽은 폴 때문에 뜬 "압력 낮음"은 진짜 저압과 완전히 다른 작업 지시입니다. 새벽 3시에 오퍼레이터가 둘을 구분 못 하면 그건 알람이 아니라 함정입니다.

상태 워드는 비트 하나씩 시운전한다

16비트 상태 워드 하나에 운전, 폴트, 경고, 로컬 모드, 원격 허가, 인터록, 통신 워치독이 다 들어갑니다. 비트 맵은 실제로 토글해서 확인하기 훨씬 전부터 "다 된 것처럼" 보이기 때문에 숨은 오류가 여기 쌓입니다. 비트 하나하나를 실제로 만들어 관찰하고, 드라이버의 비트 번호 규칙(0–15인지 1–16인지, MSB부터인지)을 먼저 확인하세요. 데이터시트의 bit 7이 항상 내 태그의 bit 7은 아닙니다.

스케일은 계측기에 없는 정밀도를 그리지 않는다

±0.25% 정확도의 압력 트랜스미터를 소수점 세 자리로 표시하면 없는 정밀도를 만들어 내는 것이고, 가짜 정밀도는 뒤에 있는 센서보다 트렌드를 더 믿음직해 보이게 만듭니다. 표시 소수 자리는 계측기 정확도 등급에서 잡고, 히스토리안 데드밴드는 노이즈 위에 두세요. 떨리는 아날로그 값이라면 아카이브를 센서 지터로 채우는 0.5%보다 2%가 낫습니다.

넘기기 전에 확인할 것

  • 핵심 레지스터에 날짜가 찍힌 테스트 증거가 있다.
  • 주소 표기 방식이 말로 문서화되어 있다.
  • 데이터 타입별로 워드·바이트 순서가 기록되어 있다.
  • 상태 비트가 테스트되었거나 미테스트로 명확히 표시되어 있다.
  • 통신 상태가 오퍼레이터와 정비에게 보인다.
  • 알람 로직이 나쁜 품질과 실제 프로세스 조건을 분리한다.
  • 히스토리안 태그의 단위·스케일·데드밴드가 맞다.
  • 최종 맵이 한 엔지니어의 노트북 스프레드시트가 아니라 프로젝트 파일에 저장되어 있다.

잘 시운전된 Modbus 인터페이스는 운영이 지루합니다. 값이 갱신되고, 진단이 실패 원인을 설명하고, 생산 정지 중에 아무도 손으로 레지스터 맵을 해독하지 않습니다. 그 지루함이 목표입니다.