5편은 AI가 래더를 짜는 이야기였다. 이번 편은 진단 이야기다. 구동 중인 PLC에 문제를 일부러 심어 놓고, AI가 원인을 찾아 고치는 과정을 되짚어 본다.
진단을 만들면서 기준으로 삼은 건 현장 사람이 고장을 잡는 방식이다. 값을 확인하는 순서가 있고, 함부로 만지면 안 되는 경계가 있고, 실험 전에는 예측부터 한다. 그 방식을 문서와 도구로 옮겨 AI한테 쥐여 줬다.
시험은 이렇게 준비했다. 정상 동작하는 이송 라인을 하나 만들고 접점 하나를 일부러 반대로 바꿔 넣었다. 그리고 그 사실을 모르는 AI 세션을 새로 열었다. 심은 쪽은 진단이 끝날 때까지 개입하지 않았다. 답을 아는 사람이 옆에서 훈수하면 시험이 안 되기 때문이다.
설비
컨베이어 두 대가 제품을 이어 나른다. 투입 컨베이어 CV1이 제품을 끝까지 이송하면 도착 센서가 감지하고, 배출 컨베이어 CV2가 넘겨받는다. 이관이 15초를 넘기면 정체 알람이 뜨고 라인이 정지한다. 기동, 정지, 리셋 버튼이 있고 래더는 10줄이다. 실물 보드 없이 로컬 런타임으로 구동하는 데스크 검증 환경이라, 센서와 버튼은 값을 직접 걸어서 조작한다. 뒤에서 AI가 검증 실험을 할 때 쓰는 것도 같은 방법이다.

전체 흐름
진단은 다섯 단계로 진행됐다. 그림 오른쪽이 AI가 한 일이고, 왼쪽이 사람이 개입한 지점이다.

원인 찾기
에디터에서 클로드 콘솔을 열고 증상만 한 줄 적었다.
사용자 → AI
TransferLine 데스크 검증 중입니다. 실보드 없이 로컬 런타임이고 센서·버튼은 force로 모사합니다. 기동 걸면 CV1은 도는데, 물건이 CV1 끝에 도착해도 CV2가 안 돕니다. 정체 알람도 안 뜹니다. 원인 진단하고 고쳐주세요.
첫 응답은 래더 분석이 아니었다. 따라갈 절차를 선언하고 런타임 상태부터 확인했다.
AI → 사용자
진단 작업으로 진입합니다. 3국면 절차(관찰 → 개입 → 치유·검증)를 따릅니다. 먼저 국면 1 — 관찰(무장 불필요, 읽기 전용)부터.
L0 정상 —
state=RUN,recentErrors=(없음), 활성 force 0건,armed=False. L1(시스템 결함)도 깨끗합니다. 로직(L2)으로 갑니다.
현장 문제의 절반은 로직이 아니라 통신이나 하드웨어에서 생긴다. 그래서 런타임과 통신, 보드부터 확인하고 로직으로 내려가도록 순서를 정해 뒀다. 위 응답이 그 순서다.
로직으로 내려간 AI가 래더 전체를 받아 읽더니 이렇게 적었다.
AI → 사용자
래더 DSL 전문을 확보했습니다. 되돌림(overwrite) 패턴 의심 — DSL 의미를 knowledge에서 확인하겠습니다(기억으로 단정하지 않습니다).
아는 것만 쓴다는 5편의 규칙이 진단에서도 이어진다. 접점 기호의 의미조차 기억으로 단정하지 않고, 내장 문서에서 확정한 다음 넘어갔다.
다음은 인과 그래프 조회다. CV2 모터가 왜 안 도는지 거슬러 올라가면 이관중이라는 내부 비트가 나온다. 이 비트를 누가 세우고 누가 지우는지 짚다가, 이관 완료 줄에서 단서가 나왔다.
그래프가 보여준 이관 완료 조건은 /이송/CV2/CV2끝센서(P4). 앞의 /가 반전 표기다. 제품이 도착하면 완료가 아니라, 비어 있으면 완료로 읽히고 있었다는 뜻이다. 조건에 붙은 이송/CV2가 3편에서 적은 심볼 경로고, 심볼이 AI의 근거가 된다던 말이 여기서 이렇게 쓰인다.
이렇게 모은 근거로 원인 설명이 나왔다. 그대로 옮긴다.
AI → 사용자
한 스캔 안에서 벌어진 일 (렁은 위→아래, 아래가 이긴다):
@13 이관 시작 M운전중 · CV1끝센서↑ → SETOUT(M이관중) M1 = ON
@16 이관 완료 M이관중 · /CV2끝센서(=OFF) → RSTOUT(M이관중) M1 = OFF ← 같은 스캔에 지워짐
@19 CV1 구동 M운전중 · /M이관중 → CV1모터 ON ← 그래서 CV1만 돈다
@22 CV2 구동 M운전중 · M이관중(=OFF) → CV2모터 OFF ← 증상 1
@26 정체 감시 M이관중(=OFF) → TAON 적산 안 함 ← 증상 2 (T0=0 → 알람 영원히 안 뜸)
두 증상(CV2 정지 + 알람 미발생)이 한 원인에서 나옵니다 — 별개 결함이 아닙니다.
이관을 시작한 바로 그 스캔에서 아래쪽 줄이 이관 상태를 지워 버린다. 스캔이 끝나면 남는 값은 항상 OFF다.
내가 심은 걸 골라 놓고 하는 말이지만, 이 부류는 원래 잡기 까다롭다. 값을 아무리 읽어 봐도 정상 정지와 구별이 안 되고, 래더 구조 검사도 통과한다. AI도 보고서에 같은 말을 적었다.
AI → 사용자
스냅샷으로는 정상 정지와 구별되지 않고,
lint_ladder도 못 잡습니다(이중 코일이 아님 — 실제로 베이스라인clean=true였습니다).
그래서 원문과 그래프와 실값을 교차해서 보라고 절차에 명시해 뒀는데, 이번 고장도 거기서 잡혔다.


