提示! 由于编译原因使用的编译器版本必须 >= 3.3.2.0. |
操作 __NEW 分配功能块实例的内存区域或者标准数据类型的数组。操作返回指向对象的一个相关指针。如果操作没有在分配内进行工作那么将会产生一个错误信息。注意选项“公台内存分配”必须在 ⇘ “动态内存设置”中被激活!
如果没有内存能够进行分配, by __NEW 将会返回 0。
释放内存使用 __DELETE.
语法:
__NEW (<类型>, [<大小>])
操作将会创建一个特殊类型<type>的新对象并且返回一个指向<type>的的一个指针。对象的初始化在创建之后进行调用。如果返回 0 表示操作失败。
如果 <type> 是一个向量选项 <length> 必须被设置并且操作创建一个具有指定大小的向量类型的数组。
提示! 在在线模式下拷贝代码动态创建对象是不允许的! |
因此只有函数库外的功能块 (因为他们不能改变) 以及具有属性 'enable_dynamic_creation' 的功能块允许用于 __New-操作。如果一个功能块改变这个标志,那么在拷贝代码时,将会产生一个错误信息。
提示! 内存分配的代码需要非变化的。 |
用于避免两个任务在同一时间尝试分配一个信号(SysSemEnter)。因此,__New操作将会产生更高的抖动。
标量类型的示例:
TYPE DUT :
STRUCT
a,b,c,d,e,f : INT;
END_STRUCT
END_TYPE
PROGRAM PLC_PRG
VAR
pDut : POINTER TO DUT;
bInit: BOOL := TRUE;
bDelete: BOOL;
END_VAR
IF (bInit) THEN
pDut := __NEW(DUT);
bInit := FALSE;
END_IF
IF (bDelete) THEN
__DELETE(pDut);
END_IF
功能块示例:
FBDynamic(FP)
{attribute 'enable_dynamic_creation'}
FUNCTION_BLOCK FBDynamic
VAR_INPUT
in1, in2 : INT;
END_VAR
VAR_OUTPUT
out : INT;
END_VAR
VAR
test1 : INT := 1234;
_inc : INT := 0;
_dut : POINTER TO DUT;
neu : BOOL;
END_VAR
out := in1 + in2;
PLC_PRG(PRG)
VAR
pFB : POINTER TO FBDynamic;
loc : INT;
bInit: BOOL := TRUE;
bDelete: BOOL;
END_VAR
IF (pFB <> 0) THEN
pFB^(in1 := 1, in2 := loc, out => loc);
pFB^.INC();
END_IF
IF (bDelete) THEN
__DELETE(pFB);
END_IF
数组示例:
PLC_PRG(PRG)
VAR
bInit: BOOL := TRUE;
bDelete: BOOL;
pArrayBytes : POINTER TO BYTE;
pArrayDuts : POINTER TO BYTE;
test: INT;
parr : POINTER TO BYTE;
END_VAR
IF (bInit) THEN
pArrayBytes := __NEW(BYTE, 25);
bInit := FALSE;
END_IF
IF (pArrayBytes <> 0) THEN
pArrayBytes[24] := 125;
test := pArrayBytes[24];
END_IF
IF (bDelete) THEN
__DELETE(pArrayBytes);
END_IF