• 上位机开发——Modbus联合运动控制卡实时通信


    前言

    最近有运动控制的学员问到这样的问题,能不能通过Modbus协议,实现运动控制卡的数据读取。

    经过测试,切实可行。这里采用的是正运动的ECI1408板卡,其他品牌板卡可能不支持,具体咨询供应商。

    MOdbus协议

    正运动控制器支持两个存储区,分别是0区和4区。

    • 0区从地址10000开始与输入 IN 口对应。
    • 0区从地址20000开始与输出 OUT 口对应。
    • 4区从地址10000开始对应轴 DPOS 区间。
    • 4区从地址11000开始对应轴 MPOS 区间。
    • 4区从地址12000开始对应轴 VP_SPEED 区间。
    • 4区从地址13000开始对应模拟量DA输出区间。
    • 4区从地址14000开始对应模拟量AD输入区间。
    • 对于其他参数,可以采用自定义存储区0-7999来使用。
    •  

    图片图片

    代码测试

    图片

    这里以读取XYZ三轴的位置来进行测试。

    • 建立连接
            //Modbus通信对象
            private ModbusTcp modbusTcp = new ModbusTcp();

            //取消线程源
            private CancellationTokenSource cts;

            private void btn_Connect_Click(object sender, EventArgs e)
            {
                if (modbusTcp.Connect(this.txt_IPAddress.Text, Convert.ToInt32(this.txt_Port.Text)))
                {
                    //如果连接成功,开线程读取
                    cts = new CancellationTokenSource();

                    Task.Run(() =>
                    {
                        GetMotionData();
                    }, cts.Token);
                }
                else
                {
                    MessageBox.Show("运动控制卡连接失败", "建立连接");
                }
            }
    • 断开连接
            private void btn_DisConn_Click(object sender, EventArgs e)
            {
                cts?.Cancel();
                modbusTcp.DisConnect();
            }
    • 多线程读取解析
            private void GetMotionData()
            {
                while (!cts.IsCancellationRequested)
                {
                    byte[] res = modbusTcp.ReadKeepReg(1, 10000, 6);
                    this.Invoke(new Action(() =>
                    {
                        if (res != null && res.Length == 12)
                        {
                            float[] values = FloatLib.GetFloatArrayFromByteArray(res, DataFormat.CDAB);
                            this.lbl_XAxis.Text = values[0].ToString();
                            this.lbl_YAxis.Text = values[1].ToString();
                            this.lbl_ZAxis.Text = values[2].ToString();
                        }
                    }));
                }
            }
    • 测试结果如下:

    上位机软件实时数据显示:

    测试软件结果显示:

    整体总结

    本案例主要是测试了基于Modbus协议来读取运动控制卡的相关参数,这种情况主要用于第三方软件需要运动控制系统的相关数据。同时,如果后续的运动控制项目,需要提供数据给其他软件,可以将运动控制卡作为一个现成免费的ModbusTCP服务器,不仅可以传递运动控制参数,其他参数都可以实现传递。

  • 相关阅读:
    android传送照片到FTP服务器
    Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
    android上传图片至服务器
    android中如何处理cookie
    【265】shell文件创建链接
    【264】◀▶ Windows 批处理(CMD)
    【263】Linux 添加环境变量 & 全局 shell 脚本
    【262】pscp命令 实现windows与linux互传文件
    合泰 HT66F30 定时器初始化
    错误 是否保存对以下各项的更改 devenv.sin
  • 原文地址:https://www.cnblogs.com/xiketang/p/16229638.html
Copyright © 2020-2023  润新知