using Hermes; using PAIX_NMF_DEV; using System; namespace AuroraIO.Vendor.PAIX { public class PAIXIO : IOUnit { short[] nDIPinStatus = new short[128]; short[] nDOPinStatus = new short[128]; int nDOPinCount = 0; int nDIPinCount = 0; short m_nDevNo = 0; bool m_bDevConnect = false; NMF.TNMF_ALL_STS tAllStatus = new NMF.TNMF_ALL_STS(); // 전체상태 구조체 NMF.TNMF_COMPO tDiCompo = new NMF.TNMF_COMPO(); // 장치구성정보 구조체 NMF.TNMF_COMPO tDoCompo = new NMF.TNMF_COMPO(); // 장치구성정보 구조체 public enum ePDIAddress { EMOSwitchFront, EMOSwitchBack, DoorLockOpen1 = 4, DoorLockOpen2, DoorLockOpen3, DoorLockOpen4, DoorLockCloseMonitoring = 10, StartSwitch = 12, ResetSwitch, ModeKeyAuto, ModeKeyMaint, PanelTempAlarm, L2MotorMCOn = 19, FanAlarm5 = 21, FanAlarm6, FanAlarm7, FanAlarm8, MainN2Alarm = 30, MainCDAAlarm, DICount } public enum ePDOAddress { TowerLampREDOn, TowerLampYELLOWOn, TowerLampGREENOn, TowerLampBLUEOn, BuzzerOn, WorkLEDOn, ResetSwitchLamp = 9, SafetyDoorRelease = 11, ModeKeySolOn = 13, ChillerRemoteOn = 15, LaserOnLampOn = 16, SeamWeldingOpticAirKnifeSol, SeamWeldingN2BlowSol = 18, DOCount } public enum ePCDIAddress { CLAMP_LEFT_FW_CY = 2, CLAMP_LEFT_BW_CY = 3, CLAMP_FRONT_FW_CY = 8, CLAMP_FRONT_BW_CY = 9, CLAMP_TOP_UP_CY = 17, CLAMP_TOP_DOWN_CY = 18, LASER_Ready = 25, LASER_Emission_On, LASER_Alarm, LASER_Warning, SCANNER_Laser_Enable, DICount } public enum ePCDOAddress { LASER_Pilot_Laser = 20, LASER_Emission_Enable, LASER_Alarm_Reset, CLAMP_LEFT_FW_SOL, CLAMP_LEFT_BW_SOL, CLAMP_FRONT_FW_SOL, CLAMP_FRONT_BW_SOL, CLAMP_TOP_UP_SOL, CLAMP_TOP_DOWN_SOL, SCANNER_Laser_Enable_Request = 29, DOCount } public enum ePTDIAddress { SUCTION_UP_CY = 2, SUCTION_DOWN_CY = 3, LASER_READY = 25, PROG_ACTIVE, PROG_COMPLETE, PILOT_LASER_IS_ON, LASER_WARNING_LAMP_IS_ON, DICount } public enum ePTDOAddress { LASER_READY_ENABLE = 19, PROG_BIT_0, PROG_BIT_1, PROG_BIT_2, PSTART_STATICAL, FAULT_EXE, PILOT_LASER_ON, SUCTION_UP_SOL = 30, SUCTION_DOWN_SOL, DOCount } public override int Open(string iP) { string[] strIP = iP.Split('.'); short nRet; short[] nIP = new short[4]; nIP[0] = Convert.ToInt16(strIP[0]); nIP[1] = Convert.ToInt16(strIP[1]); nIP[2] = Convert.ToInt16(strIP[2]); m_nDevNo = Convert.ToInt16(strIP[3]); //여기서 DIIP인지 DOIP인지 알수있는 방법이 없음.. 우선 아래처럼 해놓고 고민해보자 //string m_type = strIP[4]; //switch(m_type) //{ // case "DI": // m_nDiDevNo = Convert.ToInt16(strIP[3]); // m_nDevNo = m_nDiDevNo; // break; // case "DO": // m_nDoDevNo = Convert.ToInt16(strIP[3]); // m_nDevNo = m_nDoDevNo; // break; //} try { //네트워크 연결 확인 nRet = NMF.nmf_PingCheck(m_nDevNo, nIP[0], nIP[1], nIP[2], 200); if (nRet != 0) { Log.E($"Ping Check Error DevNo : {m_nDevNo}, Error : {nRet}"); return E1.ARGUMENT; } // 장치 연결 nRet = NMF.nmf_Connect(m_nDevNo, nIP[0], nIP[1], nIP[2]); if (nRet != 0) { Log.E($"Connect Error DevNo : {m_nDevNo}, Error : {nRet}"); return E1.ARGUMENT; } m_bDevConnect = true; return E1.OK; } catch (Exception e) { return E1.ARGUMENT; } } public override void Close() { if (m_bDevConnect) { NMF.nmf_Disconnect(m_nDevNo); NMF.nmf_Disconnect(m_nDevNo); m_bDevConnect = false; } } public override int Initialize() { short nRet; // 연결된 장치의 구성정보를 확인합니다. try { nRet = NMF.nmf_GetCompo(m_nDevNo, out tDiCompo); nRet = NMF.nmf_GetCompo(m_nDevNo, out tDoCompo); if (nRet == 0) { //tCompo로 확인하는 코드 구현 필요 } //LoadIOTable(); return E1.OK; } catch (Exception e) { return E1.ARGUMENT; } } public override void Instance(string mappingFolder) { IOMappingFolder = mappingFolder; //LoadIOTable(); } public override bool IsConnected() { return m_bDevConnect; } public override int GetDICount() { try { nDIPinCount = tDiCompo.nCntBrd[(int)NMF.Enmf_BoardType.nmf_btDI16] * 16 + tDiCompo.nCntBrd[(int)NMF.Enmf_BoardType.nmf_btDI8] * 8; //nDIPinCount = 128; return nDIPinCount; } catch (Exception e) { return E1.ARGUMENT; } } public override int GetDOCount() { try { nDOPinCount = tDoCompo.nCntBrd[(int)NMF.Enmf_BoardType.nmf_btDO16] * 16 + tDoCompo.nCntBrd[(int)NMF.Enmf_BoardType.nmf_btDO8] * 8; //nDOPinCount = 128; return nDOPinCount; } catch (Exception e) { return E1.ARGUMENT; } } public override int GetAICount() { return 0; } public override int GetAOCount() { return 0; } public override int GetDoArray(ref bool[] array) { try { short nRet; //배열 개수가 128개로 고정되어 있을 듯 nRet = NMF.nmf_DOGet(m_nDevNo, nDOPinStatus); array = new bool[nDOPinStatus.Length]; // nPinStatus 배열의 값을 bool 배열로 변환 for (int i = 0; i < nDOPinStatus.Length; i++) { array[i] = nDOPinStatus[i] == 1; } return E1.OK; } catch (Exception e) { return E1.ARGUMENT; } } public override int GetDiArray(ref bool[] array) { try { short nRet; //배열 개수가 128개로 고정되어 있을 듯 nRet = NMF.nmf_DIGet(m_nDevNo, nDIPinStatus); array = new bool[nDIPinStatus.Length]; // nPinStatus 배열의 값을 bool 배열로 변환 for (int i = 0; i < nDIPinStatus.Length; i++) { array[i] = nDIPinStatus[i] == 1; } return E1.OK; } catch (Exception e) { return E1.ARGUMENT; } } public override int ReadDoBit(int index, ref bool bit) { try { bool[] arrDI = new bool[128]; GetDoArray(ref arrDI); bit = Convert.ToBoolean(arrDI[index]); return E1.OK; } catch (Exception e) { return E1.ARGUMENT; } } public override int ReadDiBit(int index, ref bool bit) { try { bool[] arrDI = new bool[128]; GetDiArray(ref arrDI); bit = Convert.ToBoolean(arrDI[index]); return E1.OK; } catch (Exception e) { return E1.ARGUMENT; } } public override bool ReadDoBit(int index) { try { //PAIX는 Bit 1개 정보를 받아오는 API가 없음.. 전체 상태 받아와서 넘겨주자 bool[] arrDO = new bool[128]; GetDoArray(ref arrDO); return Convert.ToBoolean(arrDO[index]); } catch (Exception e) { return false; } } public override bool ReadDiBit(int index) { try { if (!IsConnected()) return false; //PAIX는 Bit 1개 정보를 받아오는 API가 없음.. 전체 상태 받아와서 넘겨주자 bool[] arrDI = new bool[128]; GetDiArray(ref arrDI); return Convert.ToBoolean(arrDI[index]); } catch (Exception e) { return false; } } public override int WriteDoBit(int index, bool bit) { try { if (!IsConnected()) return E1.NETWORK; short data = Convert.ToInt16(bit); short nPinNo = Convert.ToInt16(index); int nRet = (int)NMF.nmf_DOSetPin(m_nDevNo, nPinNo, data); if (nRet != 0) { Log.E(string.Format($"Fail to WriteDoBit : {nRet}")); return nRet; } return 0; } catch (Exception e) { return E1.ARGUMENT; } } public override void ClearList() { ListDI.Clear(); ListDO.Clear(); } } }