变量: 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
| 功能块的名称 |
| 泛型常量的范围 你可以在中声明任意数量的泛型常量 |
| 泛型常量的变量名 |
| 构造哪些类型的泛型常量。 允许使用整数数据类型或整数数据类型的子范围。 示例:
|
| 可选 初始化 重要编译检查才需要初始值。在运行时,该值被覆盖 |
通用常量可以在功能块的实现中照常使用。例如,这些常量可用于数组的索引或字符串的长度
变量声明的语法
具有指定常量的变量声明(函数块的实例化)的语法
以下选项是可能的:
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
| 范围 |
| 变量;功能块实例的名称 |
| 使用功能块键入变量 这是一个带有泛型常量的功能块。 |
| 可选 数据类型分配一个特定的值,该值仅对该功能块实例有效。该值已正式插入 示例: 如果 多个 已经为类型定义功能块声明了泛型常量,然后在尖括号中传递了一个以逗号分隔的值列表。每个常量都有一个值。 Example: |
| 可选 数据类型分配一个特定的表达式,该表达式仅对该函数块实例有效。该表达式已插入 圆括号是必要的,因为它允许使用诸如此类的符号 Example: |
| 可选 使用函数块数组键入变量。数组的长度为:
这是一个带有泛型常量的功能块。常量用作数组索引 示例: |
| 为数据类型分配特定的数组长度,该长度尤其对该功能块实例有效。 指定的数组长度作为数据类型的后缀正式插入尖括号中。指定的值必须与起始索引和结束索引定义的数组长度相匹配。 Example: |
例子
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
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
以下代码演示如何定义可以处理任意长度数组的函数块。该功能块具有通用但长度恒定的数组。“常量” 意味着,尽管每个函数块实例的数组长度各不相同,但在对象的生命周期内它是恒定的。
例如,对于想要实现通用库 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>
提示
编码时,确保先插入泛型常量的声明,然后插入 EXTENDS
和 IMPLEMENTS
。这需要一些时间来适应,但原因是泛型常量也可以与基类一起使用
的定义 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');