레시피 티칭 화면 Scout 출사 시 SaveTag를 normal_{recipeId}_{pageNo}로 주입해 1_HHmmss_normal_23_5.PNG 형태로 저장. 공통 시퀀스 SeqScoutNormal은 무수정(기존 SaveTag 확장점 사용). 페이지 번호는 1-base로 AutoRun의 auto_{recipe}_{page}_pre/post와 숫자 정합. 원복 마커: #region 260807. 현장 검증 완료.
7.5 KiB
작업지시서 — 수동 Scout 출사 이미지 파일명에 normal_{recipeId}_{pageNo} 태그 부착
- 작성일: 2026-08-07
- 대상:
WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingControlBoxViewModel.cs - 상태: 완료 (2026-08-07) — 소스 반영 · 빌드 · 현장 검증 완료(수동 Scout 파일명에 레시피/페이지 번호 정상 반영 확인). 태그 형식 §5 A안
- 원복 마커:
#region 260807 이전 원본/#region 260807: 레시피/페이지 번호 반영 SaveTag 변경 - 승인 구분:
WeldingComponents수정이므로 사전 승인 필수 (architecture.md §1)
1. 배경
AutoRun 자동 사이클에서 찍은 Scout 이미지는 _auto_{recipe}_{page}_{pre|post} 태그가 붙지만,
레시피 티칭 화면에서 수동으로 찍은 Scout 이미지는 태그 없이 1_{HHmmss}.PNG 로만 저장된다.
현장에서 나중에 파일만 봤을 때 어떤 레시피·페이지를 찍은 것인지 구분이 안 된다.
왜 이런 차이가 나는가 (코드 근거)
SaveTag 를 세팅하는 곳은 저장소 전체에서 2곳뿐이다.
| 위치 | SaveTag | 결과 파일명 |
|---|---|---|
SeqAutoRunPTOP.cs:1153 (pre) |
auto_{recipeNo}_{pageNo}_pre |
1_143052_auto_23_5_pre.PNG |
SeqAutoRunPTOP.cs:1179 (post) |
auto_{recipeNo}_{pageNo}_post |
1_143052_auto_23_5_post.PNG |
UCScannerObjectTeachingControlBoxViewModel.cs:302 (수동) |
미설정 | 1_143052.PNG |
UCTestSequenceViewModel.cs:361 (테스트 화면) |
미설정 | 1_143052.PNG |
미설정 시 기본값은 빈 문자열이다 — SeqScoutNormal.cs:397 public string SaveTag { get; set; } = "";
2. 목표 결과
변경 전 : 1_143052.PNG
변경 후 : 1_143052_normal_23_5.PNG
└ recipeId └ pageNo
저장 경로는 변경 없음 — D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_vision\FieldScanImage\{yyyy_M_d}\
pre/post 구분은 하지 않는다. 수동 출사는 용접 전/후 개념이 시퀀스에 없다.
normal_접두어로 AutoRun 산출물(auto_)과 구분된다.
3. 변경 범위 — 파일 1개, 블록 1개
공통 시퀀스 SeqScoutNormal.cs 는 수정하지 않는다.
파일명 조립 로직(SeqScoutNormal.cs:304)이 이미 태그 유무를 분기하고 있어 확장점이 열려 있다.
// SeqScoutNormal.cs:304 — 수정 대상 아님. 이미 이렇게 되어 있음
string fileName = string.IsNullOrEmpty(_InitParam.SaveTag) ? $"{baseName}.PNG" : $"{baseName}_{_InitParam.SaveTag}.PNG";
변경 위치: UCScannerObjectTeachingControlBoxViewModel.cs:301-307
변경 전
var scoutSeqParams = new ScoutSeqParams(VisionRecipeManager.GetFovInfos()[0], eDisplayType.Machine_B);
var param = new SeqScoutNormal_InitParam() {
IsRealTimeScout = false,
ScoutSeqParams = scoutSeqParams,
// [추가 2026-06-19] 현재 표시 중인 페이지의 스카우트 필드를 사용하도록 명시 주입
PageIndex = CommonHelper.GetMainPage().GetCurrentPageIndex(),
};
변경 후 (→ 표시 줄만 신규/변경)
var scoutSeqParams = new ScoutSeqParams(VisionRecipeManager.GetFovInfos()[0], eDisplayType.Machine_B);
→ int pageIndex = CommonHelper.GetMainPage().GetCurrentPageIndex(); // 0-base
→ int recipeId = _Aurora.RecipeManager.ActivatedRecipe()?.Id ?? 0; // 미활성 시 0
var param = new SeqScoutNormal_InitParam() {
IsRealTimeScout = false,
ScoutSeqParams = scoutSeqParams,
// [추가 2026-06-19] 현재 표시 중인 페이지의 스카우트 필드를 사용하도록 명시 주입
→ PageIndex = pageIndex,
→ // [추가 2026-08-07] 수동 출사 이미지 파일명 태그 — {기존}_normal_{recipeId}_{pageNo}.PNG
→ SaveTag = $"normal_{recipeId}_{pageIndex + 1}",
};
4. 값 소스 (검증 완료)
| 값 | 소스 | 근거 | 비고 |
|---|---|---|---|
recipeId |
_Aurora.RecipeManager.ActivatedRecipe()?.Id |
선례 SeqAutoRunPTOP.cs:465-466 |
_Aurora 는 이미 이 클래스 필드(:50), 생성자에서 주입(:154) — 신규 의존성 없음 |
pageIndex |
CommonHelper.GetMainPage().GetCurrentPageIndex() |
MainPage.cs:526-534 |
0-base (콤보박스 SelectedIndex, 음수면 ActiveLayer.No 폴백) |
파일명의 pageNo |
pageIndex + 1 |
— | §5 확인 필요 |
AutoRun 태그와의 의미 차이 (설계상 의도된 차이)
| AutoRun 태그 | 수동 태그 | |
|---|---|---|
| 레시피 출처 | PLC 워드 PLC_RECIPE_NO (plcRecipeNo) |
PC 활성 레시피 |
| 페이지 출처 | PLC 워드 PLC_PAGE_NO (plcPageNo, 1-base) |
화면 선택 페이지 |
수동 출사 시점에는 PLC 워드가 현재 화면과 무관할 수 있으므로 PC 기준이 맞다.
정상 사이클에서는 CheckRecipeNoComp 수렴 후 두 값이 일치한다 (SeqAutoRunPTOP.cs:457-545).
5. 페이지 번호 base — A안 확정 (2026-08-07)
GetCurrentPageIndex() 는 0-base, AutoRun 태그의 plcPageNo 는 1-base (SeqAutoRunPTOP.cs:141).
| 안 | 파일명 (화면에서 5페이지 선택 시) | 결과 |
|---|---|---|
A. pageIndex + 1 ← 확정 |
..._normal_23_5.PNG |
AutoRun ..._auto_23_5_pre.PNG 와 같은 숫자 — 대조 가능 |
B. pageIndex 그대로 |
..._normal_23_4.PNG |
같은 페이지인데 숫자가 1 작음 — 혼동 |
확정 태그 식: $"normal_{recipeId}_{pageIndex + 1}"
→ 화면 표시 페이지 번호와 파일명 숫자가 일치하고, AutoRun 산출물과 직접 대조된다.
6. 영향 범위
- 동작 변경: 레시피 티칭 화면 Scout 버튼으로 찍은 이미지의 파일명만 바뀐다.
- 경로·포맷·저장 로직: 변경 없음.
SeqScoutNormal.cs:305-310그대로. - Teaching 화면 표시: 영향 없음. 저장 직후
_SystemParameter.ScannerFieldImageFile에 전체 경로를 넣고 설정 저장으로 화면이 갱신되는 구조라(SeqScoutNormal.cs:307,:312-313) 파일명에 무관하다. - AutoRun 경로: 무영향.
SeqAutoRunPTOP.cs무수정. UCTestSequenceViewModel.cs:361(테스트 시퀀스 화면): 이번 범위에 포함하지 않음. 태그 없이 유지.
기존 파일과의 호환
기존에 쌓인 1_{HHmmss}.PNG 파일은 그대로 남는다. 파일명 규칙이 날짜 폴더 단위로 섞이지만
접미어 유무로 신/구 구분이 가능하다.
7. 검증 방법
- 빌드:
ILSOS_All.sln/Release|x64→Machines/_out_prismatic_rd_ptop/x64-Release/ - 레시피 활성화 후 레시피 티칭 화면에서 페이지 선택 → Scout 버튼 실행
D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_vision\FieldScanImage\{오늘날짜}\확인- 기대:
1_{HHmmss}_normal_{활성레시피ID}_{선택페이지}.PNG
- 기대:
- 레시피 미활성 상태에서도 실행 →
normal_0_{페이지}로 저장되고 예외가 나지 않는지 확인 - AutoRun 1사이클 실행 →
_auto_..._pre/_auto_..._post가 종전대로 나오는지 회귀 확인
5번은 M70516(WELD_TRIGGER_REQ)이 실제로 ON 되어야 검증된다. 2026-08-05 로그에서는 이 비트가 한 번도 감지되지 않아 AutoRun Scout 노드에 도달하지 못했다 (
Check OK -> PLC_WELD_TRIGGER_REQ0건).
8. 롤백
변경 블록에 [추가 2026-08-07] 주석 마커를 남긴다. 원복 시 해당 마커 줄과 SaveTag 줄,
지역변수 2줄을 제거하고 PageIndex 를 원래 인라인 호출로 되돌리면 된다.