# 작업일지 — 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_에코보장_방침_분석.md` - `docs/분석/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. 남은 것 **런타임 검증 미실시.** 우선순위 순: 1. **시뮬레이션 기동** — `IsSimul` 가드가 실제로 먹는지 (가장 위험) 2. **정상 핸드셰이크** — 로그가 `수렴 완료 (1회차)`로 찍히는지 3. **정지 동작** — 수렴 루프 중 Stop 시 에코가 안 나가는지 4. **범위 밖 PageNo 복구** — 토스트 후 정상값 복귀 시 재시작 없이 이어지는지 ### 미착수 별건 - `CheckPageNo` 레벨 → 상승엣지 전환 (08/04 조치 A) - bit15 `ResumeMode` 교착 (08/04 조치 C·D) - PLC 질문 ★1(Manual/정지 시 M70508 OFF 여부)·★2·★5 미해소 ### 환경 변화 Serena MCP 제거됨 → 이 세션에 셸 실행 경로 없음. 빌드·git은 사용자가 직접 실행.