功能块面向对象的编程方式支持扩展功能 ⇘ EXTENDS - 支持可能使用的 ⇘ 接口 和 ⇘ 继承。这需要使用动态解析的方法调用,也被称为“内部函数调用”。
当有以下情况时,使用虚拟函数调用比普通函数调用花费更多的时间:
虚函数调用与程序源代码中的调用在运行系统中将调用不同的方法。
更多的参考信息请参阅:
根据 IEC 61131-3 国际标准,像“标准” ⇘ 函数方法可以拥有附加输出值。这些都必须根据语法在函数调用时进行分配:
<method>(in1:=<value> |, further input assignments, out1 => <output variable 1> | out2 => <output variable 2> | ...further output variables)
这种方式中输出值被直接赋予调用过程中定义的本地变量值。
示例
假设功能块fub1 和 fub2 EXTEND 是从功能块fubbase 扩展而来,并且执行( IMPLEMENT ) interface1。 方法method1 已经包含。
可能使用的接口和方法调用:
PROGRAM PLC_PRG VAR_INPUT b : BOOL; END_VAR VAR pInst : POINTER TO fubbase; instBase : fubbase; inst1 : fub1; inst2 : fub2; instRef : REFERENCE to fubbase; END_VAR IF b THEN instRef REF= inst1; (* Reference to fub1 *) pInst := ADR(instBase); ELSE instRef REF= inst2; (* Reference to fub2 *) pInst := ADR(inst1); END_IF pInst^.method1(); (* If b is true, fubbase.method1 is called, else fub1.method1 is called *) instRef.method1(); (* If b is true, fub1.method1 is called, else fub2.method1 is called *)
现在假设以上程序中的fubbase包含两个方法method1 和 method2。 fub1 包含 method2但不包含method1。
method1 可以被以上示例中的形式进行调用:
pInst^.method1(); (* If b is true fubbase.method1 is called, else fub1.method1 is called *)
更多关于 THIS 指针的使用,请参阅 ⇘ “THIS 指针”。