FB_InitFB_ReinitFB_Exit 方法

方法的一般用途

您可以显式地使用方法 FB_InitFB_Reinit 来影响功能块变量的初始化以及退出功能块时的行为。

本章介绍了这些方法以及它们在要求变量初始化的不同条件下的应用和影响。

FB_Init

缺省情况下,FB_Init 方法可隐式使用。它被 EcoStruxure Machine Expert 用来对功能块或结构执行初始化。

为了影响初始化,您可以延长给定缺省初始化代码,从而显式声明 FB_Init 方法。这样,您就可以执行返回值求值。

FB_Reinit

FB_Reinit 方法必须显式声明。

如果 FB_Reinit 方法可用,则在复制了相应功能块的实例(在对功能块声明进行修改之后的在线修改期间)之后,调用此方法。它对新实例模块执行重新初始化。不执行返回值求值。如要实现基本功能块的重新初始化,可为该功能块显式调用 FB_Reinit。这样,您就可以执行返回值求值。

FB_Exit

FB_Exit 方法必须显式声明。

如果存在实现,则在控制器删除功能块实例的代码之前,调用此方法(隐式调用)。不执行返回值求值。

下面介绍了这些方法在不同运行条件下的用例。

首次下载

在将应用程序下载到缺省状态下的控制器时,变量的内存位置被设置为所需的初始状态。功能块的数据区被设置为所需的值。您可以通过在应用程序的程序代码中为功能块显式实现 FB_Init,来影响这一过程。

方法参数 bInCopyCode 设置为 FALSE 且 bInitRetains 设置为 TRUE 时,说明正在执行首次下载。

在线修改

在执行了在线修改命令时,可以使用方法 FB_ExitFB_InitFB_Reinit 来影响功能块的初始化。

在线修改期间,离线模式下进行的应用程序修改会被下载到控制器。功能块的实例按照如下方式更新为新实例:

如果您仅对功能块的实现部分而未对声明部分进行修改,则不会替换数据区。方法 FB_InitFB_ReinitFB_Exit 不被调用。

如果您对功能块的声明部分进行了修改,那么在执行在线修改命令时,会执行 FB_Reinit 文段中所述的复制过程。应用程序信息对话框中列出自上次下载后修改过的对象。在选择了选项登录并在线修改的情况下,单击此对话框中的详细信息...按钮,以此打开此对话框。

FB_InitFB_Reinit 方法参数 bInCopyCode 设置为 TRUE 且 bInitRetains 设置为 FALSE 时,说明正在执行在线修改。

在线修改期间执行的调用

执行在线更改命令可能更改地址内容。

 小心
指针无效
对地址使用指针并执行在线更改命令时,请检查指针的有效性。
不遵循上述说明可能导致人身伤害或设备损坏。

在线修改期间,相继执行以下调用:

步骤

操作

注释

1

FB_Exit

old_inst.FB_Exit(bInCopyCode := TRUE);

在启动复制过程之前,调用 FB_Exit 来执行清理过程。

它为下一个复制过程准备数据,并影响新实例的状态。

应用程序的其他部分被告知内存中所执行的位置修改。

请注意,在线修改期间,POINTERREFERENCE 类型的变量的值保持不变,并且在过程结束后,可能不再引用所需的内存位置。在线修改期间,会调整 INTERFACE 类型的变量。新实例可能能够采用外部资源,如套接字、文件或其他句柄,当系统资源不受在线修改复制过程影响时,这些外部资源在在线修改期间通常不需要单独处理。如果需要,也必须在 InitReinit 实现中处理。

2

FB_Init

new_inst.FB_Init(bInitRetains := FALSE, bInCopyCode := TRUE);

FB_Init 可用于在在线修改过程中执行特定操作。

其中包括,比如,适当地对新内存位置处的变量执行初始化,或者将与特定变量的新位置有关的信息提供到应用程序的其他部分。

3

复制操作 copy

copy(&old_inst, &new_inst);

现有值保持不变。为此,这些值从旧实例复制到新实例。

4

FB_Reinit

new_inst.FB_Reinit();

复制操作结束后,调用 FB_Reinit 方法。它将功能块实例的变量设置为定义值。

比如,您可以适当地对新内存位置处的变量执行初始化,或者将与特定变量的新位置有关的信息提供到应用程序的其他部分。

每当要将功能块复位至原始状态时,都应以与在线修改独立开的方式实现 FB_Reinit 方法,因为该方法可以随时被应用程序调用。

注: 如果您将 pragma {attribute no_copy} 添加到功能块的变量,那么在在线修改期间,这个变量不会被复制;而是仅被初始化。

下载更新的应用程序

将应用程序下载到已经在运行某一应用程序的控制器时,原有应用程序将被替换。您可以使用比如 FB_Exit 方法,为外部资源(如套接字或文件句柄)分配定义状态。

方法参数 bInCopyCode 设置为 FALSE 且 bInitRetains 设置为 FALSE 时,说明正在执行下载更新的应用程序。

启动应用程序

在执行应用程序任务的首个循环之前,应先处理初始赋值。

示例:

T1 : TON := (PT:=t#500ms);

这些赋值在调用了 FB_Init 之后执行。如要检验这些赋值的影响,可将 {attribute call_after_init} pragma 附加到功能块以及功能块的方法(比如,调用的 MyInit)。将此属性插入到功能块的声明部分上方以及相应方法的声明部分上方。另将此 pragma 附加到对其他正使用 {attribute call_after_init} pragma 的功能块进行扩展的功能块。建议为相应的方法指定相同的名称、相同的签名以及相同的属性。为此,应调用 SUPER^.MyInit。选择方法名称(FB_InitFB_ReinitFB_Exit 除外)。在处理了初始赋值之后并且在启动应用程序的任务之前,调用此方法。

注: 在执行显式定义的初始化代码时,功能块已经通过隐式初始化代码完全被初始化。因此,不允许调用 SUPER^.FB_Init

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 方法中,您可以声明其他功能块输入。将输入分配到功能块实例的声明中。

示例:功能块 serialdevice 的方法 FB_Init

METHOD PUBLIC FB_Init : BOOL
VAR_INPUT
    bInitRetains : BOOL; // Initialization of the retain variables
    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 方法相同的参数。但您可以添加另外的参数,以便实现实例的特殊初始化。

导出的功能块在面对 FB_ExitFB_Init 时的调用顺序示例

对此列表中所示的 POU(SubFB EXTENDS MainFBSubSubFB EXTENDS SubFB),执行以下操作:

步骤

操作

1

fbSubSubFb.FB_Exit(...);

2

fbSubFb.FB_Exit(...);

3

fbMainFb.FB_Exit(...);

4

fbMainFb.FB_Init(...);

5

fbSubFb.FB_Init(...);

6

fbSubSubFb.FB_Init(...);