PLC结构化文本(ST)——泛型常量(Generic Constatnt)

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-3PLC编程中,目前泛型这个概念只支持常量,相比之下还是C#语言的泛型好用,可以说不是一个层级的。这样看来从CODESYS增加泛型概念,隐隐感觉IEC61131-3 PLC ST有往高级语言发展的趋势。

总结

倍福TwinCAT平台目前只有TC3.1 Build 4026支持泛型常量,最后希望各个平台支持更多类型的泛型吧。

posted @ 2024-09-18 14:33  J_Sheng  阅读(607)  评论(0)    收藏  举报