CODESYS开发教程12-任务配置

news2024/11/25 23:28:34

今天继续我们的小白教程,老鸟就不要在这浪费时间了😊。

前面一期我们介绍了CODESYS的库管理器。这一期就来介绍一下CODESYS工程中“任务配置”的使用。看过前面教程的朋友可能记得,在工程的基本组成中有简单介绍过如何使用任务配置添加任务,这一期会详细介绍各种不同类型任务的特点、使用场景和执行时可能存在的问题,以及通过任务配置实现对Application中不同类型任务的设置和管理。

一、任务配置简介

任务配置用于定义和显示任务的基本设置。注意每个应用程序中只能包含一个任务配置对象。

1.监视

显示在线模式下各个任务的状态和相关统计信息。这里需要在登录控制器的模式下才能看到任务相关信息。

这些信息里面的平均周期时间、最大周期时间、抖动这几个数据可以帮助大家检查任务是否可能存在执行超时的情况。如果一个任务的平均周期时间大于周期循环时间,就说明该任务中执行的程序在给定的循环时间内无法执行完,这种情况需要对周期进行调整,避免出现不可预知的错误。

对于有实时性要求(实时性是指任务必须在指定的周期内执行完成,否则会出现问题)的任务,除了平均周期时间外,还要检查最大周期时间和抖动,看看是否满足实时性要求。实时性任务通常要求任务的平均周期时间和最大周期时间均小于任务循环周期,最大抖动越小越好。根据经验,如果一个有实时性任务的平均周期时间超过该任务周期循环时间的70%,说明执行时间非常紧张。建议要么调大该任务周期循环时间,要么调整执行内容,将占用时间的操作放到非实时任务中执行。

2.变量使用

变量使用显示任务配置下面所有任务中调用程序里面定义的变量,变量由哪个任务使用,以及使用的方式。对于多核系统,对变量的写操作应该只在某一个任务中进行,否则可能会导致结果不一致。在列表中点右键,可以选择要查看的一个或多个任务。从这里大家可以检查哪些变量被不同的任务使用了,方便查找不同任务读写同一变量造成的冲突问题。

3.属性

本页面显示当前使用的控制器支持的任务属性,包括任务的最大数量、循环任务的最大数量、自由任务的最大数量、状态任务的最大数量、当前CPU类型等信息。这项内容与使用的控制器有关,每个品牌的控制器显示会有差别。

二、任务特性

双击任务配置下面的任务名称,可以打开对应的任务配置页面。该页面中可以设置任务的优先级、类型、间隔以及任务中调用的程序。

1.优先级(Priority)

优先级用来确定一个任务执行的先后顺序。优先级高的任务先执行,优先级低的任务后执行。在低优先级任务运行过程中,如果高优先级任务满足条件,则会中断低优先级任务运行,先执行高优先级的任务,待其运行完成后在接着执行低优先级任务。

官方文档中优先级的范围从0到31,其中0代表最高优先级,31代表最低优先级。在任务的“配置”也没能够看到优先级的允许范围。

注意:(1)CODESYS的标准优先级范围为0-31,但是第三方厂家的控制器的具体设置有所不同,有些控制器的范围是0-10,有些是0-15。例如,我目前使用的控制器,其任务优先级是1到10。

2.任务类型

(1)循环(Cyclic)

按指定周期循环执行的任务。任务的循环周期由“间隔”来指定,单位可以设为ms或us。这是最常用的任务类型,任务周期通常根据执行的需要来设置,要求反应比较快的任务周期可以设的小一些,IO状态处理之类的任务周期可以设置为20~100ms。

循环类型任务里面有一个比较特殊的任务,EtherCAT总线通信任务,系统默认具有最高优先级,任务周期设置与所连接的伺服有关,常用值为1/2/4/8ms。

(2)状态(Status)

由指定的BOOL变量触发运行的任务。一旦输入字段Event中定义的全局变量值为TRUE,CODESYS就开始反复循环执行任务。

(3)惯性滑行(Freewheeling)

CODESYS在程序开始和完整过程结束时以连续循环的方式再次自动开始处理任务,可以设置任务优先级,但不存在循环时间设置问题。也就是执行完一次循环后会紧接着从头开始执行下一次循环,无限循环,没有停歇间隔。这类任务通常是作为后台任务来处理一些没有周期要求或者耗时很长的动作,比如将大量数据写入硬盘之类的。

