改善 Modbus 通讯效率

已锁定

醉书生

  • 帖子

    725
  • 精华

    25
  • 被关注

    15

论坛等级:侠士

注册时间:2004-06-13

普通 普通 如何晋级?

改善 Modbus 通讯效率

10064

13

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
改善 Modbus 通讯效率 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33782条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。