.

运算符 ‘_DELETE’

.
.

该运算符是IEC 61131-3标准的扩展。

提示!

为了兼容性,编译器版本必须为> = 3.3.2.0。

该运算符通过“ _NEW”运算符释放动态生成的实例内存。__DELETE运算符没有返回值,并且在此操作之后,操作数被设置为零。

要求:在应用程序的属性对话框中,在应用程序生成信息选项中选择使用动态分配内存复选框。

_DELETE (<指针>)

提示!

两个任务不能同时调用__DELETE。你可以使用信号量(进入系统事件)或类似方法来防止并发调用__DELETE,或者仅在一项任务中使用__DELETE(推荐)。

你可以使用信号量(进入系统事件)防止两个任务同时分配内存。结果,__DELETE的广泛使用会导致更高的抖动。

如果Pointer引用功能块,则CODESYS在将指针设置为零之前调用关联的FB_EXIT方法。

.

.例如

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; 


METHOD FB_Exit : BOOL 

VAR_INPUT 
  bInCopyCode : BOOL; 
END_VAR 

__Delete(_dut); 

  

METHOD FB_Init : BOOL 

VAR_INPUT 
    bInitRetains : BOOL; 
    bInCopyCode : BOOL; 
END_VAR 

_dut := __NEW(DUT); 


METHOD INC : INT 

VAR_INPUT 
END_VAR 

_inc := _inc + 1; 
INC := _inc; 


PLC_PRG(PRG) 

VAR 
    pFB : POINTER TO FBDynamic; 
    bInit: BOOL := TRUE; 
    bDelete: BOOL; 
    loc : INT; 
END_VAR 

IF (bInit) THEN 
    pFB := __NEW(FBDynamic);
    bInit := FALSE; 
END_IF

IF (pFB <> 0) THEN
    pFB^(in1 := 1, in2 := loc, out => loc); 
    pFB^.INC(); 
END_IF 

IF (bDelete) THEN 
    __DELETE(pFB); 
END_IF