Skip to main content

变量: VAR_GENERIC CONSTANT

通用常量变量

泛型常量是中的一个变量 VAR_GENERIC CONSTANT 功能块的范围。该变量仅在声明函数块实例时定义。

允许在方法中使用泛型常量。这在以下情况下可能特别有用 VAR_IN_OUT 或者 VAR_IN_OUT CONSTANT 范围。

类型声明的语法

带有泛型常量的函数块类型声明的语法

FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
    <generic constant name> : <integer data type> := <initial value> ; //Initial value will be overwritten
END_VAR

<function block name>

功能块的名称

VAR_GENERIC CONSTANT

END_VAR

泛型常量的范围

你可以在中声明任意数量的泛型常量 VAR_GENERIC CONSTANT 范围。

<generic constant name>

泛型常量的变量名

: <integer data type>

构造哪些类型的泛型常量。

允许使用整数数据类型或整数数据类型的子范围。

示例:

maxlen1 : INT := 4;

maxlen2 : INT(5..10) := 5;

:= <initial value>

可选

初始化

重要

编译检查才需要初始值。在运行时,该值被覆盖

通用常量可以在功能块的实现中照常使用。例如,这些常量可用于数组的索引或字符串的长度

变量声明的语法

具有指定常量的变量声明(函数块的实例化)的语法

以下选项是可能的:

PROGRAM <program name>
VAR
    <fb instance name> : <function block name> < <literal> > ;
    <fb instance name> : <function block name> <( <expression> )> ;
    <fb instance name> : ARRAY [ <index start > .. <index end> ] OF <function block name> < <array length> > ;
END_VAR
9. 变量声明

<scope>

END_...

范围

<fb instance name>

变量;功能块实例的名称

: <function block name>

使用功能块键入变量

这是一个带有泛型常量的功能块。

< <literal> >

可选

数据类型分配一个特定的值,该值仅对该功能块实例有效。该值已正式插入 in angle brackets 作为数据类型的后缀。

示例: fbMyString1 : FB_MyString<100&>;

如果 多个 已经为类型定义功能块声明了泛型常量,然后在尖括号中传递了一个以逗号分隔的值列表。每个常量都有一个值。

Example: fbPou : FB_Pou<100, 1000>;

<( <expression> )>

可选

数据类型分配一个特定的表达式,该表达式仅对该函数块实例有效。该表达式已插入 in angle brackets 作为数据类型的后缀。表达式本身必须包含在内 在圆括号中

圆括号是必要的,因为它允许使用诸如此类的符号 < 或者 > 在表达式中。否则,将无法再保证代码的唯一性

Example: fbMyString2 : FB_MyString<(2 * cconst)>;

ARRAY [ <start index start> .. <end index> ] OF <function block name>

可选

使用函数块数组键入变量。数组的长度为:

<end index> - <start index> + 1

这是一个带有泛型常量的功能块。常量用作数组索引

示例: arrMyString

< <array length> >

为数据类型分配特定的数组长度,该长度尤其对该功能块实例有效。

指定的数组长度作为数据类型的后缀正式插入尖括号中。指定的值必须与起始索引和结束索引定义的数组长度相匹配。

Example: arrMyString : ARRAY[0..5] OF FB_MyString<6>;



例子

92. 使用多个泛型常量的示例
FUNCTION_BLOCK FB_Pou
VAR_GENERIC CONSTANT
    lnstring : DINT := 10;
    numstring : DINT := 100;
END_VAR
VAR
    arraystring : ARRAY[0..numstring-1] OF STRING(lnstring);
END_VAR
;
PROGRAM PLC_PRG
VAR
    fbPou : FB_Pou<100, 1000>;
END_VAR


93. 示例:子作用域类型的通用常量
FUNCTION_BLOCK FB_SrString 
VAR_GENERIC CONSTANT
    maxlen2 : INT(5..10) := 5;    //subrange data type
END_VAR
VAR
    arrTest : ARRAY[0..maxlen-1] OF BYTE;
END_VAR
;
PROGRAM SrMain
VAR CONSTANT
    cconst: INT(5..10) := 5;
END_VAR
VAR    
    fbMyString1 : FB_SrString<5>;
    fbMyString2 : FB_SrString<(2 * cconst)>;
    arrMyString : ARRAY [0..5] OF FB_SrString<6>;
END_VAR


94. 示例:带有可参数化数组变量的通用功能块

以下代码演示如何定义可以处理任意长度数组的函数块。该功能块具有通用但长度恒定的数组。“常量” 意味着,尽管每个函数块实例的数组长度各不相同,但在对象的生命周期内它是恒定的。

例如,对于想要实现通用库 POU 的库程序员来说,这种结构是有益的。

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<6>;    
END_VAR
;


遗产

函数块可以继承具有泛型常量的基本函数块 (EXTENDS)。继承的功能块需要自己的通用常量。然后可以将特定值转移到外部。

语法:

FUNCTION_BLOCK <function block name> 
VAR_GENERIC CONSTANT        
    <generic constant name> : <integer data type> ; 
END_VAR 
EXTENDS <function block base> < <generic constant name> >

具有泛型常量的函数块可以实现接口 (IMPLEMENTS)。该接口声明了一个属性 (PROPERTY) 使用它可以从外部访问指定的值。接口本身不得声明任何泛型常量或局部变量。接口没有实现。

语法:

FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
    <generic constant name> : <integer data type> ;
END_VAR
IMPLEMENTS <interface name>

提示

编码时,确保先插入泛型常量的声明,然后插入 EXTENDSIMPLEMENTS。这需要一些时间来适应,但原因是泛型常量也可以与基类一起使用

95. 示例

的定义 IString 通用功能块的接口。

It is strongly recommended to define an interface for generic function blocks. The interface should allow the generic function block instance to be used without knowledge of the generic constants.

这个 Length 属性允许访问通用常量。

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

功能块的声明 FB_MyString 使用通用常量 maxlen

FUNCTION_BLOCK FB_MyString 
VAR_GENERIC CONSTANT        
    maxlen : UDINT; 
END_VAR 
IMPLEMENTS IString 

功能块 FB_LongString 是指定功能块的扩展 FB_MyString

FUNCTION_BLOCK FB_LongString EXTENDS FB_MyString<1000>

功能块的声明 FB_MySpecialString 使用通用常量 maxlen2 作为指定功能块的扩展 FB_MyString。该功能块由该方法扩展 METH_ToLatin

FUNCTION_BLOCK FB_MySpecialString 
VAR_GENERIC CONSTANT        
    maxlen2 : UDINT:= 1; 
END_VAR 
EXTENDS FB_MyString<maxlen2>
METHOD METH_ToLatin : STRING
VAR_INPUT
END_VAR

使用特定常量对功能块进行实例化

PROGRAM PLC_PRG 
VAR CONSTANT     
    cconst: DINT := 1000; 
END_VAR
VAR     
    string1 : FB_MyString<100>;
    string2 : FB_MyString<(2 * cconst)>;
    derived1 : FB_LongString;
    derived2 : FB_MySpecialString<100>;
END_VAR 

通话

string1.METH_Assign ('Welt'); 
string2.METH_Assign ('Hallo '); 
string2.METH_Append(string1); 
derived2.METH_ToLatin('Hello World');