方法调用

功能块面向对象的编程方式支持扩展功能 EXTENDS - 支持可能使用的 接口 继承。这需要使用动态解析的方法调用,也被称为“内部函数调用”。

当有以下情况时,使用虚拟函数调用比普通函数调用花费更多的时间:

  • 通过一个功能块指针进行调用(pfub^.method)
  • 一个接口函数的方法调用 (interface1.method)
  • 一个方法调用同一个功能块中的另一个方法
  • 一个调用通过引用进入到功能块
  • FB的基本类型VAR_IN_OUT被分配给派生的FB的一个实例。

虚函数调用与程序源代码中的调用在运行系统中将调用不同的方法。

更多的参考信息请参阅:

调用方法

根据 IEC 61131-3 国际标准,像“标准” 函数方法可以拥有附加输出值。这些都必须根据语法在函数调用时进行分配:

<method>(in1:=<value> |, further input assignments, out1 => <output variable 1> | out2 => <output variable 2> | ...further output variables)

这种方式中输出值被直接赋予调用过程中定义的本地变量值。

示例

假设功能块fub1fub2 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包含两个方法method1method2fub1 包含 method2但不包含method1

method1 可以被以上示例中的形式进行调用:

pInst^.method1(); (* If b is true fubbase.method1 is called, else fub1.method1 is called *)
 

更多关于 THIS 指针的使用,请参阅 “THIS 指针”