NohDoyeon241104 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

13 KiB
Raw Blame History

작업일지 — 2026-06-18

09:22

조명 컨트롤러 연결 완료 (아침)

  • 조명 컨트롤러 연결을 완료했다.

중요 사항 정리:

  • 조명 컨트롤러는 모델의 사양(스펙) 파라미터를 알고 있어야 한다.
  • 사용 중인 모델은 EROOM E-MINI CONTROLLER 인데, AURORA에서 해당 모델 타입을 제공 중이라 그대로 활용했다.
  • DEVICE에서 LIGHT1 과 Light 에 대한 파라미터 세팅을 동일하게 맞춰주고, 채널도 맞춰줘야 한다.
  • 통신 파라미터: 정지 비트(stop bit), 패리티 비트(parity bit), 시작 비트(start bit), Baud 값, 그리고 어떤 COM 포트에 꽂혔는지만 정확히 알면 된다.
  • 막혔던 부분 (해결): 장치 관리자에서 COM1 포트 설정은 맞췄지만, 고급 설정에 들어가면 버퍼(buffer) 체크가 되어 있는 항목이 있다. 이걸 꼭 해제해줘야 리모트 모드로 조명 컨트롤러에 커맨드를 날릴 수 있다.

09:32

현장 update 파일 정리

  • 어제(2026-06-17) 수정한 소스 파일들을 현장 소스에 옮기기 위해 docs/현장update파일/ 폴더를 만들어 복사해두었다.
  • 포함 파일:
    • SequenceSetting.cs — Axis Position Interlock 파라미터 4개 추가 (수직/수평 기준값·허용오차, 커밋 9543238)
    • UCScannerObjectTeachingControlBoxViewModel.cs — Laser Ready 판정을 DI(9) → DI(12) && DI(24) 동시 조건으로 변경 (커밋 9aa1b2a)
    • README.md — 각 파일의 원본 위치 / 변경 부분(diff) / 적용 체크리스트 정리

현장 PC 원격 데스크톱 접속 가능하게 변경

  • 금일 현장 PC가 방화벽 때문에 원격 데스크톱이 안 됐는데, 김남오 대리님께서 세팅하신 뒤 PC를 재부팅해서 원격 접속이 가능하도록 변경해주셨다.

09:36

현장 소스 반영(옮기기) 완료

  • docs/현장update파일/에 정리한 변경 내용을 현장 소스에 옮기기 완료했다.
    • SequenceSetting.cs — Axis Position Interlock 파라미터 4개 추가 반영
    • UCScannerObjectTeachingControlBoxViewModel.cs — Laser Ready 판정 DI(12) && DI(24) 변경 반영

10:02

SeqScoutNormal moveSleepTime 50→100ms 변경

  • SeqScoutNormal.cs의 Scanner Jump 후 moveSleepTime을 50 → 100ms로 변경했다.
  • 이유: 현장 PTOP의 경우 어제 Scout 이미지가 속도 때문에 제대로 안 됐는데, 현장 PTOP 상황에서 ScoutNormal의 FOV 거리가 멀어서 캡처가 흔들리는 부분 때문에 50에서 100으로 상향함.
  • 커밋 81fdf01로 커밋·푸시 완료.

10:18

[요청] 레이저 미발진 상태로 Analog만 살려 Power Cal 파일 생성 가능 여부

  • 목적: Laser Voltage를 1V 줬을 때 실제 몇 W가 나오는지 측정하는 캘리브레이션(Cal) 파일을 만들고 싶다.
  • 핵심 요청: 캘 파일을 만드는 동안 레이저는 실제로 발진(발사)시키지 않고, 아날로그 신호만 살려서 RTC5의 기록(로그/데이터)은 그대로 저장되도록 할 수 있는가?
  • 상세:
    • 레시피(또는 메뉴얼) 화면 → Manual Laser Power Control 영역에서 레이저를 쏠지 안 쏠지 제어함.
    • 보통은 레이저 컨트롤러 IO를 살리지 않으면 레이저가 실제로 나가지 않는다.
    • 이때 아날로그 신호만 활성화해서, 레이저는 안 나가되 RTC5가 출력 기록은 정상적으로 남기도록(저장되도록) 만들 수 있는지 확인 필요.
  • 정리: Laser 발진 IO는 비활성(레이저 OFF) + Analog 출력은 활성 → RTC5 기록은 정상 저장. 이 구성이 가능한지 검토 요청.

