方法: FB_Init
, FB_Reinit
和 FB_Exit
您可以显式声明方法以影响功能块变量的初始化以及退出功能块时的行为。
提示
隐式方法的返回值类型是 BOOL
.该值不由系统评估,但不应更改类型。
FB_Init
总是隐式可用的,它主要用于初始化。对于特定的影响,您还可以显式声明方法并在其中提供带有标准初始化代码的附加代码。
FB_Reinit
必须明确实施。如果此方法存在,则在受影响功能块的实例完成后调用 复制了.这发生在更改功能块声明(签名更改)后的在线更改期间,以便重新初始化新的实例模块。要重新初始化功能块的基本实现,您必须调用 FB_Reinit
明确地。
FB_Exit
必须明确实施。如果有实现,则在控制器移除功能块实例的代码之前调用该方法(隐式调用)。
下面显示了这些方法在不同操作条件下的一些用例。
“首次下载”操作案例
将应用程序下载到具有出厂设置的 PLC 时,所有变量的内存必须偏移到所需的初始状态。这样,功能块实例的数据区就被分配了所需的值。通过显式实现 FB_Init
对于功能块,您可以在应用程序代码中专门针对这种情况做出反应。通过评估方法参数 bInCopyCode
(FALSE
) 和 bInitRetains
(TRUE
),您可以清楚地检测到这种运行状况。
“在线变更”运营案例
在在线更改范围内,您可以通过方法影响功能块实例的初始化 FB_Exit
, FB_Init
, 和 FB_Reinit
.在在线更改期间,在离线模式下对应用程序所做的更改将应用于正在运行的 PLC。因此,“旧的”功能块实例被您的“新的兄弟姐妹”尽可能地替换而不会发生意外。如果在登录之前没有对应用程序中的功能块的声明部分进行更改,而只是在实现中,则不会替换数据区域。仅替换代码块。然后方法 FB_Exit
, FB_Init
, 和 FB_Reinit
不被调用。
提示
如果您对导致上述复制操作的功能块声明进行了更改,那么您会在在线更改期间收到一条有关“可能的意外影响”的消息。在里面 细节 在消息视图中,您会看到要复制的所有实例的列表。
在代码中 FB_Init
方法,参数 bInCopyCode
(TRUE
) 可以评估以检测是否正在执行在线更改。
在线更改期间会连续发生以下调用:
FB_Exit
old_inst.FB_Exit(bInCopyCode := TRUE);
你可以打电话
FB_Exit
退出“旧”实例以触发特定清理任务时 复制操作之前.这样,您就可以为后续的复制操作准备数据并影响新实例的状态。您可以通知应用程序的其他部分有关内存中位置的未决更改。特别注意类型的变量POINTER
和REFERENCE
.在线更改后,这些可能不再指代所需的内存位置。接口变量 (INTERFACE
) 由编译器单独处理,并在在线更改期间进行相应调整。新实例可以应用诸如套接字、文件或其他句柄之类的外部资源,在某些情况下保持不变。在在线更改期间,通常不必对它们进行特殊处理。 (参见“‘重新下载’操作案例”)FB_Init
new_inst.FB_Init(bInitRetains := FALSE, bInCopyCode := TRUE);
FB_Init
在复制操作之前调用,可用于执行在线更改的特定操作。例如,您可以在内存中的“新”位置相应地初始化变量,或者通知应用程序的其他部分有关内存中特定变量的新位置。复制操作:
copy
copy(&old_inst, &new_inst);
现有值保持不变。为此,它们从旧实例复制到新实例中。
FB_Reinit
new_inst.FB_Reinit();
此方法在复制操作之后调用,并且应该为实例的变量设置定义的值。例如,您可以在内存中的“新”位置相应地初始化变量,或者通知应用程序的其他部分有关内存中特定变量的新位置。设计独立于在线更改的实现。也可以随时从应用程序调用该方法,以将功能块实例重置为其原始状态。
提示
随着 {attribute 'no_copy'}
属性,您可以防止在在线更改功能块的单个变量期间复制该属性。它始终保留初始值。
有关更多信息,请参阅: 为在线更改设置内存保留
“新下载”操作案例
下载应用程序时,可以替换 PLC 上的现有应用程序。因此,必须规范为当前功能块提供的内存。您可以使用 FB_Exit
实现此所需步骤的方法。例如,您可以在定义的状态下偏移外部资源(带有套接字和文件句柄)。
您可以通过检查参数是否 bInCopyCode = FALSE
为了 FB_Exit
方法。
“开始申请”操作案例
在应用程序任务的第一个周期之前处理初始分配。
T1 : TON := (PT:=t#500ms);
这些类型的赋值只有在调用之后才会执行 FB_Init
.为了控制这些赋值的效果,您可以提供一个功能块或一个功能块的方法 {attribute ‘call_after_init‘}
属性。您必须在功能块主体的声明部分上方和相应方法的声明部分上方添加属性。扩展另一个 POU 的 POU,该 POU 使用 {attribute 'call_after_init'}
属性也必须有属性。为了清楚起见,我们建议用相同的名称、相同的签名和相同的属性覆盖相应的方法。这需要调用 SUPER^.MyInit
.可以无限制地选择方法的名称。 (例外: FB_Init
, FB_Reinit
, 和 FB_Exit
)。在处理初始分配之后和启动应用程序任务之前调用该方法。因此,该方法可以对用户输入做出反应。
使用时 FB_Init
或者 {attribute 'call_after_init'}
,记住检测错误 FB_Init
方法或用 {attribute 'call_after_init'}
属性比较繁琐,因为断点的设置可能没有预期的效果。
重要
如果在执行期间达到显式定义的初始化代码,则功能块实例已经通过隐式初始化代码完全初始化。因此,一定不能有 SUPER^.FB_Init
称呼。
重要
FB_Init
取代 INI
运算符用于 CoDeSys V2.3.这些方法无法与构造函数的设计进行比较,例如 C#、C++ 或 Java。这会对扩展其他功能块的功能块产生影响。 (见下文:“派生功能块”)
方法接口 FB_Init
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) END_VAR
您可以在一个 FB_init
方法。然后您必须在功能块实例的声明中设置这些输入。
方法 FB_Init
为了 serialdevice
功能块
METHOD PUBLIC FB_Init : BOOL VAR_INPUT nbInitRetains : BOOL; // initializing of retain variable bInCopyCode : BOOL; // instance is copied to copy code iCOMnum : INT; // additional input: number of the COM interface, that is to be observed END_VAR
的实例化 serialdevice
功能块:
com1: serialdevice(iCOMnum:=1); com0: serialdevice(iCOMnum:=0);
方法接口 FB_Reinit
METHOD FB_Reinit : BOOL
方法接口 FB_Exit
有强制参数 bInCopyCode
.
METHOD FB_Exit : BOOL VAR_INPUT bInCopyCode : BOOL; // TRUE: the exit method is called in order to leave the instance which will be copied afterwards (online change). END_VAR
派生功能块的行为
如果一个功能块派生自另一个功能块,则 FB_Init
派生功能块的方法必须定义与 FB_Init
基本功能块的方法。但是,您可以添加更多参数以便为实例设置特殊初始化。
功能块 MainFB
, SubFB
, 和 SubSubFB
是相互衍生的。所以, SubFB EXTENDS MainFB
和 SubSubFB EXTENDS SubFB
申请。
FB_Exit
和 FB_Init
:fbSubSubFb.FB_Exit(...);
fbSubFb.FB_Exit(...);
fbMainFb.FB_Exit(...);
fbMainFb.FB_Init(...);
fbSubFb.FB_Init(...);
fbSubSubFb.FB_Init(...);