PLC Structured Text Object Oriented Programming
PLC结构化文本(ST)——泛型常量(Generic Constatnt)
泛型常量
最近将TwinCAT3
升级到最新版本Build 4026.10
发现一个比较有意思的变量类型,也是TC3.1 Build 4026
新增的一个类型泛型常量(Generic Constatnt)
。其实CODESYS
很早就新增了这个类型,而TwinCAT3
在最新发布的编译器版本上才增加,以至于我近几日才知道存在这个东西。
泛型常量是
VAR_GENERIC CONSTANT
功能块的声明区域,直到分配功能块实例才分配初始化值。
但是这里的泛型后面加了一个CONSTANT
常量,就是限定了泛型只能使用在常量类型上。说到泛型这里解释一下C#
中的概念:
允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。——C# 泛型(Generic)|菜鸟教程
在PLC
中就是我们在写FB
时可以先不去确定常量的值,直到实例化FB
或者继承(EXTENDS)FB
时才指定静态常量的实际值。
官方例程
这里用的是CODESYS
的程序实例,倍福的官方例程写的不太走心,就不作为参考了。
- 实例化
FUNCTION_BLOCK FB_MyString
VAR_GENERIC CONSTANT
maxlen : UDINT := 1;
END_VAR
VAR
test : ARRAY[0..maxlen-1] OF BYTE;
END_VAR
PROGRAM PLC_PRG
VAR CONSTANT
cconst: DINT := 1000;
END_VAR
VAR
fbMyString1 : FB_MyString<100>;
fbMyString2 : FB_MyString<(2 * cconst)>;
arrMyString : ARRAY [0..5] OF FB_MyString<100>;
END_VAR
- 继承
INTERFACE IString
METHOD Append : BOOL
VAR_INPUT
strAppend : IString;
END_VAR
METHOD Assign : BOOL
VAR_INPUT
stringIn: String;
END_VAR
METHOD ToString : STRING
VAR_INPUT
END_VAR
PROPERTY Length : DINT
FUNCTION_BLOCK MyString IMPLEMENTS IString
VAR_GENERIC CONSTANT
maxlen : UDINT;
END_VAR
FUNCTION_BLOCK LongString EXTENDS MyString<1000>
FUNCTION_BLOCK MySpecialString EXTENDS MyString<maxlen2>
VAR_GENERIC CONSTANT
maxlen2 : UDINT:= 1;
END_VAR
METHOD ToLatin1: STRING
PROGRAM PLC_PRG
VAR CONSTANT
cconst: DINT := 1000;
END_VAR
VAR
string1 : MyString<100>;
string2 : MyString<(2 * cconst)>;
derived1 : LongString;
derived2 : MySpecialString<100>;
END_VAR
string1.Assign ('Welt');
string2.Assign ('Hallo ');
string2.Append(string1);
derived2.ToLatin1('Hello World');
- 多个泛型常量
一个FB
可以声明多个泛型常量,在使用时按照声明顺序依次用,
隔开传入参数即可。
FUNCTION_BLOCK FB_MyString
VAR_GENERIC CONSTANT
maxlen1 : UDINT := 1;
maxlen2 : UDINT := 2;
maxlen3 : UDINT := 3;
END_VAR
VAR
test1 : ARRAY[0..maxlen1-1] OF BYTE;
test2 : ARRAY[0..maxlen2-1] OF BYTE;
test3 : ARRAY[0..maxlen3-1] OF BYTE;
END_VAR
PROGRAM PLC_PRG
VAR
fbMyString1 : FB_MyString<100,200,300>;
arrMyString : ARRAY [0..5] OF FB_MyString<100,200,300>;
END_VAR
在IEC61131-3
PLC编程中,目前泛型这个概念只支持常量,相比之下还是C#
语言的泛型好用,可以说不是一个层级的。这样看来从CODESYS
增加泛型概念,隐隐感觉IEC61131-3 PLC ST
有往高级语言发展的趋势。
总结
倍福TwinCAT
平台目前只有TC3.1 Build 4026
支持泛型常量,最后希望各个平台支持更多类型的泛型吧。