具有 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
我试图在 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