Codesys 错误 - 功能块必须实例化才能访问

问题描述 投票:0回答:1

在我的 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,希望问题是新版本的库管理器/存储库中存在一些混乱。为什么会发生这种情况以及如何解决它?

libraries codesys iec61131-3
1个回答
0
投票

由于 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
© www.soinside.com 2019 - 2024. All rights reserved.