- 분석_bit15_Resume_핸드셰이크_260805.md - 작업지시서_PTOP_PLC핸드셰이크_260805.md - 분석_HeavyAlarm_비트_동작_260810.md - 작업일지 2026_08_06.md
7.5 KiB
작업일지 — 2026-08-06
1. Recipe/Page 핸드셰이크 — PLC측 프로토콜 확정
사용자 확인 내용 (현장)
- "PLC측 시퀀스 확인 함. 레시피, 페이지 동시에 바꿈 → PLC 508번 BIT 살림"
- PC측 시퀀스: 8번 BIT 체크 → 레시피 확인 → 레시피 활성화(체크 3번) → 페이지 확인 후 변경
→
PC_PAGE_CHANGE_COMPLETE송신 - "근데 PLC측은 페이지랑 레시피 넘버만 같으면 넘어가도록 되어있음"
- "PLC 제어는 이제 끝났어요."
- 30초에 대해: "우선 계속 확인하는거야. 30초 동안 중간에 계속 체크를 하고 있고, 대기하면서 다시 30초 반복해서 체크하는 것 뿐"
이로써 확정된 것
| 항목 | 내용 |
|---|---|
| 게이트 | 워드(PC_PAGE_NO/PC_RECIPE_NO). PC 에코가 PLC 값과 같아지면 진행 |
PC_PAGE_CHANGE_COMPLETE(M70008) |
PLC 미사용 — 08/04 질문 ★4 해소 |
| 확인 주기 | 상시. 30초는 확인 간격이 아니라 한 번의 확인 창이며 반복 |
코드 주석이 반대로 적혀 있었음
SeqAutoRunPTOP.cs OnSeqActionStop 의 주석 ②가
"PLC가 보는 게이트는 워드가 아니라 PC_PAGE_CHANGE_COMPLETE 비트" 라고 적고,
그 전제로 에코 워드 0 초기화를 롤백해 뒀다. 확정 내용과 정반대.
2. 방침 전환 — "검증"에서 "에코 보장"으로
사용자 지시:
"어차피 PLC가 검증하니깐, 괜찮을 것 같은데" "우리는 잘 써주는것만 확인하는 방안으로 가야해. 그래야 멈추는 일 없이 시퀀스가 핑퐁이 되지" "PC쪽에서는 페이지랑 레시피 넘버만 잘 WRITE 해주고 다음 시퀀스로 넘어가면 돼"
안전 측면 확인 (코드 검증)
용접 실행은 PLC_WELD_TRIGGER_REQ(M70516) ON 대기가 별도 게이트다
(SeqAutoRunPTOP.cs:196, :705). 페이지를 오독하면 에코 불일치 → PLC가 트리거를 안 줌
→ 용접이 나가지 않는다. 오독이 잘못된 용접으로 이어지는 경로는 없음.
그래서 문제가 된 것 — PC가 멈추는 지점
| 위치 | 증상 |
|---|---|
CheckRecipeNoComp:353-365 |
에코 없이 return 하는 경로 2개(RecipeNo=0 / 미등록) |
CheckPageNoComp:534-556 |
범위 밖이면 3초 주기로 에코 없이 무한 대기 |
CheckRecipeNoComp:408-419 |
타임아웃이 시작시각만 리셋해 탈출 못 함 |
CheckPageNoComp:501 이후 |
Stopped 가드 없어 정지 중에도 미검증 값 에코 |
부수 발견
CheckPageNoComp로그는 "3회 연속 검증"이라 하지만 3개 값을 비교하는 코드가 없었다 (판정은 마지막 값 하나).rules.md#1 전형.CheckRecipeNoComp재폴링의count++ < 3은 실제로 4회 순회.ReadWord의err반환값을 전 구간에서 버리고 있었음. 미연결 시(err, 0)반환이라 통신 이상이 자동으로 "RecipeNo=0 → 전환 생략" 경로에 빠짐.
3. 분석 문서 2건 작성
docs/분석/2026/08/06/RecipePage_에코보장_방침_분석.mddocs/분석/2026/08/06/RecipePage_에코수렴루프_설계.md
08/04 문서(AutoRun재기동_Recipe_Page워드_미반영_원인분석.md)와 상호 링크.
30초 재확인 확인 후 앞 문서의 판단 2건을 정정:
| 항목 | 종전 | 정정 |
|---|---|---|
| 에코 누락 | 영구 교착 | 자동 복구 — PC가 맞추는 즉시 진행 |
| 범위 밖 PageNo | 읽은 값 그대로 에코 | 에코하지 않고 재시도가 맞다 |
4. 확정한 설계 결정
| 항목 | 결정 |
|---|---|
PLC_RECIPE_NO == 0 |
이상값 → 에코하지 않고 재시도 |
| 범위 밖 PageNo | 에코하지 않고 재읽기 |
CheckPageNo 레벨 → 상승엣지 |
이번 범위 아님 (수렴 루프가 스테일 오독을 자동 복구) |
| 수렴 지연 시 | 토스트만 (알람 승격 안 함) |
불변식
CheckRecipeNoComp—PC_RECIPE_NO == PLC_RECIPE_NO그리고 활성 레시피 Id == 그 번호CheckPageNoComp—PC_PAGE_NO == PLC_PAGE_NO그리고_CurrentPageNo == PC_PAGE_NO - 1
워드만 맞추면 안 된다. 내부 상태를 같이 안 고치면 PLC는 통과시키는데 PC는 옛 페이지로 용접한다. 이 경우는 PLC 게이트로도 안 막힌다(에코가 맞으니 트리거가 나옴).
5. 구현 — 원복 가능 방식으로
사용자 지시: "쓰다가 문제 생기면 원복 하면 되니깐",
"원복할 수 있도록 #region 등으로 기존 소스를 삭제하지 말고 분리해서 주석 처리"
기존 코드 삭제 0건. 구버전은 /* */로 감싸 #region 260806 구버전 보존에 남기고,
신규는 #region 260806 신규로 표시. 마커 260806으로 전량 검색 가능.
| 파일 | region |
|---|---|
Device/PLC/PLCController.Logic.cs |
신규 — ReadOutWord(eWordOutput) (ReadOutBit 패턴 준용) |
Sequences/SeqAutoRunPTOP.cs |
상수 신규 / plcPageNoList 보존 / CheckRecipeNoComp 보존·신규 / CheckPageNoComp 보존·신규 / OnSeqActionStop 주석 정정 |
주요 변경
- 두 노드를 수렴 루프로 재작성 — 에코 후 되읽어 일치 확인, 어긋나면 재읽기, 맞는 즉시 다음 노드로
- Page 3회 수집(600ms)·Recipe 800ms 재폴링 제거 → 정상 흐름 지연 0
while탈출 후context.Stopped가드 추가- 시뮬레이션 가드 —
IsSimul이면 수렴 생략. PLC 워드가 항상 0이라 안 넣으면 시뮬에서 AutoRun이CheckRecipeNoComp를 못 빠져나감
계획에서 바꾼 것
using Hermes; 추가 → 완전 한정명 Hermes.E1.OK(4곳)로 변경.
이 파일이 이미 다수 네임스페이스와 static using 2개를 열고 있어 Log·Status 같은
흔한 이름에서 모호성(CS0104)이 날 위험이 있었음.
구현 중 확인
CheckInitCondition이 무조건 SEQ_CHECK_PAGENO를 반환한다(:336).
:224의 Resume 핸드셰이크 스킵 분기는 선언만 있고 타는 경로가 없다.
→ 수렴 루프는 Resume 경로에서도 항상 실행되지만 PLC 값을 따라가며 에코를 최신화할 뿐이라
보존값을 훼손하지 않음(충돌 없음).
6. 빌드·커밋·배포
- 빌드 통과 (사용자 확인: "빌드는 돼")
- 현장 PC에 파일 덮어쓰기 완료 — "현장에 파일 덮어쓰기는 했고, 추후 확인해볼게"
- 머지 진행 중이라 부분 커밋이 안 돼(
cannot do a partial commit during a merge) 머지 마무리 → 코드 커밋 순으로 진행. 커밋·푸시 완료
커밋에 포함하지 않은 것
docs/PtoP 유니셀 용접기 PLC 인터페이스/ 하위 삭제 13건(xlsx 6·7z 2·zip 1·txt 3 등)이
unstaged로 잡혀 있었음. 이번 작업과 무관해 그대로 둠.
7. 남은 것
런타임 검증 미실시. 우선순위 순:
- 시뮬레이션 기동 —
IsSimul가드가 실제로 먹는지 (가장 위험) - 정상 핸드셰이크 — 로그가
수렴 완료 (1회차)로 찍히는지 - 정지 동작 — 수렴 루프 중 Stop 시 에코가 안 나가는지
- 범위 밖 PageNo 복구 — 토스트 후 정상값 복귀 시 재시작 없이 이어지는지
미착수 별건
CheckPageNo레벨 → 상승엣지 전환 (08/04 조치 A)- bit15
ResumeMode교착 (08/04 조치 C·D) - PLC 질문 ★1(Manual/정지 시 M70508 OFF 여부)·★2·★5 미해소
환경 변화
Serena MCP 제거됨 → 이 세션에 셸 실행 경로 없음. 빌드·git은 사용자가 직접 실행.