带有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中,显然不能同时拥有一个Persistent FB和一个带有自定义参数的FB_Init方法。

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

附带说明:如果使用Twincat平台,则不会出现此问题。事实上,你甚至没有一个单独的持久变量列表。

不过请注意,如果您使用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。

(从技术上讲,你可以用相同的名称声明两个不同的实例,一个在PLC_PRG中,另一个在全局列表中,但用相同的名字命名它们并不是一种好的风格(

如果你在全局列表中声明它们,那么如下所示:

VAR_GLOBAL PERSISTENT RETAIN
p : POU;
END_VAR

最新更新