NohDoyeon241104 a43a531e00 docs: 미커밋 분석·작업지시서·작업일지 반영 (260805~260810)
- 분석_bit15_Resume_핸드셰이크_260805.md
- 작업지시서_PTOP_PLC핸드셰이크_260805.md
- 분석_HeavyAlarm_비트_동작_260810.md
- 작업일지 2026_08_06.md
2026-08-11 09:46:02 +09:00

166 lines
7.5 KiB
Markdown

# 작업일지 — 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은 사용자가 직접 실행.