WirelessHART 데이터를 SCADA로 가져올 때 멈춘 값에 속지 않는 법
WirelessHART 게이트웨이 데이터를 SCADA에 안전하게 올리는 법 — 업데이트 주기와 폴링, stale 값 검출, Modbus 매핑 함정, join 문제, 네트워크 상태 점검.
글
HMI/SCADA, 산업 통신, 알람, 태그, 히스토리언을 현장 업무 흐름에 맞춰 정리한 노트입니다.
WirelessHART 게이트웨이 데이터를 SCADA에 안전하게 올리는 법 — 업데이트 주기와 폴링, stale 값 검출, Modbus 매핑 함정, join 문제, 네트워크 상태 점검.
SCADA에서 가스 유량의 압력·온도 보정을 다룹니다. 어떤 유량계에 필요한지, 절대압 함정, 계산을 어디에 둘지, 압력 트랜스미터가 죽으면 어떻게 할지.
strapping table을 SCADA에 넣는 실무 — 원형 세그먼트 기하, 보간 간격, 계산을 어느 계층에 둘지, 그리고 정수압 레벨이 재고를 속이는 밀도 함정까지.
리밋 스위치 두 개와 이송 타이머로 SCADA에서 정직한 밸브 상태를 만드는 법 — 이동 중 처리, 불일치 알람, 그리고 느려지는 액추에이터를 몇 달 먼저 잡아내는 방법.
오리피스 DP는 유량의 제곱에 비례하므로 누군가는 제곱근을 취해야 한다 — 트랜스미터, PLC, 아니면 SCADA. 두 번 취하거나 저유량 컷오프를 빼먹으면 값이 거짓말을 한다.
센서와 SCADA 태그 사이 어디에서 온도 선형화와 냉접점 보상이 실제로 일어나는지, 그리고 엉뚱한 곳에서 처리하면 왜 믿고 쓰는 값이 조용히 편향되는지.
떨리는 4-20 mA 값을 1차 필터와 이동 평균으로 다듬는 법, 필터를 어디에 둘지, 그리고 엉뚱한 태그를 필터링하면 왜 정작 필요한 알람이 늦어지는지.
SCADA 드라이버가 BACnet 장치를 검색하고 present-value를 읽고 명령 가능 객체에 쓰는 방법 — 객체 식별자, 16슬롯 우선순위 배열, COV 대 폴링, BBMD 라우팅.
BRCB와 URCB 리포트 컨트롤 블록이 변전소 데이터를 SCADA로 보내는 방식 — 데이터셋, 트리거 옵션, 버퍼 시간, ConfRev, 그리고 클라이언트를 조용히 굶기는 예약(reservation) 다툼까지.
DNP3 double-bit binary input(object group 3·4)은 52a/52b 차단기 접점을 네 가지 상태로 인코딩해, single-bit 상태가 동작 중에 보여주는 OPEN/CLOSED 깜빡임을 없앤다 — 매핑·시운전·경보 설정법.
PLC가 UDT를 OPC UA로 노출했는데 SCADA 클라이언트에는 ByteString으로 보인다. ExtensionObject 안에 실제로 무엇이 들어 있고 구조화 DataType을 어떻게 디코딩하는지 정리한다.
SCADA 드라이버가 EtherNet/IP로 ControlLogix·CompactLogix 태그를 읽는 방식 — connected와 unconnected CIP, RPI, 연결 예산, 그리고 원자 태그보다 배열 읽기가 나은 이유.
멀티플렉서, HART 지원 I/O, WirelessHART 게이트웨이로 4-20 mA 루프 너머의 HART 보조 변수와 진단 정보를 SCADA로 끌어오는 방법.
듀티 분배, standby failover, 역할 교체가 예측 가능하게 동작하고 새벽 3시에도 운전자 눈에 보이도록 SCADA에서 lead/lag/standby 펌프 순환을 구성하는 법.
인버터(VFD)는 packed control word로 명령을 받고 status word로 상태를 보고한다. 둘 중 하나만 잘못 매핑해도 드라이브가 기동하지 않거나, HMI가 계속 latch하는 고장을 만든다. 둘 다 bit 단위로 해석하고 모든 전이를 증명하는 법.
데드밴드는 아날로그 변화가 이벤트가 될지를 결정하고, Group 32 변형은 그 형식과 크기를 결정한다. 둘을 잘못 잡으면 이벤트 버퍼를 흘러넘치게 하거나 쓸모없는 타임스탬프를 보낸다. 튜닝하는 법을 정리한다.
현장 계기에서 PLC를 거쳐 SCADA까지 모든 4-20 mA 포인트를 처음부터 끝까지 검증하고, 뒤바뀐 두 트랜스미터를 시운전 후가 아니라 전에 잡아내는 방법.
랩어라운드하는 카운터에서 가짜 유량을 만들지 않고 사용량을 계산하는 법. 레지스터 폭 정하기, 델타 보정을 한 곳에 두기, 롤오버와 리셋 구분하기, 그리고 적산이 절대 음수가 되지 않게 하기.
단선, 포화된 루프, 얼어붙은 입력도 그럴듯한 숫자를 만들어 믿을 만한 값으로 스케일된다. 잘못된 값이 운전원이나 제어 루프에 닿기 전에 과범위·저범위·정지된 4-20 mA 신호를 SCADA에서 감지하는 방법.
Class 0/1/2/3 배정, 아날로그 데드밴드, 비요청 응답, 이벤트 버퍼, 그리고 통신 두절 중에 마스터가 outstation 상태를 계속 유지할지 결정하는 IIN 비트까지 정리한다.
회선이 멈추거나 프레임을 흘리거나 CRC 오류를 남기는 DNP3 문제는 한 계층 아래에서 잡는다. 소스·목적지 주소, 확인/비확인 서비스, 재시도와 타임아웃 튜닝, keep-alive, 느린 무선·시리얼 회선의 프레이밍 오류.
DNP3 outstation이 이벤트에 스스로 타임스탬프를 찍는 이유, Need Time(IIN1.4) 비트와 지연 보정 시각 쓰기가 동작하는 방식, 그리고 시각 동기화 불량이 SOE 로그를 허구로 만드는 과정.
PLC나 HMI가 재시작된 뒤 오래된 명령이 다시 실행되지 않도록 command bit, 응답, startup 복구를 설계하고 시험하는 방법.
SCADA에서 report-by-exception과 change-of-state를 쓰는 법 — DNP3 이벤트, deadband, heartbeat, integrity poll로 짧은 이벤트와 stale 값을 놓치지 않기.
Browse는 성공했는데 태그 일부만 들어온다. OPC UA Part 4 v1.05의 continuation point 규칙과 MaxBrowseContinuationPoints로 원인을 잡는 방법.
OPC UA의 AccessLevel, UserAccessLevel, WriteMask 차이 — 브라우저에서 쓰기 가능해 보이는 setpoint가 런타임에서 BadUserAccessDenied로 거부되는 이유와 실제 운영 계정으로 write를 시험하는 방법.
정비 Bypass는 Comment 한 줄이 아니라 운전 상태다. Tag 이름, ISA-18.2의 Out of Service 처리, 만료 규칙, 그리고 임시 우회가 영구가 되지 않게 막는 Audit.
SCADA 히스토리언이 통신 공백을 보간선과 마지막 값으로 감추는 방식, 그리고 bad 데이터가 교대조 리포트까지 흘러가지 않게 막는 품질 규칙.
HMI 버튼 조건을 권한, 모드, 퍼미시브, 인터록, 품질로 나누고 실제 차단 사유를 운전원에게 보여주는 설계 방법.
재사용 페이스플레이트 팝업의 컨텍스트 전달 설계. 설비 키, 명령 바인딩 검증, OPC UA StatusCode로 본 품질 처리, ISA-101 화면 계층 기준으로 정리했다.
NodeId는 재생성되고, browse path는 설비 이동에 깨지고, DisplayName은 그냥 라벨이다. 펌웨어 업데이트 한 번에 화면 절반이 비지 않게 HMI·히스토리언·알람이 저장할 참조를 고르는 기준.
OPC UA DataChangeFilter를 정하는 법 — 절대 vs 퍼센트 데드밴드, DataChangeTrigger, 큐 크기를 어떻게 잡아야 노이즈만 걸러내고 실제 공정 변화는 남기는지.
트렌드 축 기본값은 OPC UA EURange에서 가져온다. 0~100%로 clamp하면 NAMUR NE 43 고장 전류가 −2.5%와 106.25%에서 잘려 사라진다. 알람선, 다중 축, 시운전 확인까지.
MQTT client ID는 23바이트만 보장된다. 중복 ID, 너무 넓은 wildcard, retained command, 소리 없이 거부되는 publish까지 SCADA edge에서 실제로 터지는 것들.
값만 보는 HMI가 숨기는 frozen data, gateway cache 값, clock drift를 OPC UA StatusCode severity 비트와 SourceTimestamp, ServerTimestamp로 잡아내는 방법.
평평한 1초 scan이 PLC와 gateway를 왜 밀어붙이는지, 그리고 부하가 걸려도 operator가 실제로 판단에 쓰는 데이터는 빠르게 유지되도록 scan class와 load shedding을 설계하는 법.
Exception과 periodic 수집은 서로 다른 사실을 저장한다. Tag별로 어떻게 고르면 300 ms interlock을 잃지 않는지, 그리고 시운전 때 어떻게 증명하는지 정리했다.
Modbus는 32-bit 값의 endianness를 표준으로 정하지 않는다. 그래서 16-bit register 두 개가 엉뚱한 값으로 디코딩된다. Driver에서 추측하지 말고 현장에서 byte/word order를 증명하는 방법.
히스토리언이 archive 데이터를 point ID로 잡는지 이름 문자열로 잡는지, rename 한 번에 이력이 왜 둘로 쪼개지는지, cutover에서 무엇을 확인해야 operator보다 먼저 구멍을 찾는지.
한 scan만 켜지는 reject pulse는 20 ms 만에 사라진다. 250 ms로 폴링하면 rate를 아무리 올려도 SCADA는 그 pulse를 못 본다. 감으로 정하지 말고 PLC scan time, driver, historian에 맞춰 polling rate를 정하는 법.
야간 교대 report에서 good count가 4개 어긋난다. PLC counter, historian delta, S6F11 event time, spool drain 중 어디를 먼저 봐야 하는지 정리한다.
HMI setpoint 입력이 깨지는 지점은 입력이 아니라 응답 경로다. 표시 범위와 PLC hard limit을 나누는 방법, 조용한 반올림과 무시된 write를 잡아내는 시운전 시험 10가지.
SCADA tag quality가 실제로 어떻게 동작하는지 — OPC DA quality word, OPC UA StatusCode, DNP3 flag — 그리고 죽은 신호가 정상 공정 값처럼 보이지 않게 표시·알람·저장하는 방법.
레시피 다운로드에서 선택값·다운로드값·운전값을 태그로 나누고, PLC가 인정한 값을 echo로 대조하는 방법. 거부 사유를 파라미터 단위로 남기는 설계까지.
OPC UA monitored item queue, discard policy, Overflow 상태 비트가 SCADA 클라이언트가 모든 빠른 변화를 받을지 최신 값만 받을지를 어떻게 정하는지.
faceplate 여는 데 5초 걸리는 화면의 원인을 first-load와 update 지연으로 나눠 재고, 태그 수·scan class·trend 조회·PLC 부하 순으로 좁혀가는 방법.
event frame과 batch segment는 경계가 버텨줘야 값어치를 한다. 시작과 종료 트리거를 어디서 잡을지, 무엇을 속성으로 캡처할지, 닫히지 않은 frame을 어떻게 처리할지 정리했다.
설비 event로 MES lot traceability를 만들 때 실제로 깨지는 지점 — event에 빠진 lot context, GEM clock과 event time, spool replay 순서, split/merge genealogy, 그리고 정직한 correction 설계.
OPC UA method call은 Good을 반환하고도 장비가 안 움직일 수 있다. HMI에서 접수, 실행, 실패 사유를 작업자가 제대로 보도록 method call을 설계하는 법.
Calculated tag는 어느 순간 공식 숫자가 된다. 리포트나 MES가 가져다 쓰기 전에 수식, quality 규칙, 기간 경계, counter reset을 실제 sample로 확인하는 방법.
한 화면은 stopped, 다른 리포트는 faulted라고 한다. Raw signal을 하나의 derived status tag로 정리하고 판정 순서를 문서에 남기는 방법.
화면 상태를 command bit가 아닌 feedback으로 몰고, timeout을 실제 actuator 행정으로 잡고, 왜 reject됐는지 운전자에게 보여주는 방법.
범위, 엔지니어링 단위, Modbus word order, NAMUR 고장 임계값, quality까지 확인해서 PLC·SCADA·HMI·히스토리언이 같은 값을 보게 만드는 아날로그 스케일링 시운전 실무.
장치 한 대가 멈추거나 RTU 게이트웨이가 포화돼도 SCADA 드라이버 전체가 같이 느려지지 않도록 Modbus TCP 폴링 주기, 타임아웃, 재시도, 스캔 그룹을 정하는 법.
SCADA와 산업용 텔레메트리에서 MQTT QoS, retained message, 세션, 중복 메시지, 명령 토픽을 어떻게 나눠 볼지 정리한 현장 노트.
OPC UA 샘플링 주기, 퍼블리싱 주기, 큐 크기, deadband, KeepAlive/Lifetime 관계가 SCADA 클라이언트와 히스토리언이 공정을 제대로 보는지를 어떻게 결정하는지.
PLC 다운로드나 서버 교체 후 세션은 정상인데 monitored item마다 Bad_NodeIdUnknown이 돌아옵니다. namespace index와 identifier, 클라이언트 캐시가 실제로 어떻게 바뀌는지, 정지 시간이 끝나기 전에 무엇을 확인해야 하는지 정리했습니다.
MES 비가동 사유 코드를 현장에서 제대로 선택되게 만드는 법. 입력 프롬프트 타이밍, PackML 상태 기반 자동 분류, 리포트에 실제로 필요한 필드까지 정리했습니다.
MQTT Last Will, Birth, retain 메시지로 SCADA 화면에서 오프라인·데이터 정지·정상을 서로 다른 상태로 표시하는 방법입니다.
히스토리언 데드밴드와 압축을 HMI 소수점이 아니라 계기 정확도와 공정 기준으로 정해, 노이즈는 저장하지 않으면서 실제 움직임은 트렌드에 남기는 방법.
소켓은 열리고 unit ID도 응답하고 폴도 정상인데 화면 값만 틀린 경우. SCADA와 히스토리안이 신뢰하기 전에 레지스터 맵을 검증하는 방법.
SCADA 화면은 장비가 멈춘 뒤에도 그럴듯한 숫자를 태연히 보여준다. 하트비트, 와치독, stale-data 태그로 데이터의 신선도를 눈에 보이게 만드는 방법 — 실제 프로토콜 품질, 현실적인 타임아웃, 그리고 그걸 증명하는 시운전 절차까지.
group_id·edge_node_id·device_id를 어떻게 잡아야 이름 변경 하나로 모든 구독과 히스토리언 포인트가 깨지지 않는지, 그리고 birth 인증서·alias·STATE를 실무 기준으로 정리합니다.
히스토리언을 단순 저장소가 아니라 문제 추적과 운전 개선을 위한 시간 데이터 기반으로 설명합니다.
개별 태그 값을 작업자가 이해할 수 있는 설비 운영 상태로 묶는 방법을 설명합니다.
SCADA 태그 이름을 설비, 신호 의미, 데이터 성격이 드러나도록 정리하는 실무 기준입니다.
SCADA 태그가 단순 변수명이 아니라 통신 주소, 단위, 품질, 알람, 이력 설정을 연결하는 기준점임을 설명합니다.