(4)事件(Event)

在输入域Event中定义的全局变量出现上升沿时执行任务一次。

(5)外部事件(External)

输入字段Event中定义的事件出现时,系统立即开始执行任务。由目标系统提供所支持的事件列表。

注意事项:

(1)对于总线控制器,需要一个固定的周期性任务来保证总线的数据交换,因此对于总线任务不能使用“惯性滑行”类型。

(2)注意“状态”和“事件”类型任务的区别,前者是检查变量的状态,为TRUE则执行,而后者是检查变量的上升沿,即指定变量从FALSE到TRUE的切换。如果任务的周期与指定变量的变化频率不匹配,可能会导致无法检测到变化。

(3)更新总线伺服数据(EtherCAT、CAN等)的任务,其任务周期要与所使用伺服的任务周期一致。对于CAN总线之类的伺服,其心跳、节点保护和同步设置的时间必须是任务周期的倍数,否则可能会导致数据丢失。

(4)控制器允许的最大任务数量以及各种类型的任务数量与所使用的控制器有关。前面任务配置的属性页面显示的控制器的任务最大数量为13个,循环任务最大数量为10个,惯性滑行任务最大允许1个,状态任务最大允许建立2个。

(5)我使用过的几个控制器都只有前面三个类型的任务,事件和外部事件类型的任务我也没用过(主要是现在用的控制器也没见哪个支持这些类型☹)。

3.程序调用

在某个任务配置完成后,可以指定在该任务中运行的程序。任务中有多个程序时,程序调用的先后顺序与程序在任务中排列的先后顺序相同。

4.任务组

官方文档上还有一个任务组的功能,主要是针对多核控制器的,用于将任务分组并指定其运行在多核中的特定处理器核上。。

目前我使用过的控制器大多没有任务组这个功能,这里就不做详细介绍了(实际情况就是俺也不会,就不在这里丢人现眼~~跳过跳过……)。

三、任务的使用及陷阱

实际上,只要搞清楚了任务类型,以及要实现的目标,任务配置其实是很容易的。可能会影响到使用的主要是多个任务的执行顺序以及可能出现的一些错误。

1.任务执行顺序

多个任务的处理顺序是通过优先级和条件的组合实现的。

(1)如果多个任务同时满足处理条件,则CODESYS首先处理优先级最高的任务。

(2)如果具有相同优先级的多个任务同时满足处理条件,则CODESYS首先处理等待时间最长的任务。

(3)建立程序时不要与库或者设备树中的项目同名,在调用时有个默认的搜索顺序,同名可能导致调用到错误的程序。

(4)所有任务共享Application的内存,因此访问全局变量或块时有不少注意事项,后面会详细讲到。

2.多任务常见的错误

CODESYS的任务配置其实比直接用C或者C++进行多线程编程要容易得多,简单几个独立任务基本只要设置一下就可以用了。容易出问题的地方通常在多个任务的优先级分配和数据交互上面。

CODESY的任务配置的特点

(1)周期性任务有抢占,但是没有临界区保护。

抢占的意思就是高优先级的任务触发时,会优先执行,完成后再继续低优先级任务的执行。这个没有找到任何官方说明,完全是根据使用的经验判断的。高优先级任务会随时中断低优先级任务的执行,这个在很多情况下会导致低优先级任务中的程序没有执行完就被中断。由于没有临界区保护机制,在读写文件或者读写全局数据时,很容易造成数据不完整。

在多任务中读写同一个全局变量要小心分配任务时间和优先级,精心选择写数据和读数据的位置,读写数据的时间尽量短。其实最好的办法是别用这种方式,实在是要用就只能自求多福了,出不出错以及什么时候出错得看脸……

如果多任务在运行中不规律的出现超出你想象的数据,极有可能是这个导致的。至于我是怎么发现这个问题的,呵呵,说来话长,这里就不说了☹……

注意:最近在翻官方文档的时候突然看到某个页面里提到SysSem可以解决Runtime系统中多任务的数据同步性问题,搜索了一下,只找到如下图这一页,需要3.5.17及以上版本的库才行(我原来用3.5.16,所以前面也没说错,以前确实不支持😊)。

这个我也还没用过,有需要的朋友可以自己研究一下,……

(2)超时无报错。

