← 전체 글
태그/약 12분 읽기/ 조회

봐야 할 공정을 가리지 않으면서 노이즈 낀 아날로그 입력 필터링하기

떨리는 4-20 mA 값을 1차 필터와 이동 평균으로 다듬는 법, 필터를 어디에 둘지, 그리고 엉뚱한 태그를 필터링하면 왜 정작 필요한 알람이 늦어지는지.

SCADA태그문제 해결HMI시운전

값이 가만히 있지 않는다

펌프 토출부의 vortex 유량계가 연속 스캔에서 512, 488, 531, 497, 519 m³/h를 읽는다. 유량은 안정적이다. 운전자는 펌프가 일정하게 돌아가는 소리를 듣는다. 그런데 HMI 숫자는 ±4%로 깜빡이고 trend는 지진계처럼 보인다. 누군가 "유량계 고장" 티켓을 연다. 고장이 아니다. Vortex 계기는 shedding 주파수에서 원래 노이즈가 있고, 아날로그 입력에 약간의 유도 노이즈가 있으며, 250 ms 스캔은 모든 흔들림을 잡아낼 만큼 빠르다. 아무것도 고장 나지 않았다. 신호에 필터가 필요할 뿐이다.

필터는 넣기도 쉽고 잘못하기도 쉽다. 너무 약하면 운전자가 그 숫자를 못 믿는다. 너무 강하면 실제 공정 이상을 10초 뒤처지는 매끈한 선 밑에 묻어버린다. 핵심은 "어떤 필터냐"가 아니다. 얼마나 세게, 그리고 어디에 넣느냐다.

1차 필터: 한 줄, 손잡이 하나

주력은 1차(지수) 저역통과 필터다. 이산 형태로:

y = y + α * (x - y)     여기서   α = dt / (τ + dt)

x는 원시 샘플, y는 필터 출력, dt는 스캔 주기, τ는 필터 시정수다. 이게 전부다. 태그당 곱셈 하나, 뺄셈 하나, 상태 변수 하나. τ만 정하고 잊으면 된다.

현장에서 중요한 직관은 이렇다. 실제 계단 변화가 일어나면 필터 값은 한 τ 안에 63%, 세 τ 안에 95%까지 따라오고, 다섯 τ면 사실상 다 따라온다. 그래서 250 ms 스캔에 τ = 2 s (α ≈ 0.11)면 지터를 크게 죽이지만, 진짜 유량 계단 변화는 trend에 대부분 나타나기까지 ~6 s가 걸린다. 이 지연은 부작용이 아니다. 그게 바로 필터다. 노이즈 제거와 응답 속도를 1대1로 맞바꾸는 것이다.

τ는 실제 공정이 얼마나 빨리 움직이는지로 정한다. 분 단위로 변하는 탱크 레벨은 τ = 1030 s를 견디고 유리처럼 매끈해진다. 1초도 안 되어 발달하는 압축기 surge 신호는 2 s 필터를 아예 못 견딘다. 이벤트 자체를 지워버리기 때문이다. 애매하면 가볍게(τ = 12 s 정도) 시작하고, 운전자가 불평을 멈출 때까지만 올린다. 스크린샷을 깔끔하게 만들려고 과하게 필터링하는 것이 이상 징후를 놓치는 길이다.

이동 평균 vs. 1차 필터

N 샘플 이동 평균(boxcar) 필터는 또 다른 흔한 선택이다. 어떤 면에서는 더 평평하다. 최근 N개 샘플이 똑같은 가중치를 갖는다. 하지만 태그당 N개 샘플을 저장해야 하고, 지연은 약 N·dt/2로 뭉툭하다. 250 ms에서 20 샘플이면 그룹 지연 2.5 s에 포인트마다 20-깊이 링 버퍼 메모리까지 든다. 태그 수천 개면 무시 못 할 양이다.

대부분의 SCADA 작업에서는 1차 필터가 이긴다. 더 싸고, 숫자 하나로 튜닝되며, 지수 가중치라 최근 샘플이 지배적이어서 비슷한 매끈함의 boxcar보다 실제 변화에서 더 빨리 회복한다. 이동 평균은 균등 가중이 특별히 필요할 때만 꺼낸다. 예를 들어 펌프 한 사이클 전체에 걸쳐 값을 평균 내 사이클 평균을 보고할 때다.

둘 다 스파이크는 잘 못 걸러낸다. 한 개의 튀는 샘플 — full-scale로 읽히는 1 ms 글리치 — 이 두 필터 모두를 끌어당긴다. 연속 노이즈가 아니라 고립된 스파이크와 싸운다면, 작은 median 필터(최근 3개나 5개 샘플의 중앙값을 취함)가 이상치를 통째로 버리고 평균에 번지게 하지 않는다. Median 먼저, 그다음 가벼운 1차 필터가 스파이크도 있고 노이즈도 있는 신호에 좋은 조합이다.

