Skip to main content

运算符:__DELETE

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

重要

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

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

要求: 使用动态内存分配 选项被选中 应用程序构建选项 应用程序属性对话框中的选项卡。

__DELETE (<pointer>)

重要

两个任务不应同时调用 __DELETE。您可以使用信号量 (SysSemEnter) 或类似方法来防止 __DELETE 的任何并发调用,或者仅在一个任务中使用 __DELETE(推荐)。

您可以使用信号量 (SysSemEnter) 来防止两个任务同时分配内存。因此,广泛使用 __DELETE 导致更高的抖动。

如果 Pointer 引用一个功能块,然后 CODESYS 调用相关的 FB_EXIT 指针设置为零之前的方法。

149. 例子

功能块

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;

方法 (FB_Exit

METHOD FB_Exit : BOOL

VAR_INPUT
  bInCopyCode : BOOL;
END_VAR

__Delete(_dut);

方法 (FB_Init

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