技术论坛

改善 Modbus 通讯效率

作者 主题
侠士

经验值: 1355
发帖数: 725
精华帖: 25
改善 Modbus 通讯效率
精华帖


只看楼主 只看精华 2007-11-19 09:43:23
标签:
本文阅读基础:熟知 modbus 协议(知识一、知识二),熟知一种通讯平台的通讯原理与编程方式
为了达到应用上直观方便,大多数 modbus 库都会对协议进行一定程度的包装,将库应用者从底层的数据组织,缓冲区准备中解脱出来。
但使用上的方便并不代表效率上的最佳,包装是便于在做不同的项目时简化开发过程,但对于任一个项目,通讯读写任务数一旦确定,库程序中的协议包装部分就始终在重复同样的工作。熟练的开发用户可以手工组织数据,提高通讯库的效率。
我们用一个例子来说明:S7-200 读取安川变频器的输出频率,假设变频器的从站地址为 02。
查安川变频器手册知道它的寄存器地址是 23H,数据长度为 1 个字,我们可以用 modbus 库中的 MBUS_MSG 指令按以下的方式来读取:

该程序做的绝大部分工作是根据用户输入的参数构造通讯报文,计算报文的 CRC-16 校验码,并将这些数据组织到缓冲区,才开始收发过程。随着程序的循环扫描,这个过程不停的重复,尤其是计算 CRC-16 校验码是比较花时间的。
对于任一个项目,最终其通讯任务都是固定的,每次重复计算的都是同一个结果而已。我们完全可以手工构造报文、计算校验码、组织缓冲区,通讯程序只负责收发,这样可以大大的减少通讯程序的执行时间,从而提高通讯效率。

根据 modbus 协议,我们可以得出上面 MBUS_MSG 指令需要构造的报文如下:
08 02 03 00 23 00 01 75 F3
第一字节:08,报文长度
第二字节:02,从站地址
第三字节:03,功能码
第四、五字节:0023,读取的寄存器地址(高位在前)
第六、七字节:0001,读取的数据个数(高位在前)
第八、九字节:75F3,校验码(低位在前)
我们完全可以事先一次性的构造出这条报文放在内存中,通讯时用一条 memory copy 指令(在 S7-200 中就是 BMB 指令)将其复制到通讯缓冲区,避免重复的报文构造、校验码计算等耗时的代码,可极大的改善通讯效率。
只要熟悉 modbus 协议,报文本身的构造人工比程序来更方便,因为程序需要对不同的参数组合进行种判断,而人工做的话只需要查表就可以了。唯一麻烦点的是校验码的计算,在 modbus 基础知识一中,已有了一段计算 CRC-16 的完整 C 代码,懂点高级语言编程的很轻松就可以写个 CRC-16 的计算程序,也可以用书生发布的 modbus RTU 库中的 MBUS_CRC 指令使用 S7-200 来计算。另外,网上有很多小计算器都具有 CRC-16 计算功能,随便找个就是了。
PS:手工构造缓冲区还有另一个好处,因为省却了繁琐的报文造过程,只需要对库作很小的改动,可以用同一个库来适应 RTU 和 ASCII 两种通讯模式。

以下说明由模板自动生成,属本文之一部分:
  转载请保持完整并注明:转自 醉书生杂记 [www.tuxw.cn]
  本文链接:http://www.tuxw.cn/blog/article.asp?id=122

生命存在的方式只有两种:腐烂或燃烧
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=381325&b_id=3&s_id=0&num=13

侠客

经验值: 613
发帖数: 145
精华帖: 1
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2007-11-23 12:53:48
hehe 看不懂
 
以下网友喜欢您的帖子:

  
至圣

经验值: 17408
发帖数: 6225
精华帖: 18
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2007-11-23 13:17:20
确实是这样,200做主站的时候,仪表的地址确定后,CRC也就确定了,请求桢也就确定了,把请求桢放在数据块里,发送完成后就接收。
库太大。
 
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2007-12-05 13:34:35
和楼主一样,我曾经用OMRON的CPM2A自由口协议来做modbus RTU主站,就是把要传出去的命令手工先做好,由于CPM2A无法通过检测通讯数据线的空闲启动接受modbus RTU响应帧 ,我干脆只允许主站发送响应数据帧字节长度一样的命令帧,以数据帧定长的方式接收响应,实现了一个功能有限的modbus RTU主站.而此前我认为由于CPM2A无法通过检测通讯数据线的空闲启动接受是不能实现modbus RTU主站的.
工控爱好者
以下网友喜欢您的帖子:

  
游民

