实现一个接口
接口的实现基于面向对象编程的概念。通过使用共享接口,您可以以相似的方式实现不同但相似的功能模块。
实现接口的函数块必须为使用该接口定义的所有方法和属性实现自己的代码。
当您定义实现接口的新功能块时,该接口的方法和属性会自动插入到对象树中的新功能块下方。但是, 不是全部 插入了方法和属性,但仅插入了无错误编译所需的方法和属性。
如果您稍后向接口添加更多方法,则这些方法是 不是自动 包含在实现接口的功能块的声明中。要更新那里的实现,你需要调用 实现接口 命令。要重写单个方法,请选择 添加对象 → 方法 命令。对话框打开时会显示所有可重写方法的列表。要进行选择,请单击 姓名 列表框。
对于派生函数块,你需要确保方法或属性是通过接口继承的 EXTENDS,已正确实现。如果未提供自定义实现,则函数块会自动使用上位或相关功能块的基本实现
使用接口变量
重要
必须将具有类型兼容接口的函数块实例分配给定义为类型的变量 接口。只有在此之后,您才能通过此变量调用方法。
接口类型的变量始终是对分配的功能块实例的引用。
接口变量用作对函数块实例的引用。它可以引用任何实现此接口的实例。分配的特定实例在运行时可能会有所不同。在第一次赋值之前,变量包含值 0。
界面 I1 包含方法 GetName.
功能块 A 和 B 每个都实现接口 I1:
METHOD GetName : STRING
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();
在新功能模块中实现接口
要求:当前打开的项目至少有一个接口对象。
在设备树中,选择 应用程序 对象,然后单击 项目 → 添加对象 → POU 菜单命令。
对话 添加 POU 打开。
在输入字段中输入新功能模块的名称 姓 一个,例如 POU_Im.
选择类型 功能块。
点击 实现 属性,然后单击
按钮。在输入助手中,选择 接口 类别,然后,例如,接口
ITF1。之后,单击 好吧。如果要插入其他接口,请单击
再次。接下来,选择所需的接口。您可以选择拥有一个 访问修饰符 用于选择列表中的新功能模块。
从中进行选择 实现语言 列表框(示例: 结构化文本 (ST)。
点击 添加.
CODESYS 添加了 pou_ex 带有设备树接口的功能块并打开编辑器。
第一行包含文本:
FUNCTION_BLOCK POU_Im IMPLEMENTS ITF1
现在,接口及其方法和属性已插入到功能块下方的设备树中。现在,您可以在接口及其方法的实现部分中输入程序代码。
在现有功能块中实现接口
要求:当前打开的项目有一个功能块(示例: pou_im) 和至少一个接口对象(例如: ITF1)。
双击设备树中的 POU POU_Ex(FB).
POU 的编辑器打开。
展开现有的顶行条目
FUNCTION_BLOCK POU_Im和IMPLEMENTS ITF1.功能块 POU_Im 实现接口 ITF1.
更新接口
如果您稍后向已定义的接口添加更多方法和属性,则实现此接口的功能块是 不是自动 扩展到包括新方法。你需要手动更新应该实现接口的功能块。
要执行此操作,请选择 实现接口 命令插入新对象。
有关更多信息,请参阅以下内容: 实现接口
重写方法
在以下场景中 IMPLEMENTS (接口)和 EXTENDS (继承),可能需要在派生函数块中重新实现已经在接口中声明的方法,以便对其进行调整或重写。
要重写单个方法,请选择 添加对象 → 方法 命令。对话框打开时会显示所有可重写方法的列表,因此您可以选择所需的方法,该方法应具有自己的实现。这将被添加,你可以对实现进行补充。
有关更多信息,请参阅以下内容: 对话: 添加方法