恭喜,你发布的帖子
发布于 2024-08-15 08:59:17
11楼
多数人似乎对公共环境预估和设备FB实例代码提前return的意义不理解。可能因为不常用不直观,结合下图再讲一下。
在代码扫描中,温控器0位于温控器1之前。
本截图中,位于后面的温控器1产生了一个L2任务。
温控器0虽然最先扫描,但是它已经知道有其它设备产生了L2的任务,所以主动提前return,并把状态值调整到-2来表明这点。
如果按照通常的思路,温控器0是不会管其它设备的需求变化的。温控器0自身存在L1的modbus任务,它直接首先就会占用485执行任务。如果是这样,等到温控器1被扫描的时候,将不得不等待,那么这样的在面向对象设计下的优先调度机制就不完善了。
这个Trace就是展示了,在同一个扫描周期之内,位于前面的代码直接为后面代码让路的一个例子。
--------------------------------------------------------------------
需要提到:在面向对象的模块设计下, 优先权都是在每个FB实例内部产生的,而不是由外部上级单元统一分配的。这可能是大家不理解的一个主要原因。
我估计:多数人的优先权设计,都是由外部统一的Manager角色来分配的。这样的话无所谓任务先后,多个设备都是统一管理大家所有任务的先后。
如果是这样的话,那就不是真正的面向对象的隔离式设计。也做不到设备模块级的“实例自由拖拽,只管绑定管脚参数”的多FB实例的平行调用。
纯理论上说,在面向对象设计模式下,根据职责单一原则,调度是独立于执行模块的,即执行哪个是由调度模块分配的;
调度模式常见的有轮询、抢占、FIFO、Priority、LRU、多种组合等等,有兴趣的可以看看windows内核场景中内存、页面管理部分;
当修改调度模式时,不会牵扯执行部分;
另,一个调度模式可以创建多个实例,每个实例管理各自的执行部分;
请填写推广理由:
分享
只看
楼主