#region DMC3000系列重写
/// <summary>
/// 雷赛板卡 AxisDMC3000
/// </summary>
public class DMC3000 : AxisModel
{
public DMC3000() { }
/// <summary>
/// 回零
/// </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