在我的 Codesys 3.5.18 项目中,我从我之前创建的库(版本 1.1.0)中声明了功能块 MyKeyboard 和 MyNumberPad,并将其添加到库管理器中。
PROGRAM Dummy
VAR
'some other declarations
MyKeyboard : ETN_KNP.ControlKeyboard;
MyNumberPad : ETN_KNP.ControlNumberPad;
'some other declartions
END_VAR
我对此库进行了一些更改,并为其提供了 1.1.1 版本。我在库管理器中将占位符版本更新为 1.1.1。现在,我收到一个错误,提示功能块未实例化。它们显然是 - 主项目的变量声明部分中执行此操作的代码没有更改,唯一的更改是新的库版本。
我尝试重新启动我的笔记本电脑和 Codesys,希望问题是新版本的库管理器/存储库中存在一些混乱。为什么会发生这种情况以及如何解决它?
由于 codesys 中的功能块本质上与其他语言中的类相同,因此您必须调用“构造函数”来初始化对象。在 codesys 中,此初始化是通过调用 FB_Init(功能块初始化)方法完成的。
Codesys 隐式调用
FB_Init
方法,第一次运行时使用声明期间定义的参数,例如:
VAR
fb: MY_FB("arg1", "arg2"); // fb.FB_Init(bInitRetains, bInCopyCode, "arg1", "arg2"); will be called.
// bInitRetains and bInCopyCode are internal variables used by codesys, don't worry about them.
END_VAR
如果未显式调用
FB_Init
,则 codesys 会自动调用它而不传递任何参数,换句话说,以下两个声明在语义上与 codesys 相同:
VAR
fb1: MY_FB;
fb2: MY_FB();
END_VAR
但有一个例外,您可以在声明期间使用
noinit编译指示禁用对
FB_Init
的隐式调用,在这种情况下,您需要在应用程序初始化期间自己显式调用 FB_Init
一次:
VAR
{attribute 'noinit'}
fb: MY_FB;
first_run: BOOL := TRUE;
END_VAR
IF first_run THEN
first_run := FALSE;
fb.FB_Init(FALSE, FALSE, "arg1", "arg2")
END_IF
最后,您必须确保,就像任何函数调用一样,将正确数量和类型的参数传递给
FB_Init
函数:
VAR
fb: MY_FB("arg1", "arg2"); // error if MY_FB expects 1 or 3 arguments instead
END_VAR