11:27

PTOP 네임스페이스/클래스 마이그레이션 적용 (Scanner → PTOP) + 머신 PTOP 단독화

  • 프로젝트명만 PTOP로 바꾸고 Sequence만 손봤던 상태에서, ILSOS_PrismaticScanner 네임스페이스/using/클래스명/파일명이 남아있던 것을 참고본(D:\Git\LGES-OC5-PtoP-Welder_정리후(빌드완))과 동일하게 정리.
  • 분석 문서 기준으로 진행: docs/분석/2026/06/18/111604_ptop_namespace_migration_guide.md
  • 적용 내역:
    • 파일 7개 git mv 리네임 (AlarmCode/AlarmManager/PAIX/EquipmentSpecificModel → _PTOP, RMSHandlerForScanner→ForPTOP, SettingUploadDataListForScanner→ForPTOP, SeqAutoRunPrismaticScanner→SeqAutoRunPrismatic)
    • namespace ILSOS_PrismaticScanner → ILSOS_PrismaticRD_PTOP (전 .cs/.xaml)
    • using 동일 변경, 클래스명 참조 전파 (PLCControllerPrismaticScanner→PLCControllerPTOP 등)
    • ⚠ PAIX_PrismaticScanner는 머신 참조만 PAIX_PTOP로 변경, WeldingCommon 공유 참조(SeqTestRun.cs)는 보존 — 빌드 깨짐 1순위 함정 회피
    • XAML 3종(x:Class/clr-namespace/code-behind) 일치, csproj Compile Include 7줄 갱신
    • csproj 빌드 경로 TDC→PTOP (_out_prismatic_rd_ptop)
    • sln에서 Scanner/Gun/CleanLaser 제거, 해당 머신 소스 폴더 삭제, 비-PTOP _out 아티팩트 정리 → Machines에 PTOP만 남김 (참고본과 동일 구조)
  • 주의: 이 환경에선 실제 MSBuild 검증 불가 → VS에서 Clean→Rebuild 권장(obj 비워둠).

11:34

Manual Laser Power Control — Watt 입력 GroupBox 숨김(Collapsed)

  • 마이그레이션 후 빌드 정상 확인 완료.
  • UCScannerLaserControl.xaml(WeldingCommon)의 Manual Laser Power Control 2영역(%, W) 중 W 입력 영역은 주로 안 쓰므로 Grid.Row="1"(Watt 기준) GroupBox에 Visibility="Collapsed" 추가로 숨김 처리.
  • Percent(%) 영역만 노출, 공간도 미차지. ViewModel/바인딩(CMD_LaserShotOnWatt 등)은 변경 없음.
  • 관련 분석: docs/분석/2026/06/18/102847_manual_laser_power_control_groupbox_analysis.md
  • 커밋 ad6cf68로 커밋·푸시 완료.

12:12

NoLaser 체크 — 레이저 컨트롤러(IO BIT9/13) 안 켜고 Laser On 가능

  • 발진(lasing)을 막는 실제 지점은 LaserSignalOn(RTC5 게이트)이 아니라 IO Control DO9(CoreLaser_Control)/DO13(RingLaser_Control) 를 true로 주는 부분이었음.
  • 위치: UCScannerObjectTeachingControlBoxViewModel.PerformCmdLaserReadyCheck(Laser Control GroupBox의 Laser Ready 버튼).
  • 처음엔 UCScannerLaserControl에 Analog Only(IsAnalogOnly)로 LaserSignalOn 가드를 넣었으나, 실제 IO는 다른 소스(ObjectTeachingControlBox)라 그 변경은 원복하고(Watt 숨김은 유지), 정확한 지점에 다시 구현.
  • 구현: ViewModel에 IsNoLaser 추가(기본 false). Laser Ready 버튼이 DO9/13을 켜는 분기에서 ctrlOn = !IsNoLaser로 적용 → IsNoLaser=true면 DO9/13을 true로 안 켜고 false 유지 → 레이저 컨트롤러 OFF 상태로 Laser On 가능(Cal/전압 측정용).
  • XAML: Laser Control GroupBox에 No Laser (전압만, 발진 안 함) 체크박스 추가.
  • 디바이스 레이어(Scanner/RTC5) 무변경, IO 비트 9/13만 제어.
  • 커밋·푸시 진행.

