본문 바로가기

(개인Project)_개발/PLC-PC 연결

[Program][보족] 알람이 났는데 왜 배너에는 안 뜨나요? (레벨 알람과 이벤트 알람의 차이)

반응형

이 글이 나한테 해당되는지 먼저 확인해보세요

이런 상황이 하나라도 해당된다면, 이 글이 도움이 될 겁니다.

  • 알람이 발생했는데 배너에 표시가 안 된다
  • 알람이 해제됐는데 배너가 계속 켜져 있다
  • 이벤트성 알람이 배너에 계속 쌓여서 의미 없는 숫자가 된다
  • 알람 이력은 있는데 어떤 게 지금 문제이고 어떤 게 이미 지나간 건지 구분이 안 된다
  • PLC 모니터링 툴에서 알람 로직을 어떻게 설계해야 할지 모르겠다

알람을 그냥 "조건이 맞으면 기록한다"로만 설계했다가 현장에서 운영해보면 반드시 이 문제가 생깁니다.

저도 그랬고요.


용어 먼저 짚고 넘어갈게요

이 글에서 자주 나오는 단어들을 먼저 설명하겠습니다.

 

레벨 알람 (Level Alarm)이란

온도가 80도 이상인 상태가 지속되고 있다, 압력이 기준치 초과 중이다, 신호가 ON 상태다 

이렇게 "지금 이 순간에도 문제가 계속되고 있는" 상태를 감지하는 알람입니다.

수위계가 위험 선을 넘은 채로 유지되는 것과 같습니다.

조건이 사라질 때까지 계속 활성 상태입니다.

 

이벤트 알람 (Event Alarm / CHANGED 알람)이란

값이 바뀌었다, 신호가 OFF에서 ON으로 전환됐다

이렇게 "그 순간에 일어난 일" 을 기록하는 알람입니다.

문 열림 감지 센서처럼 문이 열린 그 순간을 기록하는 겁니다.

문이 다시 닫혀도 "열렸었다"는 기록은 남습니다. 지금 문제가 지속 중인 게 아니라, 과거에 일어난 사건을 기록한 것입니다.

 

active 상태란

알람 이력 DB에 저장되는 값으로, "이 알람이 지금도 진행 중이냐"를 나타냅니다.

active=1이면 지금도 문제가 있다는 뜻이고, active=0이면 이미 해결됐거나 순간 이벤트였다는 뜻입니다.


처음에 모든 알람을 똑같이 처리했다

PLCLink 초기 알람 설계는 단순했습니다.

조건이 맞으면 기록한다. 그게 전부였어요.

ON 조건이든, 값 변화 감지든, 온도 초과든

조건에 맞으면 DB에 INSERT하고 배너 카운트를 올렸습니다.

설계가 단순해서 구현도 빨랐습니다.

 

그런데 실제로 써보니 두 가지 문제가 동시에 생겼습니다.

 

첫 번째 문제 : 배너 숫자가 의미 없어졌다

Y3920 신호가 공정 중에 계속 ON/OFF를 반복합니다.

정상 동작인데, 값이 바뀔 때마다 알람이 발화하니까 "알람 47건 활성"이 됩니다.

배너를 봐도 47건 중 어떤 게 진짜 문제인지 알 수가 없어요.

 

두 번째 문제 : 해결했는데 배너가 안 꺼진다

온도가 80도를 넘어서 알람이 났고, 조치를 해서 온도가 내려갔습니다.

그런데 배너는 여전히 켜져 있습니다.

"이미 해결된 알람"인데 배너가 계속 활성 상태를 가리키고 있어요.

 

두 문제의 원인은 사실 같은 곳에 있었습니다.

알람의 성격이 다른데 똑같이 처리한 것.


알람에는 두 가지 성격이 있다

불이 난 상황을 생각해봅시다.

"지금 불이 나고 있다"는 현재 진행형입니다.

불이 꺼질 때까지 위험 상태가 지속됩니다.

배너에 계속 표시되어야 하고, 불이 꺼지면 그때 해제되어야 합니다.

 

"아까 담배꽁초가 떨어졌다"는 과거 사건입니다.

지금은 치웠지만 그 사건이 있었다는 기록은 남겨야 합니다.

지금도 위험하다는 배너를 계속 켜두는 건 맞지 않아요.

 

PLC 알람도 똑같습니다.

 

레벨 알람 (지속 상태) : ON 중이다 / OFF 상태다 / 값이 기준치를 초과 중이다

  • 조건이 유지되는 동안 계속 활성 상태
  • 배너에 표시, 조건이 사라지면 자동 해제

이벤트 알람 (순간 사건) : 값이 바뀌었다 / 신호가 전환됐다

  • 그 순간 발생한 사건 기록
  • 팝업으로 알림, 배너에는 쌓지 않음

이 둘을 구분하는 게 알람 설계의 핵심이었습니다.


어떻게 구분해서 처리했나

