技术论坛

 Modbus的一些实践

返回主题列表
作者 主题
宝冬
侠圣

经验值:3743
发帖数:672
精华帖:10
楼主    2020-12-10 14:24:43
主题:Modbus的一些实践 精华帖 

Trace是PLC中程序执行的某个局部场景的底层细节的真实记录,一小段时间内的每个扫描周期的变量数值都明确记录下来。

通常的Modbus程序不需要Trace。但如果通信调度变复杂了,就需要通过底层执行细节来纠错和改进。通信数据变化太快,在线监视根本不管用,用Trace就能帮上忙。下面的Trace截图,是检测当前正在通信的从站号,和获得了优先权的从站号。可以看出执行过程是否按照调度设计的完好执行了。


多个从站根据自己的临时写任务的出现,来平行请求优先权。只有一个站点会获得优先执行权,其它站点排队等候。先执行的站点会把自己全部的写任务一个接一个完成后,才会释放优先权。释放优先权之后,如果有其它排队等候的优先请求站点存在,就会切换到下一个优先站点。如果没有,就会继续执行当前站点常规的非优先的读任务。

Y轴的iJob是任务队列数组中每个任务的角标序号。数组长度是0~22。Write_PRI [iJob] 是某个写任务优先申请的标志位,提出申请的时候置1,一旦被成功执行就置0。


从站的常规任务执行后,关于下一个常规任务是否执行,会进行判断。第2张截图表明,当上一个任务执行后,如果后面存在多个不执行任务的时候,会出现单扫描周期内任务序号自加2的现象。这是因为调度中有重复环节,经过调整如下。


但这种任务轮询的判断和执行方式,依赖于扫描周期的循环,有点慢。可以进行优化,把任务执行的判断放在自建循环里在单扫描周期内执行完。优化效果如下,站点执行时间缩短到40%,多站轮询显著加快。


之所以采用序号化的循环方式,是因为任务调度是基于一个给定的任务数组。而任务数组的预设存在,是因为模块化编程对于特定的设备而言,其内部的最大功能集合是已经预设存在并且对于这个设备而言是永远不变的。这是基于设备的稳定性,导致的模块稳定性,是模块化编程的一个特点。对于非模块化编程的程序员而言,没有模块化的层层抽象分隔的约束,只是简单一个个通信任务的独立存在,不必采取这种数组化的任务轮询模式。


上面几个截图展示一下利用Trace调试改善高速变化的控制结构。没有Trace会非常费时费力。同时间接展示了模块化编程的优点,复杂问题通过分解隔离,程序可扩展性和调试效率明显提高,这在面向过程的传统程序结构中是很困难的。


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