Инициализировать функциональный блок с помощью __NEW, в котором явно определен метод FB_init.

Предположим, у меня есть функциональный блок (A), в котором определен метод FB_init, например:

{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.


person Guiorgy    schedule 25.05.2020    source источник


Ответы (1)


У вас есть ошибка в функциональном блоке B. Я пробовал с TwinCAT 3, и он работает.

Изменять

a := POINTER TO A;

to

a : POINTER TO 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

Б:

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));
person Quirzo    schedule 26.05.2020
comment
Спасибо за ответ, но оказалось, что Schneider не поддерживает динамическое выделение памяти. Тем не менее, еще раз спасибо! - person Guiorgy; 30.05.2020
comment
Грустно это слышать. Надеюсь в будущем! - person Quirzo; 01.06.2020
comment
Я перешел на Schneider Machine Expert 1.2, более новое программное обеспечение, и похоже, что динамическое выделение памяти работает так, как задумано. Спасибо за ваше время! - person Guiorgy; 07.06.2020