# ILSOS PrismaticScanner - ACS 작업 가이드 > 작성일: 2026-04-06 | 작성자: NDY --- ## 목차 1. [현재까지 완료된 작업](#1-현재까지-완료된-작업) 2. [변수 맵 수신 후 교체할 곳](#2-변수-맵-수신-후-교체할-곳) 3. [홈/서보/알람 버튼 추가 작업](#3-홈서보알람-버튼-추가-작업) 4. [MOTF 시퀀스 흐름](#4-motf-시퀀스-흐름) 5. [캘리브레이션](#5-캘리브레이션) 6. [TODO 체크리스트](#6-todo-체크리스트) --- ## 1. 현재까지 완료된 작업 ### 1-1. 프로젝트 구조 ``` WeldingCommon └── Devices/ACS/ ├── ScannerACS.cs ← Gun과 독립된 Scanner 전용 ACS ├── ScannerACS.Parameter.cs ← ACS 변수명 상수 (TODO: 변수 맵 교체 필요) └── MotionVariable.cs ← 모터 상태값 ILSOS_PrismaticScanner └── EquipmentSetup.RegisterDevices() ├── ScannerACS 등록 ├── MotorX2 등록 (Stage X) ├── MotorY1, Y2, Z 등록 (TODO: 축 번호 검증 필요) └── EquipDef.cs에 MotorIds 추가 ``` ### 1-2. WeldingCommon - UCScannerMotionViewModel.cs 수정 완료 - `_MotorX` (ACSMotor) 필드 추가 및 연결 - `StageXPos`, `IsStageXActivated` 프로퍼티 추가 - `CMD_JogMove`에 `Stage_X_Left`, `Stage_X_Right` 케이스 추가 - `MoveStageX()` 메서드 추가 (현재: 직접 모터 명령 방식) - `OnMonitoring()`에 Stage X 위치 갱신 추가 ### 1-3. WeldingCommon - UCScannerMotion.xaml 수정 완료 - `Stage X Motion (ACS)` GroupBox 추가 (Grid.Row="2") - Stage X[mm] 위치 표시 - ◀ − / + ▶ 조그 버튼 --- ## 2. 변수 맵 수신 후 교체할 곳 ### 2-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: 실제 버퍼 번호로 교체 } ``` ### 2-2. EquipDef.cs - MotorIds 축 번호 검증 ```csharp public enum eMotorIdx { AxisX2 = 1, // TODO: 실제 ACS 채널 번호 확인 AxisY1 = 3, // TODO: 실제 ACS 채널 번호 확인 AxisY2 = 4, // TODO: 실제 ACS 채널 번호 확인 AxisZ = 5, // TODO: 실제 ACS 채널 번호 확인 } ``` ### 2-3. UCScannerMotionViewModel.cs - MoveStageX() 교체 ```csharp // 현재 (직접 모터 명령) private void MoveStageX(eJogDirection direction) { if (_MotorX == null || !_MotorX.IsActivated) return; double step = direction == eJogDirection.PLUS ? -StepValue : +StepValue; _MotorX.SetTargetPos(step, TargetPosType.REL); _MotorX.Move(); } // TODO: 변수 맵 수신 후 ACS 버퍼 방식으로 교체 // private void MoveStageX(eJogDirection direction) // { // double velocity = GetStageXVelocity(); // Setting에서 가져오기 // double acc = GetStageXAcc(); // _acs?.StageXJogStart(velocity, acc); // } ``` --- ## 3. 홈/서보/알람 버튼 추가 작업 ### 3-1. IScannerACS 인터페이스 추가 항목 ```csharp // WeldingCommon/Devices/ACS/ScannerACS.cs public interface IScannerACS { bool IsActivated(); // 홈 bool AllAxisHomeStart(); bool AllAxisHomeStop(); bool CheckAllAxisHome(); // Stage X 조그 (ACS 버퍼 방식) - TODO: 변수 맵 수신 후 구현 bool StageXJogStart(double velocity, double acc); bool StageXJogStop(); // MOTF bool MOTFStart(); bool MOTFStop(); bool CheckMOTFComp(); // 레이저 bool SetLaserIOUse(bool on); bool IsLaserOn(); // 알람 bool ResetAlarm(); void AllAxisServoOff(); } ``` ### 3-2. UCScannerMotionViewModel.cs - 추가할 코드 ```csharp // 필드 추가 private ScannerACS _acs; // 커맨드 추가 public ICommand CMD_HomeStart { get; } public ICommand CMD_HomeStop { get; } public ICommand CMD_AlarmReset { get; } public ICommand CMD_ServoOff { get; } // 생성자에서 추가 try { _acs = _Aurora.DeviceManager["ACS"] as ScannerACS; } catch { _acs = null; } CMD_HomeStart = new DelegateCommand(_ => _acs?.AllAxisHomeStart()); CMD_HomeStop = new DelegateCommand(_ => _acs?.AllAxisHomeStop()); CMD_AlarmReset = new DelegateCommand(_ => _acs?.ResetAlarm()); CMD_ServoOff = new DelegateCommand(_ => _acs?.AllAxisServoOff()); ``` ### 3-3. UCScannerMotion.xaml - Stage X GroupBox 교체 ```xml