这个错误在循环周期小的任务中比较容易,尤其是在控制器连接总线伺服时,在发送数据给伺服的任务中做复杂计算的情况。原因通常是任务中运行的程序执行时间过长,导致程序运行时间超出了所任务设定的周期导致的。CODESYS对于运行超时具体怎么处理帮助里面没有说明,首先系统不会报错,还是继续往下运行,所以具体造成的影响要看实际应用场景。但是按照接总线伺服运行的情况来看,超时会导致本周期数据发送失败,在运行速度高时电机振动会很明显。

四、示例

任务配置真的没有什么可以演示的~~

五、结论

写了这么多期教程了,如果你一定要问我怎么样能够学得更快,除了看我的教程以外,秘诀就是自己多实践几遍,让程序跑起来。编程是一个实践性非常强的东西,实践过程中所有不会和出错的地方,都是你需要学习的地方,个人觉得再没有比纠正错误更管用的学习方法了。

因为有其它事,这个小白教程中断了很长时间,博主也希望后面能够勤奋点😊。说实话,写着写着不知道写什么内容好了,大家有什么好的建议可以给我留言!另外觉得有问题或者不够小白的地方,欢迎留言吐槽~~

------------------

原创不易,感兴趣的多支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1176034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中使用Tkinter和Difflib模块实现文本比对功能

目录 一、引言 二、Tkinter简介 三、Difflib简介 四、实现文本比对功能 五、代码展示 六、注意事项 总结 一、引言 在Python中,Tkinter和Difflib是两个非常实用的模块。Tkinter是Python的标准图形用户界面(GUI)库,可以用来创建桌面应用程序。Dif…

【0基础】全网最细致【PYTHON入门】教学

前言 可以说很多人学编程,不玩点爬虫确实少了很多意思,不管是业余、接私活还是职业爬虫,爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫,目的是让准备学爬虫或者刚开始起步的小伙伴们,对爬虫有一个更深更全的认知…

动态壁纸软件Live Wallpaper HD mac中文版功能特色

Live Wallpaper HD mac提供了一系列美丽的主题场景,将为您的桌面增添活力。从城市景观、日落到遥远的星系,每个屏幕都有特别的触感,可以定制您的天气小部件和时钟样式,并使用您喜爱的图片创建您自己的个性化壁纸。 Living Wallpap…

使用 Rust 进行程序

首先,我们需要安装必要的库。在终端中运行以下命令来安装 scraper 和 reqwest 库: rust cargo install scraper reqwest 然后,我们可以开始编写程序。以下是一个基本的爬虫程序,用于爬取 上的图片: rust use reqwe…

QT实现的一个MVP设计模式demo

最近做qt 项目,发现网上基于MVP设计模式的QT例程很少,这里写一个demo示例可作为参考: 一、简要概述 MVP是由MVC发展而来,总体目的与作用相同。都是为了软件构架有层次之分,使得核心逻辑、界面控制、数据这三者分层清晰明了。减少…

椭圆滤波器

