# ILSOS PrismaticScanner - MOTF 구현 가이드 > 작성일: 2026-04-06 | 작성자: NDY --- ## 목차 1. [MOTF 개념](#1-motf-개념) 2. [변경된 파일 목록](#2-변경된-파일-목록) 3. [흐름 정리](#3-흐름-정리) 4. [변수 맵 수신 후 작업](#4-변수-맵-수신-후-작업) 5. [TODO 체크리스트](#5-todo-체크리스트) --- ## 1. MOTF 개념 ``` MOTF (Mark On The Fly) = Stage X(ACS)가 이동하는 동안 갈바노 스캐너가 레이저 마킹 트리거: Stage X 엔코더 위치 기반 → WaitForEncoderX 조건 도달 시 갈바노 마킹 시작 ``` ### 기존 방식 vs MOTF 방식 | 항목 | 기존 (갈바노 단독) | MOTF | |---|---|---| | Stage X | 정지 상태 | 이동 중 | | 마킹 트리거 | 즉시 실행 | 엔코더 위치 트리거 | | 처리량 | 낮음 | 높음 | --- ## 2. 변경된 파일 목록 ### WeldingCommon/Devices/ACS/ - `ScannerACS.cs` - Scanner 전용 ACS 디바이스 (Gun과 독립) - `ScannerACS.Parameter.cs` - ACS 변수명 상수 **(TODO: 변수 맵 교체 필요)** - `MotionVariable.cs` - 모터 상태값 ### WeldingCommon/Views/ - `UCScannerMotionViewModel.cs` - Stage X 조그 UI 연동 - `UCScannerMotion.xaml` - Stage X Motion 섹션 추가 ### ILSOS_PrismaticScanner/ - `EquipmentSetup.cs` - ScannerACS + 모터 등록 - `EquipDef.cs` - MotorIds 추가 - `Sequences/SeqComponentTeachingRun.cs` - MOTF 자리 확보 (주석) --- ## 3. 흐름 정리 ### SeqComponentTeachingRun 흐름 ``` CheckEndList ↓ UpdateComponentWeldingParameters (레이저 파라미터 설정) ↓ SetUploadWeldingList_SeqParams ↓ SeqUploadWeldingList (Scanner List 채우기 + MOTF ON/OFF) ↓ Scanner.Config.UseMarkingOnTheFly = true 이면 ↓ SetFlyX() + WaitForEncoderX() 자동 실행 GetUploadWeldingList_SeqResult ↓ DoComponentWelding ├── _Scanner.ExecuteList() (Scanner List 실행) ├── _ACS?.MOTFStart() ← TODO: 변수 맵 수신 후 주석 해제 ├── _Scanner.WaitForListTaskCompleted() └── CheckMOTFComp() ← TODO: 변수 맵 수신 후 주석 해제 ↓ CheckEndList (반복) ``` --- ## 4. 변수 맵 수신 후 작업 ### 4-1. ScannerACS.Parameter.cs - 변수명 교체 ```csharp // 현재 placeholder → 실제 변수명으로 교체 const string iMOTFStart = "iPCset_SCANNER_MOTF_START"; // TODO const string iMOTFComplete = "iPCget_SCANNER_MOTF_COMP"; // TODO const string rMOTFVelocity = "rPCset_SCANNER_MOTF_VEL"; // TODO const string rMOTFAcc = "rPCset_SCANNER_MOTF_ACC"; // TODO const string iAllAxisHomeComplete = "iPCget_ALLAXIS_HOMECOMP"; // TODO const string AlarmReset = "iAlarmreset"; // TODO const string HeavyAlarm = "iAlarm"; // TODO const string LightAlarm = "iLightAlarm"; // TODO private enum eBuffer { All_Axis_Home = 0, // TODO: 실제 버퍼 번호로 교체 MOTF_Start = 11, // TODO: 실제 버퍼 번호로 교체 } ``` ### 4-2. EquipDef.cs - MotorIds 축 번호 검증 ```csharp public enum eMotorIdx { AxisX2 = 1, // TODO: 실제 ACS 채널 번호 확인 AxisY1 = 3, // TODO: 실제 ACS 채널 번호 확인 AxisY2 = 4, // TODO: 실제 ACS 채널 번호 확인 AxisZ = 5, // TODO: 실제 ACS 채널 번호 확인 } ``` ### 4-3. SeqComponentTeachingRun.cs - 주석 해제 3곳 ```csharp // [1] CheckDeviceReady() - ACS 활성화 확인 추가 // DeviceIds.ACS ← 주석 해제 // [2] DoComponentWelding() - Stage X 이동 시작 // _ACS?.MOTFStart(); ← 주석 해제 // [3] DoComponentWelding() - MOTF 완료 대기 // while (!_ACS.CheckMOTFComp()) { Thread.Sleep(10); } ← 주석 해제 ``` ### 4-4. Scanner Config 설정 확인 ``` Scanner.Config.UseMarkingOnTheFly = true ← 반드시 확인 Scanner.Config.OnTheFlyCoordinate = eOntheFlyCoordinate.XY ← Linear Track 방식 Scanner.Config.MarkingOnTheFlyEncoderResolutionX ← 엔코더 분해능 Scanner.Config.MarkingStartEncoderPositionX ← 마킹 시작 엔코더 위치 ``` --- ## 5. TODO 체크리스트 ### 이정인 선임 변수 맵 수신 전 (완료) - [x] WeldingCommon에 ScannerACS 독립 구현 - [x] Scanner RegisterDevices()에 ACS + 모터 등록 - [x] UCScannerMotion Stage X 조그 UI 추가 - [x] SeqComponentTeachingRun MOTF 자리 확보 (주석) - [x] _ACS 필드 선언 및 InitDev()에서 null-safe 취득 - [x] CheckDeviceReady()에 ACS 주석으로 준비 ### 이정인 선임 변수 맵 수신 후 - [ ] ScannerACS.Parameter.cs 변수명 교체 - [ ] eBuffer 번호 교체 - [ ] MotorIds.eMotorIdx 축 번호 검증 - [ ] CheckDeviceReady() DeviceIds.ACS 주석 해제 - [ ] DoComponentWelding() MOTFStart() 주석 해제 - [ ] DoComponentWelding() CheckMOTFComp() 주석 해제 - [ ] Scanner Config UseMarkingOnTheFly 설정 확인 - [ ] 실제 장비에서 동작 확인