恭喜,你发布的帖子
发布于 2023-08-05 10:00:12
7楼
楼主的有些观点都太理想化了
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
我的程序可以任意控制通信任务参与或退出轮询
只有你做出的程序让所有人都能用上才是硬道理,用结果说话。
我最近一个活,一条485线上连了十几个同型电能表,数个同型电流表。。。轮询需要近四十次通讯,9.6K应该也就一秒左右(有未上线设备所以是推断的时间)。。。类似这样使用连续从站号的情况,真心太普遍了。。。另外,这样的低速设备,我测试的结果是:两个字的站地址如果间隔十个以上,分两次通讯比一次通讯十个字速度更快。连续位读写应该也有类似结果。
另外关于立即写的程序,之前我倒是写过一版,真心不好用。当时的思路是,每个写操作都有一个标志字,当有标志字不为0时,当前通讯结束立即转为标志字对应的写通讯,写通讯(包括异常)结束后清零对应标志字。结果就是上级调用程序,每个写都要有判断程序,每个写结束都要结果处理程序(写正常覆盖比较字,写错误恢复原始字),还要有特殊异常处理程序,比如某个变频器断电,需要在可通讯后确保完成写频率,如果是多plc系统,主控plc程序也要包含这些处理程序。。。难以进行程序模块化,每个项目的编写量都大增,实在是不如写同读一样一直轮询,简单可控
请填写推广理由:
分享
只看
楼主