Extension and compilation of ST language integrating characteristics of C language

ZHANG Lei, LI Xiang, CHEN Hongjun, YE Liwen, ZENG Kai

Integrated Circuits and Embedded Systems ›› 2024, Vol. 24 ›› Issue (2) : 74-80.

PDF(916 KB)
PDF(916 KB)
Integrated Circuits and Embedded Systems ›› 2024, Vol. 24 ›› Issue (2) : 74-80.
Research Paper

Extension and compilation of ST language integrating characteristics of C language

Author information +
History +

Abstract

In response to the issue that the standard ST language cannot fully adapt to application scenarios such as wind turbine control,the article proposes and implements an extended ST language and its compilation system that integrates the characteristics of C language.The extended ST language integrates general recursive function,function without return value,dynamic array,function block array and calling program into the standard ST language.While fully compatible with the standard ST language,it compensates for the shortcomings of the standard ST language.The compiler system supports lexical analysis,parsing,semantic analysis and cross compilation of extended ST language,and generates executable files that can be recognized by the controller.The expanded ST language and its compilation system can fully adapt to wind power generation control and other application scenarios.After application in practical engineering,it has been shown that the extended ST language can fully support special applications in practical engineering and improve the writing and execution efficiency of control programs.

Key words

ST language / PLC / C langyage

Cite this article

Download Citations
ZHANG Lei , LI Xiang , CHEN Hongjun , YE Liwen , ZENG Kai. Extension and compilation of ST language integrating characteristics of C language[J]. Integrated Circuits and Embedded Systems, 2024, 24(2): 74-80

0 引言

IEC61131-3标准是国际电工委员会公布的关于可编程逻辑控制器(Programmable Logic Controller,简称PLC)编程的国际标准[1],该标准定义了功能块图编程语言(Function Block Diagram,简称FBD)、梯形图编程语言(Ladder Diagram,简称LD)、顺序功能表图编程语言(Sequence Function Chart,简称SFC)、指令表编程语言(Instruction List,简称IL)和结构文本编程语言(Structured Text,简称ST)5种PLC领域的编程语言。其中,ST语言是一种面向过程的文本编程语言[2],具有灵活度高、数据类型丰富和程序设计自由度大等特点[3]。但是,ST语言也存在不支持递归函数、不支持无返回值函数、函数返回方式不灵活、不支持动态数组、不支持功能块数组和不支持调用程序等问题。这些问题使得ST语言无法完全适应风力发电场风机控制场景以及其他一些应用场合。
许多学者针对ST语言的编译过程进行了大量研究,取得了丰富的成果。Vladimir等人对ST语言进行了扩展,增加了STATE、PROCESS、NEXT和STOP等关键字[4],使得ST语言更加适合处理时序逻辑。Fischer等人和Neumann等人分别从不同角度对面向过程的ST代码和面向对象的ST代码的复杂性进行了度量[5-6]。Jnanamurthy等人和Rosiak等人分别提出了不同的用于度量两段ST代码相似性的方法[7-8]。Birgit提出了一种用于对ST代码成熟度进行衡量的方法,用于发现ST代码的潜在漏洞与代码质量问题[9]。Koziolek等人提出了一种基于规则的ST代码自动生成方法[10],该方法可以根据设计图纸和一种形式化的描述语言自动生成ST代码。Aljosha等人提出了一种自动生成ST代码语义能力模型的方法[11],能够在一定程度上对ST代码进行语义层面的错误检查。Florian等人提出了一种针对IEC61131-3标准的代码自动化测试方法[12]。He等人提出了一种基于控制流图的ST代码自动测试方法[13]。Marcel等人提出了一种针对IEC61131-3标准语言的代码复用判断标准与方法[14]。An等人提出了一种基于语义的ST代码移植方法,该方法支持ST代码在不同的集成开发环境之间的移植[15]。Xia等人、Xiong等人以及Ruggero等人分别提出了不同的ST代码运行时检查方法,这些方法通过LTL或其变种的形式化表达对ST代码输出的正确性与合法性进行检查[16-18]。Chen等人提出了一种基于神经网络的防止PLC内可执行程序被篡改的方法[19],该方法首先使用PLC的关键输入与输出对神经网络进行训练,在进行防篡改防护时,将PLC的关键输入发送到神经网络中,然后将神经网络的输出与PLC的输出进行比较,从而达到防止PLC中的可执行程序被非法修改的目的。Zhong等人使用ST语言在PLC内实现了一个用于条形码识别的机器视觉模块[20]。Wang等人提出了一种基于K-Framework的ST代码语义检查方法[21]
针对ST语言存在的上述问题,本文对ST语言进行扩展,将C语言的一些特性融入ST语言中,使得ST语言能够更加灵活与易用,并能完全适应风机控制等应用场景。

1 扩展设计

1.1 函数返回

根据IEC61131-3标准,当ST函数需要返回时,通过将返回值写入函数名来实现,并且ST不支持无返回值的函数,如算法1所示。算法1定义了一个名为ADD3的函数,该函数有4个输入参数,前3个参数的类型为REAL,第4个参数的类型为BOOL,该函数的返回值类型为REAL。当函数需要返回时,对函数名进行赋值并返回,如第g行~第h行及第j行~第k行所示。
算法1 带有返回值的标准ST函数
输入:3个单精度浮点数。
输出:3个单精度浮点数相加结果。
a) FUNCTION ADD3 : REAL
b) VAR_INPUT
c) X, Y, Z : REAL;
d) F : BOOL;
e) END_VAR
f) IF F=FALSE THEN
g) ADD3 := -1;
h) RETURN;
i) END_IF
j) ADD3 := X+Y+Z;
k) RETURN;
l) END_FUNCTION
这样的函数返回方式与C及Java语言的返回方式存在一定的差异,并且无法支持无返回值的函数。本文对ST函数的返回方式进行扩展,支持C风格的函数返回方式,支持无返回值的函数。扩展后具有返回值的函数定义如算法2所示,扩展后的函数增加了VAR_RETURN字段,在该字段内定义的变量类型必须与函数返回类型一致,并且,扩展后的函数允许RETURN语句带有返回变量。
算法2 带有返回值的扩展ST函数
输入:3个单精度浮点数。
输出:3个单精度浮点数相加结果。
a) FUNCTION ADD3 : REAL
b) VAR_INPUT
c) X, Y, Z : REAL;
d) END_VAR
e) VAR_RETURN
f) OUT : REAL;
g) END_VAR
h) OUT : = X+Y+Z;
i) RETURN OUT;
j) END_FUNCTION
扩展后无返回值的函数定义如算法3所示,第a行中函数返回类型为VOID,表示该函数无返回值。
算法3 无返回值的扩展ST函数
输入:3个单精度浮点数。
输出:无。
a) FUNCTION ADD3 : VOID
b) VAR_INPUT
c) X, Y, Z : REAL;
d) END_VAR
h) X := X+Y+Z;
i) RETURN;
j) END_FUNCTION

1.2 递归函数

在解决一些循环问题时,递归函数可以使得代码的逻辑更加清晰。本文对ST函数的调用方式进行扩展,增加对递归函数的支持,如算法4所示。算法4定义了一个阶乘函数,该函数具有一个输入参数N和一个返回参数V。函数的第l行进行了递归调用。
算法4 递归函数
输入:32位整型数N。
输出:整型数N的阶乘结果。
a) FUNCTION FACTORIAL : DINT
b) VAR_INPUT
c) N : DINT;
e) END_VAR
f) VAR_RETURN
g) V : LINT;
h) END_VAR
i) IF N=0 THEN
j) V := 1;
k) ELSE
l) V := FACTORIAL(N-1)*N;
m) END_IF
n) RETURN V;
o) END_FUNCTION

1.3 动态数组

嵌入式系统的内存往往是十分宝贵的,使用动态数组可以节省内存空间,达到高效使用内存的目的。IEC61131-3标准仅支持静态数组,当无法确定数组的大小时,编程人员只能根据数组元素个数的最大可能值预先定义静态数组,但这样会造成内存空间的浪费。本文对ST数组定义方式进行扩展,增加对动态数组的支持,如算法5所示。算法5代码的第h行使用NEW操作符构造了一个大小为N的动态数组。
算法5 动态数组
输入:数组元素个数N。
输出:动态数组指针。
a) FUNCTION Demo : REAL
b) VAR_INPUT
c) N : DINT;
d) END_VAR
e) VAR_RETURN
f) OUT : REF_TO DINT;
g) END_VAR
h) OUT := NEW DINT[N]L
i) RETURN OUT;
j) END_FUNCTION

1.4 功能块数组

功能块数组是元素均为功能块的数组。在一些场景中,会使用直接访问数组元素的方式调用功能块。本文对ST功能块的调用方式进行扩展,支持直接使用功能块数组元素调用功能块,如算法6中代码的第g行所示。
算法6 功能块数组元素直接调用
输入:无。
输出:无。
a) PROGRAM Demo
b) VAR
c) ARR : ARRAY[0..9] OF TON;
d) M : DINT;
e) END_VAR
f) FOR M:=0 TO 9 BY 1 DO
g) ARR[M](TRUE, T#100ms);
h) END_FOR
i) END_PROGRAM

1.5 调用程序

在IEC61131-3标准中,程序、功能块和函数统称为程序组织单元。其中,程序是顶层的程序组织单元,定义在关键字PROGRAM和END_PROGTAM之间。程序构成了用户主程序,函数和功能块构成了用户子程序。也就是说,程序仅能调用函数和功能块,而不能调用其他的程序[22]。在实际工程中,由于代码分层设计等,存在程序调用其他程序的代码编写方式。本文对ST语言的调用语句进行扩展,支持程序调用其他程序,如算法7所示。
算法7代码的第1行到第10行定义了程序ADD2,该程序用于将两个数相加。在第n行与第o行,程序Main调用了程序ADD2,并将程序ADD2的计算结果赋给变量OUT。
算法7 调用PROGRAM
输入:无。
输出:无。
a) PROGRAM ADD2
b) VAR_EXTERNAL
c) X, Y : DINT;
d) END_VAR
e) VAR_OUTPUT
f) Z : DINT;
g) END_VAR
h) Z := X+Y;
i) END_PROGRAM
j) PROGRAM Main
k) VAR
l) OUT : DINT;
m) END_VAR
n) ADD2();
o) OUT := ADD2.Z;
p) END_PROGRAM

2 扩展ST代码的编译

扩展之后的ST代码被编译生成为可执行程序之后才能被控制器识别与运行[23],编译过程如图1所示。首先,需要对标准ST语言的文法进行扩展,得到扩展文法。其次,flex-bison框架依据扩展文法对扩展ST代码进行词法分析与语法分析,生成初态语法树。初态语法树再经过语义分析被转为语法与语义均正确的终态语法树。然后,终态语法树被转换模块转为C代码。最后,由交叉编译器将C代码编译为可执行文件,供控制器识别与执行。
Fig. 1 Compilation of extended ST source code

图1 扩展ST源代码的编译

Full size|PPT slide

2.1 文法扩展

针对第1节的几处扩展,标准ST语言的文法也需要进行相应的扩展与修改。本文采用flex-bison框架作为ST语言编译的前端工具,按照bison的文法格式对函数返回方式、递归函数、动态数组、功能块数组和调用程序等文法规则进行修改。
函数定义的文法增加了对VOID关键字的解析,以便能够支持无返回值的函数,如function文法的第二条规则所示。
function:
FUNCTION identifier ˈ:ˈ type fcontent END_FUNCTION
|FUNCTION identifier ˈ:ˈ VOID fcontent END_FUNCTION
;
函数返回语句的文法增加了识别RETURN关键字之后带有变量的语句,如return_statement文法的第二条规则所示。
return_statement:
RETURN ˈ;ˈ
|RETURN variable ˈ;ˈ
;
赋值语句的文法增加对动态数组相关的NEW与DELETE[]操作符的识别,并且支持NEW操作符与DELETE[]操作符的语法规则。assignment_statement文法新增的规则与新增的delete_statement文法规则如下:
assignment_statement:
......
|ref_variable ˈ:=ˈ NEW type ˈ[ˈ variable ˈ]ˈ ˈ;ˈ
|ref_variable ˈ:=ˈ NEW type ˈ[ˈ integer ˈ]ˈ ˈ;ˈ
;
delete_statement:
DELETE[] ref_variable ˈ;ˈ
|......
;
在原有功能块调用语句文法规则基础上,增加如下两条功能块数组调用规则(两条新规则分别支持使用整型字面量与整型变量访问功能块数组内的元素,并支持直接调用数组内的功能块):
fb_invocation:
......
|arr_varaible ˈ[ˈ integer ˈ]ˈ ˈ(ˈ param_list ˈ)ˈ ˈ;ˈ
|arr_varaible ˈ[ˈ variable ˈ]ˈ ˈ(ˈ param_list ˈ)ˈ ˈ;ˈ
;
新增program_invocation文法规则,以便支持程序调用语句。在该规则中,pre_defined_program_name表示已经定义的程序名。
program_invocation:
pre_defined_program_name ˈ(ˈ ˈ)ˈ
;

2.2 语义分析

语法的正确并不能保证语义的正确[24],例如,自然语言中“羊捕食老虎”这句话符合中文语法的主谓宾结构,但却存在着语义错误。对编程语言而言,在词法与文法分析之后,需要进一步对生成的初态语法树进行语义分析,进而获得语法与语义均正确的终态语法树。与语法分析相比,语义分析更加复杂繁琐,检查项较多[25-26]
对于本文的ST扩展而言,需要进行变量存在性检查和数组下标类型检查等。具体而言,需要检查RETURN语句之后的变量是否为真实存在的并且已经在VAR_RETURN段内定义的变量;当函数的返回值为VOID时,RETURN语句之后不允许带有返回变量;NEW操作符之后的初始化大小变量必须是整型变量;功能块形参与实参的类型与个数应该一一对应匹配, 还包括其他方面的检查与分析。
语义分析完成之后,生成语法与语义均正确的终态语法树。一个可能的终态语法树的部分结构如下:
<function>
<name identifier="Demo0"/>
<return_type identifier="VOID"/>
<var_list>...</var_list>
<statement_list>
...
<return_stmt/>
</statement_list>
</function>
<program>
<name identifier="Demo1">
<var_list>...</var_list>
<statement_list>
<assign_stmt>
<lexp>
<var identifier="ref_var"/>
</lexp>
<rexp>
<op identifier="NEW"/>
<type identifier="DINT"/>
<subscript value="10"/>
</rexp>
</assign_stmt>
</statement_list>
</program>

2.3 转为C代码

语法分析与语义分析完成之后,转换模块需要将终态语法树转为C代码,供交叉编译器使用。转换模块采用访问者-观察者模式进行设计[27],依次遍历终态语法树的每个节点,并结合每个节点的上下文节点信息将该节点转为C代码。以函数递归为例,转换后的一段C代码如下:
算法8 递归阶乘函数
输入:32位整型数N。
输出:整型数N的阶乘结果。
a) IEC_DINT FACTORIAL(IEC_DINT N)
b) {
c) IEC_DINT V=0;
d) if(N == 0)
e) V = 1;
f) else
g) V = FACTORIAL(N-1)*N;
h) return V;
i) }

3 系统实现

控制器运行嵌入式Linux操作系统,编译集成开发环境(Integrated Development Environment,简称IDE)采用C++语言编写,可以运行于Windows操作系统与Linux操作系统。某实际风电控制程序使用本IDE编写,如图2所示。
Fig. 2 Function block array debugging

图2 功能块数组调试

Full size|PPT slide

其中,DeviceStatus为功能块,保存各设备的工作状态代码,并根据工作状态代码得出设备是否处于正常状态(工作状态代码∈[21,255]时,为正常状态);DevSta为功能块数组,数组的每个元素均为DeviceStatus类型。在单步调试模式下,对DevSta的调用进行监视;对DevSta的每个功能块元素,初始化赋工作状态代码为0,功能块元素返回-1。即采用功能块数组的直接调用方式,程序能够根据设备的工作状态代码返回设备是否处于正常状态。

4 结语

本文对标准ST语言中存在的无法完全适应风力发电场风机控制等应用场景问题,提出并实现了一种扩展ST语言及其编译系统。扩展ST语言将无返回值的函数、递归函数、动态数组、功能块数组和调用程序等C语言的特性引入到标准ST语言内;编译系统支持对扩展ST语言的编译并生成控制器能够识别的可执行文件。在实际工程中的应用结果表明,扩展ST语言能够完全适用于风力发电场风机控制以及其他一些应用场景,并能提高控制程序的编写及执行效率。

References

