具有 FB_Init 功能块的持久变量列表

Persistent Vars list with function blocks with FB_Init

我试图在 CODESYS 3.5.16 中保留一个功能块 (POU),但出现 C0138: No matching 'FB_Init' method found for instantiation of POU 错误。

持久变量:

VAR_GLOBAL PERSISTENT RETAIN
    PLC_PRG.p: POU;
    // PLC_PRG.p: POU(val := 10); // also tried this
    PLC_PRG.p1: POU1;
END_VAR

POU:

FUNCTION_BLOCK POU
VAR
    _val: INT;
END_VAR

METHOD FB_Init: BOOL
VAR_INPUT
    bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold)
    bInCopyCode: BOOL;  // TRUE: the instance will be copied to the copy code afterward (online change)
    val: INT;
END_VAR
THIS^._val := val;

POU1:

FUNCTION_BLOCK POU1
VAR_INPUT
    val: INT;
END_VAR
VAR
    _val: INT;
END_VAR
_val := val;

PLC_PRG:

PROGRAM PLC_PRG
VAR PERSISTENT
    p: POU(val := 10);
    p1: POU1;
END_VAR
(*VAR
    p: POU(val := 10);
END_VAR*) // also tried this
p1(val := 20);

我做错了什么? (POU1 按预期工作)

在 Codesys 中,您显然不能同时拥有持久性 FB 和带有自定义参数的 FB_Init 方法。

使用 codesys 的解决方案是删除 fb_init 方法的自定义参数或为您的程序尝试其他初始化解决方案。在您之前的一个问题的 answer 中可以找到不同的初始化解决方案。

附带说明:如果您使用 Twincat 平台,则不会出现此问题。 事实上,您甚至没有单独的 Persistent Vars 列表。

注意,如果你使用 Twincat,这是错误的:

VAR_GLOBAL PERSISTENT RETAIN
    PLC_PRG.p: POU;
    // PLC_PRG.p: POU(val := 10); // also tried this
    PLC_PRG.p1: POU1;
END_VAR

您可以在 PLC_PRG 或 VAR_GLOBAL 中声明您的 FB。

(从技术上讲,您可以声明 2 个具有相同名称的不同实例,一个在 PLC_PRG 中,一个在您的全局列表中,但是将它们命名为相同的样式并不是很好)

如果你在全局列表中声明它们,那么像这样:

VAR_GLOBAL PERSISTENT RETAIN
    p : POU;
END_VAR