static public bool OpenDevice(out short _nModuleIP) { _nModuleIP = m_nModuleIP; if (bOpened) { return(true); } short nRet; if (NMC2.nmc_PingCheck(m_nModuleIP, 200) != 0) { Log.ShowMessage("PAIX", "Ping Test Error 192.168.0." + m_nModuleIP.ToString()); return(false); } nRet = NMC2.nmc_OpenDevice(m_nModuleIP); if (nRet == 0) { bOpened = true; } else { Log.ShowMessage("PAIX", "NMC2 Open Failed"); return(false); } return(bOpened); }
public bool SetOut(int _iNo, bool _bOn, bool _bDirect = false) { //Check Error. if (_iNo >= m_iMaxOut || _iNo < 0) { return(false); } //Get Addr. int iBitAddr; int iModule; int iModuleDp; GetInfoOutput(_iNo, out iModule, out iModuleDp, out iBitAddr); short nOn = _bOn ? (short)1 : (short)0; if (_bDirect) { NMC2.nmc_SetDIOOutPin(m_aModuleInfo[iModule].nNmcNo, (short)iBitAddr, nOn); } else { m_aModuleInfo[iModule].nDataOutSet[iBitAddr] = nOn; } return(true); }
/// <summary> /// 홈을 수행한다. /// </summary> /// <returns>수행 성공여부.</returns> public bool GoHome(double _dHomeVelFirst, double _dHomeVelLast, double _dHomeAccFirst) { SetServo(true); short nRet; bool bRet; nRet = NMC2.nmc_SetSpeed(m_nDevId, (short)Para.iPhysicalNo, 200, _dHomeAccFirst, _dHomeAccFirst, _dHomeVelFirst); nRet = NMC2.nmc_SetAccSpeed(m_nDevId, (short)Para.iPhysicalNo, _dHomeAccFirst); nRet = NMC2.nmc_SetDecSpeed(m_nDevId, (short)Para.iPhysicalNo, _dHomeAccFirst); nRet = NMC2.nmc_SetHomeSpeed(m_nDevId, (short)Para.iPhysicalNo, _dHomeVelFirst, _dHomeVelFirst, _dHomeVelLast); // 1. 0번 축의 원점 이동 모드 : +Near // 2. 원점 검색후(3차이동 까지 완료) CW회전으로 Z상 검출 // 3. 지령/엔코더 위치 0으로 초기화 // 4. Offset 300위치로 이동 // 5. Offset이동후 지령/엔코더 위치 0으로 초기화 //nRet = nmc_HomeMove(11, 0, 0x82 | 3, 0xF, 300); const short nHomeEndMode = NMC2.NMC_END_CMD_CLEAR_A_OFFSET | NMC2.NMC_END_ENC_CLEAR_A_OFFSET | NMC2.NMC_END_CMD_CLEAR_B_OFFSET | NMC2.NMC_END_ENC_CLEAR_B_OFFSET; //메뉴얼과 샘플이 달라서 샘플 방식으로 함...eHomeMethode 여기다 0x80을 덮어 씌워야 된다고 //메뉴얼에 나와 있었는데 잘 모르겠음... nRet = NMC2.nmc_HomeMove(m_nDevId, (short)Para.iPhysicalNo, (short)Para.eHomeMode, nHomeEndMode, Para.dHomeOffset * m_dPulsePerUnit, 0); bRet = nRet == 0; return(bRet); }
/// <summary> /// Command Encoder Target포지션 세팅. /// </summary> /// <param name="_dPos">세팅할 펄스</param> public void SetPos(double _dPos) { short nRet; nRet = NMC2.nmc_SetCmdPos(m_nDevId, (short)Para.iPhysicalNo, _dPos); nRet = NMC2.nmc_SetEncPos(m_nDevId, (short)Para.iPhysicalNo, _dPos); }
public bool GetIn(int _iNo) { //Check Error. if (_iNo >= m_iMaxIn || _iNo < 0) { return(false); } bool _bOn; //Controller 추가 연결시 사용 되는거 같다. //NMC2.nmc_GetDIOInput(m_nDevId, ReadStat); NMC2.nmc_GetMDIOInput(m_nDevId, ReadStat); if (ReadStat[_iNo] == 0) { _bOn = false; } else { _bOn = true; } return(_bOn); }
public bool Init() { short nRet; if (!MotionNMC2.CModule.OpenDevice(out m_nDevId)) { return(false); } // DIO 입/출력 개수 정보 가져오기 ======================== short nMotionType, nIOType, nExtIo, nMDio; nRet = NMC2.nmc_GetDeviceInfo(m_nDevId, out nMotionType, out nIOType, out nExtIo, out nMDio); //nIOType은 IO Controller 사용시. //switch (nIOType) //{ // case 1: m_iMaxIn = 16; m_iMaxOut = 16; break; // case 2: m_iMaxIn = 32; m_iMaxOut = 32; break; // case 3: m_iMaxIn = 48; m_iMaxOut = 48; break; // case 4: m_iMaxIn = 64; m_iMaxOut = 64; break; // default: m_iMaxIn = 0 ; m_iMaxOut = 0 ; break; //} //기본 Motion Controller 사용시는 NMDio사용. switch (nMDio) { case 1: m_iMaxIn = 8; m_iMaxOut = 8; break; default: m_iMaxIn = 0; m_iMaxOut = 0; break; } return(true); }
/// <summary> /// -방향 조그 이동 /// </summary> /// <param name="_dVel">초당 구동 속도 펄스</param> /// <param name="_dAcc">구동 가속율 펄스</param> /// <param name="_dDec">감속율 펄스</param> public void JogN(double _dVel, double _dAcc, double _dDec) { short nRet; nRet = NMC2.nmc_SetSpeed(m_nDevId, (short)Para.iPhysicalNo, 200, _dAcc, _dDec, _dVel); nRet = NMC2.nmc_JogMove(m_nDevId, (short)Para.iPhysicalNo, 1); }
public bool GetOut(int _iNo) { //Check Error. if (_iNo >= m_iMaxOut || _iNo < 0) { return(false); } bool _bOn; short nRet; //Controller 추가 연결시 사용 되는거 같다. //nRet = NMC2.nmc_GetDIOOutput(m_nDevId, ReadStat); nRet = NMC2.nmc_GetMDIOOutput(m_nDevId, ReadStat); //OutPut if (ReadStat[_iNo] == 0) { _bOn = false; } else { _bOn = true; } return(_bOn); }
/// <summary> /// 홈센서 기준 절대 위치로 이동. /// </summary> /// <param name="_dPos">이동할 위치 펄스단위</param> /// <param name="_dVel">이동할 속도 펄스단위</param> /// <param name="_dAcc">이동할 가속 펄스단위</param> /// <param name="_dDec">이동할 감속 펄스단위</param> /// <returns>성공여부</returns> public void GoAbs(double _dPos, double _dVel, double _dAcc, double _dDec) { short nRet; nRet = NMC2.nmc_SetSpeed(m_nDevId, (short)Para.iPhysicalNo, 200, _dAcc, _dDec, _dVel); nRet = NMC2.nmc_AbsMove(m_nDevId, (short)Para.iPhysicalNo, _dPos); }
/// <summary> /// 홈센서 기준 절대 위치로 다축 이동. /// </summary> /// <param name="Para.iPhysicalNos">이동할축들 0번이 마스터</param> /// <param name="_dPoses">이동할 위치 펄스단위</param> /// <param name="_dVel">이동할 속도 펄스단위</param> /// <param name="_dAcc">이동할 가속 펄스단위</param> /// <param name="_dDec">이동할 감속 펄스단위</param> /// <returns>성공여부</returns> /// 일단 2축만 구현한다. /// 축번호는 오름차순으로 배열 해야함. public void GoMultiAbs(int [] _iPhysicalNos, double [] _dPoses, double _dVel, double _dAcc, double _dDec) { if (_iPhysicalNos.Count() > 3 || _dPoses.Count() > 3) { return; } if (_iPhysicalNos.Count() < 2 || _dPoses.Count() < 2) { return; } if (_iPhysicalNos.Count() != _dPoses.Count()) { return; } short nRet; nRet = NMC2.nmc_SetSpeed(m_nDevId, (short)_iPhysicalNos[0], 200, _dAcc, _dDec, _dVel); if (_iPhysicalNos.Count() == 2) { nRet = NMC2.nmc_Interpolation2Axis(m_nDevId, (short)_iPhysicalNos[0], (double)_dPoses[0], (short)_iPhysicalNos[1], (double)_dPoses[1], 1); } if (_iPhysicalNos.Count() == 3) { nRet = NMC2.nmc_Interpolation3Axis(m_nDevId, (short)_iPhysicalNos[0], (double)_dPoses[0], (short)_iPhysicalNos[1], (double)_dPoses[1], (short)_iPhysicalNos[2], (double)_dPoses[2], 1); } }
/// <summary> /// 현재 파라미터들을 아진 함수를 이용하여 세팅함. /// </summary> public void ApplyPara(double _dPulsePerUnit) { m_dPulsePerUnit = _dPulsePerUnit; short nRet; //이머전시 로직은 한모듈에서 그룹별로 나눠놨는데 //4축 이하는 그룹이 무조건 1개 이다. //왜 이렇게 만들었는지 이해가 안됨... nRet = NMC2.nmc_SetEmgLogic(m_nDevId, 0, 0); nRet = NMC2.nmc_SetUnitPerPulse(m_nDevId, (short)Para.iPhysicalNo, 1); //1펄스당 1펄스로 세팅. nRet = NMC2.nmc_SetNearLogic(m_nDevId, (short)Para.iPhysicalNo, (short)Para.eHomeLogic); nRet = NMC2.nmc_SetMinusLimitLogic(m_nDevId, (short)Para.iPhysicalNo, (short)Para.eMinusLimitLogic); nRet = NMC2.nmc_SetPlusLimitLogic(m_nDevId, (short)Para.iPhysicalNo, (short)Para.ePlusLimitLogic); nRet = NMC2.nmc_SetAlarmLogic(m_nDevId, (short)Para.iPhysicalNo, (short)Para.eAlarmLogic); nRet = NMC2.nmc_SetEncoderZLogic(m_nDevId, (short)Para.iPhysicalNo, (short)Para.eZLogic); nRet = NMC2.nmc_SetEncoderCount(m_nDevId, (short)Para.iPhysicalNo, (short)Para.eEncMulti); nRet = NMC2.nmc_SetEncoderDir(m_nDevId, (short)Para.iPhysicalNo, (short)Para.eEncInputMode); //진입점이 없다고 뻑남... 메뉴얼 샘플 과 DLL버전이 다른듯. nRet = NMC2.nmc_SetPulseLogic(m_nDevId, (short)Para.iPhysicalNo, (short)Para.ePulseLogic); nRet = NMC2.nmc_SetSReadyLogic(m_nDevId, (short)Para.iPhysicalNo, (short)Para.eServoLogic); //nRet = NMC2 }
/// <summary> /// 서보 온오프 /// </summary> /// <param name="_bOn">온오프</param> public void SetServo(bool _bOn) { short nRet; short nSignal = _bOn ? (short)0 : (short)1; //이지서보 다이렉트 케이블일 경우 접점이 반대라서 우선 뒤집어 놓는다. nRet = NMC2.nmc_SetServoOn(m_nDevId, (short)Para.iPhysicalNo, nSignal); }
/// <summary> /// 홈이 지원 안되는 보드 같은경우 돌려주고 Update 함수 내부에서 처리 해야 한다. /// 파익스는 네트워크 타입이라 너무 느려서 업데이트에서 한번만 스캔하여 담아두고 /// </summary> public void Update() { if (Para.iPhysicalNo != 0) { return; } short nRet; nRet = NMC2.nmc_GetAxesExpress(m_nDevId, out NmcAxesExpr); nRet = NMC2.nmc_GetAxesMotionOut(m_nDevId, out NmcAxesMotionOut); nRet = NMC2.nmc_GetHomeStatus(m_nDevId, out NmcHomeFlag); if (nRet != 0) { if (!m_bNeededReopen) { Log.ShowMessage("PAIX", "Needed Reopen 192.168.0." + m_nDevId.ToString()); } m_bNeededReopen = true; } if (m_bNeededReopen) { if (CModule.ReOpenDevice()) { m_bNeededReopen = false; } } }
static public void CloseDevice() { if (!bOpened) { return; } NMC2.nmc_CloseDevice(m_nModuleIP); bOpened = false; }
public bool SetOut(int _iNo, bool _bOn) { //Check Error. if (_iNo >= m_iMaxOut || _iNo < 0) { return(false); } //OutPut short nOn = _bOn ? (short)1 : (short)0; short nRet; //Controller 추가 연결시 사용 되는거 같다. //nRet = NMC2.nmc_SetDIOOutPin(m_nDevId, (short)_iNo, nOn); nRet = NMC2.nmc_SetMDIOOutPin(m_nDevId, (short)_iNo, nOn); return(true); }
/// <summary> /// 리셑 시그널 온오프 제어 /// </summary> /// <param name="_bOn">온오프</param> public void SetReset(bool _bOn) { short nRet; short nSignal = _bOn ? (short)1 : (short)0; nRet = NMC2.nmc_SetAlarmResetOn(m_nDevId, (short)Para.iPhysicalNo, nSignal); //이상하게 이머진시 오래 유지 되고 난후에 이머전시 풀르면 A접점들이 안살아나면서 //병신이 되서 프로그램 껏따 켜야되는데... //밑에 테스트 결과 안됌. //전기 문제 혹은 파익스 문제 인듯. //if (!_bOn) //{ // bool bRet = CModule.ReOpenDevice(); //} }
private void Btn_Disital_Output_Click(object sender, EventArgs e) { Button btn = (Button)sender; short bitno = -1; if (btn != null) { bitno = Convert.ToInt16(btn.Tag); if (MultiMotion.OutStatus[bitno] == 1) { NMC2.nmc_SetDIOOutputBit(DeviceManager.g_ndevIdC_4, bitno, 0); } else { NMC2.nmc_SetDIOOutputBit(DeviceManager.g_ndevIdC_4, bitno, 1); } } }
static public bool ReOpenDevice() { NMC2.nmc_CloseDevice(m_nModuleIP); if (NMC2.nmc_PingCheck(m_nModuleIP, 200) != 0) { Log.Trace("PAIX", "ReOpen Ping Test Error 192.168.0." + m_nModuleIP.ToString()); return(false); } short nRet = NMC2.nmc_OpenDevice(m_nModuleIP); if (nRet == 0) { Log.ShowMessage("PAIX", "ReOpen Success! 192.168.0." + m_nModuleIP.ToString()); return(true); } Log.Trace("PAIX", "ReOpen Failed! 192.168.0." + m_nModuleIP.ToString()); return(false); }
/// <summary> /// 초기화 함수. /// </summary> /// <returns>초기화 성공여부</returns> public bool Init() { if (m_bInit == false) { m_bInit = true; //통합 보드 초기화 부분. if (!MotionNMC2.CModule.OpenDevice(out m_nDevId)) { return(false); } //Motor 개수 정보 가져오기 ======================== short nRet; short nMotionType, nIOType, nExtIo, nMDio; nRet = NMC2.nmc_GetDeviceInfo(m_nDevId, out nMotionType, out nIOType, out nExtIo, out nMDio); m_iMaxMotor = nMotionType; } return(true); }
/* * public void Update() * { * //NMC2.nmc_GetMDIOOutput(m_nDevId, ReadStatOut); * //NMC2.nmc_GetMDIOInput (m_nDevId, ReadStatIn ); * for(int i=0; i < m_iModuleCnt; i++) * { * NMC2.nmc_SetDIOOutPins(m_aModuleInfo[i].nNmcNo, (short)m_aModuleInfo[i].nDataOutSet.Length , m_aModuleInfo[i].nDataOutNo, m_aModuleInfo[i].nDataOutSet); * * //short s = m_aModuleInfo[i].nDataOutSet[0] ; * //NMC2.nmc_SetDIOOutPin(m_aModuleInfo[i].nNmcNo , 0 , s); * * //NMC2.nmc_GetDIOOutput (m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataOutGet); * //NMC2.nmc_GetDIOInput (m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataIn ); * NMC2.nmc_GetDIOOutput128 (m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataOutGet); * NMC2.nmc_GetDIOInput128 (m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataIn ); * * * } * * * * } */ public void Update() { //NMC2.nmc_GetMDIOOutput(m_nDevId, ReadStatOut); //NMC2.nmc_GetMDIOInput (m_nDevId, ReadStatIn ); bool bDisconnected = false; for (int i = 0; i < m_iModuleCnt; i++) { if (NMC2.nmc_SetDIOOutPins(m_aModuleInfo[i].nNmcNo, (short)m_aModuleInfo[i].nDataOutSet.Length, m_aModuleInfo[i].nDataOutNo, m_aModuleInfo[i].nDataOutSet) == NMC2.NMC_NOTCONNECT) { bDisconnected = true; } //short s = m_aModuleInfo[i].nDataOutSet[0] ; //NMC2.nmc_SetDIOOutPin(m_aModuleInfo[i].nNmcNo , 0 , s); //NMC2.nmc_GetDIOOutput (m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataOutGet); //NMC2.nmc_GetDIOInput (m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataIn ); if (NMC2.nmc_GetDIOOutput128(m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataOutGet) == NMC2.NMC_NOTCONNECT) { bDisconnected = true; } if (NMC2.nmc_GetDIOInput128(m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataIn) == NMC2.NMC_NOTCONNECT) { bDisconnected = true; } } //이건 아예 첨부터 장비 파워 안들어갔을때. 중간에 장비 전원 껐다켰을때. if (m_iModuleCnt == 0 || bDisconnected) { short[] nIp = new short[] { 192, 168, 0, 255 }; // 192.168.0.XXX로 되는 모든 주소로 장치 검색 int nCount = NMC2.nmc_GetEnumList(nIp, out NMC2.NMCEQUIPLIST NmcEquipList); if (nCount != 0) { Init(); } } }
public bool Init() { short[] nIp = new short [] { 192, 168, 0, 255 }; // 192.168.0.XXX로 되는 모든 주소로 장치 검색 //무조건 첫모듈은 1번이여야 하고 순서대로 설정해야 함. 1,2,3,4,5,6, //이함수에서 모듈을 선착순 순서로 리턴해서 순서가 렌덤임. int nCount = NMC2.nmc_GetEnumList(nIp, out NMC2.NMCEQUIPLIST NmcEquipList); if (nCount <= 0) { Log.ShowMessage("Dio", "Module Count is 0, plz Check IP Add"); return(false); } for (int i = 0; i < nCount; i++) { if (NmcEquipList.nDioType[i] != 0) { m_iModuleCnt++; } } m_aModuleInfo = new TModuleInfo[m_iModuleCnt]; m_iModuleCnt = 0; //string sTemp = ""; for (int j = 1; j < nCount + 1; j++) { for (int i = 0; i < nCount; i++)//2개이상 모듈을 사용할때 IP작은순으로 들어오지 않고 선착순으로 들어옴.... { if (NmcEquipList.lModelType[i] == NMC2.NMC2_UDIO) { //int i1 = NmcEquipList.lIp[0] & 0xff; //int i2 = NmcEquipList.lIp[0]>>8 & 0xff; //int i3 = NmcEquipList.lIp[0]>>16 & 0xff; int i4 = NmcEquipList.lIp[i] >> 24 & 0xff; if (i4 != j) { continue; } //sTemp = sTemp + i4.ToString(); m_aModuleInfo[m_iModuleCnt].nNmcNo = (short)i4; if (NMC2.nmc_OpenDevice(m_aModuleInfo[m_iModuleCnt].nNmcNo) != 0) { Log.ShowMessage("Dio", "Paiz NMC2 IO Module Port Open Fail"); return(false); } NMC2.nmc_GetDIOInfo(m_aModuleInfo[m_iModuleCnt].nNmcNo, out short iCntIn, out short iCntOut); m_aModuleInfo[m_iModuleCnt].iCntIn = iCntIn; m_aModuleInfo[m_iModuleCnt].iCntOut = iCntOut; m_aModuleInfo[m_iModuleCnt].nDataIn = new short[128]; m_aModuleInfo[m_iModuleCnt].nDataOutGet = new short[128]; m_aModuleInfo[m_iModuleCnt].nDataOutSet = new short[128]; //new short[iCntOut]; 16개나 128개나 시간상 똑같아서 128 m_aModuleInfo[m_iModuleCnt].nDataOutNo = new short[128]; //new short[iCntOut]; m_iMaxIn += iCntIn; m_iMaxOut += iCntOut; for (int k = 0; k < 128; k++) { m_aModuleInfo[m_iModuleCnt].nDataOutNo[k] = (short)k; } m_iModuleCnt++; } } } //for(int y = 0; y < m_iMaxOut; y++) //{ // SetOut(y,GetOut(y)); //} for (int i = 0; i < m_iModuleCnt; i++) { NMC2.nmc_GetDIOOutput128(m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataOutSet); NMC2.nmc_GetDIOOutput128(m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataOutGet); NMC2.nmc_GetDIOInput128(m_aModuleInfo[i].nNmcNo, m_aModuleInfo[i].nDataIn); } //Log.ShowMessage(sTemp, sTemp); /* * short nRet; * // DIO 입/출력 개수 정보 가져오기 ======================== * short nMotionType, nIOType, nExtIo, nMDio; * nRet = NMC2.nmc_GetDeviceInfo(m_nDevId, out nMotionType, out nIOType, out nExtIo, out nMDio); * //nIOType은 IO Controller 사용시. * //switch (nIOType) * //{ * // case 1: m_iMaxIn = 16; m_iMaxOut = 16; break; * // case 2: m_iMaxIn = 32; m_iMaxOut = 32; break; * // case 3: m_iMaxIn = 48; m_iMaxOut = 48; break; * // case 4: m_iMaxIn = 64; m_iMaxOut = 64; break; * // default: m_iMaxIn = 0 ; m_iMaxOut = 0 ; break; * //} * //기본 Motion Controller 사용시는 NMDio사용. * switch(nMDio) * { * case 1: m_iMaxIn = 8 ; m_iMaxOut = 8 ; break; * default: m_iMaxIn = 0 ; m_iMaxOut = 0 ; break; * } */ //NMC2E-UDIO-CPU, NMC2E-UD16&UDO16 사용시 //int plDeviceType; //NMC2.nmc_GetDeviceType(m_nDevId, out plDeviceType); //short pnInCount, pnOutCount ; //int iRet = NMC2.nmc_GetDIOInfo(m_nDevId, out pnInCount, out pnOutCount); //m_iMaxIn = pnInCount ; //m_iMaxOut = pnOutCount; //if(iRet != 0) { // m_iMaxIn = 0 ; m_iMaxOut = 0 ; //} //ReadStatIn = new short[m_iMaxIn ]; //ReadStatOut = new short[m_iMaxOut]; return(true); }
public void Update() { NMC2.nmc_GetMDIOOutput(m_nDevId, ReadStat); NMC2.nmc_GetMDIOInput(m_nDevId, ReadStat); }
/// <summary> /// 모터 감속 무시 긴급정지. /// </summary> public void EmgStop() { short nRet; nRet = NMC2.nmc_SuddenStop(m_nDevId, (short)Para.iPhysicalNo); }
//Motion Functions. /// <summary> /// 모터 정지 명령. /// </summary> public void Stop() { short nRet; nRet = NMC2.nmc_DecStop(m_nDevId, (short)Para.iPhysicalNo); }
public static short SetPin(short nNmfNo, short nPinNo, short nOutStatus) { //SubForm.SmallLog.Instance.LogReport(string.Format("핀번호={0} 상태값={1}", nPinNo, nOutStatus)); return(NMC2.nmc_SetDIOOutputBit(nNmfNo, nPinNo, nOutStatus)); }