[1]
LARSON K. RTU Features IEC61131-3 Programming[J]. Control, 2021, 34(1):46-49.
[2]
VOGEL-HEUSER B, FISCHER J, HESS D, et al. Managing Variability and Reuse of Extra-functional Control Software in CPPS[C]// Design,Automation and Test in Europe Conference and Exhibition, 2021:755-760.
[3]
TM ANTONSEN. PLC Controls with Structured Text (ST),V3:IEC 61131-3 and best practice ST-programming[M]. Books On Demand, 2020.
[4]
VLADIMIR E Z, ANDREI S R, IGOR S A, et al. poST:A Process-Oriented Extension of the IEC61131-3 Structured Text Language[J]. IEEE Access, 2022(10):35238-35250.
[5]
FISCHER J, VOGEL-HEUSER B, HABEN F, et al. Reengineering Workflow for Planned Reuse of IEC 61131-3 Legacy Software[C]// 2020 IEEE International Conference on Industrial Engineering and Engineering Management.IEEE, 2020:1126-1130.
[6]
NEUMANN E M, VOGEL-HEUSER B, FISCHER J, et al. Identifying Runtime Issues in Object-Oriented IEC 61131-3-Compliant Control Software using Metrics[C]//IECON 2020-46th Annual Conference of the IEEE Industrial Electronics Society.IEEE, 2020.
[7]
JNANAMURTHY, H K JETLEY, RAOUL HENSKENS, et al. Multi-level analysis of IEC 61131-3 languages to detect clones[J]. International Journal of Computer Applications in Technology, 2020, 63(4):64-77.
[8]
ROSIAK K, SCHLIE A, LINSBAUER L, et al. Custom-Tailored Clone Detection for IEC 61131-3 Programming Languages[J]. Journal of Systems and Software, 2021.
[9]
BIRGIT V H, EVA-MARIA N, JULIANE F. MICOSE4aPS: Industrially Applicable Maturity Metric to Improve Systematic Reuse of Control Software[J]. ACM Transactions on Software Engineering and Methodology, 2021, 31(1).
[10]
KOZIOLEK H, BURGER A, PLATENIUS-MOHR M, et al. Rule-based code generation in industrial automation: four large-scale case studies applying the CAYENNE method[C]//ICSE '20:42nd International Conference on Software Engineering, 2020.
[11]
ALJOSHA K, TOM J, ALEXANDER F. A Method to Automatically Generate Semantic Skill Models from PLC Code[C]//IECON 2021 - 47th Annual Conference of the IEEE Industrial Electronics Society. IEEE, 2021.
[12]
FLORIAN H, BARBARA R. IEC 61131-3 Software Testing:A Portable Solution for Native Applications[J]. IEEE Transactions on Industrial Informatics, 2020, 16(6):3942-3951.
[13]
HE W, SHI J, SU T, et al. Automated test generation for IEC 61131-3 ST programs via dynamic symbolic execution[J]. Science of Computer Programming, 2021, 206(1).
[14]
MARCEL C W, KLAUS S. From IEC 61131-3 Function Block Diagrams to Sequentially Constructive Statecharts[C]//2022 Forum on Specification & Design Languages, 2022.
[15]
AN Y, QIN F W, CHEN B, et al. Onto PLC:Semantic Model of PLC Programs for Code Exchange and Software Reuse[J]. IEEE Transactions on Industrial Informatics, 2020(99).
[16]
XIA M, XIN L, YAN H H, et al. Programmable Logic Controllers Past Linear Temporal Logic for Monitoring Applications in Industrial Control Systems[J]. IEEE Transactions on Industrial Informatics, 2022, 18(7):4393-4405.
[17]
XIONG J W, BU X X, HUANG Y H, et al. Safety Verification of IEC 61131-3 Structured Text Programs[J]. IEEE Transactions on Industrial Informatics, 2021, 17(4):2632-2640.
[18]
RUGGERO L, MASSIMO M, ANDREI M. Industrial Control Systems Security via Runtime Enforcement[J]. ACM Transactions on Privacy and Security, 2022, 26(1).
[19]
CHEN Y, POSKITT C M, SUN J. Code Integrity Attestation for PLCs using Black Box Neural Network Predictions[C]// 29th ACM Joint European Software Engineering Conference and Symposium on the Foundations of Software Engineering, 2021.
[20]
ZHONG C, DONG X, SUN H, et al. Research on Function Block Programmable Technology of Machine Vision[J]. Journal of Physics:Conference Series, 2020,1570.
[21]
WANG K, WANG J, Poskitt C M, et al. K-ST:A Formal Executable Semantics of PLC Structured Text Language[J]. IEEE Transactions on Software Engineering, 2022(2).
[22]
IEC61131-3,Programmable controllers-Part 3:Programming languages[S]. United States of America: International Electrotechnical Commission, 2022.
[23]
BASHEV V, ANUREEV I, ZYUBIN V. The Post Language:Process-Oriented Extension for IEC 61131-3 Structured Text[C]//2020 International Russian Automation Conference, 2020.
[24]
GROOTE J F, MOREL R, SCHMALTZ J, et al. Logic Gates,Circuits,Processors,Compilers and Computers[M].Springer Cham, 2021.
[25]
BACELAR ALMEIDA J C, BARBOSA M, BARTHE G, et al. A formal treatment of the role of verified compilers in secure computation[J]. The journal of logical and algebraic methods in programming, 2022, 125(2):100736-100757.
[26]
李学良, 赵千川, 杨文, 等. PLC指令表程序的一种语法分析方法及其在代码静态测试上的应用[J]. 清华大学学报(自然科学版), 2021, 61(10):1159-1165.
LI X L, ZHAO Q CH, YANG W, et al. A syntax analysis method for PLC instruction table programs and its application in static code testing[J]. Journal of Tsinghua University(Science and Technology), 2021, 61(10):1159-1165 (in Chinese).
[27]
KOLP M, WAUTELET Y, HENG S. Design Patterns for Social Intelligent Agent Architectures Implementation[M].IGI Global, 2021.
PDF(916 KB)

134

Accesses

0

Citation

Detail

Sections
Recommended

/