经验值: 60
发帖数: 15
精华帖: 0
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-05 11:29:27
确实如楼主所说这样可以提高通讯效率,PLC计算CRC校验码是相当费时的,这样做大大地缩减PLC的循环扫描时间。
 
以下网友喜欢您的帖子:

  
至圣

经验值: 28602
发帖数: 10825
精华帖: 131
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-05 22:42:47
但写报文呢?
因为设定值变化了,CRC校验肯定也变了!


微信公众号:PLC标准化编程,ZHO6371995
以下网友喜欢您的帖子:

  
侠圣

经验值: 4031
发帖数: 1259
精华帖: 6
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-06 09:13:26
读的多而且频繁,写的少(基本上只有换工艺时才写).
因此可以专门给写做一个CRC校验.
唯一的缺点是读上来的数据没经过校验,做好通讯超时判断后基本没问题.
QQ 402550360 TEL 17606539722
以下网友喜欢您的帖子:

  
游士

经验值: 292
发帖数: 236
精华帖: 0
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-07 09:58:45
OMRON的CPM2A是不支持做modbus RTU的通信的前几天我也遇到了这种情况,欧姆龙的技术支持说不能做modbus RTU的通信的通信,我又改的配置改成西门子的了,不知‘winter938 ’是怎么做的能否交流一下。
我的QQ是657360273谢谢!!
 
以下网友喜欢您的帖子:

  
侠士

经验值: 1355
发帖数: 725
精华帖: 25
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-07 15:51:30
quote:以下是引用万泉河在2008-01-05 22:42:47的发言:
但写报文呢?
因为设定值变化了,CRC校验肯定也变了!

这确实是个问题,对写命令还是要计算CRC。不过也不必每次发送命令时都计算CRC,因为设定值一般不会频繁变更,再怎么快它变化的频率也远远低于通讯的频率,可以作一个设定值修改标记,只有修改时才计算CRC,否则直接COPY
生命存在的方式只有两种:腐烂或燃烧
以下网友喜欢您的帖子:

  
侠圣

经验值: 2263
发帖数: 1720
精华帖: 7
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-07 15:56:15
quote:以下是引用醉书生在2008-01-07 15:51:30的发言:
quote:以下是引用万泉河在2008-01-05 22:42:47的发言:
但写报文呢?
因为设定值变化了,CRC校验肯定也变了!

这确实是个问题,对写命令还是要计算CRC。不过也不必每次发送命令时都计算CRC,因为设定值一般不会频繁变更,再怎么快它变化的频率也远远低于通讯的频率,可以作一个设定值修改标记,只有修改时才计算CRC,否则直接COPY


"只有修改时才计算CRC,否则直接COPY "

为何不改成:“只有修改时才发出写命令,否则不管”

助人为主,捣乱为辅,偶尔灌水,有时潜水!开心就好
以下网友喜欢您的帖子:

  
侠士

经验值: 1355
发帖数: 725
精华帖: 25
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-07 16:03:35
quote:
"只有修改时才计算CRC,否则直接COPY "
为何不改成:“只有修改时才发出写命令,否则不管”


这倒是个好想法
不过可能跟从站设置有一定关系,假如一个项目中只有写命令,而且设定值长时间不变,可能会因为没有报文流动,从站报超时
生命存在的方式只有两种:腐烂或燃烧
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-07 17:56:20
to xu74:请参考以下网址的贴子http://bbs.gongkong.com/detail.asp?id=335327

http://gx.gongkong.com/tech/Detail.Asp?id=338113&page=1
工控爱好者
以下网友喜欢您的帖子:

  
侠圣

经验值: 2942
发帖数: 1103
精华帖: 7
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-08 16:19:17
是不是当成自由口通讯去做啊。
好好学习天天向上
以下网友喜欢您的帖子:

  
游侠

经验值: 305
发帖数: 227
精华帖: 0
回复:改善 Modbus 通讯效率


只看楼主 只看精华 2008-01-08 16:32:32
这样只是参照modbus协议写出来的特殊协议,不同用。
S7-200
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
改善 Modbus 通讯效率
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。