雷赛板卡工具类

发布时间 2023-08-31 10:52:20作者: baivfhpwxf

雷赛板卡工具类,先记录一下还有优化空间

优化方向:

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