上位机开发Modbus卡如何实现与运动控制卡的实时通信?

2026-05-22 09:112阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计670个文字,预计阅读时间需要3分钟。

上位机开发Modbus卡如何实现与运动控制卡的实时通信?

前言:最近有位运动控制专家询问,能否通过Modbus协议解决此类问题,实现运动控制卡的データ读取。经过测试,切实可行。这里采用的是正运动的ECI1408卡片,其他品牌卡片可能不支持。

上位机开发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通信对象
privateModbusTcpmodbusTcp=newModbusTcp();

//取消线程源
privateCancellationTokenSourcects;

privatevoidbtn_Connect_Click(objectsender,EventArgse)
{
if(modbusTcp.Connect(this.txt_IPAddress.Text,Convert.ToInt32(this.txt_Port.Text)))
{
//如果连接成功,开线程读取
cts=newCancellationTokenSource();

Task.Run(()=>
{
GetMotionData();
},cts.Token);
}
else
{
MessageBox.Show("运动控制卡连接失败","建立连接");
}
}

  • 断开连接

privatevoidbtn_DisConn_Click(objectsender,EventArgse)
{
cts?.Cancel();
modbusTcp.DisConnect();
}

  • 多线程读取解析

privatevoidGetMotionData()
{
while(!cts.IsCancellationRequested)
{
byte[]res=modbusTcp.ReadKeepReg(1,10000,6);
this.Invoke(newAction(()=>
{
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服务器,不仅可以传递运动控制参数,其他参数都可以实现传递。

本文共计670个文字,预计阅读时间需要3分钟。

上位机开发Modbus卡如何实现与运动控制卡的实时通信?

前言:最近有位运动控制专家询问,能否通过Modbus协议解决此类问题,实现运动控制卡的データ读取。经过测试,切实可行。这里采用的是正运动的ECI1408卡片,其他品牌卡片可能不支持。

上位机开发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通信对象
privateModbusTcpmodbusTcp=newModbusTcp();

//取消线程源
privateCancellationTokenSourcects;

privatevoidbtn_Connect_Click(objectsender,EventArgse)
{
if(modbusTcp.Connect(this.txt_IPAddress.Text,Convert.ToInt32(this.txt_Port.Text)))
{
//如果连接成功,开线程读取
cts=newCancellationTokenSource();

Task.Run(()=>
{
GetMotionData();
},cts.Token);
}
else
{
MessageBox.Show("运动控制卡连接失败","建立连接");
}
}

  • 断开连接

privatevoidbtn_DisConn_Click(objectsender,EventArgse)
{
cts?.Cancel();
modbusTcp.DisConnect();
}

  • 多线程读取解析

privatevoidGetMotionData()
{
while(!cts.IsCancellationRequested)
{
byte[]res=modbusTcp.ReadKeepReg(1,10000,6);
this.Invoke(newAction(()=>
{
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服务器,不仅可以传递运动控制参数,其他参数都可以实现传递。