IEC61131-3基础(TwinCAT3项目+ST语言)

概念

其实在理解了 IEC61131 这个标准后我们知道其实 3 这个子集就是关于 PLC 编程语言的标准。该部分明确了 PLC 的编程语言、语法、程序结构、数据类型、指令、函数等关于编程的方面。

这个软件模型很重要,给出了我们编码和设计程序的思路:

关于 twincat3 的一些细节可以看倍福官方的这个视频,这对了解 TwinCAT 基本组成十分重要:基础知识-TwinCAT3 概览_哔哩哔哩_bilibili,这个视频后面也有 ST 语言的讲解。

按我自己的理解总结一下 TwinCAT3,底层多种语言、结构混合编程,然后通过链接的方式将变量与变量,变量与物理参数链接后进行控制。

编程语言分类

IEC 61131-3 标准中,规定了 5 种常用的 PLC 编程语言:IL、ST、LD、FBD、SFC。其中由 3 种图形语言:梯形图(LAD)功能块图(FBD)顺序功能图(SFC);两种文本语言:结构化文本(ST)指令表(IL)

对于一上来就看见这个的一定很懵逼,以为标准就规定一下用什么语言,哪一上来说规定了 5 个语言,而我们到底要学哪个语言?

其实这个具体要看我们用的什么 PLC 不同的 PLC 对语言的支持是不一样的,早期的 PLC 主要支持两种编程语言:梯形图(LD)和指令表(IL)。

  • 指令表(IL – Instruction List):IL 是一种低级的、类似于汇编语言的编程语言,它支持基于累加器的编程,并且支持 IEC 61131-3 操作符以及多输入/多输出、取反、注释、输出的设置/重置和无条件/有条件跳转。IL 语言简单易学,非常容易实现,不用编译就可以下载到 PLC,但它对大型的复杂控制问题缺少有效的工具,因此,在大型复杂的控制问题中,通常不采用 IL 编程语言。
  • 梯形图(LD – Ladder Diagram):LD 是 PLC 首先采用的编程语言,也是最普遍采用的编程语言。它从继电器控制系统原理图的基础上演变而来,与继电器控制系统梯形图的基本思想一致。LD 语言直观、易于理解,非常适合电气技术人员使用,适用于从简单到中等复杂的应用场景,如制造业、汽车行业和过程控制。
  • 结构化文本(ST – Structured Text):ST 是一种高级的文本编程语言,类似于 Pascal 或 C 语言,它适用于执行复杂的计算、数据操作和控制逻辑任务。ST 语言的特点是指令更简单、可实现更复杂算法、程序结构更紧凑、可读性更强、跨平台复制粘贴、程序更难破解。ST 语言在工业自动化领域越来越受欢迎,尤其是在需要复杂数据处理和算法实现的应用中。
  • 功能块图(FBD – Function Block Diagram):FBD 采用类似于数字逻辑门电路的图形符号,逻辑直观,使用方便。FBD 以功能模块为单位,从控制功能入手,使控制方案的分析和理解变得容易。它适用于控制规模较大、控制关系较复杂的系统,可以缩短编程和组态时间,减少调试时间。FBD 在食品和饮料、包装、水处理等行业中广泛采用,特别适合需要代码可重用性和模块化的应用。
  • 顺序功能图(SFC – Sequential Function Chart):SFC 是一种图形化的功能性说明语言,专用于描述工业顺序控制程序。SFC 以功能为主线,条理清楚,便于对程序操作的理解和沟通。它适用于大型程序,可分工设计,采用较为灵活的程序结构,可节省程序设计时间和调试时间。SFC 在石油和天然气、化工加工、汽车装配线等行业中广泛使用,特别适合需要顺序控制和复杂状态转换的应用。

我们其实是将我们的 PC 去实现 PLC 的功能,而其的软件基础是使用 TwinCAT3,他对 5 种编程语言支持都很好,我们为了快速过渡到一些基本的使用,相信看这个的你也是电脑编程或者嵌入式软件相关,所以我们易学的也就是 ST 语言,至于 IL 语言这种类似汇编的编写太困难,学习成本较高,可以根据自己兴趣看看。

更详细测理解看一看 PLC 编程的 5 种电气语言简介

软件模型

这个应该作为开始学习我们 ST 语言的一个前置了解项,程序是以什么样的组织架构的,就像编程至少要知道入口函数在哪里是吧。

我在这里再做一个简单的总结:

  1. 配置(Configuration)

他其实就是整个系统的整合,说形象一点,比如我一个 PC 做为控制系统,下面挂了几个 PLC 或者我用 CPU 的一个核来虚拟了几个出来或者一些分布式架构,然后将这些统一管理。

  1. 资源(Resource)

资源就是配置的下一层,像一个 PLC 或者 CPU 的一个核这种。

  1. 任务(Task)

任务是程序的调度者,用来执行一个或多个程序。这个把他理解成一个进程,下面可以有很多线程就对了。只不过这些进程有分类,有些有执行条件这些。(甚至一个任务里面可以就是一个功能块,其他任务的程序调用功能块的时候就被分配到了另一个任务上面执行,比如这种操作可以让前面的代码优先级比较高,然后到执行到这里的时候优先级低一点)

  1. 程序组织单元(Program Organization Unit,POU),TwinCAT 中能明显看到该部分

程序组织单元是用户程序的基本单元,包括变量声明区和代码区两部分。变量声明区用来定义 POU 中使用的变量的名称、类型及初始值;代码区是使用 IEC61131-3 推荐的五种编程语言写的程序代码。

IEC61131-3 定义了三种程序组织单元:功能(Function)、功能块(Function Block)和程序(Program)

功能(Function)是包含局部变量和指令的代码,可以设置输入/输出参数,局部变量非静态。可以把他看成一个只用局部变量的有输入有输出的函数,注意输出只能有一个。同样输入对应确定输出。

功能块(Function Block)与功能的区别在于它由属于自己的存储区,局部变量是静态的。就等于能用静态变量的函数(下次调用时这个变量不会被清除,能保留上次运行的过程数据),比如定时器和计数器等。因为有静态变量,静态变量可能会随着运行次数不同在过程中被改变,所以同样输入有不同输出。

注意:ST 语言在第三版中引入了临时变量和静态变量的关键字 VAR_TEMP、VAR_STAT,所以可以说现在只是默认的情况下变量的特性

程序(Program)可以分为主程序与子程序,可以被任务启动,并调用功能或者功能块。一个程序可由多个部分组成,而每个部分所使用的编程语言不一定是相同的。(比如主程序用 ST,子程序用 SFC 这种)

  • POU 不允许递归调用(无法直接或间接调用自身)
  • program 可以调用 other program、function block 和 function,但不允许反向调用
  • function block 可以调用 function block,并且 function block 可以调用 function
  • function 可以调用 function

因为代码区和申明区分离,请注意,PLC 程序组织单元(POUs)、数据单元类型(DUTs)、全局变量列表(GVLs)以及可视化(VISUs)。

  1. 全局变量、访问路径

全局变量用于程序组织单元之间交互数据,访问路径提供了当前配置对外通信的接口。(用来和其他模块链接)

ST 语言

面向过程

这个就是一门编程语言,按照自己学习编程语言的习惯去学习就行了,这里摆一下前人学习的资料和一些比较好的视频:

入门-0、TC3 IEC61131-3 编程入门_哔哩哔哩_bilibili

如果熟悉 C 与 C++ 语言,学习这个语言将会特别快。

面向对象

如果你看完前人写的文档,我相信已经能按照面向过程的逻辑写一套完整的程序了,上面的教程也到此为止。

在 IEC 61131-3 的第三版(2011 年发布)中,正式引入了面向对象编程的概念,这包括了类(Classes)、接口(Interfaces)、方法(Methods)、继承(Inheritance)、属性(Properties)以及关键字如 THIS 和 SUPER 等。这些特性允许开发者在 PLC 编程中使用面向对象的方法,提高了代码的重用性、模块化和可维护性。

这里我也接着前人的思路继续将 ST 语言的面向对象学完。精通-1 TC3 面向对象编程入门_哔哩哔哩_bilibili

在倍福官网中明确表明了 FB 功能块和类的概念是有部分等价性的!

来源:Beckhoff Information System – English

关键词

  • METHOD:方法,带自定义变量的 FB action(FB action 的结构已经很像方法了,就是在 FB 下面的代码块,之所以不能叫函数因为没有输入输出变量)。
  • EXTENDS:继承,获得继承对象的方法,变量,属性等。继承的对象可以是 FB 或结构类型变量。
  • THIS:一种指针,引用当前功能块的方法、变量或属性。
  • SUPER:一种指针,引用父类功能块的方法、变量或属性。
  • INTERFACE:接口,一种复杂的结构类型,包含变量,方法,属性。(类似于没有代码的 FB)
  • IMPLEMENTS in the FB:实现,功能块引用一个指定的接口类型。
  • PROPERTY:属性,使用 Set/Get 方法来访问变量的一种方式。

METHOD:方法

其实就是我们 C++ 中常说的方法,有独立的输入变量,输出变量和输入输出变量,可以访问所属的 FB 中的变量。在里面定义的变量默认都是临时变量。

PROPERTY:属性

其实他是提供了一个接口去访问 FB 内部的值,他比较不同的地方在于他内部是提供了 Get 和 Set 方法来进行读取和写入。要是 FB 里面值很多,或者不希望每次都去寻找。可以去定义一个属性,在 Get 和 Set 中去实现,将内部变量的值等于到属性上,或者将属性的值赋给一个内部变量和更多的其他操作。

Get 和 Set 方法不需要单独去调用,而是在赋值和读取的时候自动会调用这两个方法。

虽然通过 FB 加.的方式也可以读取一部分 FB 的内部变量,但是这样实现的代码能保证遵循面向对象的思路。

EXTENDS:继承

继承的对象可以是 FB 或结构类型变量。

如果是结构体,子结构体将会继承父结构体的所有变量。如果是 FB,子 FB 将会继承父 FB 的所有变量、属性和方法。

和 C++ 一样,子 FB 可以重写父 FB 的方法,但是需要注意子 FB 重载的方法中返回值的类型必须是一样的,而局部变量可以随意更改。并且子 FB 会以重写的方法为准。

THIS 和 SUPER 指针

一个引用当前功能块的方法、变量或属性,一个引用父类功能块的方法、变量或属性。每一个功能块都有 THIS 和 SUPER 指针,但是最上层的 SUPER 指针是没有结果的,写上去后会有提示。

INTERFACE:接口 和 IMPLEMENTS:实现

接口包含变量、方法和属性。但是他只是声明,没有实际的代码,只有输入输出和输入输出变量,没有内部变量

实现就是声明一个新功能块去引用一个指定的接口类型。

其主要用法在于假设你想在不同情况下使用不同的 FB,你就可以通过接口的方法。在不同的情况下,让接口等于不同的功能块,然后你后面的程序都通过接口去写就行了。如图:

接口是一个指针,一定要注意,用它必须要赋值。

上一篇
下一篇