그 숫자를 소유한 계층에서 한 번만 필터링하라

가장 자주 보는 실수: 같은 신호가 세 번 필터링된다. Transmitter에 damping이 4 s로 잡혀 있고, PLC가 1차 블록을 더하고, 그다음 누군가 SCADA trend pen에 스무딩을 건다. 그래도 여전히 약간 부산해 보였기 때문이다. 각 단계가 지연을 더하고, 지연은 누적된다. 이제 운전자는 공정을 15초 뒤처져 따라가는 숫자를 보고 있고, 제어 루프가 왜 hunting하는지 아무도 모른다.

필터가 어디 살지 한 번에 정하라. 값이 표시와 느린 제어에만 쓰인다면 나는 transmitter 자체의 damping을 기본으로 쓴다. 노이즈 원천에 가장 가깝고, 하류의 모든 소비자가 같은 깨끗한 숫자를 받는다. 대부분의 HART transmitter는 damping 상수(보통 0~32 s)를 노출한다. 거기서 설정하고 PLC와 SCADA는 건드리지 말라. 소비자마다 다른 스무딩이 필요하다면 — 제어용 빠른 원시값, trend용 느린 값 — 화면마다 다시 필터링하지 말고 PLC에서 필터링해 이름을 명확히 붙인 두 태그를 발행하라. 무엇을 고르든 기록해 둬라. 문서화되지 않은 필터는 미래의 엔지니어가 설계대로 정확히 동작하는 지연을 하루 종일 쫓게 되는 이유다.

트립을 먹이는 태그는 필터링하지 마라

이게 물린다. 1차 필터는 저역통과다. 빠른 변화를 감쇠시킨다. Rate-of-change 알람, 빨리 동작해야 하는 high-high 트립, PID 루프의 미분항은 모두 빠른 변화에 의존한다. 이 중 무엇이든 입력을 필터링하면, 그걸 만든 바로 그 목적을 약화시킨 것이다. Rate-of-change 알람 앞의 τ = 5 s 필터는 알람이 쓸모 있던 시점을 지나서까지 알람을 늦출 수 있다. 지연 1초마다 얼마만큼의 runaway를 내주는지는 [[rate-of-change-alarm-runaway-detection-notes]]를 보라.

깔끔한 분리는 이렇다. 보호와 rate 로직용으로는 필터 안 건(또는 median만 가볍게 건) 신호 사본을 유지하고, 표시와 느린 trend를 구동하는 사본만 필터링하라. PID라면, 노이즈 때문에 출력이 떨린다면 전체 PV가 아니라 미분 입력을 필터링하라. 대부분의 컨트롤러에 바로 이 용도의 미분 필터 파라미터가 있다. 그래야 비례 응답까지 느려지지 않는다.

그리고 어떤 필터든 손대기 전에 히스토리언 쪽을 확인하라. 이 태그를 압축 deadband로 저장하고 있다면([[historian-deadband-and-compression-field-notes]] 참고), deadband 판정 앞에서 필터링하라. Swinging-door 압축에 원시 노이즈를 먹이면 모든 지터를 "유의미한" 변화로 저장한다. 노이즈로 뚱뚱한 아카이브가 생기고 deadband는 아무 일도 안 한다. 압축 앞에 적당한 필터를 두면 저장 이벤트가 크게 줄고 trend는 여전히 진실을 말한다.

필터링한 신호가 이상해 보일 때 확인할 것

  • 알려진 계단 변화 동안 trend가 공정보다 뒤처짐(펌프 기동, 레벨 관찰): 지연을 재라. τ나 boxcar 그룹 지연에 가까우면 정상이다. 그게 물리다. 훨씬 길면 두 번 이상 필터링하고 있는 것이다.
  • 알람이 늦게 들어옴: 알람이 표시 사본이 아니라 원시 태그를 읽는지 확인하라.
  • 필터링 후에도 여전히 지터: 노이즈가 스캔 속도이거나 그보다 느릴 수 있다. 필터는 자신의 응답보다 느린 노이즈는 못 없앤다. τ를 더 올리기 전에 배선, 접지, 실드 종단을 보라.
  • 필터 값이 실제 읽음값보다 낮은 곳에서 정체: 램프 신호에 τ를 아주 높게 잡으면 항상 뒤처진다. 스케일링 오류가 아니라 램프에서의 정상상태 지연이다.

필터는 손잡이지 수리가 아니다. 밑의 신호가 진짜 나쁘면 — 뜬 실드, ground loop, VFD 노이즈와 싸우는 transmitter — 필터는 증상만 가리고 진짜 고장은 그대로 남는다. 숫자를 다듬는 것은 왜 움직였는지 알아낸 다음이지, 알아내는 대신이 아니다.