← 전체 글
HMI/약 15분 읽기/— 조회

기동이 막힌 이유를 화면에서 바로 읽히게 만드는 HMI 페이스플레이트 설계

ISA-101.01 디스플레이 계층, ISA-18.2 알람 상태, NAMUR NE 43 전류대, OPC UA 품질 코드를 기준으로 페이스플레이트에 무엇을 넣고 무엇을 빼는지 정리했다.

HMI체크리스트프로젝트 노트알람

운전원이 Start를 누른다. 펌프는 돌지 않는다. 페이스플레이트는 여전히 READY라고 띄워 둔다. 다음 2분은 화면이 아니라 무전기에서 소비된다. 명령이 컨트롤러까지 갔는지, 퍼미시브가 빠진 것인지, 피드백만 안 돌아온 것인지 — 이 세 갈래를 화면이 가려 주지 못하면 페이스플레이트는 장식이다.

기동이 안 될 때 원인을 가르는 두 번의 확인: 명령 에코가 보이는지, 퍼미시브가 모두 성립했는지 Start. 아무것도 안 돈다. READY 명령 에코가 올라오는가 없다 HMI 쪽에서 막혔다 — 권한·모드 Bad_UserAccessDenied 올라온다 퍼미시브가 모두 성립했는가 아니다 빠진 조건을 문장으로 띄운다 SUCTION PRESS LOW 성립했다 피드백 불일치 또는 품질 불량 Uncertain_LastUsableValue

페이스플레이트는 진단 화면이 아니다

ISA-101.01-2015는 디스플레이를 네 단계로 나눈다. Level 1은 공정 영역 개요, Level 2는 공정 단위 조작, Level 3은 단위 상세, Level 4는 진단·지원 화면이다. 페이스플레이트는 Level 2에서 띄우는 조작 창이고, Level 4를 축소해 넣는 자리가 아니다.

여기서 설계가 가장 많이 망가진다. 진단 항목을 다 넣고 싶어서 탭을 세 개 만들고, 운전원은 그중 첫 탭만 쓴다. 나는 페이스플레이트 진단 영역을 두 줄로 제한한다. 지금 조작을 막고 있는 조건 한 줄, 통신·품질 상태 한 줄. 그보다 길어지면 Level 4로 보낸다. 운전원이 상황 파악에 쓰는 시간은 초 단위고, 두 줄이 그 시간에 읽히는 분량이다.

명령이 들어갔는지를 화면이 말해야 한다

READY 표시는 "명령을 받았다"는 뜻이 아니다. 대부분의 HMI는 쓰기만 하고 결과를 안 읽는다.

프로토콜 쪽은 이 문제를 오래전에 정리해 뒀다. IEEE 1815(DNP3)의 select-before-operate는 SELECT 응답으로 수락 여부를 먼저 돌려주고, OPERATE 응답에 상태를 다시 담는다. OPC UA Part 4의 Method Call도 호출마다 StatusCode를 돌려준다. 권한 때문에 거절되면 Bad_UserAccessDenied, 노드가 쓰기 불가면 Bad_NotWritable이다. 반면 단순 Write는 "값을 썼다"까지만 보장한다. 로직이 그 값을 보고 움직였는지는 별개 신호다.

그래서 명령마다 네 가지를 정해 둔다.

  • 펄스냐 래치냐. IEC 61131-3의 R_TRIG으로 상승 에지를 잡는 로직이면 비트를 세워 두면 안 된다. 세워 둔 비트는 컨트롤러 재시작 직후 한 번 더 먹는다.
  • 진행 중 표시. 명령 송출과 피드백 사이 구간을 별도 상태로 띄운다. 이게 없으면 운전원이 버튼을 세 번 누른다.
  • 불일치 타이머. 내가 쓰는 기본값은 솔레노이드 밸브 5 s, 모터 10 s, MOV 30 s다. 실측 행정 시간에 50% 여유를 얹은 값이고, 현장에서 실제 행정 시간을 재면 그대로 조정한다.
  • 확인 창을 띄울 것인지. 모든 조작에 확인 창을 달면 운전원은 읽지 않고 누르는 습관을 익힌다. 기동·정지·리셋·바이패스·모드 전환·생산에 영향 있는 설정 변경까지만 남긴다.

같은 버튼이 상황에 따라 기동이기도 하고 트립 리셋이기도 하면, 나눈다. 숨은 상태로 의미가 바뀌는 컨트롤은 야간에 사고를 만든다.

막힌 이유는 태그 이름이 아니라 문장으로

"NOT READY"만 띄우는 화면은 질문을 운전원에게 넘기는 것이다. 막은 주체가 무엇인지로 분류해서 보여 준다.

표시운전원이 알아야 할 것
퍼미시브 미성립기동·개방이 안 된다. 어떤 조건인지 문장으로.
인터록 동작강제 정지·폐쇄·트립. 조작으로 풀 수 없다.
장비 고장리셋 또는 정비가 필요하다.
로컬 제어현장에서 쥐고 있다. 원격 명령은 안 나간다.
통신 불량상태 자체가 불확실하다. 조작을 막는 게 맞다.

P_104_LO_PERM 대신 "흡입 압력 낮음"을 띄운다. 태그 이름은 정비·엔지니어링용으로 같은 화면에 남기되, 이상 상황에서 운전원이 내부 명명 규칙을 해독하게 만들지 않는다. 명명 규칙 자체는 SCADA 태그 명명 가이드에서 다뤘고, 퍼미시브와 인터록을 묶어 보여 주는 방법은 퍼미시브·인터록 표시 체크리스트에 따로 정리했다.

얼어 있는 값은 상태가 아니다

