技术论坛

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

作者 主题
侠士

经验值: 1353
发帖数: 728
精华帖: 25
Modbus遐(瞎)想续篇——通用Modbus方案
精华帖精华帖星级4级


只看楼主 只看精华 2009-06-25 16:30:24
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内存范围。
另外,为了通用,设置从站参数使用了全帧数据块,这个比较耗内存。实际上可以将待写参数的站号、寄存器地址、参数值分别建表,程序程序处理时动态生成帧,能有效的减小数据块的大小。但这样做到通用比较麻烦,因为不同的从站支持的功能码不同,可能要指定功能码,这会增加表格的复杂度,也增加程序块的大小。
生命存在的方式只有两种:腐烂或燃烧
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=3&a_id=564556&s_id=0&num=8

侠士

经验值: 1082
发帖数: 357
精华帖: 4
回复:Modbus遐(瞎)想续篇——通用Modbus方案


只看楼主 只看精华 2009-06-25 16:58:32
嗯,不错,这样的方式已经比较灵活了,如果再加改进,通过一个小软件来生成awl格式的文档再导入那将是无敌了。
 
以下网友喜欢您的帖子:

  
侠士

经验值: 1404
发帖数: 969
精华帖: 2
回复:Modbus遐(瞎)想续篇——通用Modbus方案


只看楼主 只看精华 2009-06-26 08:12:20
收藏学习了,资料不错
我问上帝:“怎么样才能做到对悲伤的事情一边大笑一边遗忘?” 上帝答:“把自己弄疯!”
以下网友喜欢您的帖子:

  
侠士

经验值: 1561
发帖数: 924
精华帖: 0
回复:Modbus遐(瞎)想续篇——通用Modbus方案


只看楼主 只看精华 2009-06-29 11:33:09
醉书生
你好,方便个资料学习下,谢谢!
hansion808@sohu.com
hansion
以下网友喜欢您的帖子:

  
侠士

经验值: 1353
发帖数: 728
精华帖: 25
回复:Modbus遐(瞎)想续篇——通用Modbus方案


只看楼主 只看精华 2009-07-01 15:19:17
quote:以下是引用hansion在2009-06-29 11:33:09的发言:
醉书生
你好,方便个资料学习下,谢谢!
hansion808@sohu.com

这个刚用在项目中,还没有整理单独的资料
实际上只要会用RTU主站库2.1,再看懂前面贴的程序中的网络7、网络8这两个网络是如何解释帧配置表的,就可以自己做了
生命存在的方式只有两种:腐烂或燃烧
以下网友喜欢您的帖子:

  
侠客

经验值: 703
发帖数: 327
精华帖: 2
回复:Modbus遐(瞎)想续篇——通用Modbus方案


只看楼主 只看精华 2009-07-02 13:04:38
高人啊,拜读了!
http://t.sina.com.cn/1604299892/profile/
以下网友喜欢您的帖子:

  
游侠

经验值: 437
发帖数: 339
精华帖: 0
回复:Modbus遐(瞎)想续篇——通用Modbus方案


只看楼主 只看精华 2009-12-31 22:30:21
资料不错

兵未动,粮草先行
以下网友喜欢您的帖子:

  
游民

经验值: 80
发帖数: 27
精华帖: 0
回复:Modbus遐(瞎)想续篇——通用Modbus方案


只看楼主 只看精华 2010-01-20 16:45:46
高人啊!你太厉害了。

帮帮忙!
以下网友喜欢您的帖子:

  
游民

经验值: 118
发帖数: 17
精华帖: 0
回复:Modbus遐(瞎)想续篇——通用Modbus方案


只看楼主 只看精华 2010-01-20 18:44:18
不错,值得借鉴
用心?用心。用心!
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
Modbus遐(瞎)想续篇——通用Modbus方案
×
扫描打开手机版
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。