
이 글이 나한테 해당되는지 먼저 확인해보세요
이런 상황이 하나라도 해당된다면, 이 글이 도움이 될 겁니다.
- 알람이 발생했는데 배너에 표시가 안 된다
- 알람이 해제됐는데 배너가 계속 켜져 있다
- 이벤트성 알람이 배너에 계속 쌓여서 의미 없는 숫자가 된다
- 알람 이력은 있는데 어떤 게 지금 문제이고 어떤 게 이미 지나간 건지 구분이 안 된다
- 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 처리도 배너 처리도 자연스럽게 결정됩니다.
'(개인Project)_개발 > PLC-PC 연결' 카테고리의 다른 글
| [Program][보족] 현장 PC에서 서버를 켜면 자동으로 감시가 시작되게 만든 방법 (0) | 2026.05.23 |
|---|---|
| [Program][보족] 설정이 계속 날아가는 이유 (localStorage의 한계와 DB 전환 시점) (0) | 2026.05.22 |
| [Program][보족] 브라우저를 닫았더니 알람이 사라졌다 (0) | 2026.05.20 |
| [Program][Phase 2] 브라우저를 꺼도 알람이 쌓인다 (PLCLink Phase 2 완성기) (0) | 2026.05.19 |
| [Program][보족] bat 파일 더블클릭했는데 창이 바로 닫힌다 (줄바꿈 문자 문제일 수 있습니다) (0) | 2026.05.16 |