Modbus遐(瞎)想续篇——通用Modbus方案

Modbus遐(瞎)想中,构想了一个通用方案,但一直没有动力实现。最近有个项目只能用通讯做,我很讨厌每做一个项目都要从头来,所以尽量考虑比较通用的方法,福至心灵,在RTU主站库2.1基础上稍加点代码,很简单的实现了一个方案。
首先分配一段内存做帧配置表,表中的每一项定义一个帧,用一个通用的子程序来解释配置表中的定义项,发送定义项指定的帧,并负责数据交换。本方案可以:
1、对不同的工程不需要特别编写通讯代码
2、从站设置好通讯参数后,其它参数可以自动设置(特别是对支持广播、写多字功能码16的从站,参数设置非常方便)
3、不需要修改程序,可临时读到从站任意参数
 
帧配置表中每项占12字节,定义如下:
1、0-3字节:帧起始地址
2、4-7字节:数据起始地址
3、8-9字节:(写数据帧)数据在帧中的偏移量
4、10-11字节:待写数据的个数(字数)
 
配置表编辑界面:
 
为减小解释程序大小,配置项中的地址是绝对地址,人机界面上通过工程量换算成相对地址,如 &VB6000,绝对地址是 16#08001770,人机界面上只要输入 6000 即可。
 
表项说明:
第01项:6000  2320  0  0
是一条固定的读命令,帧数据从 VB6000 开始,返回的数据放到 VB2320 开始
第06项:6080  2316  9  1
是一条可变的写命令,帧数据从 VB6080 开始,待写数据在 VB2316,长1个字,须先复制到帧内第9字节处
 
对每一表项处理:
首选根据待写字数是否为0来确定是固定帧还是可变帧。
1、对于固定的帧(如读命令)不需要第3、4项,简单发送 0-3 字节地址处的帧(返回的数据存放到 4-7 指定的地址)
2、对于固定的写命令,直接将 0-3 指定地址处的帧发送
3、对于可变的写命令,先将4-7地址处的相应相应字数(10-11字节指定)复制到帧中(8-9字节指定的)偏移处,再发送帧
 
配置表解释程序,处理已定义的轮询范围。
当轮询范围从配置表第1项开始时,循环处理范围中的每一项
当轮询范围[x, y]中x不从第1项开始时,则只对轮询范围[x+1, y]中的项处理一次(用来设置从站参数)
 
对一个新的工程,程序部分只需要调用一个解释帧配置表的子程序。然后在人机界面上编写报文、定义配置表、设置轮询范围,再保存到数据块即可。
 
比如我们想临时读从站03的02号寄存器到VW4020中:
1、编写报文:07 08 03 03 00 02 00 01 00 00
2、(本步可省略)计算CRC=16#2824,报文变成 07 08 03 83 00 02 00 01 24 28(CRC低位在前)
3、将这条报文放到 VB6288 处
 
4、在配置表中选一个未用的项(示例用第13项):6288, 4020, 0, 0
 
5、停止通讯,轮询范围改为 12-13(轮询范围不从第1项起时,范围中第1项会忽略)、激活通讯
非循环轮询处理一次后会停在最后一条帧的处理结果上,这样可以单步测试每一条通讯帧。
 
正常的循环轮询范围从第1项开始
 
单步调试好每一帧后,写数据块到EEPROM
 
本方案已通过安川、汇川变频器在实际项目中验证。因时间关系,本方案没有独立的示例子程序,这里贴一下配置表解释程序,实际项目中也只需要调用这一个子程序。
 
注意:本程序未作野指针检查,写帧配置表时须保证内存范围不要超出CPU的可用V内存范围。
 
另外,为了通用,设置从站参数使用了全帧数据块,这个比较耗内存。实际上可以将待写参数的站号、寄存器地址、参数值分别建表,程序程序处理时动态生成帧,能有效的减小数据块的大小。但这样做到通用比较麻烦,因为不同的从站支持的功能码不同,可能要指定功能码,这会增加表格的复杂度,也增加程序块的大小。

以下说明属本文之一部分:
  本文出自:醉书生杂记 [www.tuxw.cn]

  本站所有原创文章均遵循 [创作共用 Creative Commons] 协议
  如未特别说明,本站文章可以转载(非商业用途),须 保持完整 并注明出处。
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: S7200 Modbus 通用
评论: 2 | 引用: 0 | 查看次数: 1273
回复回复丙丁[2009-12-07 09:24 PM | 117.80.143.176 : 江苏省苏州市 电信 | del]
可能是学艺不精吧,感觉S7 200同300差别还是蛮大的,转移平台还真不是一下子就可以,郁闷!
回复回复路人甲[2009-08-28 03:41 PM | 61.167.79.132 : 黑龙江省齐齐哈尔市 网通 | del]
我在300上面也做了类似的数据结构:
定义一个udt:

站号
读/写要求
起始地址
数量
存放数据db号
存放数据db的起始byte号
错误代码
成功计数
错误计数

程序根据读/写要求和起始地址确定功能码,然后形成发送报文

发表评论
昵 称: 虽然发表评论不用注册,但是为了保护您的发言权,建议您 注册帐号.
密 码: 游客发言不需要密码.
验证码: 验证码 注册用户不必输入. (停留时间较长时请点击图片刷新验证码再输入)
内 容:
字数限制:400 字 | UBB代码:开启 | [img]标签:关闭 
选 项: