用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (7)- 用状态机实现红绿灯
状态机是一个常用的设计模式,其逻辑清晰实现简单。本文以一个简化版的红绿灯为例,演示在 AWPLC 中实现状态机的方法。
背景
AWTK 全称 Toolkit AnyWhere,是 ZLG 开发的开源 GUI 引擎,旨在为嵌入式系统、WEB、各种小程序、手机和 PC 打造的通用 GUI 引擎,为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎。
AWPLC 是 ZLG 自主研发的 PLC 系统(兼容 IEC61131-3),其中 AWPLC 的运行时库 (Runtime) 基于 ZLG TKC 开发,可以移植到到任何主流 RTOS 和 嵌入式系统。AWPLC 的集成开发环境 (IDE) 基于 AWTK 开发,可以运行在 Windows、MacOS 和 Linux 系统之上。AWPLC 的主要目标之一是把 PLC 中低代码开发方法 引入到嵌入式软件,从而提高嵌入式软件的开发效率和可靠性。
简介
状态机是一个常用的设计模式,在有的情况下采用状态机,逻辑清晰,实现简单。在 AWPLC 中,也是可以采用状态机模式的,本文以一个简化版的红绿灯为例,演示在 AWPLC 中实现状态机的方法。
在采用状态机模式设计时,一般按照下列步骤进行:
确定系统存在的状态,并选取我们关注的状态。比如,在本系统中,我们选取红灯、黄灯、绿灯三个状态;确定在各个状态下系统的行为。比如,在本系统中,在红灯状态下,点亮红色 LED 灯;在黄灯状态下,点亮黄色 LED 灯;在绿灯状态下,点亮绿色 LED 灯;确定各个状态之间转换的条件。比如,在本系统中,在红灯状态下,超时进入黄灯状态下;在黄灯状态下,超时进入绿灯状态下;在绿灯状态下,超时进入红灯状态下。状态转换如下图所示:
1. 系统组成
该系统包括:
3 个 LED。2. 软件模拟
LED 都用软件模拟。PLC 程序
1. 变量定义
在本系统中,需要定义几个变量:
STATE_RED 表示红色状态,是一个常量,取值为 1;STATE_YELLOW 表示黄色状态,是一个常量,取值为 2;STATE_GREEN 表示绿色状态,是一个常量,取值为 3;STATE 表示系统当前的状态;LED_RED 表示红色 LED 灯,映射到第 1 个数字输出;LED_YELLOW 表示黄色 LED 灯,映射到第 2 个数字输出;LED_GREEN 表示绿色 LED 灯,映射到第 3 个数字输出。具体配置如下图所示:
2. 功能块图
基本工作原理:
如果系统当前状态 STATE 等于 STATE_RED 时,表明当前处于红灯状态:点亮红色 LED 灯,定时器保持工作,当定时器超时,设置系统当前状态为黄灯状态;如果系统当前状态 STATE 等于 STATE_YELLOW 时,表明当前处于黄灯状态:点亮黄色 LED 灯,定时器保持工作,当定时器超时,设置系统当前状态为绿灯状态;如果系统当前状态 STATE 等于 STATE_GREEN 时,表明当前处于绿灯状态:点亮绿色 LED 灯,定时器保持工作,当定时器超时,设置系统当前状态为绿灯状态。* 值得注意的是,这里使用了功能块 MOVE 对变量进行赋值。按道理来说,对变量进行赋值,直接拉根线连接起来就可以了,为什么还要加个 MOVE 呢?原因在于,这里是条件赋值,即在定时器超时的时候,才对 STATE 进行赋值。
* 这就需要利用功能的执行控制 (Execution Control),当功能块启用执行控制 (Execution Control) 时,只有其输入引脚 EN 为 TRUE 时,其后续赋值才生效。
具体实现如下图所示:
用户界面
应用程序不需要编程,用 AWTK Designer 设计好界面,将控件与模型进行绑定即可。下面介绍一下控件与模型的绑定方法。这里用的是 AWTK-MVVM,数据绑定规则与 AWTK-MVVM 是完全一样的。
模型可以用 io、plc 或者 io+plc。io 可以用来绑定 IO 变量,plc 可以用来绑定程序 PLC 内部变量。
示例:
<window v-model="io+plc" tr_text="AWPLC demo">
由于符号 % 在程序里具有特殊功能,所以在绑定 IO 变量时,把 % 换成 _ 。比如:将 %QX0.0 写作 _QX0.0 。
示例:
<view name="out" x="r:10" y="m" w="100" h="330" children_layout="default(r=3,c=1,s=10)"><check_button v-data:value="{_QX0.0}" style="led_red" sensitive="false"/> <check_button v-data:value="{_QX0.1}" style="led_yellow" sensitive="false"/>
<check_button v-data:value="{_QX0.2}" style="led_green" sensitive="false"/>
</view>
程序界面如下所示(为了方便理解,我们把功能块图也放到了界面上):
运行效果:系统启动后,三个 LED 灯循环点亮,和跑马灯不同的是,三个 LED 点亮的时间并不完全相同。
* 由此可见,在 AWPLC 功能块图的帮助下,我们不要写 C 代码或脚本,即可完成应用程序的开发。AWPLC 用低代码降低了开发的门槛,提高了开发的效率。AWPLC 等您来玩!
AWPLC 目前还处于开发阶段的早期,写这个系列文章的目的,除了用来验证目前所做的工作外,还希望得到大家的指点和反馈。如果您有任何疑问和建议,请在评论区留言。
ZLG官方商城:https://sale.zlg.cn/
ZLG开发者社区:https://developer.zlg.cn/
更多详细产品信息、技术干货,请关注微信公众号“ZLG致远电子”。
克服PLC编程的难题——基于Git的软件
图片来源:Copia Automation
作者:Darren Henry
一家控制系统集成商使用基于Git的软件提高了自动化程度,并提升了新员工的入职培训效率和质量。
Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发。Git最初是由Linux开发者Linus Torvalds创建的,它具有高效、灵活、稳定等优点,如今已成为软件开发领域中最流行的版本控制系统之一。Git使用一种名为“仓库”的数据结构来保存代码和它们的变更历史。每个开发人员都可以在本地拥有自己的仓库,并将其与其他人的仓库同步更新。除此之外,Git还提供了强大的分支和合并功能,可以让开发人员在不影响主干的情况下创建和测试新功能。
自1996年以来,工程咨询公司DMC一直致力于通过定制的自动化软件和控制系统,帮助客户提高生产设施的生产力。他们参与过很多行业应用,如汽车、食品和饮料,甚至海军战舰。
负责该公司美国西部自动化业务的项目总监John Sullivan表示,对服务的需求从未如此之高。“有时,我们不得不地拒绝合同,因为需求超过了我们快速雇佣和培训控制工程师的能力。”
控制系统集成商协会(CSIA)最近的一项调查显示,2021年系统集成工程师的招聘形势严峻,但整个领域的人员流动率却高达16.5%,这也印证了 Sullivan 的判断。
最大的瓶颈是培养新人才和有效地利用高级工程师的时间。软件工程专业的学生,学习的通常是基于文本的编程语言,而不是专用于机器自动化的可编程逻辑控制器(PLC)可视化梯形逻辑图。因此,年轻的工程师需要与经验丰富的导师配对进行培训,这可能需要几个月的时间。
在DMC公司,软件项目组的大小从一名程序员到25名工程师不等,夏季往往会需要更大的团队,新人可以向经验丰富的同事学习。高级工程师的日程很快就被频繁的设计审查填满。到了冬天,随着大学毕业生更有能力独立开展工作,小型的团队变得越来越普遍。
为了简化其设计审查过程、版本控制和协作,他们采用了基于Git的软件,该软件可以加速多个PLC编程环境的开发。这使团队能够在相同的文件上工作,而不会有覆盖他人工作的风险。Git分支和合并功能,为梯形图逻辑编程带来了与文本语言项目相同的协作优势。
带注释的可视化检查功能,提供了易于阅读、颜色编码的比较,审核人员无需在原始集成开发环境(IDE)中下载和打开文件。
通过在网络浏览器或桌面应用程序中显示PLC梯形图逻辑 并突出显示提交之间的变化 Copia可以加快代码审查速度
01 尽早发现并修复错误
PLC编程语言的自动渲染以及在不使用原始IDE的情况下快速可视化变更的能力,大大加快了初级和高级工程师之间的反馈路径。在领导多个项目时,由于代码审查速度更快,高级工程师每周最多可以节省一天的时间。此外,审查比以前更频繁。Sullivan说道,“在部署或测试之前,我们会发现更多的错误。因为我们总是在合并之前查看可视化代码,所以我们犯的错误也更少。”
转向基于Git的软件后,使Sullivan的团队效率大大提高。他说,“虽然在管理项目历史方面Git本身做得很好,但在审查代码时就显得力不从心了。每当有人提交代码变更时,我们的高级工程师都需要打开两份开发环境副本,在两个平台之间进行比较,并在重新提交之前手动复制代码。现在,我们可以立即看到变更,只需单击几个按钮即可合并这些变更。过去需要45分钟的过程,现在只需要15分钟。”
“成功的关键之一就是要确保拥有最新的代码。共享同一个资源库有助于实现这一点。”
02 克服自动化编程的难题
Copia Automation公司基于Git的版本历史记录,可以捕获项目生命周期中的所有编码变更,允许团队根据需要恢复到任何早期版本。编辑历史对于团队成员了解最新的项目变化非常重要,它也有助于管理困扰DMC公司多年的难题。对于很多企业来说,挑战在于:在安装后很长一段时间内,如何保持为机器和系统提供持续支持的能力。
Sullivan说:“我最近收到一位客户来信,该客户在七年前与我们最后一次合作。负责该项目的工程师和经理都去世了。始终能够找到老旧项目的文件非常重要。另外一个客户设施遇到电涌,导致其丢失了相关程序。不幸的是,他们从来没有保存过它的副本。因此,我们需要获取旧代码,并帮助它们重新部署到一组新的硬件上,以便它们能够恢复运行。现在,我们团队中的任何人,都能够在没有参与该项目的原始工程师参与的情况下,轻松应对这些难题。拥有项目整个生命周期的情境信息非常有价值。”
在一个安全的中央存储库中拥有唯一的信息来源,也有助于团队更有效地与制造客户合作。有些客户在运营设施时,工程师会定期进行小代码更改。当真出现问题时,他们会给出及时反馈。Sullivan说,“我们的工作是介入并帮助客户解决问题。成功的关键之一是确保我们拥有最新的代码。共享同一个存储库可以做到这一点。”
业界仍然依赖文件名和共享文件夹是一件 "令人尴尬 "的事情。开发一个精简平台,让程序员可以相互学习并开发单一的信息来源,这对于减少瓶颈和让年轻工程师在不麻烦高级工程师的情况下学习至关重要。基于Git的软件帮助他们大大提高了工作效率。
关键概念:
■ 如何培养新人并对其进行编程培训,是一个主要的挑战。
■ 了解基于Git的软件如何消除一些潜在的瓶颈。
■ 发现单一信息来源对编程的重要性,以及开放式沟通对团队的好处。
思考一下:
如何通过改变PLC编程工作流程来提高自动化水平?
相关问答
西门子plc用什么编程?
西门子PLC采用STEP7编程软件,是一款集成开发环境(IDE)工具,它支持多种编程语言,如LAD,FBD,STL,SCL和GRAPH,可满足不同的编程需求。使用STEP7编程软件,...
gxworks2起保停控制编程?
gxworks2具备起保停控制编程功能。GXWorks2是一款可以编写运行在三菱电机可编程控制器上的PLC程序的IDE(集成开发环境)。起保停控制编程是控制器最基本的编...
1t机械硬盘和512固态硬盘做编程够用吗?
其实主要用来编程的话,512G就够用了,如果用来存储各种教程视频,那就不够了,现在的视频太占资源,随便一个视频就好几百兆。编程的话建议内存配置大点,现在I...
step7的编程方式?
Step7可以使用不同的编程方式实现,具体取决于您使用的编程语言和环境。以下是几种可能的编程方式:1.命令行编程:在命令行界面中编写和运行代码。可以使用文...
codesys发展前景大吗?
codesys发展前景是挺大的,因为codesys是一款工业自动化领域的一款开发编程系统,应用领域涉及工厂自动化、汽车自动化、嵌入式自动化、过程自动化和楼宇自动化...
电脑主板上不带plc插槽怎么处理-ZOL问答
plc(PLC)可编程逻辑控制器,是一种采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令,并通过数字或模...
在七彩虹主板bios设置里面怎么设置从光驱启动电脑-ZOL问答
如果在BIOS当中AdvancedBIOSFeatures当中设置FirstBootDevice为CDROM在自检完过后,并不非从光驱(IDE)引导,而是跳过光驱,由下一设备引导。经多番尝试...
求高手讲解一下:要使单片机正常工作,需要具备哪几个条件?
2.2如果是用C写的,就要做一点额外的软件工作了,包括:link文件(把代码放进相应的flash和ram中),启动代码,初始化系统时钟代码,gcc或者IDE环境编译。...2.1...
同样大小固态硬盘好还是机械硬盘好,从各方面来说?
固态硬盘和机械硬盘各有各的好处和坏处。目前主流的方案是固态硬盘搭配机械硬盘使用,固态硬盘做系统盘,机械硬盘做数据存储盘。下面来说下固态硬盘和机械硬盘...
怎么可以让发光二极管灯十秒闪一次?
所以电阻:4.3/0.01=430Ω!程序接好线之后,我们就可以直接在Arduino里面写程序了。打开ArduinoIDE,开始编写程序,有多简单呢。看下图:程序代码如下:...电阻.....