接口实现

为了支持面向对象的编程方式 一个功能块可以实现多个 接口 提供了使用 方法的可能性。 

语法:

FUNCTION_BLOCK <function block name> IMPLEMENTS <interface_1 name>|,<interface_2 name>, ..., <interface_n name>

一个功能块要实现一个接口必须要包含定义这个接口所需的所有的方法和属性 ( “接口属性”) 。包括名称,输入和输出的特定方法,以及属性必须是相同的。

因为这个原因,当 创建一个带有接口的新的功能块时,所有基于这种接口的方法和属性将会自动的插入到对象树中的新功能块下。注意:如果插入之后添加接口方法,将不会自动在功能块中添加。必须通过命令 “实现接口... ”进行更新。

示例

INTERFACE I1包含方法 GetName:

METHOD GetName : STRING

功能块 A 和B 每个都包含接口 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 来定义一个功能块。