La programación orientada a objetos con bloques de funciones, aparte de ofrecer extensión mediante EXTENDS, admite el posible uso de interfaces y herencias. Esto requiere invocaciones de métodos con resolución dinámica, también denominadas llamadas de función virtuales.
Las llamadas de función virtuales necesitan algo más de tiempo que las llamadas de función normales, y se utilizan en los siguientes casos:
oCuando se realiza una llamada mediante un puntero a un bloque de funciones (pfub^.method).
oCuando se llama a un método de una variable de interfaz (interface1.method).
oCuando un método llama a otro método del mismo bloque de funciones.
oCuando se realiza una llamada mediante una referencia a un bloque de funciones.
oCuando a VAR_IN_OUT de un tipo de bloque de funciones de base se le puede asignar una instancia de un tipo de bloque de funciones derivado.
Las llamadas de función virtuales permiten que la misma llamada en un código fuente de programa invoque diferentes métodos durante el tiempo de ejecución.
Para obtener información más detallada, consulte:
oMétodo para obtener más información sobre métodos.
oPuntero THIS para obtener más información sobre el uso del puntero THIS.
oPuntero SUPER para obtener más información sobre el puntero SUPER.
Según el estándar IEC 61131-3 , los métodos como las funciones normales pueden tener salidas adicionales. Pueden asignarse a la llamada de método según la sintaxis siguiente:
<método>(in1:=<valor> |, más asignaciones de entrada, out1 => <variable de salida 1> | out2 => <variable de salida 2> | ...más asignaciones de salida)
Como resultado, la salida del método se escribe en las variables declaradas localmente tal como se especifica en la llamada.
Supongamos que los bloques de funciones fub1 y fub2 EXTEND el bloque de funciones fubbase e IMPLEMENT interface1. Se incluye el método method1.
Posible uso de las interfaces y llamadas de método:
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 *)
Supongamos que fubbase del ejemplo anterior contiene 2 métodos, method1 y method2. fub1 anula method2 pero no method1.
Se llama a method1, tal como se muestra en el ejemplo anterior.
pInst^.method1(); (* If b is true fubbase.method1 is called, else fub1.method1 is called *)
Para realizar la llamada mediante el puntero THIS, consulte Puntero THIS.