实现接口

概述

为了支持面向对象的编程,功能块可实现数个接口,让您可使用方法

语法

FUNCTION_BLOCK <功能块名称> IMPLEMENTS <接口_1 名称>|,<接口_2 名称>, ..., <接口_n 名称>

实现接口的功能块必须包含该接口定义的所有方法和属性(接口属性)。这包括特定方法或属性的名称、输入和输出,它们必须完全相同。

为此,在创建实现接口的新功能块时,在该接口中定义的所有方法和属性都将自动插入应用程序树中的该新功能块下。

注: 如果此后将方法添加至接口定义,不会自动将它们添加在相关的功能块中,因此会产生编译器错误。执行命令实现界面... 来显式执行该更新。

使用功能块继承时,应注意:如果方法或属性是通过接口的继承创建的,则要么实现这些方法或属性,要么在要实现基本功能块的情况下删除这些方法或属性。pragma 属性自动插入。这些属性在编译期间被检测,并生成消息以向您提醒必须验证继承的方法或属性。完全实现了新功能块后,删除 pragma 属性。

有关更多信息,请参阅实现界面...命令的说明。

示例

INTERFACE I1 包括方法 GetName

METHOD GetName : STRING

功能块 AB 各自实现接口 I1

FUNCTION_BLOCK A IMPLEMENTS I1
FUNCTION_BLOCK B IMPLEMENTS I1

从而在两个功能块中,方法 GetName 必须可用并且将在功能块插入应用程序树时自动插入每个功能块下。

注意 I1 类型的变量的声明:

FUNCTION DeliverName : STRING 
VAR_INPUT 
  l_i : I1; 
END_VAR 

该输入可接收实现接口 I1 的所有功能块。

功能调用示例:

DeliverName(l_i := A_instance); // call with instance of type A 
DeliverName(l_i := B_instance); // call with instance of type B 
注: 必须向接口类型的变量分配功能块实例后方可在其上调用方法。接口类型的变量始终是分配的功能块实例的引用。

因此对于接口方法结果的调用会导致对于功能块实现的调用。一旦分配了引用,则会于在线模式下监控相应地址。否则,如果尚未分配引用,则会于在线模式的监视中显示值 0。

相关示例请参阅功能 DeliverName 的实现部分:

DeliverName := l_i.GetName(); // in this case it depends on the "real" type of l_i whether A.GetName or B.GetName is called
注: 另请参阅通过在声明中使用关键字 EXTENDS扩展功能块的可能性。