方法‘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)以检测是否正在执行在线更改。
联机更改期间,以下调用连续发生:
1. | FB_Exit old_inst.FB_Exit(bInCopyCode := TRUE); 您可以在退出旧实例时调用FB_Exit,以在复制操作之前触发特定的清理任务。这样,您可以为接下来的复制操作准备数据,并影响新实例的状态。您可以通知应用程序的其他部分有关内存中未决位置的更改。要特别注意POINTER和REFERENCE类型的变量。联机更改后,这些地址可能不再引用所需的存储位置。接口变量(INTERFACE)由编译器单独处理,并且在联机更改期间会相应地对其进行调整。套接字,文件或其他句柄之类的外部资源可以由新实例应用,在某些情况下可以保持不变。通常,在进行在线更改期间不必对它们进行特殊对待。(请参阅“操作条件“重新下载””) |
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(); 在复制操作之后将调用此方法,并且应为实例的变量设置定义的值。例如,您可以在内存中的新位置相应地初始化变量,或将内存中特定变量的新位置通知应用程序的其他部分。独立于在线更改设计实现。也可以随时从应用程序中调用该方法,以将功能块实例重置为其原始状态。 |
|
使用{attribute'no_copy'}属性,可以防止在在线更改功能块的单个变量时复制该属性。它始终保留初始值。 |
运行条件“新下载”
下载应用程序时,可以在PLC上替换现有应用程序。因此,必须调节当前功能块的存储空间。您可以使用FB_Exit方法来实现所需的步骤。例如,您可以在定义的状态下偏移外部资源(带有套接字和文件句柄)。
您可以通过检查FB_Exit方法的参数bInCopyCode = FALSE来检测此操作条件。
运行条件“开始应用”
在应用程序任务的第一个周期之前处理初始分配。
.例如
T1 : TON := (PT:=t#500ms);
仅在调用FB_Init之后才执行此类分配。为了控制这些分配的效果,可以提供具有{attribute‘call_after_init’}属性的功能块或功能块的方法。您必须在功能块主体的声明部分上方和相应方法的声明部分上方添加属性。扩展使用{attribute'call_after_init'}属性的另一个POU的POU也必须具有该属性。为了清晰起见,我们建议使用相同的名称,相同的签名和相同的属性覆盖相应的方法。这需要调用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替换了CoDeSys V2.3中使用的INI运算符。这些方法不能与构造函数的设计进行比较,例如C#,C ++或Java。这对扩展其他功能块的功能块有影响。(参见下文:“派生功能块”) |
方法
FB_Init的接口
METHOD FB_Init : BOOL
VAR_INPUT
bInitRetains : BOOL; //TRUE:保留变量已初始化(热复位/冷复位)
bInCopyCode : BOOL; // TRUE:实例将在之后复制到复制代码(在线更改)
END_VAR
您可以在FB_init方法中声明其他功能块输入。然后,必须在功能块实例的声明中设置这些输入。
.例如
serialdevice功能块的方法FB_Init
METHOD PUBLIC FB_Init : BOOL
VAR_INPUT
bInitRetains : BOOL; //初始化保留变量
bInCopyCode : bInCopyCode:BOOL; //实例被复制到复制代码INT; //附加输入:要观察的COM接口的编号
END_VAR
serialdevice功能块的实例化:
com1: serialdevice(iCOMnum:=1);
com0: serialdevice(iCOMnum:=0);
方法
FB_Reinit的接口
方法
FB_Exit的接口
有必填参数bInCopyCode。
METHOD FB_Exit : BOOL
VAR_INPUT
bInCopyCode : BOOL; // // TRUE:调用exit方法是为了离开实例,该实例随后将被复制(在线更改)。
END_VAR
派生功能块的行为
如果功能块是从另一个功能块派生的,则派生功能块的FB_Init方法必须定义与基本功能块的FB_Init方法相同的参数。但是,您可以添加更多参数,以便为实例设置特殊的初始化。
.例如
功能块MainFB,SubFB和SubSubFB是彼此派生的。因此,适用于SubFB EXTENDS MainFB和SubSubFB EXTENDS SubFB。
. 方法FB_Exit和FB_Init的调用顺序:
1. | fbSubSubFb.FB_Exit(...); |
2. | fbSubFb.FB_Exit(...); |
3. | fbMainFb.FB_Exit(...); |
4. | fbMainFb.FB_Init(...); |
5. | fbSubFb.FB_Init(...); |
6. | fbSubSubFb.FB_Init(...); |