首页 > 其他分享 >雷赛板卡 控制常用方法 工具类

雷赛板卡 控制常用方法 工具类

时间:2023-09-10 18:23:30浏览次数:43  
标签:常用 dmc return Param AxisNum LTDMC 雷赛 板卡 CardNum

#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

 

标签:常用,dmc,return,Param,AxisNum,LTDMC,雷赛,板卡,CardNum
From: https://www.cnblogs.com/stevenchen2016/p/17691625.html

相关文章

  • linux常用命令大全
    lessless工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less的用法比起more更加的有弹性。在more的时候,我们并没有办法向前面翻,只能往后面看,但若使用了less时,就可以使用[pageup][pagedown]等按键的功能来往前往......
  • conda的一些常用命令
    以下是conda的一些常用命令:- condacreate:创建一个新的环境。- condaactivate:激活一个已存在的环境。- condadeactivate:停用当前环境。- condaenvlist:列出所有可用的环境。- condainstall:安装包或软件。- condaupdate:更新包或软件。- condaremove:移除......
  • 2通道16bit 1G ADC采集和4通道2.8G DAC回放的FMC板卡
    概要QT7335是一款集成2通道ADC采集和4通道DAC回放的FMC板卡,ADC(ADS54J60)转换速率最高为1.0GSPS,ADC位数16bit;DAC(DAC39J84IAAV)转换速率最高为2.8GSPS,DAC位数16bit;板卡支持触发输出/触发输入可选;触发/同步可选;采样时钟支持内部参考时钟、外部参考时钟、外部采样时钟三种方式可选,可通......
  • linux firewall 常用命令
    #1.启动防火墙systemctlstartfirewalld#2.关闭防火墙systemctlstopfirewalld#3.查看防火墙状态systemctlstatusfirewalld#4.开机自动禁用systemctldisablefirewalld#5.开机自动启动systemctlenablefirewalld#6.开放80/tcp端口(--permanent永......
  • 【Python基础】字符串常用方法
    replace()方法replace()方法把字符串中的old(旧字符串)替换成new(新字符串),如果指定第三个参数max,则替换不超过max次。str="ThisisATest"print(str.replace("is","was"))#ThwaswasATest"print(str.replace("is","was",1))#Thwas......
  • git 常用命令
    查看修改的状态(status)gitstatus添加工作区到暂存区(add)gitadd提交暂存区到本地仓库(commit)gitcommit查看提交日志(log)gitlog--all显示所有分支--pretty=oneline将提交信息显示为一行--abbrev-commit使得输出的commitId更简短--graph以图的形式显示版本......
  • java 字符串常用API
      importjava.util.Scanner;publicclassMain{publicstaticvoidmain(Stringargs[]){Scannersc=newScanner(System.in);Strings="1233.32";doubley=Double.parseDouble(s);//将一个字符串强制转化为浮点数Stri......
  • Python中列表list常用方法总结
     在Python中,列表(List)是一种有序的数据集合,可以存储任意类型的数据,例如整数、浮点数、字符串、元组、列表等。因为列表是有序的,所以可以通过下标(索引)来访问和修改列表中的元素。Python中的列表是可变的,也就是说可以动态增加和删除元素。创建列表的方法有多种,其中最常见的是使......
  • Linux 开发常用网站
    根据命令查安装包https://command-not-found.com/linuxkernel源码在线阅读https://elixir.bootlin.com/linux/v5.19.11/sourcelinuxkenel源码下载https://www.kernel.org/https://github.com/torvalds/linuxlinux内核文档在线阅读https://www.kernel.org/doc/html......
  • Linux部署项目常用命令(持续更新)
    防火墙配置#启动防火墙服务systemctlstartfirewalld#关闭防火墙服务systemctlstopfirewalld#查看防火墙服务状态systemctlstatusfirewalld#开机禁用防火墙服务systemctldisablefirewalld#开机自启防火墙服务systemctlenablefirewalld端口配置......