Use Interlock ON 시 ① 안전구역 게이트(기존) 유지 + ② 레시피별 방향 차단(신규). Recipe 폴더의 Recipe_Laser_Interlock.json(Front/Down 0/1)에 저장하고, 경로는 FieldHelper.json과 동일 소스(DB.Dao.SystemRecipe.WorkRecipeFile) 사용. Auto/Manual 양쪽 적용(Manual은 ①+② 신규), VM 체크박스는 레시피 전환 시 Background 우선순위 재로드로 stale 방지.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- UCScannerObjectTeachingControlBox.xaml: Scout Normal 실행 줄을 2열에서 3열로
재구성, 너비 1*/1.3*/1*로 Run 강조. Run Scout Normal 버튼을 Run으로 변경,
1열에 Field 버튼 신규 추가.
- VM: 매뉴얼 화면과 동일한 WDSelectScoutField 팝업을 띄우는
CMD_ShowSelectFieldWindow 이식. 저장은 팝업 VM에서 자체 처리하므로
비전 이벤트 구독(SAVE_CHILD_IMAGE_SETTING)은 제외.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 레시피 컨트롤박스에 'Scanner Cam' 버튼 추가 → 카메라+모션 창 Show/Hide 토글
- WDScannerCamMotion: 전용 displayType(Machine_C) 카메라뷰 + 매뉴얼 UCScannerMotion 재사용
- UCScannerMotionViewModel: publish/execute 모드 분리
- 레시피(publish): 입력값을 EVENT_SCANNER_COMMAND_MOVE 로 발행
- 매뉴얼(execute): 이벤트 구독해 동일 메소드로 실제 스캐너 이동(인터락 그대로 재사용)
- Move/Jog/Home 메소드를 인자형으로 리팩터해 UI·이벤트 경로가 같은 본체 공유
- 분석 문서 추가(docs/분석/2026/06/23)
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>
같은 행 이동과 행 전환 이동(먼 거리)의 대기시간을 RowIdx 기준으로 분리.
- SystemParameter: ScoutSameRowSleepMs(150)/ScoutRowChangeSleepMs(300) 추가
- Recipe View > Scout Image 그룹에 입력 UI 2줄 + 즉시 저장
- SeqScoutNormal.CaptureNextPosition: prevRowIdx 추적해 행 전환 시 분기
- 공유(WeldingCommon)라 같은행은 150(기존동일), 행전환 기본 300ms
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- UCScannerObjectTeachingControlBoxViewModel.OnMonitoring:
IsGuidBeam = _IODevice.ReadDO(17) 를 try 블록 안으로 이동, catch 에서 IsGuidBeam=false
→ IO 미연결(시뮬/개발PC)에서 Recipe View 진입 시 미처리 예외로 앱 종료되던 문제 해결
- AjinIO.ReadDoBit(int): 스텁(return true) → AxdoReadOutport 실제 구현 활성화
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 분석 문서 4종 추가 (docs/분석/2026/06/19):
알람부 종합 / MX Component PLC 연결 / AjinIO.ReadDoBit / 가이드빔 TruPulse(ExtPilotOnOff 미구현)
- AjinIO.ReadDoBit(int): 스텁(return true) 유지 + 구현(ReadDiBit 패턴) 주석 보존
- SeqComponentTeachingRun: 중알람 인터락 임시 주석 (현장 PLC 미연결 우회, 추후 원복)
- 레시피 Guide Beam: DO 17 read/write + IsConnected 가드 주석 (필요시 주석 토글 운용)
- 작업일지 2026-06-19 정리
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
시뮬 모드가 아니고 IO보드가 없으면 IODevice._iOUnit이 null이라
OnMonitoring의 ReadDI(11/15)에서 NRE 발생(현장 PC에서 레시피 메뉴 진입 시).
IsConnected()로 미연결을 선검사해 폴링을 스킵, 프로그램이 꺼지지 않도록 함.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DA1/DA2 Voltage UniformGrid에 Visibility 바인딩(IsNoLaser, convTrueVisible) 추가.
Time이 Use Spot Time 체크 시 표시되듯, No Laser 체크 시에만 전압 표시.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Manual: IsNoLaser 추가, Laser On 직접 분기(Percent/Watt)의 LaserSignalOn을
if(!IsNoLaser)로 가드 → 체크 시 발진 없이 전압만 인가
- Manual XAML: Use Spot Time과 동일 ToggleSwitch 디자인의 'No Laser(전압만)' 토글 추가
(Timer Set: UseSpotTime → Time(체크시) → NoLaser → DA1/DA2 Voltage)
- Recipe(UCScannerObjectTeachingControlBox): NoLaser 완전 제거(원래 의도가 Manual),
PerformCmdLaserReadyCheck를 WriteDoBit(9/13,true)로 환원. DI 11&15 변경은 유지.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ed36f8d에서 분석 문서만 들어가, 실제 구현 소스를 함께 커밋.
- ScannerObj.GetAnalogOut(abstract) + RTC5/RTC6(n_get_value, signal=portNo+32)/Simul(0) + Scanner 파사드(-1)
- UCScannerLaserControlViewModel: AnalogOut1/2Voltage + ReadbackAnalogOut(raw/4095*10 V), Laser On 직접 분기 WriteDA 직후 호출
- UCScannerLaserControl.xaml: Control Setting에 DA1/DA2 Voltage [V] 표시
- 작업일지 13:55 기록
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
IO 결선 변경에 따라 Laser Ready 입력 판정을
ReadDI(12) && ReadDI(24) → ReadDI(11) && ReadDI(15)로 수정. 로직 동일.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
W 입력 영역은 주로 사용하지 않아 UCScannerLaserControl.xaml의 Grid.Row=1
(Watt 기준) GroupBox를 Visibility=Collapsed 처리. Percent 영역만 노출.
ViewModel/바인딩은 변경 없음(CMD_LaserShotOnWatt 등 유지).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
OnMonitoring의 IsLaserReady 판정을 DI(9)(CoreLaser_Laser_Ready 단독)에서
DI(12) && DI(24) (CoreLaser_Control_Status AND RingLaser_Control_Status)로 변경.
버튼이 켜는 Control(DO9/13)의 피드백을 Core·Ring 둘 다 확인.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
PTOP 변경 과정에서 Recipe 탭 진입 시 IO Device DI 읽기 실패로 시스템 크래시 발생.
근본 원인:
- DI 24가 PTOP 하드웨어에 미정의됨
- UCScannerObjectTeachingControlBoxViewModel에서 DI 9, 24를 함께 읽으려고 시도
- 범위 초과 오류(ERROR CODE:3102) 발생
변경사항:
- DI 24 읽기 제거 (Scanner 레거시 코드, PTOP에 불필요)
- DI 9 읽기만 수행하도록 변경
- try-catch 예외 처리 추가로 안정성 개선
- 오류 발생 시 에러 로깅
Fixes: Recipe 탭 시스템 셧다운
또는 더 간단하게:
fix: Recipe 탭 DI 읽기 오류 해결
DI 24가 PTOP에 미정의되어 OnMonitoring에서 범위 초과 에러 발생.
DI 9만 읽도록 수정하고 try-catch 예외 처리 추가.