您的位置:控制工程论坛网论坛 » 现场总线 » 改善S7-200PLC与Modbus的通讯效率

netwell

netwell   |   当前状态:在线

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

注册时间: 2006-12-06

最后登录时间: 2017-03-16

空间 发短消息加为好友

改善S7-200PLC与Modbus的通讯效率

netwell  发表于 2008/9/27 18:05:41      1185 查看 0 回复  [上一主题]  [下一主题]

手机阅读

    为了达到应用上直观方便,大多数 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 计算功能,随便找个就是了。

1楼 0 0 回复