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

已锁定

醉书生

  • 帖子

    728
  • 精华

    25
  • 被关注

    15

论坛等级:侠士

注册时间:2004-06-13

普通 普通 如何晋级?

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

7247

8

2009-06-25 16:30:24

star star star star
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内存范围。
另外,为了通用,设置从站参数使用了全帧数据块,这个比较耗内存。实际上可以将待写参数的站号、寄存器地址、参数值分别建表,程序程序处理时动态生成帧,能有效的减小数据块的大小。但这样做到通用比较麻烦,因为不同的从站支持的功能码不同,可能要指定功能码,这会增加表格的复杂度,也增加程序块的大小。
Modbus遐(瞎)想续篇——通用Modbus方案 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33777条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

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