← 전체 글
네트워킹/약 12분 읽기/— 조회

Select-Before-Operate가 잘못된 DNP3 명령의 차단기 오작동을 막는 법

DNP3 제어 시운전: SBO와 direct operate 선택, CROB 코드 읽기, 느린 회선의 select 타임아웃, 피드백으로 검증하는 법.

네트워킹SCADA문제 해결시운전

제어에서 저지른 DNP3 실수는 실제로 아프다

DNP3 outstation을 잘못 읽으면 데이터를 잃는다. 잘못 쓰면 그대로 있어야 할 차단기를 동작시키고, 펌프를 기동하고, 밸브를 닫는다. 제어 명령은 별도의 시운전 규율을 받을 자격이 있다. 실패 형태가 나쁜 트렌드가 아니라 물리적 동작이기 때문이다.

DNP3 제어(IEEE 1815)는 거의 항상 CROB(Control Relay Output Block), 즉 오브젝트 그룹 12를 쓴다. CROB는 Modbus처럼 "이 코일에 1을 쓴다" 같은 단순한 것이 아니다. 제어 코드, on-time, off-time, count를 담으며, 두 가지 아주 다른 방식으로 전달될 수 있다. select-before-operate 또는 direct operate다. 방식, 코드, 피드백 검증을 제대로 맞추는 것이 일의 전부다.

Select-Before-Operate와 Direct Operate

DNP3는 제어를 보내는 두 가지 방법을 준다. 서로 바꿔 쓸 수 있는 것이 아니다.

방식순서언제 쓰나
Select-Before-Operate(SBO)마스터가 Select 전송 → outstation이 되돌려 echo → 마스터가 Operate 전송차단기, 밸브, 모터 등 결과가 큰 모든 것
Direct Operate마스터가 단일 메시지로 Operate 전송위험이 낮고 빈도가 높아 2단계 핸드셰이크가 낭비인 포인트

SBO의 핵심은 echo다. 마스터가 Select를 보내면 outstation은 자신이 이해한 내용을 그대로 회신한다. 이 포인트, 이 제어 코드, 이 시간들. 마스터는 그 echo를 자신이 의도한 것과 비교한다. 일치할 때만 Operate를 보낸다. 손상되거나 잘못 지정된 명령은 비교에서 걸러져 아무것도 동작시키지 않는다.

Direct operate는 핸드셰이크를 건너뛴다. 메시지가 하나라 더 빠르고 느린 회선에 가볍지만, outstation이 동작하기 전 확인 단계가 없다. 응답조차 돌려주지 않는 "direct operate, no acknowledge" 변형도 있다. 고빈도 설정값성 출력에는 쓸 만하지만 쇠붙이를 움직이는 것에는 위험하다.

현장 규칙: 공정이나 사람을 다치게 할 수 있는 모든 것에는 SBO, direct operate는 무해하고 빈번한 포인트에만. 선택을 포인트별로 기록한다. 이것은 성능 튜닝 손잡이가 아니라 안전 결정이다.

Select 타임아웃은 실재하고 물어뜯는다

SBO에는 사람들이 잊는 타이머가 있다. outstation이 Select를 echo한 뒤, 선택은 제한된 시간 동안만 열려 있다. Operate가 그 창 안에 도착하지 않으면 선택이 만료되고 Operate는 거부된다.

빠른 유선 회선에서는 이게 드러나지 않는다. 왕복 지연이 수 초인 무선, 셀룰러, 위성 회선에서는 Select가 echo되고 Operate가 전송돼도 창이 이미 닫혀 outstation이 거부할 수 있다. 증상이 사람 미치게 한다. 명령이 "가끔 된다", 보통 회선이 조용할 때만.

시운전 확인 항목.

  • outstation의 select 타임아웃 값을 찾는다. 대부분의 장치에서 설정 가능하며 기본값이 느린 회선의 왕복보다 짧은 경우가 많다.
  • 실제 회선에서 Select-to-Operate 왕복 시간을 측정한다. 벤치가 아니라 현장에서.
  • Operate가 "선택 안 됨"이나 타임아웃 상태로 간헐 실패하면 배선보다 창을 먼저 의심한다.

CROB 필드 읽기

CROB는 on/off 이상을 담는다. 현장에서 중요한 필드는 다음과 같다.

  • 제어 코드: 무엇을 할지. 흔한 것은 Latch On, Latch Off, 그리고 Trip/Close 한정자와 짝을 이룬 Pulse On이다. 차단기 제어는 거의 항상 Trip과 Close 코드를 써서 outstation이 두 물리 출력 중 올바른 쪽을 구동하게 한다.
  • Count: 동작을 몇 번 수행할지. 거의 모든 경우 1이어야 한다. 걸리거나 잘못 설정된 count는 단일 펄스가 여러 번이 되는 경로다.
  • On-time / Off-time: 밀리초 단위 펄스 지속 시간. 차단기 코일이나 모터 기동을 구동하는 순시 출력에서는 on-time이 펄스 폭이다. 너무 짧으면 릴레이가 픽업하지 않고, 너무 길면 정격을 넘겨 코일을 여자 상태로 붙잡는다.