수정
원인이 나왔으니 고칠 차례다. AI는 현재 래더를 백업해 두고, 구조 검사 기준선을 잡아 두고, 이관 완료 줄의 B접점을 A접점으로 고쳤다. 문법 검증과 구조 검사와 빌드까지 통과시켰다. 여기까지는 혼자 하게 뒀다. 에디터 안에서 래더를 고치는 건 5편의 어시스턴트가 늘 하던 일이고, 에디터는 장비가 아니다.
무장
다음은 고친 래더를 런타임에 올리는 배포다. 그 앞에서 AI가 스스로 멈췄다.
AI → 사용자
검증 결과 — 아직 안 됨. 여기서 멈춥니다
배포(deploy)와 force 재현은 무장 필요 도구인데 현재 armed=False입니다. 즉 지금 고쳐진 건 에디터 래더뿐이고 로컬 런타임에는 안 올라갔습니다 — 지금 다시 돌려도 증상은 그대로입니다.
무장이 이 시스템의 허락 장치다. 사람이 에디터에서 진단 모드를 켜면서 설비 트리에서 AI가 써도 되는 주소를 고른다. 허가 목록에 없는 주소는 무장 중에도 못 쓴다.
AI가 스스로 무장을 여는 경로는 만들지 않았다. 필요한 주소를 밝혀 요청하는 것까지만 할 수 있다. 이번 요청은 이랬다.
AI → 사용자
P0(기동버튼) · P1(정지정상) · P2(리셋버튼) · P3(CV1끝센서) · P4(CV2끝센서)
출력(P16·P17·P18)은 일부러 뺐습니다 — 읽기는 허가 없이 되고, 출력을 force하면 로직이 만든 값인지 제가 건 값인지 구별이 안 됩니다(에코 착각).
가설 확인에 필요한 주소만 요청하는 것도, 강제한 값을 로직이 만든 값으로 착각하지 말라는 것도 절차 문서에 적어 둔 원칙이다. 그 원칙이 요청 문장에 그대로 나온다. 나는 에디터에서 다섯 주소를 넣고 무장을 걸었다. 그리고 콘솔에 한 줄 쳤다. 무장했습니다, 진행하세요.

