Skip to main content

实现一个接口

实现一个接口

接口的实现基于面向对象编程的概念。您还可以通过通用接口以相同的方式使用不同但相似的功能块。

实现接口的功能块必须包含该接口中定义的所有方法和属性(接口方法和接口属性)。这意味着:相应方法或属性的名称、输入和输出必须完全相同。

当您创建一个实现接口的新功能模块时,添加 CODESYS 自动在树中新功能模块下方输入该接口的所有方法和属性。

重要

之后,如果您向接口添加更多方法,则添加 CODESYS 这些方法不会自动添加到相关的功能模块中。对于更新,您必须明确使用命令 实现接口 选择。

在派生功能块的情况下,您必须确保从接口“继承”采用的方法或属性接收所需的实现,或者如果要使用基础中的实现,则将其删除。您将收到相应的翻译错误消息或警告,由自动插入的 pragma 属性引发。请查看命令的帮助页面 实现接口.

重要

  • 您必须先将功能块的接口分配给接口类型的变量,然后才能通过该变量调用方法。

  • 接口类型的变量始终是分配的功能块实例的引用。

接口类型变量是对功能块实例的引用。这样的变量可以引用任何实现该接口的功能块。如果没有对变量进行赋值,则变量包含在线模式下的值 0.

30. 例子

界面 I1 包含方法 GetName.

METHOD GetName : STRING

功能块 AB 每个都实现接口 I1

FUNCTION_BLOCK A IMPLEMENTS I1
FUNCTION_BLOCK B IMPLEMENTS I1

因此,两个功能模块都必须有一个名称为的方法 GetName 和返回类型 STRING 包含。否则编译器会报错。

函数包含接口类型变量的声明 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

调用接口方法:

在这种情况下,这取决于实际类型 l_i 从是否申请 A.GetName 或者 B.GetName 来电。

DeliverName := l_i.GetName();


在新功能模块中实现接口

要求:当前打开的项目至少有一个接口对象。

  1. 选择 应用 在设备树中并选择菜单命令 项目→添加对象→POU.

    对话 添加 POU 打开。

  2. 在输入字段中输入新功能模块的名称 一个,例如 POU_Im.

  3. 选择 功能模块.

  4. 选择 实施的 并点击按钮 _cds_icon_input_assistent.png.

  5. 在入口助手中,从类别中选择 接口 以界面为例 ITF1 并点击 .

  6. 要添加另一个接口,请再次单击 _cds_icon_input_assistent.png 并选择另一个界面。

  7. 您可以选择拥有一个 访问修饰符 用于选择列表中的新功能模块。

  8. 从下拉列表中选择 实现语言 例如 结构化文本(ST) 出去。

  9. 点击 添加.

    CODESYS 添加功能块 POU_Ex 进入设备树并打开编辑器。第一行说:

    FUNCTION_BLOCK POU_Im IMPLEMENTS ITF1

    接口及其方法和属性现在插入到功能块下的设备树中,您现在可以在接口及其方法的实现部分输入程序代码。

在现有功能块中实现接口

要求:当前打开的项目有一个功能块,例如 POU_Im 和至少一个接口对象,例如 ITF1.

  1. 双击设备树中的 POU POU_Ex(FB).

    POU 的编辑器打开。

  2. 展开现有的顶行条目 FUNCTION_BLOCK POU_ImIMPLEMENTS ITF1.

    功能块 POU_Im 实现接口 ITF1.