69 Commits

Author SHA1 Message Date
to3796zw
25edd79325 feat: Page Change bit로 Recipe+Page 전환 통합
PLC가 Page Change bit(0x08) 하나만 트리거로 보내면 Recipe No와
Page No를 함께 읽어 Recipe를 먼저 전환한 뒤 Page를 전환하도록 변경.
Recipe Change bit(0x09)는 트리거로 미사용(enum 정의는 보존).

- CheckRecipeNo Decision 제거, 흐름 재배선(CheckPageNo→Recipe→Page)
- Recipe No 1회 읽기, 0/음수/미등록/동일이면 전환 생략(정지 안 함)
- 실제 전환 시 ActivateRecipe 후 Dispatcher.Invoke(OnActiveReloaded)로
  Model.Layers 동기 갱신 + 페이지 검증/레이어 선택을 UI 스레드 직렬화
  (ActivateRecipe-Layers 비동기 race 차단)
- PC_RECIPE_CHANGE_COMPLETE 미사용 처리, PC_RECIPE_NO 에코는 유지

VS Rebuild(Debug|x64) EXITCODE=0 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:04:35 +09:00
to3796zw
9be3fdcb54 Merge branch 'field/ptop-1st' of https://gitea.ubisampaju.synology.me/RobotAutomationDevelopment-Dept/LGES-OC5-PtoP-Welder into field/ptop-1st
# Conflicts:
#	Machines/ILSOS_PrismaticRD_PTOP/Sequences/Manual/SeqComponentTeachingRun.cs
2026-06-20 19:52:36 +09:00
to3796zw
bae5f4fe63 chore: PLC PC I/O Check 완료 및 중알람 인터락 원복
PLC-PC 간 I/O Check 완료에 따라 SeqComponentTeachingRun의
중알람(High) 인터락 차단 블록을 임시 우회에서 원복하고,
PLC DeviceMap CSV(M/D Device) 4종을 추가한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 19:36:15 +09:00
9330fb20ea revert: TeachingRun H알람 인터락 임시 우회 원복 (현장 PLC 연결 완료)
현장 PLC 미연결로 임시 주석 처리했던 CheckCondition_Interlock()의
High(중대) 알람 인터락 블록을 원복. 현장 PLC 연결 완료에 따라 정상 동작.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 18:48:39 +09:00
a8a48cd7b5 docs: HMI Manual 상단 메뉴 바 PTOP 메뉴로 교체
EquipmentSetup.cs RegisterViews 기준 실제 PTOP 메뉴로 교체(코드→이미지):
AutoRun · Recipe · Manual · Calibration · Monitoring · Device · Setting · Alarm
- 슬라이드별 현재 화면 메뉴 강조(Slide1/2 AutoRun, Slide3 Manual, Slide4 Calibration)
- 타설비 메뉴(로드셀/Robot/IPA/Door Screen 등) 그룹 제거

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 16:04:47 +09:00
cbd6c10edf docs: HMI Manual PPT에 XAML 기반 화면 레이아웃 도식 삽입
스크린샷 대신 실제 WPF XAML 구조를 읽어 화면 구성을 도식 이미지로 렌더링·삽입.
- Slide1 Main(UCMainAutoRun): Working Position/Recipe Canvas/Manual Control/
  Equipment Status/Product Info/Camera View 그리드 레이아웃
- Slide3 Manual(UCManualScannerOperation): Scanner Camera/Motion/
  Laser Power Control(Control Setting·Laser Shot Control)
- Slide4 Calibration(UCScannerCalibration): Vision Correction List/Correction/
  Scanner Calibration/Mark Grid/Pattern List
- 타설비 스크린샷·번호 콜아웃 제거, 다크 HMI 스타일 도식으로 교체
- 생성 스크립트/렌더는 UnTrackedLocalFiles (커밋 제외)

남음: 상단 메뉴 인덱스 바의 타설비 항목(로드셀/Robot/IPA 등) 정리는 추후.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 15:06:37 +09:00
e940fdcdad docs: 산출물 HMI Manual PPT PTOP 텍스트 채움
타설비 용어/설명을 PTOP(레이저 용접) HMI 기준으로 교체.
- Slide1 Main: 메뉴/장비연결(PLC·IO·Laser·Scanner)/카운트/Cell·Lot
  (기존 Cognex·로드셀·Hermes·DownStream 등 타설비 용어 제거)
- Slide2 Main 상세: AutoRun(SeqAutoRunPTOP)/Scanner Canvas View 등
- Slide3 Manual: Scanner Jog·Home / Laser IO Gate / Model Finder / Head Theta 인터락
- Slide4 Calibration: Scanner Correction List / CorrectionPro
- 슬라이드 라벨: Manual/Calibration 정정, 폰트 속성 보존(python-pptx)