2편 시스템 구성에서 AI와 런타임 사이만 선을 안 긋고 남겨 뒀었다. 보안 문제가 있어 손볼 곳으로 남겨 둔다고 적었는데, 그 자리를 이렇게 채웠다. 사람이 무장으로 열어 준 주소를, 열어 둔 동안만 건드린다.
5편에서 배포는 사람이 Deploy 버튼을 누르는 자리라고 적었다. 진단에서는 무장이 그 자리다. 버튼이 무장으로 바뀌었을 뿐, 허락 없이 장비에 올라가는 경로가 없다는 건 그대로다.
재현 검증
무장을 확인한 AI가 배포를 실행했다. 저장, 빌드, 전송, 런타임 재시작까지 한 번에 진행된다. 이제 고친 게 실제로 고쳐졌는지 확인할 차례다.
여기에도 규칙이 하나 있다. 강제를 걸기 전에 예측을 적는다. 예측이 없으면 결과를 봐도 판단이 없고, 설계된 실험과 임의 조작의 차이가 여기서 갈린다고 절차 문서에 적어 뒀다. 실제 장면은 이렇다.
AI → 사용자
자기유지 정상 — 버튼을 뗐는데
M0=ON유지.이제 결정적 실험입니다.
CV1끝센서(P3)를 0→1로 올립니다.예측
- 수정이 유효하면:
M1=ON(래치 생존),P17(CV2모터)=ON,P16(CV1모터)=OFF- 수정이 무효면(되돌림 잔존):
M1=OFF,P17=OFF,P16=ON— 즉 원래 증상 그대로
강제를 걸고 값을 조회한 결과가 왔다.
AI → 사용자
증상 1 소멸 확인.
M1=ON([FORCED]없음 — 로직이 래치를 유지),P17(CV2모터)=ON,P16(CV1)=OFF. 그리고T0=22(2.2초) — 정체 타이머가 적산을 시작했습니다.
이런 실험이 여섯 번이었고 여섯 번 모두 예측대로 나왔다. AI가 최종 보고에 붙인 표를 그대로 싣는다.
| # | 실험 | 결과 |
|---|---|---|
| 1 | P1=1, P0 0→1 | M0=ON(FORCED 아님) · P16=ON, 기동 정상 |
| 2 | P0 →0 | M0=ON 유지, 자기유지 정상 |
| 3 | P3 0→1 | M1=ON · P17(CV2)=ON · P16=OFF · T0 적산 시작, 증상 1 소멸 |
| 4 | P4 미투입 15초 | T0=150 · M10=ON · P18(알람등)=ON · M0=OFF · 양 모터 정지, 증상 2 소멸 |
| 5 | P2 0→1 (리셋) | M10·M1 해제, T0=0, M0는 OFF 유지, 알람 리셋만으로 자동 재기동 안 됨(정상) |
| 6 | 재기동 → P3↑ → P4↑ | M1=OFF · P17=OFF · P16=ON(CV1 복귀) · T0=0, 수정한 줄의 양성 경로 정상 |
표에서 몇 줄만 짚는다.
- 1번의 “FORCED 아님”: 값을 조회하면 강제된 값에는 표기가 붙는다. 운전 비트에 그 표기가 없으니 로직이 만든 값이 맞다.
- 2번과 5번: 고친 곳과 상관없는 자리다. 수정이 자기유지와 리셋을 건드리지 않았는지 확인하는 회귀 점검이다.
- 6번을 마지막에 둔 이유: 고장이 재현되지 않는 걸 확인했으면, 고친 줄이 제 기능대로 정상 이관을 완료하는지도 확인해야 한다.
한 가지 더 적어 둔다. 이 데스크 환경은 보드가 없어서 강제를 풀어도 값이 0으로 돌아가지 않고 마지막 값이 그대로 남는다. 그 상태에서 같은 주소에 1을 다시 걸면 상승엣지가 안 생겨서 버튼을 눌러도 안 눌린 것처럼 보인다.
얼마 전 다른 시험에서 이 함정을 실제로 밟고 처방을 진단 문서에 적어 뒀다. 이번 AI는 그 문서를 읽고 와서 처음부터 펄스를 0과 1 두 번에 나눠 걸었고 여섯 실험 내내 한 번도 안 밟았다.
검증이 끝나면 강제를 전부 해제하고 잔존 0건을 조회로 확인한다. 걸어 둔 강제를 잊고 가는 게 현장 사고의 단골 원인이라 이것까지 완료 조건으로 정해 뒀고, 이번 세션도 그 확인으로 끝났다.