12:20

Laser Ready 판정 DI 변경 — IO 결선 변경(12&24 → 11&15)

  • IO 결선을 바꿔서, 레시피의 Laser Ready 판정 입력을 ReadDI(12) && ReadDI(24) → ReadDI(11) && ReadDI(15) 로 수정.
  • 위치: UCScannerObjectTeachingControlBoxViewModel의 OnMonitoring Laser Ready 판정부.
  • 변경된 결선에 맞춘 단순 입력 번호 교체(로직 동일).

13:55

RTC5 AnalogOut 전압 Readback 표시 (Laser Shot Control)

  • docs/RTC5_AnalogOut_Readback_수정가이드.md(외부 작성 구현 명세)에 맞춰 RTC5 보드의 AnalogOut(파워 지령 전압) readback 기능 구현. 가이드 파일은 적용 후 삭제.
  • Device 계층: ScannerObj에 abstract int GetAnalogOut(uint portNo) 추가 → ScannerRTC5/ScannerRTC6(n_get_value(signal=portNo+32), AnalogOut1=33/AnalogOut2=34)/ScannerSimul(더미 0) override + Scanner 파사드(미활성 시 -1).
  • ViewModel(UCScannerLaserControlViewModel): AnalogOut1Voltage/AnalogOut2Voltage 속성 + ReadbackAnalogOut()(raw/4095×10 [V]) 추가, Laser On 직접 분기(No Use Spot Time)의 WriteDA 직후·출사 전 호출.
  • XAML(UCScannerLaserControl.xaml): Control Setting(Percent 영역)에 DA1 Voltage/DA2 Voltage [V] 읽기전용 표시 추가.
  • 표시 대상은 Power Calibration(dbVoltage)이 아니라 ScannerLaserControl 화면으로 확정(요청). LaserSignalOn 발사 동작은 변경 없음(readback만 추가).
  • AuroraDevices 변경이라 VS Rebuild로 빌드 확인 예정(abstract 추가 → override 3개 모두 구현).
  • 관련 분석: docs/분석/2026/06/18/122432_laser_on_no_emission_analysis.md

14:14

NoLaser를 Manual(ScannerLaserControl)로 이동 + Recipe NoLaser 제거

  • 어제/오늘 Recipe(UCScannerObjectTeachingControlBox)에 만들었던 NoLaser는 원래 의도가 Manual 화면이었음 → Recipe에서 완전 제거(속성/InitVariable/체크박스/RowDefinition/PerformCmdLaserReadyCheck의 ctrlOn 원복하여 WriteDoBit(9/13,true)로 환원). DI 11&15 변경은 유지.
  • Manual(UCScannerLaserControlViewModel): IsNoLaser 추가, Laser On 직접 분기(Percent/Watt 두 곳)의 LaserSignalOn()을 if(!IsNoLaser)로 가드 → 체크 시 발진 없이 전압만 인가.
  • Manual XAML(UCScannerLaserControl.xaml): Use Spot Time 토글과 같은 ToggleSwitch 디자인의 No Laser (전압만) 토글 추가. Timer Set 영역 배치 = Use Spot Time → Time(체크 시만) → No Laser → DA1/DA2 Voltage 순.
  • 이 NoLaser는 RTC5 발진 게이트(LaserSignalOn)를 막는 방식이라 이 화면만으로 자기완결(DO9/13 별도 화면 불필요). No Use Spot Time + No Laser + Laser On → 전압 readback 표시 + 발진 없음.

14:19

