Codesys闭坑贴之如果任务运行时间超过循环周期会发生什么
最近在学习Codesys,当然笔者并不擅长应用相关的。只是刚好接触了Codesys一些相关的,就顺便学习了解一下。要是请教我PLC编程,我肯定是不熟悉的。在创建一个任务,一般有几个配置,比如优先级0到31。然后类型默认是循环,然后可以配置循环周期1,2,3,4,甚至更大比如2000ms。
然后task里就是执行PLC程序。
笔者因为经验不丰富,总是有各种奇怪的想法。
然后自己就在想,如果执行PLC程序段的时间,超过了循环周期,会怎么办呢。
也就是任务执行时间超过了循环周期,会发生什么呢。
循环周期,也可以理解为定时器。应该是相当于有一个定时器设定一个闹钟,每多少时间去执行这个任务。
那么当下一个执行周期来的时候,这个任务还没有执行完,会发生什么呢。
这个任务会不会突然被干掉,也就是后面的程序段不再运行,然后从新开始执行任务呢。
还是等当前任务执行完成再马上执行同一个任务。
如果任务一直反复执行,会不会CPU使用率很高。
系统会不会崩溃呢。
带着这些疑问,笔者决定做一些测试。下面一起来看一下。
(测试数据仅供参考)首先,我们先设置MainTask的配置。先来个保守参数。优先级从中间的16开始。
循环类型,间隔为14ms。然后程序段大概运行在80ms左右。
上代码
代码逻辑也比较简单。
1 先设置Y0_out=1;注意,并没有实际映射任何外设IO。只是本地内存变量。所以不考虑变量赋值时间。
2 使用FOR执行大概30ms的时间。
3 对Count进行累加。
4 再同样执行FOR执行个30ms的时间。
5 再对Count2进行累加。最后随便执行个Y0_out为0.
这样监控程序变量的时候,就可以测试出几个点。
如果这个任务,每次都能从头执行到结束,不会中途退出,那Count和Count2这两个变量累加的值应该是一样的。
由于任务执行的时间超过了循环周期,那就看不同的优先级下,会发生什么样的现象。
先看个第一个参数。优先级16,循环周期14,任务时间大概在80ms。
初步得到几个数据:
1)task 任务正常在执行。并没有出现卡顿。
2)任务不会被打断停止,而是等任务执行完成之后,再马上执行任务。效果等同于惯性滑行吧。
到这里,我们并未能得到结论,我们先别高兴太早了。
因为接下来才是最关键的。因为这里还有个关键的参数,就是优先级。
接下来我们调整不同的优先级看看。
优先级改成14:从监视窗口来看,最大循环达到了121ms。也就是开始出现大的抖动了。
而且,数据刷新很慢,也就是出现了卡顿。
PLC程序监控也出现卡顿
先是出现了?,然后卡顿一会数据才开始出来,然后数据刷新也开始变得慢了。
点停止后,又变流畅了。
下面直接用表格整理下测试的数据。循环周期14ms,任务执行大概80ms,不同优先级。
优先级最大循环时间数据刷新
1680左右。正常范围正常
15120ms左右1~2秒才刷新
14120ms左右2~3秒才刷新
13,12,11,10,9,8,7120ms左右3~4秒才刷新
6,5,4,3,2,1,0好像嘎了系统嘎了
最后发现在当前参数下,优先级在6到0。(数字越小,优先级越高)
下载进去点运行之后,系统就嘎了。在线仿真断开。而且,扫描不上PLC了。
即便是给PLC重新上电,还是无法扫描上PLC。
这种情况下,恢复出厂模式后给PLC重新上电。然后重新下载正常PLC程序才能恢复。
这时候测试就差不多了。可以做总结了。
当然,也有同学会问,你这个测试,任务周期都80ms了,循环周期14ms。超过太大范围了。
那如果是循环周期是4ms,然后任务执行也是4-5ms左右的呢。
当然笔者也同样做了测试。只要是任务周期稳定大于循环周期的。像那种1000次任务,只有一两次任务超过循环周期的,不在本次测试范围内。
总结几点吧:首先,任务周期大于循环周期,(指的是稳定,长期,超过%50的时间吧),肯定会出问题的。
当然,也分几挡。
在优先级低的情况(16~31)
执行效果相当于惯性滑行。也就是不影响系统的正常运行。由于优先级低的任务,无法打断优先级高的任务,所以暂时看起来是正常的。
但是,如果有很多优先级低的任务,也都超时运行,是否也会有问题。笔者没有继续追加验证。有兴趣的同学可以试一下。
在优先级为中的情况(7~15)
会出现明显的卡顿。但不至于挂掉。
而且,只有一个任务都已经卡成这样了,不知道如果两来几个任务会怎么样。情况只会更糟糕。
优先级为高的情况:(0~6)
系统直接嘎掉了。在线中断,扫描不上。只能恢复出厂再重新上电,下载正常的工程才能恢复。
闭坑指南:
在和几个擅长Codesys应用的工程师交流之后,针对这种情况,需要闭坑。
1 首先,要确定下,当前的任务,是否真的超过循环周期。也就是当前的任务是否真的需要执行这么久。
2 如果确实存在这种情况,建议任务类型改成惯性滑行。
因为当任务周期超过循环周期,这种情况下,循环周期已经没有意义了。
而且,循环周期的执行过程和机制,是会消耗系统定时器资源的。会影响系统的任务调度的。
3 合理的设置任务优先级。
很多人包括我自己,接触到Codesys的时候,其实对任务优先级是没有太多概念的。只是知道优先级越高,任务越容易优先执行。(数字越小,优先级越高)。
那么,优先级的几个档次,不同的优先级下是否还会有别的隐患,也很难去理解,只能通过经验来。
像上面的几个测试,发现在优先级为高的几挡里,任务出现异常的时候,严重的,会直接让系统挂掉。
然后就像上面测试的结果一样。
16~31测试出来的,能正常运行。像惯性滑行。
7~15 测试出来的,运行会卡顿,但不会崩溃。
0~6 测试出来的,系统会崩溃。
那么到底是凑巧,还是这几个任务优先级本来就有特定的含义和等级划分呢。
明明任务优先级15和16很接近,为什么差别这么大。
为什么是从6开始系统出现崩溃呢。
带着这些疑问,我们下一集讨论。
好帖啊 解答了我长久的疑问
页:
[1]