기동 중 RecipeFieldScan 싱글톤이 비어 있는 상태에서 SaveAndLoadFieldScanFromLasaDb
가 Save 를 Load 보다 먼저 수행해(MainPage.cs:539 -> :540) 대상 FieldHelper.json 이
"[]" 2바이트로 파괴됐다. 현장 3건 확인 — RMS(07-29), U_Frame _pre welding(08-03),
Bottom_Frame_Welding(08-03). 3건 모두 Aurora 초기화 직후 4~19초, 사용자 입력이
불가능한 구간이며 형제 TeachingEditor.json 은 옛 mtime 을 유지했다.
RecipeFieldScan
- SaveFieldHelper 진입부: 완주한 로드의 결과가 아닌 빈 상태면 저장을 건너뛴다.
Load(:540)는 그대로 돌아 파일의 실제 데이터로 싱글톤을 채운다. 사용자가 페이지를
지워 정당하게 비운 경우는 loadedOnce 로 구분해 통과시킨다.
- LoadFieldHelper: loadedOnce 를 Clear 와 짝지어 리셋하고, 완주해도 결과가 0건이면
로드로 보지 않는다. Clear 이후 예외가 나는 경로에서 플래그만 남아 가드가
무력화되는 것을 막는다.
- 맨 catch 를 LastSaveError 기록으로 교체. throw 하지 않는 이유는 ReloadSetting
경로가 Rx OnNext 안이라(UCScannerObjectTeachingViewModel.cs:55-57) 전파 시
구독이 끊겨 티칭 화면 갱신이 영구 정지하기 때문이다.
RecipeHelper
- SaveRecipe 에 저장 대상과 메모리 신원(Recipe.SelectedRecipeFile) 불일치를
Aurora Logger 로 남기는 관측 코드 추가. 저장은 막지 않는다. 기준을
Dao.SystemRecipe.WorkRecipeFile 로 잡지 않은 것은 그 값이
SystemParameterILSOS.json 에 영속되고 Aurora SystemParameter 와 파일을
공유해 신원으로 쓸 수 없기 때문이다.
교차 오염(내용이 채워진 채 엉뚱한 레시피에 기록되는 현상)은 이 변경으로 막히지
않는다. 관측 로그로 발생 경로를 확정한 뒤 별건으로 조치한다.
검증: LASAGUI/WeldingCommon/ILSOS_PrismaticRD_PTOP 빌드 오류 0,
빌드 산출물 직접 로드한 시뮬레이션 31건 전수 통과.
증상: 레시피 전환 후에도 이전 레시피의 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 <noreply@anthropic.com>
증상: 운전화면 페이지 이동 후에도 SeqScoutNormal이 이전 페이지(보통 0)의
스카우트 필드로 동작.
원인: LoadScoutField()가 GUI 캐시 selectedIndexNo 의존 — WinForms 티칭
콤보에서만 갱신되어 운전화면/자동운전 경로에선 stale.
- SeqScoutNormal_InitParam에 PageIndex 추가, 실행 시점 라이브 페이지
(GetCurrentPageIndex)를 호출부(Recipe/Test VM)에서 명시 주입
- MainPage: LoadScoutField(int) 오버로드 + GetCurrentPageIndex() 추가
- 폴백: 페이지 없으면 selectedIndexNo 로드, 그래도 null이면 빈 리스트(NRE 방지)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>