public override int GetAxisActPos(int nAxisNo) { short rtn = 0; double post = 0; int postCmd = 0; if (m_MotorType[nAxisNo] >= MotorType.SEVER) { rtn |= CPCI_M314.CS_m314_get_position((ushort)m_nCardIndex, (ushort)nAxisNo, ref post); } else { rtn |= CPCI_M314.CS_m314_get_command((ushort)m_nCardIndex, (ushort)nAxisNo, ref postCmd); post = postCmd; } if (false && m_nCardIndex == 2 && nAxisNo == 3) { post = post / 10.0; } if (rtn == 0) { return((int)post); } else { return(0); } }
public override bool StopEmg(int nAxisNo) { short rtn = 0; rtn |= CPCI_M314.CS_m314_emg_stop((ushort)m_nCardIndex, (ushort)nAxisNo); return(rtn == 0); }
public override bool Close() { short rtn = 0; rtn = CPCI_M314.CS_m314_close((ushort)m_nCardIndex); return(rtn == 0); }
public override bool ServoOff(short nAxisNo) { short rtn = 0; rtn = CPCI_M314.CS_m314_set_servo((ushort)m_nCardIndex, (ushort)nAxisNo, 0); return(rtn == 0); }
/// <summary> ///按位获取输出信号 /// </summary> /// <param name="nIndex"></param> /// <returns></returns> public override bool ReadIoOutBit(int nIndex) { short rtn = 0; ushort a = 0; rtn |= CPCI_M314.CS_m314_get_dio_output((ushort)m_nCardNo, (ushort)nIndex, ref a); return(a == 1); }
public override bool SetCmdPos(int nAxisNo, double pos) { logger.Info(string.Format("{0}卡{1}轴设置命令位置", m_nCardIndex, nAxisNo)); short rtn = 0; rtn |= CPCI_M314.CS_m314_set_command((ushort)m_nCardIndex, (ushort)nAxisNo, (int)pos); return(rtn == 0); }
public override bool ReasetAxis(int nAxisNo) { short rtn = 0; rtn |= CPCI_M314.CS_m314_set_command((ushort)m_nCardIndex, (ushort)nAxisNo, 0); rtn |= CPCI_M314.CS_m314_set_position((ushort)m_nCardIndex, (ushort)nAxisNo, 0.0); return(rtn == 0); }
public override bool SetActutalPos(int nAxisNo, double pos) { logger.Info(string.Format("{0}卡{1}轴设置实际位置", m_nCardIndex, nAxisNo)); short rtn = 0; rtn |= CPCI_M314.CS_m314_set_position((ushort)m_nCardIndex, (ushort)nAxisNo, pos); return(rtn == 0); }
public override bool StopAxis(int nAxisNo) { Istop = true; double dccTime = GetTdec(nAxisNo, 0); short rtn = 0; return(rtn == CPCI_M314.CS_m314_sd_stop((ushort)m_nCardIndex, (ushort)nAxisNo, dccTime)); }
public bool ClearAlarm(short nAxisNo) { short rtn = 0; rtn |= CPCI_M314.CS_m314_set_servo((ushort)m_nCardIndex, (ushort)nAxisNo, 0); Thread.Sleep(20); rtn |= CPCI_M314.CS_m314_set_servo((ushort)m_nCardIndex, (ushort)nAxisNo, 1); return(rtn == 0); }
/// <summary> /// 按位输出信号 /// </summary> /// <param name="nIndex"></param> /// <param name="bBit"></param> /// <returns></returns> public override bool WriteIoBit(int nIndex, bool bBit) { short rtn = 0; ushort a = 0; if (bBit) { a = 1; } rtn |= CPCI_M314.CS_m314_set_dio_output((ushort)m_nCardNo, (ushort)nIndex, a); return(a == 1); }
public override bool Home(int nAxisNo, int nParam) { Istop = false; short rtn = 0; double acc = m_HomePrm[nAxisNo].AccH; double vel = m_HomePrm[nAxisNo].VelH; double Tacc = (vel - 0) / acc; double Tdcc = (vel - 0) / m_HomePrm[nAxisNo].DccH; int dir = m_HomePrm[nAxisNo]._bHomeDir ? 0 : 1; rtn |= CPCI_M314.CS_m314_set_servo((ushort)m_nCardIndex, (ushort)nAxisNo, 1); rtn |= CPCI_M314.CS_m314_set_home_finish_reset((ushort)m_nCardIndex, (ushort)nAxisNo, 1); rtn |= CPCI_M314.CS_m314_set_home_config((ushort)m_nCardIndex, (ushort)nAxisNo, (short)m_HomePrm[nAxisNo]._nHomeMode, 0, 0, 0); rtn |= CPCI_M314.CS_m314_set_home_offset_position((ushort)m_nCardIndex, (ushort)nAxisNo, (int)m_HomePrm[nAxisNo]._iSeachOffstPluse); rtn |= CPCI_M314.CS_m314_home_move((ushort)m_nCardIndex, (ushort)nAxisNo, 0, (int)vel, Tacc, (short)dir); if (rtn != 0) { return(false); } Stopwatch stopwatch = new Stopwatch(); stopwatch.Restart(); ushort MoSt = 1; do { if (Istop) { rtn = -1; break; } if (stopwatch.ElapsedMilliseconds > 30000) { m_AxisStates[nAxisNo] = AxisState.ErrAlarm; //超时停止 CPCI_M314.CS_m314_sd_stop((ushort)m_nCardIndex, (ushort)nAxisNo, Tdcc); CPCI_M314.CS_m314_set_servo((ushort)m_nCardIndex, (ushort)nAxisNo, 0); logger.Warn($"{m_nCardIndex}卡{nAxisNo}号轴 回0 过程中超时"); return(false); } if (rtn == 0) { rtn |= CPCI_M314.CS_m314_reset_error_counter((ushort)m_nCardIndex, (ushort)nAxisNo); rtn |= CPCI_M314.CS_m314_set_home_finish_reset((ushort)m_nCardIndex, (ushort)nAxisNo, 0); } rtn |= CPCI_M314.CS_m314_motion_done((ushort)m_nCardIndex, (ushort)nAxisNo, ref MoSt); Thread.Sleep(10); }while (MoSt == 0); return(rtn == 0); }
//public override int GetAxisNo(int IndexAxis) //{ // return AxisInRang(IndexAxis) ? (IndexAxis - GetMinAxisNo() ) : int.MaxValue; //} public override bool Open() { m_bOpen = false; ushort cardID = 0; short rtn; //================ M314 Initial =================// ushort gCardNum = 0; rtn = CPCI_M314.CS_m314_open(ref gCardNum);//可以多次枚举 if (gCardNum == 0) { MessageBox.Show("PCI_M314 not found!!", "Error"); return(false); } rtn |= CPCI_M314.CS_m314_get_cardno((ushort)m_nCardIndex, ref cardID); rtn = CPCI_M314.CS_m314_initial_card(cardID); if (rtn != 0) { return(false); } string strConfigPath = $"{System.AppDomain.CurrentDomain.BaseDirectory}PCI_M314_0.cfg"; rtn = CPCI_M314.CS_m314_config_from_file(cardID, strConfigPath); //for (i = 0; i < 4; i++) //{ // //----Generate Interface IO Function----// // CPCI_M314.CS_m314_set_alm((ushort)m_nCardIndex, i, 1, 0); 0 1 2 3 // CPCI_M314.CS_m314_set_ez((ushort)m_nCardIndex, i, 0); // CPCI_M314.CS_m314_set_erc((ushort)m_nCardIndex, i, 32); // CPCI_M314.CS_m314_set_sd((ushort)m_nCardIndex, i, 0, 0, 0); // CPCI_M314.CS_m314_set_ell((ushort)m_nCardIndex, i, 0); // //----Generate Pulse IO Function----// // CPCI_M314.CS_m314_set_pls_outmode((ushort)m_nCardIndex, i, 6); //4: Cw/CCw, 6: AB Phase // CPCI_M314.CS_m314_set_pls_outwidth((ushort)m_nCardIndex, i, 1); // CPCI_M314.CS_m314_set_feedback_src((ushort)m_nCardIndex, i, 0); //0: external, 1: internal // CPCI_M314.CS_m314_set_move_ratio((ushort)m_nCardIndex, i, 1); //} //if(cardID==2) //{ // rtn = CPCI_M314.CS_m314_set_gear(2, 3, 1, 10, 1);//AA机器默认设置 //} short a1 = 0; short a2 = 0; ushort a3 = 0; CPCI_M314.CS_m314_get_gear(2, 3, ref a1, ref a2, ref a3); m_bOpen = true; return(rtn == 0); }
public override AxisState IsAxisNormalStop(int nAxisNo) { short rtn = 0; ushort MoSt = 1; rtn |= CPCI_M314.CS_m314_motion_done((ushort)m_nCardIndex, (ushort)nAxisNo, ref MoSt); if (rtn == 0 && MoSt == 0) { return(AxisState.NormalStop); } else { return(AxisState.Moving); } }
/// <summary> /// 与其他的控制卡不兼容,因为这个M314没有buf'运动 /// </summary> /// <param name="objGroup"></param> /// <param name="type"></param> /// <param name="mode"></param> /// <param name="nAxisNum">nAxisNum 3=1&2</param> /// <param name="velHigh"></param> /// <param name="velLow"></param> /// <param name="Point1">Point1[0]= centerX,Point1[1]=centerY</param> /// <param name="Point2">Point2[0]=angle</param> /// <returns></returns> public override bool AddBufMove(object objGroup, BufMotionType type, int mode, int nAxisNum, double velHigh, double velLow, double[] Point1, double[] Point2) { if (mode == 1) { short rtn = 0; ushort[] array = new ushort[3] { (ushort)nAxisNum, (ushort)(nAxisNum + 1), (ushort)(nAxisNum - 1) }; double speed = velHigh; double Acc = m_MovePrm[2].AccH; double Dcc = m_MovePrm[2].DccH; switch ((int)velHigh) { case 0: Acc = m_MovePrm[2].AccH; Dcc = m_MovePrm[2].DccH; speed = m_MovePrm[2].VelH; break; case (int)SpeedType.Mid: Acc = m_MovePrm[2].AccM; Dcc = m_MovePrm[2].DccM; speed = m_MovePrm[2].VelM; break; case (int)SpeedType.Low: Acc = m_MovePrm[2].AccL; Dcc = m_MovePrm[2].DccL; speed = m_MovePrm[2].VelL; break; } double Tacc = (speed - 0) / Acc; double Tdec = (speed - 0) / Dcc; // rtn |= CPCI_M314.CS_m314_start_ta_arc_xy((ushort)m_nCardIndex, ref array[0], (int)Point1[0], (int)(Point1[1]/10.0), Point2[0], 0, (int)speed, Tacc, Tdec); rtn |= CPCI_M314.CS_m314_start_tr_heli_xy((ushort)m_nCardIndex, ref array[0], (int)Point1[0], (int)(Point1[1] / 10.0), (int)10, 9, 0, 0, (int)speed, Tacc, Tdec); return(rtn == 0); } return(false); }
public override bool JogMove(int nAxisNo, bool bPositive, int bStart, double nSpeed) { short rtn = 0; double speed = nSpeed; double Acc = m_MovePrm[nAxisNo].AccH; double Dcc = m_MovePrm[nAxisNo].DccH; switch (nSpeed) { case (double)0: Acc = m_MovePrm[nAxisNo].AccH; Dcc = m_MovePrm[nAxisNo].DccH; speed = m_MovePrm[nAxisNo].VelH; break; case (double)SpeedType.Mid: Acc = m_MovePrm[nAxisNo].AccM; Dcc = m_MovePrm[nAxisNo].DccM; speed = m_MovePrm[nAxisNo].VelM; break; case (double)SpeedType.Low: Acc = m_MovePrm[nAxisNo].AccL; Dcc = m_MovePrm[nAxisNo].DccL; speed = m_MovePrm[nAxisNo].VelL; break; } double Tacc = (speed - 0) / Acc; double Tdec = (speed - 0) / Dcc; short dir = bPositive ? (short)0 : (short)1; if (false && m_nCardIndex == 2 && nAxisNo == 3) { //((ushort)m_nCardIndex, (ushort)nAxisNo, (int)(nPos / 10.0), 0, (int)(speed / 10.0), Tacc / 10.0, Tdec / 10.0); rtn |= CPCI_M314.CS_m314_tv_move((ushort)m_nCardIndex, (ushort)nAxisNo, 0, (int)(speed / 10.0), Tacc / 10.0, dir); } else { rtn |= CPCI_M314.CS_m314_tv_move((ushort)m_nCardIndex, (ushort)nAxisNo, 0, (int)(speed), Tacc, dir); } return(rtn == 0); }
public override int GetAxisCmdPos(int nAxisNo) { short rtn = 0; int post = 0; rtn |= CPCI_M314.CS_m314_get_command((ushort)m_nCardIndex, (ushort)nAxisNo, ref post); if (false && m_nCardIndex == 2 && nAxisNo == 3) { post = (int)(post / 10.0); } if (rtn == 0) { return((int)post); } else { return(0); } }
public override long GetMotionIoState(int nAxisNo) { short rtn = 0; ushort evenStatus = 0; long lStandardIo = 0; rtn |= CPCI_M314.CS_m314_get_io_status((ushort)m_nCardIndex, (ushort)nAxisNo, ref evenStatus); if (rtn == 0) { short p = 3; var k = p << 1; var t = evenStatus & k; if ((evenStatus & ((ushort)1 << 1)) == 2L) { lStandardIo |= (0x01 << 1);//驱动器报警存在第1位 } if ((evenStatus & ((ushort)1 << 2)) == 4L) { lStandardIo |= (0x01 << 1); //正限位报警存在第2位 } if ((evenStatus & ((ushort)1 << 3)) == 8L) { lStandardIo |= (0x01 << 2); //负限位报警存在第3位 } if ((evenStatus & ((ushort)1 << 4)) == 16L) { lStandardIo |= (0x01 << 3); //原点到位存在第4位 } if ((evenStatus & ((ushort)1 << 6)) == 64L) { lStandardIo |= (0x01 << 4); //急停触发存在第5位 } if ((evenStatus & ((ushort)1 << 14)) == (1 << 14)) { lStandardIo |= (0x01 << 7); //电机使能标志存在第8位 } return(lStandardIo); } return(-1); }
public override bool RelativeMove(int nAxisNo, double nPos, double nSpeed) { short rtn = 0; double speed = nSpeed; double Acc = m_MovePrm[nAxisNo].AccH; double Dcc = m_MovePrm[nAxisNo].DccH; switch (nSpeed) { case (double)0: Acc = m_MovePrm[nAxisNo].AccH; Dcc = m_MovePrm[nAxisNo].DccH; speed = m_MovePrm[nAxisNo].VelH; break; case (double)SpeedType.Mid: Acc = m_MovePrm[nAxisNo].AccM; Dcc = m_MovePrm[nAxisNo].DccM; speed = m_MovePrm[nAxisNo].VelM; break; case (double)SpeedType.Low: Acc = m_MovePrm[nAxisNo].AccL; Dcc = m_MovePrm[nAxisNo].DccL; speed = m_MovePrm[nAxisNo].VelL; break; } double Tacc = (speed - 0) / Acc; double Tdec = (speed - 0) / Dcc; if (false && m_nCardIndex == 2 && nAxisNo == 3) { rtn |= CPCI_M314.CS_m314_start_tr_move((ushort)m_nCardIndex, (ushort)nAxisNo, (int)(nPos / 10.0), 0, (int)(speed / 10.0), Tacc / 10.0, Tdec / 10.0); } else { rtn |= CPCI_M314.CS_m314_start_tr_move((ushort)m_nCardIndex, (ushort)nAxisNo, (int)nPos, 0, (int)speed, Tacc, Tdec); } return(rtn == 0); }