Codesys闭坑贴之如果任务运行时间超过循环周期会发生什么-CODESYS资源下载区-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

HSC6490-cn中国制造,中国芯~
查看: 2095|回复: 1

Codesys闭坑贴之如果任务运行时间超过循环周期会发生什么

[复制链接]
  • TA的每日心情
    擦汗
    2019-8-13 14:13
  • 签到天数: 32 天

    [LV.5]常住居民I

    发表于 2024-11-15 20:26:15 | 显示全部楼层 |阅读模式
    最近在学习Codesys,当然笔者并不擅长应用相关的。只是刚好接触了Codesys一些相关的,就顺便学习了解一下。要是请教我PLC编程,我肯定是不熟悉的。
    在创建一个任务,一般有几个配置,比如优先级0到31。然后类型默认是循环,然后可以配置循环周期1,2,3,4,甚至更大比如2000ms。
    然后task里就是执行PLC程序。
    笔者因为经验不丰富,总是有各种奇怪的想法。
    然后自己就在想,如果执行PLC程序段的时间,超过了循环周期,会怎么办呢。
    也就是任务执行时间超过了循环周期,会发生什么呢。
    循环周期,也可以理解为定时器。应该是相当于有一个定时器设定一个闹钟,每多少时间去执行这个任务。
    那么当下一个执行周期来的时候,这个任务还没有执行完,会发生什么呢。
    这个任务会不会突然被干掉,也就是后面的程序段不再运行,然后从新开始执行任务呢。
    还是等当前任务执行完成再马上执行同一个任务。
    如果任务一直反复执行,会不会CPU使用率很高。
    系统会不会崩溃呢。
    带着这些疑问,笔者决定做一些测试。下面一起来看一下。
    (测试数据仅供参考)首先,我们先设置MainTask的配置。先来个保守参数。优先级从中间的16开始。
    循环类型,间隔为14ms。然后程序段大概运行在80ms左右。
    上代码

    微信图片_20241115202105.png


    代码逻辑也比较简单。
    1 先设置Y0_out=1;注意,并没有实际映射任何外设IO。只是本地内存变量。所以不考虑变量赋值时间。
    2 使用FOR执行大概30ms的时间。
    3 对Count进行累加。
    4 再同样执行FOR执行个30ms的时间。
    5 再对Count2进行累加。最后随便执行个Y0_out为0.
    这样监控程序变量的时候,就可以测试出几个点。
    如果这个任务,每次都能从头执行到结束,不会中途退出,那Count和Count2这两个变量累加的值应该是一样的。
    由于任务执行的时间超过了循环周期,那就看不同的优先级下,会发生什么样的现象。
    先看个第一个参数。优先级16,循环周期14,任务时间大概在80ms。

    微信图片_20241115202124.png

    微信图片_20241115202139.png
    微信图片_20241115202152.png


    初步得到几个数据:
    1)task 任务正常在执行。并没有出现卡顿。
    2)任务不会被打断停止,而是等任务执行完成之后,再马上执行任务。效果等同于惯性滑行吧。
    到这里,我们并未能得到结论,我们先别高兴太早了。
    因为接下来才是最关键的。因为这里还有个关键的参数,就是优先级。
    接下来我们调整不同的优先级看看。
    优先级改成14:从监视窗口来看,最大循环达到了121ms。也就是开始出现大的抖动了。
    而且,数据刷新很慢,也就是出现了卡顿。
    PLC程序监控也出现卡顿

    1731673352672.jpg

    1731673365743.jpg


    先是出现了?,然后卡顿一会数据才开始出来,然后数据刷新也开始变得慢了。
    点停止后,又变流畅了。
    下面直接用表格整理下测试的数据。循环周期14ms,任务执行大概80ms,不同优先级。

    优先级最大循环时间数据刷新
    16
    80左右。正常范围
    正常
    15
    120ms左右
    1~2秒才刷新
    14
    120ms左右
    2~3秒才刷新
    13,12,11,10,9,8,7
    120ms左右
    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开始系统出现崩溃呢。
    带着这些疑问,我们下一集讨论。

    +10
    不赞一个?
    打赏鼓励一下!
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-12-25 08:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2024-12-24 16:44:48 | 显示全部楼层
    好帖啊   解答了我长久的疑问
    +10
    不赞一个?
    打赏鼓励一下!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    
    顶部qrcode底部
    关注酷德网订阅号,获取更多资讯!

    QQ|Archiver|手机版|小黑屋|酷德论坛 ( 苏ICP备16065247号-1 )|网站地图

    GMT+8, 2026-11-15 13:43 , Processed in 0.200423 second(s), 55 queries .

    酷德网

    © 2001-2013 Hicodesys. 技术支持 by 酷德网

    快速回复 返回顶部 返回列表