技术论坛

 关于modbus轮询子程序数据结构的探讨

返回主题列表
作者 主题
阳春节拍
游侠

经验值:313
发帖数:69
精华帖:0
楼主    2023-07-23 17:41:19
主题:关于modbus轮询子程序数据结构的探讨

看到论坛里有篇关于modbus轮询的子程序,权限不够不能回帖,在这儿探讨下轮询的需求。

1、modbus通讯对速度通常要求不高,多数读操作可以分钟计,写操作以秒计都是可以的。

2、正常一次通讯也就一二十毫秒,因此即使全部通讯异常也可以通过参数优化到每秒二十次以上,全部正常的话更可以达到每秒50次以上,这对于多数应用来说都是足够的。因此写优先意义不大,掉线排除轮询更是大大增加程序复杂度。

3、简化数据块的使用和占用更重要。比如20型cpu才八千多的V区地址,尽量少占用空间很重要。比如msg的dataptr,在数据块里就不要使用D型数了,直接用W型数据,然后程序里给加上16进制8百万换算成V型地址。还有count也可以用B代替W型数。RW仅是一个位,随便整合到哪个数里

4、读写内容类型完全一致,只是需要更改连续站号,这是刚需。可以直接在数据块中压缩为站号首地址、连续站数量,以及目标数据区首地址。比如连续写1到9号站的2000h地址为vw0开始的九个字,只是增加了一个连续站数量,就使数据块少了8组,即减小空间又降低数据块填写出错概率。

5、按以上思路,可以做到一个通讯口使用1K字节空间,就能支持50组数据,每组可以为连续百多个站号的读或写(把RW整合进连续数量字节里)

不欲勿施
奇侠

经验值:8148
发帖数:843
精华帖:14
6楼    2023-08-02 20:50:07
精华帖  主题:回复:关于modbus轮询子程序数据结构的探讨

楼主的有些观点都太理想化了

1、modbus通讯对速度通常要求不高,多数读操作可以分钟计,写操作以秒计都是可以的。

比如设备的启停,往往要求响应快一点,太长了客户会认为你的控制有问题。

2、正常一次通讯也就一二十毫秒,因此即使全部通讯异常也可以通过参数优化到每秒二十次以上,全部正常的话更可以达到每秒50次以上,这对于多数应用来说都是足够的。因此写优先意义不大,掉线排除轮询更是大大增加程序复杂度。

影响通信次数的原因很多,比如从站的响应速度,线路的波特率,通信的数据量多少。比如:在9600波特率的情况下传输120个字,光传输时间是200毫秒,加上主站和从站的处理时间,差不多250毫秒。也许楼主会说上19200,那传输的时间也得100毫秒,有些线路支持不了这么高的波特率。写优先和掉站处理是会增加复杂度,但在功能上如果是用不上自然是称之为无用,这功能是为了解决设备运作响应的,响应时间太长了客户会认为你的控制有问题。

3、简化数据块的使用和占用更重要。比如20型cpu才八千多的V区地址,尽量少占用空间很重要。比如msg的dataptr,在数据块里就不要使用D型数了,直接用W型数据,然后程序里给加上16进制8百万换算成V型地址。还有count也可以用B代替W型数。RW仅是一个位,随便整合到哪个数里

八千多的V区,实际上不少了,你有几次合理使用把这八千多的地址还不够用?至于指令的参数改类型,这要看通信的任务有多少条,如果没多少条也转换的意义就不大。count也可以用B代替W型数?如果需要要读回512个位,要读2次吗?

4、读写内容类型完全一致,只是需要更改连续站号,这是刚需。可以直接在数据块中压缩为站号首地址、连续站数量,以及目标数据区首地址。比如连续写1到9号站的2000h地址为vw0开始的九个字,只是增加了一个连续站数量,就使数据块少了8组,即减小空间又降低数据块填写出错概率。

这种假定在特定的情况下才适用,不太容易遇到

5、按以上思路,可以做到一个通讯口使用1K字节空间,就能支持50组数据,每组可以为连续百多个站号的读或写(把RW整合进连续数量字节里)

把你的思路化做程序,有许多人使用的话,你的思路就是成功的。


我的帖子被关闭了,所以是无法回复的,你可以仔细看一看。

https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1794991&b_id=64&s_id=0&num=0

我的程序可以任意控制通信任务参与或退出轮询


只有你做出的程序让所有人都能用上才是硬道理,用结果说话。

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