주의: 우측 화면 캡처 이미지는 타설비 스크린샷이라 실제 PTOP HMI 캡처로 교체 필요.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 14:54:35 +09:00
979f1b99cc docs: 산출물 SW 점검 결과 Excel PTOP 내용 자동 채움
타설비(비전/물류) 템플릿 잔재를 PTOP(레이저 용접) 프로젝트 소스 기준으로 교체.
- SW Version: PTOP 점검 항목(IO Check/PLC Interface/Scout Field 등)
- Device: PLC(Melsec)/Scanner(RTC)/Laser/Ajin IO
- IO List: PLC 인터페이스 신호 74건 (PLCController.Address.cs + PLC 명세서 검증
  주소 매핑 — PC출력 M/D70000+, PC입력 70500+; 예 M70509/D70510)
- Sequence: SeqAutoRunPTOP 핸드셰이크/용접/모니터링/Safety/UI
- Overall: PTOP 기능 트리, Motor List는 PLC측 회신 대기 표기
- 서식/수식/병합 보존(openpyxl), 원본 백업은 UnTrackedLocalFiles

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 14:52:12 +09:00
6c435ec04a revert: docs/분석 다시 git 추적 (커밋 포함 유지)
사유: 분석 문서가 다른 PC에서 풀 받을 때 사라지면 안 되어 git에 포함 유지.
- .gitignore의 /docs/분석/ 제외 규칙 제거
- docs/분석 전체 재추적(기존 22 + 금일 신규 3 = 25개)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 14:48:19 +09:00
d537792c48 chore: docs/분석 git 추적 해제 및 gitignore 추가, 산출물 양식 폴더 생성
- /docs/분석/ 을 .gitignore에 추가 (로컬 전용 분석 문서, 커밋 제외)
- 기존 추적되던 docs/분석 22개 파일 git rm --cached (로컬 파일은 유지)
- Doc/산출물문서/양식/ 폴더 생성 (추후 필수 제출 2종 드롭 위치, README 포함)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 14:41:04 +09:00
1d60d474b8 fix: 레시피 전환 시 Scout Field 이전 레시피 잔존(레시피축 stale) 수정
증상: 레시피 전환 후에도 이전 레시피의 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>
2026-06-20 14:40:47 +09:00
to3796zw
7fc11f2602 fix: AjinIO.IsConnected 반전 로직 정정
AxlGetBoardStatus가 SUCCESS일 때 미연결로 반환하던 반전 버그를
정정(실제 Ajin 연결 시 OnMonitoring 폴링이 스킵되던 원인).
연동해 OnMonitoring 미연결 가드를 앞으로 정리.
2026-06-20 10:14:18 +09:00
to3796zw
00cdd8ac9b fix: Axis Position Interlock 삭제, Theta 영어화
SequenceSetting의 Axis Position Interlock 속성 4개를 제거하고
(참조처 없음), LaserInterlock의 Head Theta DisplayName을 영어로
전환해 세팅 UI 표기를 정리. 빌드 검증 통과(오류 0).
2026-06-20 09:41:53 +09:00
to3796zw
bef3107f38 Merge branch 'field/ptop-1st' of https://gitea.ubisampaju.synology.me/RobotAutomationDevelopment-Dept/LGES-OC5-PtoP-Welder into field/ptop-1st 2026-06-19 17:45:27 +09:00
to3796zw
4a655ecefb fix: ScoutNormal 페이지별 필드 로드 정정 (PageIndex 주입)
증상: 운전화면 페이지 이동 후에도 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>
2026-06-19 17:44:35 +09:00
3849d4d951 docs: ScoutField 페이지별 로드 버그 작업지시서 + 작업일지 2026-06-19
- FieldHelper.json 분석 및 selectedIndexNo stale 버그 원인 정리
- A안(SeqScoutNormal PageIndex 주입) 수정안 작업지시서 작성 (소스 미수정, null 가드 포함)
- 작업일지 16:30 항목 + 주말 출근(06.20~06.21) 기록

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 17:23:54 +09:00
to3796zw
de7450474a docs: 작업일지 2026-06-19 - Head Theta 인터락·Scout sleep 기록
- 15:04 Laser Head Theta 각도 인터락 추가 (0e73086)
- 15:25 Scout Image Sleep Time 사용자 설정 추가 (e263ab8)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:37:10 +09:00
to3796zw
e263ab8a5a feat: ScoutNormal 행 전환 sleep 분리 (SameRow/RowChange)
같은 행 이동과 행 전환 이동(먼 거리)의 대기시간을 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>
2026-06-19 15:25:53 +09:00
to3796zw
0e73086b14 feat: 레이저 Head Theta 인터락 추가
발진(ExecuteWelding) 직전 PLC Head_Theta_Position(D70510)을 읽어
헤드 각도가 수평/수직 ±허용오차를 둘 다 벗어나면 알람 후 발진 차단.

