PLC结构化文本(ST)——构造函数(FB_init)

PLC Structured Text Object Oriented Programming

PLC结构化文本(ST)——构造函数(FB_init)

构造函数的作用

简单来说,构造函数是一种方法,用来初始化类的实例也就是对象。类在创建时会有一个默认的构造函数,如果自定义一个构造函数,那么默认构造函数失效。

与高级语言的区别

高级语言C#、Java和C++都有构造函数这个概念,那么IEC61131-3有没有这个特殊的方法呢?当然是有的,只不过ST的构造函数与高级语言稍有不同。

  • 1.高级语言比如C#Java,它们的构造函数方法名与类名相同,而在IEC61131-3 ST中所有PRG和FB的构造函数名均为FB_init
  • 2.C#和Java的默认构造函数是无参的,PLC ST中的默认构造函数有两个参数。
METHOD FB_init : BOOL
VAR_INPUT
	bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
	bInCopyCode : BOOL;  // if TRUE, the instance afterwards gets moved into the copy code (online change)
END_VAR

添加构造函数

CODESYS源生平台或二次开发平台为例:

  • 1.在PRG或者FB程序块上右键--->添加--->Method--->名称(右侧下拉框)--->选择FB_init--->Open。
  • 2.在PRG或者FB程序块上右键--->添加--->Method--->名称--->直接输入FB_init--->Open。
    上述两种方法均可以,个人建议选择第一种方法较好,防止编译器抽风

使用构造函数

创建Dog类

FUNCTION_BLOCK FB_Dog
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
	name : STRING;
END_VAR

自定义构造函数

METHOD FB_init : BOOL
VAR_INPUT
	bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
	bInCopyCode : BOOL;  // if TRUE, the instance afterwards gets moved into the copy code (online change)
	sname	: STRING; // 初始化名字
END_VAR
----------------------------------------------
THIS^.name := sname;

主程序调用

PROGRAM MAIN
VAR
	dog : FB_Dog('laifu'); // 初始化dog name 来福
END_VAR

激活下载,程序初始化时自动调用(隐式调用)FB_init,无需手动调用(显式调用)。
自定义构造函数中增加了一个参数,所以在声明FB变量时必须给出对应参数,否则编译不通过。
系统只有在每次初始化FB时自动调用一次,后续周期不再继续调用执行。

Tips : FB_init可以隐式调用也可以显式调用,但是在显式调用时需要补全输入参数。

dog.FB_init(bInCopyCode := TRUE,bInitRetains :=TRUE ,sname := 'laifu');

因此,一般在变量声明区初始化输入参数,很少直接调用构造函数。

总结

构造函数主要用来初始化对象,一般不会将它暴露在PLC扫描周期内循环执行,要是这样与普通Method有什么区别。建议使用之前先去学习高级语言C#和Java的使用方法,宁可不用也不滥用