__NEW

提示!

由于编译原因使用的编译器版本必须 >= 3.3.2.0.

操作 __NEW 分配功能块实例的内存区域或者标准数据类型的数组。操作返回指向对象的一个相关指针。如果操作没有在分配内进行工作那么将会产生一个错误信息。注意选项“公台内存分配”必须在 “动态内存设置”中被激活!

如果没有内存能够进行分配, by __NEW 将会返回 0。

释放内存使用 __DELETE.

语法:

__NEW (<类型>, [<大小>])

操作将会创建一个特殊类型<type>的新对象并且返回一个指向<type>的的一个指针。对象的初始化在创建之后进行调用。如果返回 0 表示操作失败。

如果 <type> 是一个向量选项 <length> 必须被设置并且操作创建一个具有指定大小的向量类型的数组。

 

示例:

pScalarType := __New(ScalarType, 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