几类常用PLC程序架构研究

参考文献

[1] 西门子. S7-1200 可编程控制器系统手册[M]. V4.4. , 2019.
[2] 西门子. S7200 SMART 可编程控制器系统手册[M]. V2.6. , 2021.
[3] 汇川技术. H5U&Easy系列可编程逻辑控制器编程与应用手册[M]. A08. , 2022.
[4] 台达. ISPSoft软件使用手册[M]. A08. , 2022. 第十版. , 2019.
[5] 王永华. 现代电气控制及PLC应用技术[M]. 第5版. 北京:北京航空航天大学出版社, 2018.

1前言

接触电气编程工作已有一段时间,已经学习和使用了不少品牌的控制器,参加工作后又接触了IEC61131-3标准和codesys平台。想来还是希望写一篇博客,总结PLC的程序架构逻辑,也可帮助读者快速入门新品牌的PLC。

2传统程序架构

实际上应用传统程序架构的PLC已经不多见了,我所接触过的只有信捷XD3;现如今大部分中低端PLC采用的是结合IEC特征的改良版本的传统程序架构,例如西门子S7-200 SMART和三菱FX3U简单梯形图模式等,该改良架构将在后文阐述。

2.1元素

传统程序架构分为一个主程序和若干个子程序,而子程序又分为SBR子程序INT中断子程序;子程序属于可选元素,用于实现模块化设计,而主程序必须存在。

  • 主程序:主程序主体包括控制应用的指令,CPU 将按顺序执行这些指令,每个扫描周期执行一次;
  • SBR子程序:子程序是只有在被主程序调用时才执行的可选元素,适用于封装功能相对独立,需要被重复执行的代码;
  • INT中断子程序:中断子程序不会被主程序调用。中断子程序与一个中断事件相关联,只有在该中断事件发生时,CPU 才会执行中断例程中的指令;常见的中断子程序类型有外部中断、定时中断等;

主程序、子程序的执行逻辑与循环扫描方式如下图所示,主程序通过**调用指令(CALL)启动子程序执行,在子程序执行完毕后,用返回指令(RET)**回到主程序;
在这里插入图片描述
通常支持子程序的数层嵌套:
在这里插入图片描述
注意不要把传统程序架构的子程序和汇编语言中的子程序等同,其最大的区别是前者不支持参数传递,因而仅具备代码封装功能。

2.2评价

传统的 PLC 程序是将所有的程序,包括子程序都写在同一段程序代码当中,故只适合简单系统,难以承担较为复杂的控制任务,否则当程序愈来愈庞大时,对于程序的维护与除错都会是相当大的负担。

3 IEC61131-3程序架构

之前已对标准工业控制编程语言IEC61131-3进行了简述,可参考这篇文章,这里不展开描述。
程序组织单元(Program Organization Unit, POU)与任务(TASK)是 IEC61131-3 中相当重要的编程观念。此二者的最大意义在于让 PLC 的编程由传统的程序撰写提升至项目管理的层次;基于其模块化特性,不同的 POU 亦可进行独立开发,对于人力的分配与项目开发的进行也都能带来显著的效益。

3.1程序组织单元

有别于传统的 PLC 程序,由IEC61131-3 程序架构将原始码按功能或特性分割成若干个小单元,从而提升了程序开发与后续维护的便利性;这些小单元称之为 POU。POU是用户程序中最小的、独立的软件单元,POU之间可以带参数或不带参数地相互调用。POU是模块化程序设计环境下的产物,读者们另一个更为熟悉的名称为块(Blocks)

在IEC61131-3中定义了三种类型的POU,按其功能的递增顺序依次为函数(Function,FUN)、功能块(Function Block,FB)和程序(Program,PROG)

  1. FUN(函数)
    FUN是可以赋予参数但没有静态变量(没有记忆)的POU,因而在函数程序中不能使用和状态相关或多周期执行的指令;当以相同的输入参数调用时,它总是生成相同的结果作为函数输出。常见的FUN有算术运算指令。

函数没有存储器,不存储暂态结果、状态信息或内部数据,故称其无记忆。

  1. FB(功能块)
    FB是可以赋予参数并具有静态变量(有记忆)的POU,当以相同的输入参数调用时,它的输出状态取决于其内部和外部变量的状态,故在同样的输入条件下,可能得到不同的输出结果。常见的FB有定时器和计数器等。与FUN不同,使用功能块时需要将其实例化,这样可使用一个通用 FB 控制多个设备。

  2. PROG(程序)
    PROG代表PLC用户的最高层,即程序,它能存取PLC的IO变量,这些IO变量必须在POU或其上层中予以说明。

POU相互调用的规则为:

  • FUN可以调用FUN;
  • FB可以调用FUN和FB;
  • PROG可以调用FB和FU;
    在这里插入图片描述

3.2FB和FC的参数传递功能

参数传递功能是指,程序可以传递参数给FB/FC,FB/FC也可以返回参数给程序。
FB/FC支持IN、OUT、IN_OUT接口类型,以实现值传递(call-by-value)或引用传递(call-by-reference),见下表:

参数说明
IN输入参数
OUT输出参数
IN_OUT引用参数

3.3任务

程序可以有不同的执行顺序或是启动方式,实现这样的功能由任务(TASK)来完成。任务是程序的调度者,一个任务与一个(或多个)程序相关联(使用关键字WITH),这样就可以使程序进入运行期;未关联任务的程序将不会执行。至于FB和FUN的执行方式,则是依据调用它们的程序而定。
在这里插入图片描述
任务运行方式一般可分为自由运行、周期以及事件。

  • 自由运行(Freewheeling):自由运行任务没有固定持续时间,一个运行周期结束后,任务将在下一个周期中重启;
  • 周期(cyclic): 任务按照设定的周期事件执行。如果某个周期任务设定的周期过短,则该周期任务会在执行完全部关联程序后立即重复执行,而不会执行其它低优先级任务或系统处理;
  • 事件(event):仅在指定的事件发生时执行一次,事件可分为外部中断事件、I/O 中断事件、计数中断事件…等;