PLCLink에서는 알람 룰을 등록할 때 타입을 선택합니다.

알람 조건 타입:
  - ON          : 신호가 ON 상태인 동안 (레벨)
  - OFF         : 신호가 OFF 상태인 동안 (레벨)
  - 초과 (>)   : 값이 기준치를 넘는 동안 (레벨)
  - 미만 (<)   : 값이 기준치 아래인 동안 (레벨)
  - CHANGED     : 값이 바뀐 순간 (이벤트)

DB에 기록할 때 active 컬럼 처리가 달라집니다.

# 레벨 알람 : 조건이 맞으면 active=1로 기록
if condition_met:
    if not already_active:  # 중복 INSERT 방지
        insert_alarm(rule, value, active=1)

# 조건이 해제되면 active=0으로 업데이트
if not condition_met:
    if was_active:
        update_alarm_to_inactive(rule)

# 이벤트 알람 (CHANGED) : 발생 순간에 active=0으로 기록
if value_changed:
    insert_alarm(rule, value, active=0)  # 처음부터 active=0

active=0으로 기록한다는 게 처음에 이상하게 느껴질 수 있습니다.

"알람이 발생했는데 왜 비활성 상태로 저장하나?"라고요.

이건 active의 의미를 "알람이 발생했냐"가 아니라 "지금 이 순간에도 문제가 지속 중이냐"로 정의했기 때문입니다.

이벤트 알람은 발생한 건 맞지만, 지금도 문제가 지속 중인 건 아니거든요. 그래서 이력은 남기되 active는 0으로 시작합니다.


화면에서는 어떻게 다르게 표시하나

배너와 팝업을 분리했습니다.

배너 (헤더 알람 카운트) : active=1인 항목만 집계

배너 숫자는 "지금 이 순간 해결되지 않은 문제의 수"를 뜻합니다.

이벤트 알람은 배너에 포함되지 않습니다.

47건이 아니라 진짜 문제인 2건만 표시됩니다.

 

팝업 : 새로 추가된 이력 전부에 반응

레벨 알람이든 이벤트 알람이든, 처음 발화하는 순간에는 팝업이 뜹니다.

뭔가 새로운 일이 생겼다는 건 알아야 하니까요.

팝업을 닫는 방식도 두 가지로 나뉩니다.

팝업에서 "확인" 누르면
  - 레벨 알람 : 팝업만 닫힘, active=1 유지, 배너에 계속 표시
  - 이벤트 알람 : 팝업 닫힘, 이미 active=0이라 배너에 없음

팝업에서 "조치 완료" 누르면
  - 레벨 알람 : DB에 active=0 기록, 배너에서 제거

운전자 입장에서는 배너 숫자가 "지금 당장 확인해야 하는 것의 수"가 됩니다.

배너가 0이면 지금 진행 중인 문제가 없다는 뜻이고, 숫자가 있으면 아직 해결 안 된 게 있다는 뜻입니다.


설계하면서 실수한 것

레벨 알람 중복 INSERT 문제가 있었습니다.

온도가 80도를 넘어서 알람이 발화했는데, 1초마다 폴링을 하니까 온도가 계속 80도 이상인 동안 매초 INSERT가 되는 겁니다.

이력 페이지에 같은 알람이 100개씩 쌓였어요.

해결은 이미 active=1인 레벨 알람이 있으면 중복 INSERT를 막는 조건을 추가하는 것이었습니다.

# 이미 활성 중인 동일 알람이 있으면 INSERT 안 함
existing = query_active_alarm(rule_id)
if existing:
    continue  # 중복 스킵
else:
    insert_alarm(rule, value, active=1)

테스트할 때는 짧은 시간 동안만 조건을 걸어보니까 몰랐던 문제입니다.

현장에서 장시간 돌려봐야 발견되는 종류의 버그예요.


정리

항목 레벨 알람 이벤트 알람 (CHANGED)
조건 예시 ON / OFF / > / < 값 변화 감지
성격 지속 상태 순간 사건
active 초기값 1 0
자동 해제 조건 사라지면 active=0 해당 없음
배너 표시 포함 (active=1인 동안) 미포함
팝업 알림 처음 발화 시 발화 시
중복 방지 필요 (1초마다 폴링이니까) 불필요

마치며

처음에 알람을 설계할 때는 "조건이 맞으면 기록하면 되지 않나?"라고 생각했습니다.

그런데 실제로 현장에서 운영하면 금방 한계가 보입니다.

 

배너 숫자가 의미 없어지고, 어떤 게 진짜 문제인지 모르고, 해결했는데 계속 알람이 켜져 있고.

알람을 설계할 때 한 가지만 먼저 정하면 나머지가 따라옵니다.

"이 알람은 지금도 진행 중인 문제를 가리키는가, 아니면 과거에 일어난 사건을 기록하는가?"

이 질문에 답할 수 있으면, active 처리도 배너 처리도 자연스럽게 결정됩니다.

반응형