보고와 이력
보고 형식도 정해져 있다. 원인, 증거 사슬, 수정 내용, 검증 결과, 그리고 잔여 위험과 미확인 항목까지 다섯 칸이다. 앞의 넷은 위에서 본 그대로고 다섯째 칸을 보라고 이 형식을 만들었다. 확인 못 한 걸 확인한 것처럼 보고하지 않는 칸이다. 이번 보고의 다섯째 칸에서 몇 개만 옮긴다.
- 이관 중에 CV1이 정지하는 구조를 발견했지만 고치지 않았다. “의도된 설계일 수 있어 손대지 않았습니다. 바꾸려면 별도 변경 1건입니다.” 시킨 수리는 하나였고, 배포 한 번에 변경 한 건이라는 규칙을 지켰다.
- 정체 15초가 타이머대로 동작하는 것만 확인했고, 그 값이 현장에 맞는지 판단하려면 실기 데이터가 필요하다고 적었다.
- 정지 버튼이 실제로 NC 배선인지는 도구로 확인할 수 없다고 적었다. 메모리 너머는 사람 눈의 몫이다.
그리고 시키지 않은 게 하나 딸려 왔다. 그래프 도구가 래치를 세우고 지우는 줄을 색인하지 못한다는 걸 진단 중에 발견하고 다른 조회로 우회해 쓴 다음, 개선 후보라고 보고서에 적어 놨다.
보고 끝에는 사람이 할 일 두 가지가 적혀 있었다.
AI → 사용자
진단 모드는 아직 무장 상태(armed=True)입니다 — 끝내시려면 Senbrix UI에서 해제해 주세요. 이 진단 이력을 docs/에 네 칸(증상·맥락·원인·조치)으로 남겨둘까요?
이력을 남겨 달라고 한 줄 쳤다. AI는 이 진단 한 건을 증상, 맥락, 원인, 조치 네 칸으로 정리해 프로젝트 docs 폴더에 남겼다. 고장 이력은 네 칸으로 남기라는 것도 현장 노하우 문서에 적어 둔 것이다. 같은 설비에 다음 문제가 생기면 다음 진단이 이 이력을 읽는다. 무장을 닫는 건 안내대로 내가 에디터에서 했다.


끝나고 세어 봤다. 이 진단에서 사람이 한 일은 증상 한 줄, 무장 한 번, 진행하라는 한 줄, 이력 남기라는 한 줄이다. 증상을 말하고 십오 분쯤 뒤에 원인 설명과 고쳐진 래더와 검증 표와 이력 문서가 돌아왔다.
정리
4편에서 래더가 장비에서 구동했고, 5편에서 AI가 래더를 짰고, 이번 편에서 AI가 구동 중인 장비의 문제를 잡았다. 그렇게 한 바퀴를 다 돌았다.
이번 편에서 만든 걸 다시 세면, 읽기와 쓰기를 가른 도구 경계, 관찰의 순서와 교차 방법, 무장이라는 허락 장치, 예측 먼저라는 실험 규칙, 다섯 칸 보고와 네 칸 이력이다. 현장 사람이 몸으로 아는 진단의 규율을 문서와 도구로 옮겨 뒀더니, 그걸 읽은 AI가 그 규율대로 고장을 잡았다.
그리고 그 내내 경계는 같은 자리에 있었다. 읽기는 언제나 열려 있고, 쓰기는 무장 안에서만 열린다. 문제를 말하면 고친다, 지가 제어해가며. 단, 전부 사람이 허락한 범위 안에서다.
다음 편
다음 편이 마지막이다. PLC를 직접 만들어 보니 어땠는지, 됐던 것과 안 됐던 것을 정리한다.
댓글
닉네임만 입력하면 바로 댓글을 남길 수 있어요. Google/GitHub 로그인도 가능합니다.