您的位置:控制工程论坛网论坛 » 现场总线 » 如何改善Modbus 通讯效率

hylotus

hylotus   |   当前状态:离线

总积分:5168  2024年可用积分:0

注册时间: 2009-08-20

最后登录时间: 2012-08-16

空间 发短消息加为好友

如何改善Modbus 通讯效率

hylotus  发表于 2009/10/14 14:58:47      1501 查看 0 回复  [上一主题]  [下一主题]

手机阅读

本文阅读基础:熟知 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 两种通讯模式。
1楼 0 0 回复