- 세팅 메뉴 UI: 수평/수직/허용오차/PLC스케일 + 사용 체크박스
  (LaserInterlockSetting, 기본 미사용)
- fail-closed: PLC 미연결/미활성·스케일0 시 차단, 알람 호출 try/catch
- eWordInput.HEAD_THETA_POSITION(=D70510), 알람코드 210620 추가
- 런타임 설정(CSV 주소맵 D70510, AlarmDescriptions.xlsm 210620 행)은 별도 필요

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:04:05 +09:00
3333d3ca47 현장 ScoutImage moveSleepTime 변경 2026-06-19 14:39:04 +09:00
63dfc2fc53 docs: 작업일지 2026-06-19 - Recipe View 진입 크래시 수정 기록
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 13:57:58 +09:00
8bfeb7377a fix: 레시피 Guide Beam DO 읽기 try/catch 이동(크래시 방지) + AjinIO.ReadDoBit 구현 활성화
- 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>
2026-06-19 13:57:15 +09:00
to3796zw
eb307b459e Merge branch 'field/ptop-1st' of https://gitea.ubisampaju.synology.me/RobotAutomationDevelopment-Dept/LGES-OC5-PtoP-Welder into field/ptop-1st 2026-06-19 13:30:17 +09:00
to3796zw
058818d9b9 Update rules.md 2026-06-19 13:30:10 +09:00
to3796zw
eba70a4380 docs: PTOP 문서 최신화 및 Aurora 레퍼런스 연결
실제 repo와 어긋난 상위 아키텍처 문서를 현행 구조로 정정.
- 모듈명 ILSOS_PrismaticPTOP → ILSOS_PrismaticRD_PTOP 리네임 반영
- 삭제된 형제 모듈(Scanner/Gun/CleanLaser) 기술 정리
- PTOP 폴더구조·EquipDef ID·빌드 출력경로를 실제값으로 갱신
- architecture.md 200줄 이하로 슬림화(하네스 절 요약)
- CLAUDE.md에 Aurora 레퍼런스 README @import 연결

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 13:27:42 +09:00
to3796zw
a12f57e356 fix: AuroraMotor 참조 경로·빌드 순서 정정
클린 빌드 시 AuroraACS/AuroraPLC에서 'using AuroraMotor' CS0246 발생.
- AuroraACS.csproj: AuroraMotor HintPath를 미존재 경로에서 실제
  출력 위치(_out\x64-Debug)로 수정
- ILSOS_All.sln: 두 프로젝트에 AuroraMotor 빌드 순서 의존성 추가
  (느슨한 DLL 참조라 병렬 빌드 시 레이스로 먼저 컴파일되던 문제)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 13:27:32 +09:00