之前的文章 信号去噪 中列出了7种常用的信号去噪算法,对于后两种算法——深度学习和奇异值分解(SVD),我现在也不太理解,就先不写了。 很多朋友留言又提了一些算法,今天一起来聊聊椭圆滤波器。 椭圆滤波器(Elliptic F…

极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

引言 前端性能已成为网站和应用成功的关键要素之一。用户期望快速加载的页面和流畅的交互,而前端框架的选择对于实现这些目标至关重要。然而,传统的前端框架在某些情况下可能面临性能挑战且存在技术壁垒。 在这个充满挑战的背景下,我们引入…

新大陆NVH200-AP(U)扫码枪在上位机软件开发中的应用

前言: 由于本次使用的是USB接口的扫码枪 1、先安装Nset软件,使用扫码枪扫描“启动设置条码”,然后扫描“USB CDC串口”条码 2、打开NSet软件,点击“刷新按钮” 就能找到扫码枪设备 3、设置条码后缀 点击“高级设置”,然后点击“数据编辑”,在“后缀”那里设置结束符…

〔001〕虚幻 UE5 安装教程

✨ 目录 🎈 下载启动程序🎈 注册个人账户🎈 选择引擎版本🎈 选择安装选项🎈 虚幻商城的使用🎈 每月免费插件🎈 安装插件🎈 下载启动程序 下载地址:https://www.unrealengine.com/zh-CN/download点击上面地址,下载 UE5 启动程序并安装🎈 注册个人账户 打开商…

发送Http请求的HttpClientUtil工具

发送Http请求的HttpClientUtil工具 代码如下: /*** author xuan* create 2023/11/6*/ public class HttpUtil {// 创建连接池管理器private static final PoolingHttpClientConnectionManager connMgr new PoolingHttpClientConnectionManager();// http客户端pr…

Java 求两个向量余弦相似度计算代码

Java 求两个向量余弦相似度计算代码 公式&#xff1a; 源码&#xff1a; public Double getCosineSimilarity( List<Double> x, List<Double> y ){double numerator 0D;for( int i 0; i < x.size(); i ){numerator x.get( i ) * y.get( i );}double leftD…

在 Python 中使用 Selenium 按文本查找元素

我们将通过示例介绍在Python中使用selenium通过文本查找元素的方法。 在 Python 中使用 Selenium 按文本查找元素 软件测试是检查应用程序是否满足用户需求的技术。 该技术有助于使应用程序成为无错误的应用程序。 软件测试可以手动完成&#xff0c;也可以通过某些软件完成。…

电脑怎么恢复删除的文件?恢复文件必备3个方法分享!

“由于我经常需要处理大量的文件&#xff0c;我在电脑里建了一个文件夹放比较重要的文件&#xff0c;但不知道由于我误操作还是什么原因&#xff0c;文件夹里的部分文件消失了&#xff0c;我现在很是烦恼&#xff0c;有什么方法可以帮我恢复删除的文件吗&#xff1f;” 处理电脑…

【Python】批量下载素材酷视频资源

【需求】 做视频精彩需要用到梗图视频等,但是素材酷上面的视频没有搜索功能,每次用起来还要去下载也很麻烦,下载只能一个一个下载也很麻烦,下要搞一个能够批量下载的功能,然后把下载的资源全部放进万兴喵影编辑器的云空间,这样就可以做到随做随查随用了。 【效果】 目…

第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例

文章目录 1.触发器的概念2.触发器操作的语法结构3.各类触发器的典型应用案例3.1.需求描述以及实现思路3.2.创建日志表3.3.INSERT类型的触发器3.4.UPDATE类型的触发器3.5.DELETE类型的触发器 1.触发器的概念 触发器是与表中数据相关的数据库对象&#xff0c;当表中的数据产生in…

为什么江西的彩礼高?

作为一名江西土生土长的娃&#xff0c;今天和大家聊一聊江西的彩礼为何如此高&#xff1f; 江西的彩礼之所以高&#xff0c;主要与江西省的传统文化习俗、经济条件及社会观念等因素有关。那么我们从传统文化&#xff0c;经济条件&#xff0c;社会观念这三点出发。 1.传统文化习…

使用Kotlin与Unirest库抓取音频文件的技术实践

目录 摘要 一、Kotlin与Unirest库概述 二、使用Kotlin和Unirest抓取音频文件 1、添加Unirest依赖 2、发送HTTP请求获取音频文件 3、保存音频文件 三、完整代码示例 四、注意事项 结论 摘要 本文详细阐述了如何使用Kotlin编程语言与Unirest库抓取网络上的音频文件。首…

K8s:部署 CNI 网络组件+k8s 多master集群部署+负载均衡及Dashboard k8s仪表盘图像化展示管理

目录 1 部署 CNI 网络组件 1.1 部署 flannel 1.2 部署 Calico 1.3 部署 CoreDNS 2 负载均衡部署 3 部署 Dashboard 1 部署 CNI 网络组件 1.1 部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容…

深度学习中的数据类型介绍:FP32, FP16, TF32, BF16, Int16, Int8 ...

文章目录 0. 前言1. 数据的存储方式2. 不同数据类型介绍2.1 深度学习中常用的数据类型2.2 BF16 类型的优势2.3 不同数据类型的使用场景 0. 前言 相比于 CPU&#xff0c;GPU 在架构设计时将更多的晶体管用于数据处理&#xff0c;而不是数据缓存和流量控制&#xff0c;因此可以高…

【Python基础】Python函数介绍(超全面、缺省参数、多值传参、可变参数等)

函数进阶 1.01. 函数参数和返回值的作用1.1无参数&#xff0c;无返回值1.2 无参数&#xff0c;有返回值1.3 有参数&#xff0c;无返回值1.4 有参数&#xff0c;有返回值 2.不可变和可变的参数3.多值参数 1.01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值&…