멈춘 숫자가 정상값처럼 보이는 것이 페이스플레이트에서 가장 조용한 실패다. 밸브 피드백이 통신 끊김 때문에 0을 유지하는 중인데 화면은 "닫힘"으로 읽힌다.

품질은 두 층에서 확인된다. 아날로그 신호 자체는 NAMUR NE 43이 전류대로 구분한다. 유효 측정 구간은 3.8~20.5 mA, 3.6 mA 이하는 하향 고장, 21.0 mA 이상은 상향 고장이다. 센서가 단선되면 3.6 mA 밑으로 떨어지므로, 4 mA를 0%로만 환산하는 스케일링은 고장을 0%로 표시한다. 이건 화면 문제가 아니라 스케일링 문제고, 페이스플레이트는 그 결과를 그대로 물려받는다.

상위 통신에서는 OPC UA가 StatusCode로 구분해 준다. Part 4가 코드 체계를 정의하고 Part 8(Data Access)이 데이터 접근 쪽 코드를 설명한다. 현장에서 자주 보는 네 개:

  • Bad_NoCommunication — 소스는 정의돼 있는데 통신이 성립하지 않았다. 마지막 값도 없다.
  • Uncertain_LastUsableValue — 갱신이 멈췄다. 숫자는 있지만 지금 값이 아니다.
  • Uncertain_SubstituteValue — 사람이 덮어쓴 값이다.
  • Bad_OutOfService — 소스가 운전 상태가 아니다.

강제값이 제일 많이 문다. 시운전 중에 넣은 치환값은 Uncertain_SubstituteValue로 올라오는데, 화면이 Uncertain을 Good과 같게 그리면 몇 달 뒤에 아무도 모른다. 시뮬레이션·강제 상태는 숫자 옆에 눈에 띄게 표시하고, 해당 포인트가 하나라도 강제 상태면 페이스플레이트 헤더에 올린다.

알람은 ISA-18.2 상태 이름을 그대로 쓴다

페이스플레이트에 알람을 붙일 때는 해당 객체의 알람만 넣고, 상태를 ISA-18.2-2016의 이름으로 표시한다. 표준의 상태는 Normal, Unacknowledged, Acknowledged, Return-to-normal Unacknowledged, Shelved, Suppressed-by-design, Out-of-service다. 이 일곱 개를 자체 용어로 바꿔 부르는 현장이 많고, 교대 인수인계에서 꼭 어긋난다.

세 가지 억제 상태는 성격이 다르다. Shelved는 운전원이 일시적으로 내리는 것이고 시한이 있어야 한다 — 나는 교대 길이에 맞춰 8 h를 기본으로 두고 만료 시 자동 복귀시킨다. Suppressed-by-design은 로직이 내리는 것이라 운전원 조작 대상이 아니다. Out-of-service는 정비 쪽 상태다. 이 셋을 버튼 하나로 묶으면 운전원이 설계 억제를 해제해 버린다.

바이패스·억제 조작에는 권한과 기록이 따라와야 한다. IEC 62443-3-3의 SR 2.1(권한 집행)이 역할 기반 접근을, SR 2.8(감사 기록 대상 사건)이 조작 기록을, SR 2.11(타임스탬프)이 그 기록의 시각 신뢰성을 요구한다. 알람을 애초에 몇 개 띄울지는 알람 합리화 워크숍 체크리스트와 흔한 SCADA 알람 설계 실수 쪽 주제다.

색 하나로 구분하지 않는다

IEC 60073은 표시기 색의 의미를 규정한다 — 적색은 비상·위험, 황색은 비정상, 녹색은 정상이다. 다만 색만으로 구분하면 색각 이상인 운전원과 햇빛 들어오는 제어실에서 무너진다. ISA-101.01도 색을 유일한 코드로 쓰지 말라고 본다. 형상·테두리·텍스트를 같이 바꾼다. 자세한 조합은 운전 화면의 색과 형상 의미에 있다.

소수점은 계측기 분해능까지만

12비트 입력 카드는 4096 카운트다. 0~100%로 환산하면 카운트당 0.0244%이므로, 소수점 둘째 자리는 이미 계측기가 모르는 숫자다. 탱크 레벨을 63.28491 %로 띄우는 화면은 정밀한 게 아니라 시끄러운 것이다. 나는 레벨·유량에 소수점 한 자리, bar 단위 압력에 두 자리를 쓰고, 그 이상은 트렌드에서 본다.

단위는 숫자마다 붙인다. 퍼센트 표시는 특히 위험하다 — 밸브 위치인지, 제어 출력인지, 속도 지령인지, 부하율인지가 글자 없이는 구분되지 않는다.

템플릿 단위로 시운전한다

페이스플레이트는 정적 리뷰 대상이 아니다. PLC나 시뮬레이터를 물려 놓고 돌린다.

  • 허용 모드·차단 모드 각각에서 모든 명령을 눌러 본다.
  • 루프 캘리브레이터로 3.5 mA를 주입하고 화면이 0%가 아니라 품질 불량을 띄우는지 확인한다.
  • 피드백선을 뽑아 불일치 타이머가 설정값에 터지는지 본다.
  • 로컬/원격을 현장에서 전환하고 화면이 따라오는지 본다.
  • 알람 상태 일곱 개를 하나씩 만들어 표시를 맞춘다.
  • 설정·바이패스 영역에 권한 없는 계정으로 접근해 거절을 확인한다.

발견한 결함은 화면 하나가 아니라 객체 템플릿에 기록한다. 밸브 100개에 복제된 템플릿 결함은 결함 한 건이지만 운전 문제 100건이다.

다음에 확인할 것은 정해져 있다. 페이스플레이트를 띄워 두고 운전원에게 "지금 이 장비를 누가 쥐고 있나"를 물어보면 된다. 3초 안에 대답이 안 나오면 화면이 아직 설명을 안 하고 있는 것이다.