3b8799aa51 feat/docs: 가이드빔·알람·PLC(MXComponent) 분석 및 현장 임시 수정
- 분석 문서 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>
2026-06-19 12:49:08 +09:00
85a5aad60d docs: 작업일지 2026-06-19 - *_wpftmp.csproj gitignore 추가 기록
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:39:30 +09:00
3724007b15 chore: WPF 빌드 임시 파일(*_wpftmp.csproj) gitignore 추가
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:38:52 +09:00
7cb652574f docs: PtoP PLC 인터페이스 xlsx(260617) 삭제
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:38:24 +09:00
3293455a28 docs: 협업 규칙 5번 - .md 영문 작성 요건 제거
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:36:23 +09:00
5d2cdb3452 docs: 작업일지 2026-06-19 - External/Aurora/bin 커밋 예외 및 규칙 문서화 기록
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:28:22 +09:00
de0c1c20df docs: Git 커밋 규칙 문서화 및 architecture.md 연결
External/Aurora/bin 커밋 예외, .gitignore 자체 커밋(-f) 규칙을 GIT_RULES.md로 정리하고 architecture.md에 @import 연결

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:26:51 +09:00
7f464ab2af chore: External/Aurora/bin 커밋 예외 추가 및 산출물 포함
전역 bin/ 무시는 유지하되, External/Aurora/bin 만 negation으로 재포함하여 커밋 대상에 추가

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:23:35 +09:00
8033edad26 docs: 작업일지 - 오늘 작업 마무리 기록 (PLCAddress/IO null 커밋·푸시 정리) 2026-06-18 20:34:53 +09:00
0ca485eab2 docs: 작업일지 - PLCAddress 모호참조/IO null 분석 및 수정 기록 2026-06-18 20:32:35 +09:00
a312e4ec8a fix: 레시피 화면 IO 미연결 시 null 가드 (OnMonitoring)
시뮬 모드가 아니고 IO보드가 없으면 IODevice._iOUnit이 null이라
OnMonitoring의 ReadDI(11/15)에서 NRE 발생(현장 PC에서 레시피 메뉴 진입 시).
IsConnected()로 미연결을 선검사해 폴링을 스킵, 프로그램이 꺼지지 않도록 함.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 20:32:35 +09:00
95ef7b97c0 fix: PLCController.Address eCommon* enum 원복 (빌드 정상화)
89e9a02 "PLCController.Address 통일"이 base WeldingCommon의
eCommonBitInput/Output, eCommonWordInput/Output 선언만 eBit*/eWord*로
리네임하면서 소비처(Logic/시퀀스 등 60+곳)가 CS0246으로 깨지고,
PTOP enum과 using static 충돌(CS0104)까지 유발했음.
base를 eCommon*로 원복해 빌드 정상화 (이름 통일은 별도 과제).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 20:32:23 +09:00
89e9a02ed0 feat : PLCController.Address 통일 2026-06-18 17:12:25 +09:00
12402f81d6 feat :ReadbackAnalogOut 아날로그 Vot 값 표시 수정 2026-06-18 17:08:17 +09:00
aafde8e63f docs: CVT-Emini 조명 컨트롤러 메뉴얼/자료 추가 (LightControl)
Protocol/Spec-User Manual, Layout(dwg), LED Controller Test Prog 등.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 16:00:35 +09:00
a9f3ab0f2d docs: 작업일지 - Manual Laser Power Control Power 기본값 0 변경(5eebe96) 기록
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 15:56:59 +09:00
5eebe96779 프로그램 시작 시 Manual - Laser Powe Control 부분 파라미터 Power 값 10 -> 0 300 ->0 수정 2026-06-18 15:54:50 +09:00
0537c4aa7d docs: 작업일지 - PTOP 현장 레이저 참고 메뉴얼 기록 (Trumpf OPC UA for CPX)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 15:40:12 +09:00
e19a1e677a chore: PLC Recipe Change 수정가이드 삭제 (구현 반영 완료)
구현(42c5565)에 모두 반영되어 가이드 명세서 제거.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 15:32:00 +09:00
42c5565249 feat: PLC Recipe Change 핸드셰이크 구현 (SeqAutoRunPTOP) + 주소 정합
근거: 가이드 + Excel 260618(빨간셀 M70509/M70009/D70502/D70002). Page Change 미러링.
- 주소 enum: PLC_RECIPE_CHANGE_REQ(0x09)/PC_RECIPE_CHANGE_COMPLETE(0x09)/
  PLC_RECIPE_NO(idx2)/PC_RECIPE_NO(idx2). 공용 eCommonBitOutput 동기화.
  충돌: SeqStatusMonitor RMS_USED 읽기 주석, SeqAutoRunPrismatic 참조 이름만 교체.
- 시퀀스: CheckRecipeNo(논블로킹 Decision) + CheckRecipeNoComp(.Id 1:1 조회/활성화/
  반영폴링/에코·완료비트), Builder 흐름·엣지·루프백, 리셋 비트·워드, _RecipeManager Enter 확보.
- Page 검증 상한 하드코딩 제거 → 활성 Recipe Layers.Count() 가변.
- (별도) D:\ILSOSConfig\...\External\PLC CSV 디바이스맵 4종 라벨 정합(.bak260618 백업).

빌드는 VS Rebuild로 검증 필요(레거시 포함). STEP5 UI/PLC 사양 최종정합은 후속.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 15:31:43 +09:00
de06a4c897 docs: IOInterfaceView DI 경로 PTOP 전환 분석일지
IO DI 경로는 IO_Board.json의 IOInterfaceMapDI 절대경로로 결정되며
IODevice.MappingDIO가 path-agnostic하게 그대로 읽음(소스 수정 불필요).
PTOP 전환 = config(IO_Board.json 경로) + DI/DO.csv 존재 + DataPath 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 14:38:14 +09:00
1fbe7fa98f feat: DA1/DA2 Voltage 표시를 No Laser 토글에 연동(조건부 표시)
DA1/DA2 Voltage UniformGrid에 Visibility 바인딩(IsNoLaser, convTrueVisible) 추가.
Time이 Use Spot Time 체크 시 표시되듯, No Laser 체크 시에만 전압 표시.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 14:20:26 +09:00
accffdd94a feat: NoLaser 옵션을 Manual(ScannerLaserControl)로 이동, Recipe NoLaser 제거
- 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>
2026-06-18 14:14:59 +09:00
166d1bd2f0 feat: RTC5 AnalogOut 전압 readback - device 계층 + ViewModel + XAML 표시
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>
2026-06-18 13:57:14 +09:00