DA1/DA2 Voltage 표시를 No Laser 토글에 연동(조건부 표시)

  • DA1/DA2 Voltage UniformGrid에 Visibility="{Binding IsNoLaser, Converter={StaticResource convTrueVisible}}" 추가.
  • Time이 Use Spot Time 체크 시 표시되는 것과 동일하게, No Laser 체크(전압만) 시에만 DA1/DA2 Voltage 표시, Laser Fire(해제) 시 숨김.

14:33

IOInterfaceView DI 경로 PTOP 전환 분석 (소스 무수정)

  • Monitoring IOInterfaceView의 DI 표시가 Scanner DI를 보던 원인 분석. IODevice.MappingDIO가 IO_Board.json의 IOInterfaceMapDI(절대경로)를 그대로 읽음(path-agnostic) → 소스 수정 불필요.
  • PTOP 전환 = D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_config_device\IO_Board.json의 DI/DO 경로를 PTOP로 + DI/DO.csv 존재 + DataPath 확인. (Device 설정에서 파일 위치만 지정하면 됨)
  • 분석일지: docs/분석/2026/06/18/143345_io_interface_di_path_ptop_analysis.md

15:30

PLC Recipe Change 인터페이스 구현 (SeqAutoRunPTOP) + 주소/디바이스맵 정합

  • 근거: docs/PLC_RecipeChange_구현_수정가이드.md + Excel 유니셀 PtoP 단동기 Laser Interface_260618.xlsx(빨간셀 M70509/M70009/D70502/D70002). 기존 Page Change 핸드셰이크를 미러링해 Recipe Change(상위 개념) 추가.
  • STEP1 주소 enum (Device/PLC/PLCController.Address.cs):
    • eBitInput PLC_RMS_USED→PLC_RECIPE_CHANGE_REQ(0x09), eBitOutput PC_EMPTY01→PC_RECIPE_CHANGE_COMPLETE(0x09)
    • eWordInput PLC_STEP_NO→PLC_RECIPE_NO(idx2), eWordOutput EMPTY_02→PC_RECIPE_NO(idx2)
    • 공용 eCommonBitOutput에 PC_RECIPE_CHANGE_COMPLETE=0x09 동기화(RestoreDeviceStatus가 common enum 사용)
    • 충돌: SeqStatusMonitor의 RMS_USED 읽기 주석(소비처 0), SeqAutoRunPrismatic의 PLC_STEP_NO 참조 이름만 교체(로직 불변)
  • STEP2~4,6 시퀀스 (Sequences/SeqAutoRunPTOP.cs):
    • CheckRecipeNo(Decision, 논블로킹 peek: REQ OFF면 Page로, ON이면 Comp로) + CheckRecipeNoComp(3회 검증→.Id 1:1 조회→활성화+반영 폴링→에코/완료비트, Page 미러형) 추가
    • Builder: CheckInitCondition → CheckRecipeNo → CheckRecipeNoComp → CheckPageNo, REQ-OFF 엣지 추가, 루프백(CheckCycleStop)을 RecipeNo로 회귀
    • 리셋: RestoreDeviceStatus/OnSeqActionStop에 Recipe 비트·워드 초기화
    • _RecipeManager는 Enter 노드에서 미리 확보해 사용
    • STEP6: 페이지 상한 하드코딩(>2) 제거 → _ScannerCanvasUserCtrl.Model.Layers.Count() 가변 검증(Recipe별 2~5페이지)
  • CSV 디바이스맵 4종(D:\ILSOSConfig\…PTOP\External\PLC): M70509/M70009/D70502/D70002 라벨을 enum과 정합(.bak260618 백업). enum 값/인덱스 ↔ CSV 주소 ↔ Excel 빨간셀 전부 1:1 일치 확인.
  • STEP5(UI Recipe 표시)는 선택이라 생략. 핸드셰이크는 기존 Page 미러형(COMPLETE 비트만) — PLC 사양 최종 정합/base 절대주소는 PLC 담당자 확인 권장.
  • ⚠️ 빌드는 VS Rebuild로 검증 필요(레거시 포함). 작업 중 Excel 워킹트리본(57249)을 커밋본(46119)으로 되돌린 이슈 있었음(도연님 확인 → 문제없음).