雷赛板卡工具类
雷赛板卡工具类,先记录一下还有优化空间
优化方向:
1.抽象出接口
2.抽象出一个基类
3.不同厂家的板卡不同实现。这样在使用时就简单了。
#region DMC3000系列重写 /// <summary> /// 雷赛板卡 /// </summary> public class DMC3000 : AxisModel { public DMC3000() { } /// <summary> /// 回0 /// </summary> /// <returns></returns> public override bool Home() { var a = LTDMC.dmc_set_home_profile_unit(CardNum, AxisNum, Param.HomevelL, Param.HomevelH, Param.T_acc, Param.T_dec); //设置回原点模式 //home_dir 回零方向,0:负向,1:正向 //vel_mode 回零速度模式:0:低速回零,1:高速回零 //mode 回零模式:0:一次回零,1:一次回零加回找,2:二次回零,3:原点加同向 EZ,4:单独记一个 EZ,5:原点加反向 EZ,6:原点锁存,7:原点锁存加同向 EZ,8:单独记一个 EZ 锁存,9:原点锁存加反向 EZ //EZ_count 锁存源,0:锁存指令位置;1:锁存编码器位置 var b = LTDMC.dmc_set_homemode(CardNum, AxisNum, Param.HomeDir, Param.HomeSpeedMode, Param.HomeMode, 0); //回原点运动 var c = LTDMC.dmc_home_move(CardNum, AxisNum); WaitMoveDone(); Thread.Sleep(250); ClearMotorPos(); return true; } /// <summary> /// 设置指令脉冲位置为零点 /// </summary> public void ClearMotorPos() { //设置指令脉冲位置为零点 //current_position 指令脉冲位置,单位:pulse LTDMC.dmc_set_position(CardNum, AxisNum, 0); //设置指定轴编码器脉冲计数值 //encoder_value 编码器计数值,单位:pulse LTDMC.dmc_set_encoder(CardNum, AxisNum, 0); IsHomed = true; } /// <summary> /// 设置运行速度 /// </summary> private void SetAxisParam() { //单轴运动速度曲线设置函数 //参 数:CardNo 控制卡卡号 // axis 指定轴号,取值范围:DMC5C00:0~11,DMC5800:0~7,DMC5600:0~5 // DMC5400A:0~3 // Min_Vel 起始速度,单位:pulse / s(最大值为 2M) // Max_Vel 最大速度,单位:pulse / s(最大值为 2M) // Tacc 加速时间,单位:s(最小值为 0.001s) // Tdec 减速时间,单位:s(最小值为 0.001s) // Stop_Vel 停止速度,单位:pulse / s(最大值为 2M) LTDMC.dmc_set_profile(CardNum, AxisNum, Param.Vel_Start, Param.Vel_Run, Param.T_acc, Param.T_dec, Param.Vel_Stop); //设置单轴速度曲线 S 段参数值 LTDMC.dmc_set_s_profile(CardNum, AxisNum, 0, Param.T_Spara); //设置减速停止时间 LTDMC.dmc_set_dec_stop_time(CardNum, AxisNum, Param.T_Stop); } /// <summary> /// 获取使能(使用)状态 /// </summary> /// <returns>是否</returns> public override bool GetAxisServoSts() { return LTDMC.dmc_get_sevon_enable(CardNum, AxisNum) == 0; } /// <summary> /// 使能(使用) /// </summary> /// <param name="servo"></param> /// <returns></returns> public override bool AxisServo(bool servo) { ushort svo = (ushort)(servo ? 1 : 0); //控制指定轴的伺服使能端口的输出 //on_off 设置伺服使能端口电平,0:低电平,1:高电平 return LTDMC.dmc_write_sevon_pin(CardNum, AxisNum, svo) == 0; } /// <summary> /// 根据位置名称 获取位置 点位值 /// </summary> /// <param name="axisPosName">位置名称</param> /// <returns>点位值</returns> public override double GetAxisPosList(string axisPosName) { //foreach (var item in PosList) //{ // if (item.Name == axisPosType) // return item.Position; //} double position = 0; if (PosList != null && PosList.Count > 0) { var posObj = PosList.FirstOrDefault(t=>t.Name.Equals(axisPosName)); if (posObj != null) { position = posObj.Position; } } return position; } /// <summary> /// 绝对运动 /// </summary> /// <param name="pos">运动位置</param> /// <returns></returns> public override bool MoveAbs(double pos) { try { int dis = (int)(pos * Param.PulseRatio); SetAxisParam(); //单轴运动函数 //Dist 目标位置,单位:pulse,范围:-134217728~+134217728 //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式 LTDMC.dmc_pmove(CardNum, AxisNum, dis, 1); return true; } catch (Exception) { return false; } } /// <summary> /// 移动到指定位置 /// </summary> /// <param name="posname">位置名称</param> /// <returns></returns> public override bool MoveAbs(string posname) { try { int dis = (int)(GetAxisPosList(posname) * Param.PulseRatio); SetAxisParam(); //单轴运动函数 //Dist 目标位置,单位:pulse,范围:-134217728~+134217728 //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式 LTDMC.dmc_pmove(CardNum, AxisNum, dis, 1); return true; } catch (Exception) { return false; } } /// <summary> /// 步进运动 /// </summary> /// <param name="pos">步进距离</param> /// <returns></returns> public override bool MoveInc(double pos) { try { int incdis = (int)(pos * Param.PulseRatio); SetAxisParam(); //单轴运动函数 //Dist 目标位置,单位:pulse,范围:-134217728~+134217728 //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式 LTDMC.dmc_pmove(CardNum, AxisNum, incdis, 0); return true; } catch (Exception) { return false; } } public override bool MoveInc(double pos , double speed) { try { int incdis = (int)(pos * Param.PulseRatio); //单轴运动速度曲线设置函数 //参 数:CardNo 控制卡卡号 // axis 指定轴号,取值范围:DMC5C00:0~11,DMC5800:0~7,DMC5600:0~5 // DMC5400A:0~3 // Min_Vel 起始速度,单位:pulse / s(最大值为 2M) // Max_Vel 最大速度,单位:pulse / s(最大值为 2M) // Tacc 加速时间,单位:s(最小值为 0.001s) // Tdec 减速时间,单位:s(最小值为 0.001s) // Stop_Vel 停止速度,单位:pulse / s(最大值为 2M) LTDMC.dmc_set_profile(CardNum, AxisNum, Param.Vel_Start, speed, Param.T_acc, Param.T_dec, Param.Vel_Stop); //设置单轴速度曲线 S 段参数值 LTDMC.dmc_set_s_profile(CardNum, AxisNum, 0, Param.T_Spara); //设置减速停止时间 LTDMC.dmc_set_dec_stop_time(CardNum, AxisNum, Param.T_Stop); //单轴运动函数 //Dist 目标位置,单位:pulse,范围:-134217728~+134217728 //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式 LTDMC.dmc_pmove(CardNum, AxisNum, incdis, 0); return true; } catch (Exception) { return false; } } /// <summary> /// 运动 /// </summary> /// <param name="dir"></param> /// <returns></returns> public override bool Jog(bool dir) { try { int direction = dir ? 1 : 0; SetAxisParam(); //单轴运动函数 //Dist 目标位置,单位:pulse,范围:-134217728~+134217728 //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式 LTDMC.dmc_vmove(CardNum, AxisNum, (ushort)direction); return true; } catch (Exception) { return false; } } /// <summary> /// 运动 /// </summary> /// <param name="speed"></param> /// <param name="dir"></param> /// <returns></returns> public override bool Jog(double speed, bool dir) { try { int direction = dir ? 1 : 0; //单轴运动速度曲线设置函数 //参 数:CardNo 控制卡卡号 // axis 指定轴号,取值范围:DMC5C00:0~11,DMC5800:0~7,DMC5600:0~5 // DMC5400A:0~3 // Min_Vel 起始速度,单位:pulse / s(最大值为 2M) // Max_Vel 最大速度,单位:pulse / s(最大值为 2M) // Tacc 加速时间,单位:s(最小值为 0.001s) // Tdec 减速时间,单位:s(最小值为 0.001s) // Stop_Vel 停止速度,单位:pulse / s(最大值为 2M) LTDMC.dmc_set_profile(CardNum, AxisNum, Param.Vel_Start, speed, Param.T_acc, Param.T_dec, Param.Vel_Stop); //设置单轴速度曲线 S 段参数值 LTDMC.dmc_set_s_profile(CardNum, AxisNum, 0, Param.T_Spara); //设置减速停止时间 LTDMC.dmc_set_dec_stop_time(CardNum, AxisNum, Param.T_Stop); //单轴运动函数 //Dist 目标位置,单位:pulse,范围:-134217728~+134217728 //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式 LTDMC.dmc_vmove(CardNum, AxisNum, (ushort)direction); return true; } catch (Exception) { return false; } } /// <summary> /// 运动 /// </summary> /// <param name="speed"></param> /// <returns></returns> public override bool Jog(double speed) { try { speed *= 1000; int direction = (speed >= 0) ? 1 : 0; //单轴运动速度曲线设置函数 //参 数:CardNo 控制卡卡号 // axis 指定轴号,取值范围:DMC5C00:0~11,DMC5800:0~7,DMC5600:0~5 // DMC5400A:0~3 // Min_Vel 起始速度,单位:pulse / s(最大值为 2M) // Max_Vel 最大速度,单位:pulse / s(最大值为 2M) // Tacc 加速时间,单位:s(最小值为 0.001s) // Tdec 减速时间,单位:s(最小值为 0.001s) // Stop_Vel 停止速度,单位:pulse / s(最大值为 2M) LTDMC.dmc_set_profile(CardNum, AxisNum, Param.Vel_Start, speed, Param.T_acc, Param.T_dec, Param.Vel_Stop); //设置单轴速度曲线 S 段参数值 LTDMC.dmc_set_s_profile(CardNum, AxisNum, 0, Param.T_Spara); //设置减速停止时间 LTDMC.dmc_set_dec_stop_time(CardNum, AxisNum, Param.T_Stop); //单轴运动函数 //Dist 目标位置,单位:pulse,范围:-134217728~+134217728 //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式 LTDMC.dmc_vmove(CardNum, AxisNum, (ushort)direction); return true; } catch (Exception) { return false; } } /// <summary> /// 停 止 /// </summary> /// <returns></returns> public override bool Stop() { //停止坐标系内所有轴的运动 //参 数:CardNo 控制卡卡号 // axis 指定轴号,取值范围:DMC5C00:0~11,DMC5800:0~7,DMC5600:0~5DMC5400A:0~3 // stop_mode 制动方式,0:减速停止,1:立即停止 return LTDMC.dmc_stop(CardNum, AxisNum, 0) == 0; } /// <summary> /// 获取当前轴位置值 /// </summary> /// <returns></returns> public override double GetCurPos() { double dunitPos = 0; //读取指定轴编码器反馈位置脉冲计数值 dunitPos = LTDMC.dmc_get_encoder(CardNum, AxisNum); //LTDMC.dmc_get_position_unit(CardNum, AxisNum, ref dunitPos); //读取指定轴指令位置值 return dunitPos / Param.PulseRatio; } /// <summary> /// 获取移动是否完成 /// </summary> /// <returns></returns> public bool GetMoveDone() { //检测坐标系的运动状态 //返回值:坐标系状态,0:正在使用中,1:正常停止 return LTDMC.dmc_check_done(CardNum, AxisNum) == 1; } /// <summary> /// 等待移动是否完成 /// </summary> /// <returns></returns> public override bool WaitMoveDone() { int totalCount = 10000; int index = 1; while (!GetMoveDone()) { if (index > totalCount) { throw new Exception("等待移动是否完成 进入死循环"); } Thread.Sleep(10); } int stopReason = -1; //读取指定轴的停止原因 //StopReason 停止原因: //0:正常停止 LTDMC.dmc_get_stop_reason(CardNum, AxisNum, ref stopReason); if (stopReason == 0 || stopReason == 5) return true; else return false; } /// <summary> /// 获取轴状态 /// </summary> /// <param name="_cardNo">卡号</param> /// <param name="axis">轴</param> /// <param name="isAxisAlarm">是否报警</param> /// <returns></returns> public override string GetAxisStatus(ushort _cardNo, ushort axis, out bool isAxisAlarm) { string AxisState = string.Empty; ushort Axis_State_machine = 0; isAxisAlarm = true; LTDMC.nmc_get_axis_state_machine(_cardNo, axis, ref Axis_State_machine); switch (Axis_State_machine)// 读取指定轴状态机 { case 0: AxisState = "轴处于未启动状态"; isAxisAlarm = false; break; case 1: AxisState = "轴处于启动禁止状态"; isAxisAlarm = true; break; case 2: AxisState = "轴处于准备启动状态"; isAxisAlarm = false; break; case 3: AxisState = "轴处于启动状态"; isAxisAlarm = false; break; case 4: AxisState = "轴处于操作使能状态"; isAxisAlarm = false; break; case 5: AxisState = "轴处于停止状态"; isAxisAlarm = false; break; case 6: AxisState = "轴处于错误触发状态"; isAxisAlarm = true; break; case 7: AxisState = "轴处于错误状态"; isAxisAlarm = true; break; default: AxisState = "轴处于错误状态"; isAxisAlarm = true; break; }; return AxisState; } } #endregion