恭喜,你发布的帖子
发布于 2020-12-08 21:55:19
21楼
msg的done标志是“局部变量”,不同位置的msg指令都维护自己的done标志,“通讯令牌”是“全局变量”,任一过程都能访问(读写)
任一过程需要发起通讯时前都锁定当前状态,相当于开始排队,然后检查“通讯令牌”,如果通讯忙,只有等待下一次扫描再检查,如果有多个过程需要通讯,则按照过程在程序中的扫描顺序等待,多个过程在程序中的位置可以不连续,可以在主程序或子程序的任何地方;
只有通讯空闲时,也就是上个过程已经完成,无需关心上一个具体是哪一个过程,在主程序或者子程序的什么位置,本过程就会复位通讯令牌(使通讯处于忙的状态),然后发起通讯,并阻止其他过程发起通讯,因为没有了通讯令牌,或者说通讯已经处于忙的状态
通讯完成后再释放令牌,相当于令牌转移到下一个需要通讯的过程的手中
这个方法主要是对200 smart手册(V2.5 01/2020)里msg指令资源争夺解决方法的补充
题外话:上图程序段3有个bug,S M2.0, 2 应该是S M2.0, 1 好几版手册了,都没改过来
程序在556页还有一部分,我就不贴了
最后说一句,或许这个帖子的名字不应该这么叫,如果叫做“一种西门子Modbus RTU指令库使用时解决资源争夺的方法”更合适一些
本来想给大伙分享一下我遇到的问题的解决方案的,没想到变成对“轮询”的争论,不是我的本意
到此为止吧
请填写推广理由:
分享
只看
楼主