Trip과 Close는 특히 조심해야 한다. 이들이 별개의 제어 코드인 이유는 바로 차단기 "개방"과 "투입"이 별도의 물리 출력으로 가서 걸린 비트 하나로 혼동될 수 없게 하기 위해서다. 시운전에서 Trip 명령이 trip 출력만을, 오직 trip 출력만을 여자하는지 확인하고, Close도 마찬가지로 확인한다. 차단기를 인출(rack out)하거나 그 밖에 동작해도 안전한 상태에서 한다.

응답이 아니라 피드백을 검증하라

성공한 DNP3 Operate 응답은 outstation이 명령을 받아들여 수행했다는 뜻이다. 현장 장치가 실제로 움직였다는 뜻은 아니다. 상태 코드는 프로토콜 계층에서 명령이 받아들여졌음을 알려 주고, 공정 포인트는 설비가 반응했음을 알려 준다.

결과가 큰 모든 제어에는 피드백 포인트와 확인이 필요하다.

  1. 제어를 보낸다.
  2. Operate가 성공 상태를 돌려줬는지 확인한다("이미 활성", "동작 횟수 초과", "선택 안 됨", "하드웨어 오류"가 아니라).
  3. 대응하는 상태·피드백 포인트를 읽어 장치가 기대 시간 안에 명령한 상태에 도달했는지 확인한다.
  4. 상태는 성공인데 피드백이 끝내 바뀌지 않으면, 프로토콜 문제가 아니라 배선·코일·현장 장치 문제다.

이것은 HMI에서 적용하는 명령-피드백-타임아웃 규율을 프로토콜 계층으로 내린 것이다. Operate 상태와 피드백 포인트는 서로 다른 두 질문에 답하며, 하나를 다른 하나로 취급하는 것이 "명령은 OK라는데" 와 "밸브는 안 움직였다"가 공존하는 방식이다.

흔한 실패 서명

  • Operate에서 "선택 안 됨": select 타임아웃이 만료됐거나, Select가 도착하지 않았거나, Operate가 Select와 다른 포인트를 지정했다. 회선 지연과 주소 지정을 확인한다.
  • Operate가 "동작 횟수 초과"로 거부: count 필드가 틀렸거나, outstation의 제어 한도가 포인트를 보호하고 있다.
  • 명령은 성공인데 아무것도 안 움직임: 피드백 포인트를 읽는다. 프로토콜은 정상, 현장이 아니다.
  • 한 명령에 장치가 두 번 동작: count가 1보다 크거나, 마스터가 이미 실행된 Operate를 재시도했다. 불안정한 회선에서는 SBO를 선호해, 재시도된 Select가 두 번째 동작을 일으키지 못하게 한다.
  • 펄스 출력이 픽업 안 함: on-time이 릴레이나 코일에 필요한 것보다 짧다.

시운전 체크리스트

  1. 제어 가능한 모든 포인트에 대해 방식(SBO 또는 direct operate)을 기록하고, direct operate는 안전 근거로 정당화한다.
  2. 각 제어의 제어 코드, count, on-time, off-time을 기록하고, 의도적으로 다르게 하지 않는 한 count가 1인지 확인한다.
  3. Trip과 Close가 별도의 물리 출력을 구동하는지 장치가 동작해도 안전한 상태에서 시험한다.
  4. outstation의 select 타임아웃을 찾아 측정된 회선 왕복 시간을 넉넉히 넘는지 확인한다.
  5. 각 제어를 끝에서 끝까지 시험한다. Select echo 일치, Operate 성공, 피드백 포인트가 기대 시간 안에 명령한 상태 도달.
  6. 어긋나거나 만료된 Select를 일부러 시험해, outstation이 동작을 거부하는지 확인한다.
  7. 마스터가 Operate 상태 코드를 조용히 삼키지 않고 운전원에게 드러내는지 확인한다.
  8. 포인트별로 기록한다. 방식, 제어 코드, 시간들, 피드백 포인트, 기대 응답 시간을 포인트 맵과 함께.

거의 아무도 안 하지만 내가 꼭 시키는 시험 하나. 한 포인트로 Select를 보내고 다른 포인트로 Operate를 보내, outstation이 거부하는지 확인한다. 그래도 동작한다면 마스터에서 echo 비교가 실제로 일어나지 않는 것이고, 그 시스템의 모든 SBO는 핸드셰이크를 걸친 direct operate일 뿐이다. 그게 SBO의 안전 논리 전부이니, 손상된 프레임이 그 틈을 찾는 날이 오기 전에 시운전에서 증명해 두라.