使用已明确定义FB_init方法的__NEW初始化功能块

问题描述 投票:0回答:1

假设我有一个定义了FB_init方法的功能块(A),例如:

{attribute 'enable_dynamic_creation'}
FUNCTION_BLOCK A
  METHOD FB_init : BOOL
    VAR_INPUT
      bInitRetains : BOOL;
      bInCopyCode : BOOL;
      parameter: BOOL;
    END_VAR
  END_METHOD
END_FUNCTION_BLOCK

而且我还有另一个功能块(B),我想从中动态初始化此(A)FB:

FUNCTION_BLOCK B
  VAR
    a := POINTER TO A;
  END_VAR
  METHOD FB_init : BOOL
    VAR_INPUT
      bInitRetains : BOOL;
      bInCopyCode : BOOL;
      parameter: BOOL;
      somethingElse: INT;
    END_VAR
    a := __NEW(A); // No matching FB_init method found for instantiation of A
    a := __NEW(A(TRUE)); // Build returns errors
    a := __NEW(A(parameter := TRUE)); // Build returns errors
  END_METHOD
END_FUNCTION_BLOCK

我无法动态创建A功能块的实例。这是否可能,或者我做错了吗?

PS。我正在使用Schneider SoMachine V4.3

initialization dynamic-memory-allocation codesys structured-text
1个回答
2
投票
您在功能块B中出错。我尝试过TwinCAT 3,它可以工作。

更改

a := POINTER TO A;

to

a : POINTER TO A;

此后,以下工作:

A:

{attribute 'enable_dynamic_creation'} FUNCTION_BLOCK A VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR END_VAR METHOD FB_init : BOOL VAR_INPUT bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start) bInCopyCode : BOOL; // if TRUE, the instance afterwards gets moved into the copy code (online change) parameter: BOOL; END_VAR

B:

FUNCTION_BLOCK B VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR a : POINTER TO A; END_VAR METHOD FB_init : BOOL VAR_INPUT bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start) bInCopyCode : BOOL; // if TRUE, the instance afterwards gets moved into the copy code (online change) parameter: BOOL; somethingElse: INT; END_VAR a := __NEW(A(parameter := TRUE));
© www.soinside.com 2019 - 2024. All rights reserved.