using Aurora; using Aurora.Api; using AuroraDeviceCommon.Utils; using AuroraIO; using AuroraLaser; using Hermes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static AuroraIO.AJINEXTEK.AjinIO.IOModuleInfo; using static WeldingCommon.Devices.Laser.PAIX_PrismaticScanner; namespace WeldingCommon.Devices.Laser { public class PAIX_PrismaticScanner : IODevice { public PAIX_PrismaticScanner(IAuroraEnvironment auroraEnv, string deviceId, bool isSimul) : base(auroraEnv, deviceId, isSimul) { } public int WriteDoBit(ePrismaticDOAddress index, bool bit) => _iOUnit.WriteDoBit((int)index, bit); public bool ReadDiBit(ePrismaticDIAddress index) => _iOUnit.ReadDiBit((int)index); #region 260824 이전 원본 (임시레이저 Core/Ring 2대 구성) — 원복 시 이 블록을 살리고 아래를 제거 //public enum ePrismaticDIAddress //{ // CoreLaser_Laser_Ready = 9, // CoreLaser_Error_State, // CoreLaser_Laser_Output_State, // CoreLaser_Control_Status, // RingLaser_Laser_Ready, // RingLaser_Error_State, // RingLaser_Laser_Output_State, // RingLaser_Control_Status = 23, //} //public enum ePrismaticDOAddress //{ // CoreLaser_Control = 9, // CoreLaser_ErrorClearing, // RingLaser_Control = 13, // RingLaser_ErrorClearing, // EX_Red_Control = 17, //} #endregion // ───────────────────────────────────────────────────────────────────────────── // 260824 본 레이저(Max MFMC-2000/2000M) 단일 발진기 구성. // Core/Ring 2대 → 1대 통합으로 상태 신호 8개 → 4개. // // ★ 이 enum 이 IO 채널 번호의 단일 소스다. PAIX_PTOP / SeqAutoRunPTOP 의 중복 정의를 제거하고 // 전부 이곳을 참조하도록 통일했다(260824). 번호 수정은 여기 한 곳만 고치면 된다. // // ※ 아래 값은 통신배선자료 엑셀 "Digital_IO (본 레이저)" 시트의 도면값이다. // 임시레이저에서 도면이 실배선보다 DI 기준 +1 어긋난 전례가 있다(분석문서 §8). // 실측 결과가 다르면 여기 숫자만 -1 하면 된다. // // 괄호 안은 레이저 I/O 커넥터 핀 번호 — 배선 추적용 메모이며 소프트웨어는 사용하지 않는다. // ───────────────────────────────────────────────────────────────────────────── // 260824 레이저 38핀 커넥터 매뉴얼 확인 후 명칭·의미 정정. 도면(엑셀) 라벨에 오기가 있었다. public enum ePrismaticDIAddress { // (Pin21) LASER_READY — "Power Supply ON & No error" 일 때 High. 출사 가능 조건. Laser_READY = 8, // (Pin22) ERROR/ALARM — ★★ Active-Low ★★ // 정상 시 High(24V), 알람 발생 시 Low(0V). 판정할 때 반드시 부정(!)을 붙여야 한다. // if (!ReadDiBit(Laser_ALARM)) → 알람 발생 Laser_ALARM, // (Pin23) LASER_EMISSION_ON — Emission ON=High. 실제 발진 중에 High 가 된다. // ★ 260904 현장 실측 정정 — 종전 주석의 "DO Laser_REMOTE(External Start) 의 에코" 는 오기다. // 이 신호가 들어올 때 실제로 레이저가 출사 중이었음을 현장에서 확인했다. // → 메뉴얼 화면 "레이저 출사중" 램프의 판정 근거로 쓴다(UCScannerLaserControlViewModel). // ※ 260826 에 레시피 화면 Laser Ready 표시를 DO Laser_REMOTE 되읽기로 정한 판단은 그대로 유효하다. // 출사 중에만 뜨는 신호라 애초에 Ready 램프로는 쓸 수 없다. Laser_EMISSION_ON, // (Pin24) MAIN_PWR_STATE — 레이저 전원 투입 상태(Key Switch ON=High). // ※ 도면(엑셀)에는 "Laser_FIRE" 로 적혀 있으나 오기다. 발진 중 표시가 아니다. // DO Laser_AC_KEY 의 에코. Laser_MAIN_PWR_STATE, } public enum ePrismaticDOAddress { // (Pin5,6 쇼트) REMOTE_AC_KEY_A/B — 외부 제어용 키스위치. 분리 시 Emission OFF. Laser_AC_KEY = 8, // (Pin7,8 쇼트) REMOTE_DC_PWR_SW1/SW2 — "External Start" // ★ 이름과 달리 모드 전환이 아니라 Emission ON/OFF 를 직접 제어한다. // 연결 시 Emission ON, 분리 시 Emission OFF. 구 Core/Ring_Control 자리. Laser_REMOTE, // (Pin18) EX_RED_CONTROL+ — 가이드 레이저 ON/OFF. 구 EX_Red_Control 자리(명칭 동일). Laser_GUIDE_BEAM_CONTROL, // (Pin20) EX_RESET+ — ★ Water Flow Alarm 리셋 전용. 다른 error/alarm 에는 무효다. // 구 Core/Ring_ErrorClearing 의 완전한 대체품이 아니다. Laser_ALARM_RESET, } } public class LaserIOControl : Device { PAIX_PrismaticScanner _ioBoard; public IODevice _IOLaser; public IOUnit _iOUnit; public LaserIOControl(PAIX_PrismaticScanner io) { _IOLaser = io; _ioBoard = io; _iOUnit = io._iOUnit; } protected override int DoActivate(IDeviceConfig config) { if (_ioBoard.IsActivated) return E1.OK; return E2.NOT_CONNECTED; } protected override int DoDeactivate() { return E1.OK; } public int SetEmmision(bool on) { _ioBoard.WriteDO(1, on); return E1.OK; } public bool GetLaserReady() { #region 260824 이전 원본 (Core/Ring 2대 AND 판정) //bool coreReady = false; //bool ringReady = false; //GetLaserDIStatus(ePrismaticDIAddress.CoreLaser_Laser_Ready, out coreReady); //GetLaserDIStatus(ePrismaticDIAddress.RingLaser_Laser_Ready, out ringReady); // //return coreReady && ringReady; #endregion // 260824 본 레이저 단일 발진기 — Laser_READY 단독 판정 bool ready = false; GetLaserDIStatus(ePrismaticDIAddress.Laser_READY, out ready); return ready; } public int GetLaserDevice(ref IODevice _IOLaser) { if (IsActivated == false || _ioBoard == null) { return E1.GENERIC; } _IOLaser = _ioBoard; return E1.OK; } private bool GetLaserDIStatus(ePrismaticDIAddress addr, out bool bValue) { bool[] arrDI = new bool[Convert.ToInt32(_IOLaser._iOUnit.GetDICount())]; int nRet = _IOLaser._iOUnit.GetDiArray(ref arrDI); if (nRet == E1.OK && arrDI.Length != 0) { bValue = arrDI[Convert.ToInt32(addr)]; return true; } else { bValue = false; return false; } } } }