한 협력업체가 가동 중인 Logix 프로세서에 "룽 하나만 추가하자"고 했다. 오수 중계 펌프장을 제어하는 프로세서였다. 추가할 룽은 새 세척 밸브의 퍼미시브로, 겉보기엔 무해했다. 그가 편집을 어셈블하자 리드 펌프가 약 400 ms 동안 떨어졌다. 체크밸브가 쾅 닫히고 운전원이 전화를 걸 만큼의 시간이었다. 그의 새 룽은 펌프를 건드리지도 않았다. 문제는 스캔 순서였다. 그의 룽이 읽는 태그를 뒤쪽 룽이 쓰고 있었고, 그래서 한 스캔 동안 펌프의 실인(seal-in)이 낡은 0을 봤다.
온라인 편집은 PLC 작업 중에서 문서가 가장 적고 긴장도는 가장 높은 영역이다. 실제 설비를 제어하는 동안 로직을 고치는 일이기 때문이다. 대부분은 일상적이고 문제없다 — 문제가 생기기 전까지는. 내가 접근하는 방식은 이렇다.
온라인 편집은 다운로드가 아니다
먼저 두 동작을 확실히 구분하자. 많은 사람이 "다운로드"라는 말로 둘 다를 가리키기 때문이다.
다운로드는 프로젝트 전체를 프로세서로 보낸다. ControlLogix나 CompactLogix에서는 컨트롤러가 Program 모드로 강제 전환되고, 그동안 모든 출력이 설정된 Program 모드 상태(대개 소자/de-energized)로 간다. 공정을 먼저 세우지 않았다면 가동 중인 공정에 전체 다운로드를 하지 않는다. Siemens S7-1500에서는 정지된 CPU에 하는 전체 다운로드가 이에 해당한다.
온라인 편집은 프로세서가 Run 상태를 유지한 채 로직을 수정한다. Studio 5000의 절차는 Start Pending Edits → Test Edits(원본과 새 버전이 모두 컴파일되고 테스트 버전이 실행됨) → Assemble Edits(내 버전이 실행 로직이 되고 원본은 폐기됨) → 이후 최종 확정(finalize/accept)이다. Test 단계에서 Cancel하면 원본이 내내 계속 돌아간다. Siemens TIA Portal은 이를 "download in RUN"이라 부르고 훨씬 제한적이다. 기존 로직은 바꿀 수 있지만 블록 인터페이스 추가, 데이터 블록 구조 변경, 태그 테이블 수정은 대개 정지를 강제한다. Rockwell이 더 관대한데, 바로 그래서 자기 발등을 찍기가 더 쉽다.
실제로 무는 함정들
스캔 순서. 위의 펌프장 이야기가 그것이다. 래더는 위에서 아래로, 왼쪽에서 오른쪽으로 푼다. 뒤쪽에서 만들어지는 값을 소비하는 룽을 앞에 끼워 넣으면, Assemble 후 첫 스캔에서 그 값은 한 스캔 낡은 값이다. 빠르게 걸리는 실인이나 원샷에는 낡은 한 스캔이면 충분히 사고가 난다. 그 룽의 입력을 만들어 내는 로직 뒤에 룽을 넣거나, 첫 스캔 가드를 추가하라.
Assemble 중 실인·OTE 글리치. OTE가 있는 룽을 지웠다가 수정해 다시 넣으면, Assemble 도중 그 출력의 룽 조건이 재평가되는 구간이 생긴다. 편집이 모터 실인을 잡아 주는 분기를 바꾸면 OTE가 한 스캔 동안 떨어질 수 있다. 하드웨어 접촉기로 실인 걸린 모터는 대개 한 스캔 정도는 견디지만, 솔레노이드나 빠른 VFD 인에이블은 못 견딜 수 있다. 출력이 절대 글리치를 내면 안 된다면, 편집 전에 OTL로 래치하고 이후 언래치하라 — 아니면 그 룽은 온라인으로 편집하지 마라.
포스는 여전히 살아 있다. 온라인 편집과 포스는 서로 독립이다. 누군가 이전 트러블슈팅에서 출력을 포스해 두고 갔다면, 당신의 편집은 그 출력에 아무 영향도 못 주고 당신은 그걸 눈치채지 못할 수도 있다. 편집 전에 포스 상태를 확인하라 — FORCE LED와 I/O Forces 창. 나는 로직에 손대기 전에 항상 남은 포스를 먼저 정리한다.
초기화 안 된 태그. 새 태그를 만들어 비교 명령에서 참조하면, 무언가 값을 써 주기 전까지 그 값은 0이다. 새 설정값 태그에 대한 GRT는 "0 > 0 = false"로 읽히는데, 그게 안전측일 수도 있고 아닐 수도 있다. 새 설정값·구성 태그는 미리 채워 넣어라 — 편집 안에서 첫 스캔 MOV로든, HMI에서든, 그걸 쓰는 로직이 활성화되기 전에.
HMI 쓰기 경합. HMI가 쓰는 태그를 새 룽도 쓴다면, 이제 그 태그에 주인이 둘이다. 누가 소유할지 정하고 나머지는 읽기 전용으로 만들어라. 이것은 여느 명령 중재 문제와 같은 규율일 뿐, 가동 중에 끼어들어 생겼다는 차이만 있다.
키스위치와 모드
ControlLogix에서 온라인 편집을 하려면 키스위치가 REM(원격)에 있어야 한다 — RUN 위치에서는 프로세서가 편집을 거부하며, 잠긴 플랜트에서 그 위치의 존재 이유가 바로 이것이다. 편집이 거부됐다면 대개 지난 변경 뒤 누군가 잠금 삼아 키를 RUN으로 돌려놨다는 뜻이다. 왜 거기 있는지 묻지 않고 도로 돌려놓지 마라.
이중화 섀시(ControlLogix Redundancy 또는 Hot Standby)에서는 온라인 편집이 Assemble의 일부로 세컨더리에 자동 크로스로드된다 — 단, 세컨더리가 동기화되고 자격을 갖췄을 때만. 세컨더리가 disqualified인 상태에서 편집하면 프로그램 버전이 갈라지고, 다음 전환 때 옛 로직이 돈다. 편집 전후로 "Synchronized"를 확인하라.
안전 로직은 규칙집이 다르다
위의 어느 것도 SIL 등급 안전 컨트롤러에는 함부로 적용되지 않는다. 로직이 안전 컨트롤러(GuardLogix, S7 F-CPU, HIMA)에 있다면 안전 태스크의 온라인 편집은 IEC 61511의 지배를 받는다 — 문서화된 바이패스/오버라이드 절차를 따르고, 변경을 MOC(management of change)로 기록하며, 바이패스를 해제하기 전에 영향받은 안전 기능을 재검증한다. "룽 하나만 추가하자"는 로직 솔버 근처에 있어선 안 되는 말이다. 같은 GuardLogix 안의 표준(비안전) 태스크는 정상적으로 편집할 수 있지만 안전 태스크는 아니다.
내가 실제로 돌리는 사전 점검표
가동 중인 프로세서에 손대기 전에:
- 현재 프로그램을 업로드해 날짜가 붙은 파일명으로 저장한다. 편집이 틀어졌을 때 가장 빠른 복구는 언두가 아니라 알려진 정상 파일이다.
- 포스를 확인한다 — 남은 것은 지우고, 의도한 것은 기록한다.
- 키스위치가 REM인지 확인하고, 이중화 시스템이면 세컨더리가 동기화됐는지 확인한다.
- 공정 상태를 파악한다. 펌프가 돌고 있는가? 배치가 홀드 스텝에 있는가? 가동 중인 SFC의 활성 스텝이나 배치 페이즈를 편집하는 것이 반응기를 좌초시키는 방법이다. 가능하면 안전 상태를 기다려라.
- 룽의 이웃을 읽는다 — 무엇이 그 입력을 쓰고, 그 출력이 무엇에 실인 거는지. 스캔 순서를 위해 삽입 지점을 계획하라.
- 화면만이 아니라 설비를 지켜보는 운전원을 둔다. 400 ms 드롭은 트렌드에 뜨기 전에 현장에서 쾅 소리로 먼저 나타난다.
Assemble 후에는 손댄 출력을 라이브 스캔으로 꼬박 1분간 지켜본 뒤에야 끝났다고 부른다 — 그리고 그제서야 편집을 최종 확정(finalize/accept)해 변경이 전원 재투입에도 남게 한다. 확정하지 않은 Test Edits는 다음 전체 다운로드에서 사라지고, 그 놀라움은 몇 주 뒤 다른 사람이 프로젝트를 밀어 넣을 때 찾아온다.