3.4传统PLC程序架构与IEC61131-3程序架构区别

传统PLC程序架构在IEC61131-3框架下的实现可参考下表:

传统PLC程序架构IEC61131-3 程序架构
主程序1. 将单一的程序切割为许多独立的程序POU。
2. 将建立的程序单元关联至自由运行/周期性的任务。
一般子程序1. 将子程序建立为功能块。
2. 在其它的程序单元中对建立好的功能块进行调用。
中断子程序1. 为不同的中断程序,分别建立独立的程序POU。
2. 将建立好的程序单元关联至对应的事件任务中。

在这里插入图片描述
可以看到核心变化之一为传统程序架构的单一程序被分解为IEC的多POU+TASK,POU本身不承担运行期逻辑功能。这样做是否合理我无法评价,毕竟像西门子仍保留了组织块的设计。

子程序的执行代码可以由自定义FB(适用于异步执行)或自定义FC(适用于同步执行)承载,FB的优势在于可以生成多实例,可以借助这一特性实现部分面向对象的程序设计。

3.5评价

基于IEC61131-3标准的程序架构无疑是行业发展的方向,且对于复杂的控制任务更为有利,特别是在尝试面向对象的编程思路后,代码的维护难度将大大降低。传统程序架构向IEC程序架构的转变,可以视作OT向IT的转变。

POU的特性与优点可概括为:模块化设计、高独立性、可重用性、可移植性、可维护性、可读性、保密性和高开发效率。

很有意思的一件事是,向来封闭的日本厂商居然是IEC61131-3的忠实拥趸,日本工业标准JIS B 3503即是IEC 61131-3本土化标准;具体来看,读者也可以注意到从FX5U开始三菱在标准化方面所做出的努力;相比之下,大厂西门子则显得墨守成规。

4具有IEC 61131-3部分特征的传统程序架构

很显然传统程序架构已经过时,但是实现IEC 61131-3程序架构又需要较高的成本,所以一些厂家对传统程序架构加以改进,个人把这种改进架构称之为具有IEC 61131-3部分特征的传统程序架构。

  1. FB块补充
    最简单的方式就是在保留主程序+子程序的基础上,加入IEC 61131-3的FB,例如汇川H5U或三菱FX3U 简单梯形图。不过在这种情况下,只能进行简单封装的子程序便显得有些鸡肋了。
  2. 子程序的参数传递
    为子程序增加同FB/FC的参数传递功能,因而可以同汇编语言的子程序靠拢,同时也不会破坏原有架构的设计美感。参考型号如西门子S7-200 SMART。

5西门子 S7-1200/1500 程序架构

西门子S7-1200/1500的程序架构与IEC 61131-3程序架构类似,主要区别在于西门子的组织块和数据块,这应该符合早期的DIN标准(推测为Din 19239),当然现行的DIN61131-3已经完全就是IEC61131-3的德国本土化版本了。尽管如此,考虑到S7-1200/1500的市场保有量,仍然由单独章节列出的必要。

补充一点,就我个人所知,西门子从来没说过S7-1200/1500 程序架构符合IEC61131-3,只说过编程语言符合IEC61131-3,运动控制指令库符合PLCopen。

5.1程序组织单元

  1. 组织块(OB)
    组织块为程序提供结构,CPU 中的特定事件将触发组织块的执行。控制器支持多种类型的OB,常见的几类OB见下。
    ●程序循环 OB :程序循环 OB 在 CPU 处于 RUN 模式时循环执行。
    ●启动 OB:启动 OB 在 CPU 的操作模式从 STOP 切换到 RUN 时执行一次。
    ●延时中断OB:延时中断 OB 在组态的时延后执行。
    ●循环中断 OB:循环中断即定时中断,以指定的时间间隔执行。
    ●硬件中断 OB:硬件中断 OB在发生相关硬件事件时执行。

  2. 功能(FC)
    功能 (FC) 其功能与IEC函数大致相同,不再赘述。FC 不具有相关的背景数据块 (DB),因而不保存临时数据。

  3. 功能块(FB)
    功能块(FB)其功能与IEC功能块大致相同,不再赘述。功能块 (FB) 使用背景数据块保存其参数和静态数据。

  4. 数据块(DB)
    在用户程序中创建数据块 (DB) 以存储代码块的数据。有背景DB和全局DB两种类型的 DB。
    ●全局DB:用户程序中的所有程序块都可访问全局 DB 中的数据。
    ●背景DB:背景 DB 存储特定 FB 的数据。背景 DB 中数据的结构反映了 FB 的参数(Input、Output
    和 InOut)和静态数据,每创建一个FB实例,将自动生成背景DB。(FC 采用了局部数据堆栈。)
    在这里插入图片描述

5.2 S7-1200/1500 程序架构与IEC61131-3程序架构区别

组织块承担了TASK+程序块的功能,因此组织块也有数种类型。
全局DB实际上就是IEC的全局列表。
背景DB在IEC中隐式存在,也就是说监控模式下IEC同样可以实现多实例监控。

5.3评价

从这个角度看来S7-1200/1500 程序架构与IEC61131-3程序架构从更深的含义来讲基本一致,至于很多西门子狂热粉丝觉得IEC架构难用,那纯粹是习惯问题。

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值