接口的实现基于面向对象编程的概念。有了通用接口,就能以相同的方式使用不同但相似的功能块。
实现接口的功能块必须包含该接口定义的所有方法和属性(接口方法和接口属性)。这意味着方法或属性的名称、输入和输出必须完全相同。创建一个实现接口的新功能块时,CODESYS 会自动将接口的所有方法和属性添加到新功能块下方的树中。




注意

如果之后添加了更多接口方法,CODESYS 不会自动将这些方法添加到受影响的功能块中。要执行此更新,必须明确执行“Implement Interfaces” 命令。
对于继承的功能块,必须确保通过继承接口派生的任何方法或属性也能得到相应的实现。否则就应删除,以防使用基础中提供的实现方式。会显示相应的编译错误信息或警告,由添加的 pragma 属性自动提示。更多信息,请参阅“Implementing Interfaces” 命令的帮助页面。




注意

-
在通过变量调用方法之前,必须将功能块的接口赋值给接口类型的变量。
-
接口类型的变量始终是指定功能块实例的引用。
接口类型的变量是对功能块实例的引用。这种变量可以引用实现接口的每个功能块。如果没有给变量赋值,则联机模式下的变量包含值0
。
示例
I1
接口包含GetName
方法。
METHOD GetName : STRING
功能块A
和B
实现了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
调用接口方法:
在这种情况下,应用程序是调用 A.GetName
还是 B.GetName
,取决于 l_i
的实际类型。
DeliverName := l_i.GetName();
在新功能块中实现接口
要求:打开的项目至少有一个接口对象。
-
右键单击设备树中的“Application” ,然后选择“Project Add Object POU” 。
“Add POU” 对话框将打开。
-
在“Name” 输入字段中键入新 POU 的名称,例如“POU_Im” 。
-
选择“功能块” 。
-
单击“已实施” ,然后单击更多按钮 (
)。
-
在输入助手中,从“接口类别中选择接口” ,例如
ITF1
,然后点击“OK” 。 -
要插入更多接口,请单击
并选择另一个接口。
-
作为选项,您可以从选择列表中为新功能块选择“Access 修改器” 。
-
从“实现语言” 组合框中选择(例如:“结构化文本 (ST)”.
-
单击“添加” 。
CODESYS 将“POU_Ex” 功能块添加到设备树并打开编辑器。第一行包含文本:
FUNCTION_BLOCK POU_Im IMPLEMENTS ITF1
现在,接口及其方法和属性已插入设备树中功能块的下方。现在,你可以在接口及其方法的实现部分输入程序代码。
在现有功能块中实现接口
要求:当前打开的项目有一个功能块(例如:“POU_Im”) 和至少一个接口对象(示例:“ITF1” )。
-
双击设备树中的“POU_Ex(FB)” POU。
POU 编辑器打开。
-
将最上面一行
FUNCTION_BLOCK POU_Im
中的现有条目扩展为IMPLEMENTS ITF1
“POU_Im” 功能块实现了“ITF1” 接口。
另见