From 1d60d474b8caa8426e692ff6d78665188e5db945 Mon Sep 17 00:00:00 2001 From: NohDoyeon241104 Date: Sat, 20 Jun 2026 14:40:47 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=A0=88=EC=8B=9C=ED=94=BC=20=EC=A0=84?= =?UTF-8?q?=ED=99=98=20=EC=8B=9C=20Scout=20Field=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=EB=A0=88=EC=8B=9C=ED=94=BC=20=EC=9E=94=EC=A1=B4(=EB=A0=88?= =?UTF-8?q?=EC=8B=9C=ED=94=BC=EC=B6=95=20stale)=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: 레시피 전환 후에도 이전 레시피의 Scout Field 영역이 그대로 적용됨. 원인: RecipeFieldScan(싱글톤)은 페이지명으로만 키잉되어 레시피 식별자가 없고, ReloadRecipe에서 필드 재로드가 주석 처리됨. 또한 UpdateWeldingLinesRecipe → 콤보박스 SelectedIndexChanged → SaveAndLoadFieldScanFromLasaDb 경로가 WorkRecipeFile은 새 경로/싱글톤은 stale인 상태로 SaveFieldHelper를 호출해 이전 레시피 데이터를 새 레시피 FieldHelper.json에 덮어쓰는 손상까지 유발. - 가드 플래그(_suppressPageFieldSync) 추가, 콤보박스 핸들러 저장 호출을 가드 - ReloadRecipe에서 UpdateWeldingLinesRecipe를 try/finally로 감싸 전환 중 저장 억제 - 로드 전용 LoadFieldScanFromLasaDb 추가, 전환 후 새 레시피 필드만 싱글톤에 로드 - 기존 소스는 삭제 없이 주석/가드로 보존 - 빌드 검증: MSBuild Debug|x64 솔루션 오류 0개, 현장 동작 확인 완료 Co-Authored-By: Claude Opus 4.8 --- WeldingComponents/LASA/GUI/Page/MainPage.cs | 32 ++++++++- docs/작업일지/2026_06_20.md | 76 +++++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/WeldingComponents/LASA/GUI/Page/MainPage.cs b/WeldingComponents/LASA/GUI/Page/MainPage.cs index c8bb8c0..f4f4044 100644 --- a/WeldingComponents/LASA/GUI/Page/MainPage.cs +++ b/WeldingComponents/LASA/GUI/Page/MainPage.cs @@ -465,11 +465,24 @@ namespace GUI DB.Dao.SystemRecipe.WorkRecipeFile = fullpath; - UpdateWeldingLinesRecipe(); + // [변경 2026-06-20] 전환 중 콤보박스 SelectedIndexChanged 핸들러가 + // SaveAndLoadFieldScanFromLasaDb()로 stale 데이터를 새 레시피 FieldHelper.json에 + // 덮어쓰는 것을 막기 위해 동기화 억제. (UpdateWeldingLinesRecipe → UpdateLayersInfo → + // 콤보박스 SelectedIndex 설정 → 핸들러 발화 경로 차단) + _suppressPageFieldSync = true; + try { + UpdateWeldingLinesRecipe(); + } finally { + _suppressPageFieldSync = false; + } //// Page 불러온 후, 실행되지 않아도 됨. 왜냐하면, 어차피 SelectedIndex 쪽으로 빠짐. //SaveAndLoadFieldScanFromLasaDb(); //ChangeScoutImage(); + // [추가 2026-06-20] 레시피 전환 시 필드 싱글톤이 이전 레시피 값으로 남는 버그(레시피축 stale) 수정. + // 저장 없이 "로드 전용"으로 새 레시피의 FieldHelper.json 만 싱글톤에 반영. + // 순서 주의: WorkRecipeFile 갱신 + UpdateWeldingLinesRecipe(Layers 채움) 이후라야 pageCount 정합. + LoadFieldScanFromLasaDb(); } #endregion @@ -527,6 +540,15 @@ namespace GUI DB.RecipeFieldScan.Instance.LoadFieldHelper(newpath, ScannerCanvasCtrlTeaching.Model.Layers.Count() , defaultScoutName, defaultChildRowBufCols); } + // [추가 2026-06-20] 로드 전용. SaveFieldHelper 호출 없음 → 레시피 전환 시 새 레시피 필드를 + // 이전(stale) 싱글톤 데이터로 덮어쓰는 사고를 방지. ReloadRecipe 에서만 사용. + void LoadFieldScanFromLasaDb(string inputStr = null) + { + string fullpath = inputStr == null ? DB.Dao.SystemRecipe.WorkRecipeFile : inputStr; + string newpath = fullpath.Replace(Path.GetFileName(fullpath), "FieldHelper.json"); + DB.RecipeFieldScan.Instance.LoadFieldHelper(newpath, ScannerCanvasCtrlTeaching.Model.Layers.Count() + , defaultScoutName, defaultChildRowBufCols); + } Bitmap canvasTeachingBitmapBuffer1 = null; Bitmap canvasTeachingBitmapBuffer2 = null; @@ -1394,6 +1416,10 @@ namespace GUI #endregion #endregion + // [추가 2026-06-20] 레시피 전환(ReloadRecipe) 중 콤보박스 SelectedIndexChanged가 + // SaveAndLoadFieldScanFromLasaDb()로 stale 데이터를 새 레시피 FieldHelper.json에 + // 덮어쓰는 것을 차단하기 위한 가드. 평상시 페이지 전환에는 영향 없음. + private bool _suppressPageFieldSync = false; int selectedIndexNo = 0; private void toolStripComboBoxPage_SelectedIndexChanged(object sender, EventArgs e) { @@ -1402,7 +1428,9 @@ namespace GUI ScannerCanvasCtrlTeaching.Canvas.CommandChangeLayer(box.SelectedIndex); // 1.1. 바뀔 떄마다 스카우트 관련 파라미터 저장 및 변경 - SaveAndLoadFieldScanFromLasaDb(); + // [변경 2026-06-20] 레시피 전환 중에는 stale 저장 방지 위해 스킵 (기존 호출은 보존) + if (!_suppressPageFieldSync) + SaveAndLoadFieldScanFromLasaDb(); // 1.2. 너무 많은 시간이 소비되므로, 달라질 경우에만 ChangeScoutImage() if(selectedIndexNo != box.SelectedIndex) ChangeScoutImage(); diff --git a/docs/작업일지/2026_06_20.md b/docs/작업일지/2026_06_20.md index 8d7a797..412e7d4 100644 --- a/docs/작업일지/2026_06_20.md +++ b/docs/작업일지/2026_06_20.md @@ -36,3 +36,79 @@ ### 비고 - `AjinIO.cs`는 공용(AuroraIO.dll) — Ajin 보드 쓰는 타 머신에도 영향(반전 정정이 올바른 방향) - 사용자 요청으로 **빌드 검증 생략** + +## 13:26 — U-Frame 가접 추가 → Recipe 신규 시 SeqAutoRunPTOP 작업구간 분석 (소스 미수정) + +### 배경 +- 어제 U-Frame 용접 시 **밀착 불량**으로 품질 미달 → 결론: **가접(tack weld) 추가** 후 본접. +- 현재 샘플 1개에 **테이프**로 임시 고정 검증 중. SW상 결국 **Recipe 1개 추가** 예상. +- 가접 정의(현장 확인): 본접 전, 부품이 떨어지지 않도록 **Dot/짧은 Line을 미리 출사해 pre-fix**하는 작업. + +### 분석 결론 (소스 수정 없이 분석만) +- `Machines/ILSOS_PrismaticRD_PTOP/Sequences/SeqAutoRunPTOP.cs` 노드별 검토 +- **레시피 선택(CheckRecipeNo/Comp)**: 수정 불필요 — `.Id` 1:1 조회, 하드코딩 없음. 레시피 등록 + PLC 번호 송신만 하면 됨 +- **페이지 처리(CheckPageNoComp)**: 수정 불필요 — 레이어 수 기반 가변 검증 +- **리스트 업로드(SetUploadWeldingList)**: 조건부 — 가접이 같은 리스트 추가 오브젝트면 자동 포함 +- **★ 용접 실행(ExecuteWelding, 라인 720)**: 핵심 분기점 + - Case A: 가접 Dot/짧은 Line을 본접보다 **앞 순서 오브젝트**로 추가 → 한 리스트 연속 발진, 코드 수정 불필요(동일 파라미터·연속 Gate일 때) + - **Case B(이번 케이스 유력)**: 가접을 **별도 선행 패스**(다른 파라미터/별도 리스트)로 분리 → ExecuteWelding 수정, 필요 시 Builder Flow에 가접 전용 노드 추가 +- 한 줄 요약: **레시피 추가 자체는 데이터 구동이라 소스 수정 거의 불필요. 가접을 "별도 동작"으로 돌릴 때만 ExecuteWelding이 작업 구간.** + +### 결정 필요 +- 가접 파라미터(파워/속도/체류시간)가 본접과 다른가? → 다르면 Case B +- 신규 레시피 번호(PLC_RECIPE_NO) 체계/매핑 (PLC측 확정 대기와 연계) + +### 산출물 +- 분석 문서: `docs/분석/2026/06/20/132647_uframe_가접_recipe_추가_seqautorun_분석.md` + +## 13:37 — 레시피 전환 시 Scout Field가 "이전 레시피 필드"를 가져오는 버그 분석 (개선 필요, 소스 미수정) + +### 증상 (현장 확인) +- 어제(06-19) PageIndex 주입 수정(`4a655ec`) 적용 후, 오늘 확인하니 **레시피 전환 시 새 레시피가 이전 레시피의 필드 영역을 그대로 가져옴.** +- 페이지 인덱스 정합성은 맞았으나 **레시피 단위 정합성**이 깨짐. + +### 루트 원인 +- `RecipeFieldScan`은 **싱글톤**이고 필드 데이터를 페이지명(`selectedIndex{N}`)으로만 키잉 — **레시피 식별자 없음.** +- **★ `MainPage.ReloadRecipe()`에서 필드 재로드(`SaveAndLoadFieldScanFromLasaDb()`)가 주석 처리됨** → 레시피를 바꿔도 싱글톤 `fieldScanDatas`가 이전 레시피 값 그대로 유지(stale). +- 그 결과 `SeqScoutNormal.LoadScoutField(pageIndex)`가 "올바른 페이지 × 이전 레시피 데이터"를 읽음. +- 어제 수정은 **페이지축 stale**을 고친 것이고, 오늘 버그는 **레시피축 stale**(별개 축). + +### 개선안 +- **단순 주석 해제는 위험** ⚠️ — `SaveAndLoadFieldScanFromLasaDb()`는 저장→로드 순서라, ReloadRecipe에서 `WorkRecipeFile`이 이미 새 경로로 바뀐 뒤 호출하면 **이전 레시피 stale 데이터를 새 레시피 FieldHelper.json에 덮어써 손상**시킴(주석 처리된 이유로 추정). +- **권장: "로드 전용" 메서드 추가**(`SaveFieldHelper` 없이 `LoadFieldHelper`만) → `ReloadRecipe`에서 `UpdateWeldingLinesRecipe()`로 Layers 채워진 뒤 호출하여 새 레시피의 FieldHelper.json만 로드. +- 검토: FieldHelper.json 부재 시 NRE, ChangeScoutImage 동반 필요 여부, PLC Recipe Change(`RMSHandlerForPTOP`) 경로 적용, 전환 시 저장 금지(저장은 필드변경/스카우트/레시피저장 때만). +- (선택) 근본: 싱글톤에 레시피 식별자 포함 또는 전환 시 명시적 Clear. + +### 산출물 +- 분석 문서: `docs/분석/2026/06/20/133714_recipe전환시_scout필드_이전레시피_잔존_분석.md` + +## 13:50~14:xx — 레시피축 stale 수정 적용 + 서브에이전트 교차검증 + 정정 + +### 1차 수정 (불완전) +- `MainPage.cs`에 로드 전용 `LoadFieldScanFromLasaDb()` 추가 + `ReloadRecipe`에서 호출. 빌드 0 오류. + +### 서브에이전트 교차검증으로 발견한 핵심 결함 (직접 코드 재확인 완료) +- **숨은 저장 경로**: `ReloadRecipe → UpdateWeldingLinesRecipe()(MainPage.cs:411) → UpdateLayersInfo() → toolStripComboBoxPage.SelectedIndex 설정(:364) → SelectedIndexChanged 핸들러(:1411) → SaveAndLoadFieldScanFromLasaDb()(:1418)`. +- 이 시점 싱글톤=이전 레시피(stale), WorkRecipeFile=새 경로 → **SaveFieldHelper가 stale을 새 레시피 FieldHelper.json에 덮어써 디스크 손상.** 1차 수정의 로드는 손상된 파일을 다시 읽어 무력화. +- 이 손상은 **수정 전부터 잠재**한 기존 거동 → 기존 레시피 전환 반복 시 일부 FieldHelper.json 오염 가능성(현장 점검 권장). + +### 최종 수정 (적용·빌드 검증 완료) +- `MainPage.cs` 한 파일, 기존 소스 보존: + 1. 가드 플래그 `private bool _suppressPageFieldSync = false;` 추가 + 2. 콤보박스 핸들러: `if (!_suppressPageFieldSync) SaveAndLoadFieldScanFromLasaDb();` + 3. `ReloadRecipe`: `UpdateWeldingLinesRecipe()`를 try/finally로 감싸 전환 동안 가드 ON → 저장 스킵, 이후 `LoadFieldScanFromLasaDb()`로 새 레시피 필드만 로드 +- 효과: (a) 전환 중 stale 저장 차단(손상 방지), (b) 새 레시피 필드 정상 로드 → 레시피축 stale 해소 +- 평상시 사용자 페이지 전환은 가드 false라 무영향. WinForms 단일 UI 스레드 동기 발화라 경쟁 없음. +- **MSBuild Debug|x64 솔루션 빌드: 오류 0개** (경고 212개 전부 기존·무관) + +### 잔여(선택) +- 인덱스 불변(0→0) 케이스 ChangeScoutImage 미동반 시 이미지/데이터 불일치 소지(Low~Med) +- 근본: 싱글톤에 레시피 식별자 도입 또는 전환 시 명시적 Clear +- 현장: 레시피 전환 → Scout Field 새 영역 반영 런타임 확인, 기존 오염된 FieldHelper.json 점검 + +## 14:xx — 현재 상태 정리 (레시피축 stale 수정 건) +- **수정 적용 완료**: `WeldingComponents/LASA/GUI/Page/MainPage.cs` (가드 플래그 `_suppressPageFieldSync` + 콤보박스 핸들러 가드 + ReloadRecipe try/finally + 로드 전용 `LoadFieldScanFromLasaDb`) +- **빌드 검증 완료**: MSBuild Debug|x64 솔루션, 오류 0개 +- **미커밋 상태**: 커밋 전, 현장 런타임 확인 대기 중 +- 다음 액션: ① 현장에서 레시피 전환 시 Scout Field 새 영역 반영 확인 ② 기존 전환으로 오염됐을 수 있는 FieldHelper.json 점검 ③ 확인 후 커밋 +- 산출물: 분석 `docs/분석/2026/06/20/133714_recipe전환시_scout필드_이전레시피_잔존_분석.md` (4-B 교차검증 섹션 포함)