llamada de método
Para implementar una llamada de método, los parámetros reales (argumentos) se pasan a las variables de la interfaz. Como alternativa, se pueden omitir los nombres de los parámetros.
Según el modificador de acceso declarado, un método solo se puede usar dentro de su propio espacio de nombres (INTERNAL
), únicamente dentro del propio bloque de programación y sus derivados (PROTECTED
) o solo dentro de su propio bloque de programación (PRIVATE
) ser llamado. en PUBLIC
el método se puede llamar en cualquier lugar.
Dentro de la implementación, un método puede llamarse recursivamente a sí mismo, ya sea directamente por medio del ESTE
puntero, o por medio de una variable local para el bloque de función asignado.
Llamada de método como una llamada de función virtual
La herencia puede dar lugar a llamadas a funciones virtuales.
Las llamadas a funciones virtuales permiten que la misma llamada en el código fuente del programa invoque diferentes métodos en tiempo de ejecución.
La llamada al método está enlazada dinámicamente en los siguientes casos:
Llamas a un método usando un puntero a un módulo de función.
Ejemplo:
pfub^.method
En esta situación, el puntero puede apuntar a instancias del tipo de bloque de funciones ya instancias de todos los bloques de funciones derivados.
Llamas al método de una variable de interfaz.
Ejemplo:
interface1.method
La interfaz puede hacer referencia a todas las instancias de bloques de funciones que implementan esta interfaz.
Un método llama a otro método del mismo módulo de función. En este caso, el método también puede llamar al método de un bloque de función derivado con el mismo nombre.
Se llama a un método utilizando una referencia a un módulo de función. En esta situación, la referencia puede apuntar a instancias del tipo de bloque de funciones ya instancias de todos los bloques de funciones derivados.
tu apuntas
VAR_IN_OUT
-Variables de un tipo de bloque de función básico a una instancia de un tipo de FB derivado.En esta situación, la variable puede apuntar a instancias del tipo del bloque de funciones ya instancias de todos los bloques de funciones derivados.
ejemplo
Los bloques de funciones fub1
y fub2
expandir el bloque de funciones fubbase
e implementar la interfaz interface1
. Están los métodos method1
y method2
.
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 will be called, otherwise fub1.method1 is called *) instRef.method1(); (* If b ist TRUE, fub1.method1 will be called, otherwise fub2.method1 is called*)
Asumiendo que fubbase
del ejemplo anterior dos métodos method1
y method2
contiene, sobrescribe fub1 method2
, pero no method1
. la llamada de method1
tiene lugar de la siguiente manera:
pInst^.method1();
Cuándo b TRUE
es, llamadas CODESYSfubbase.method1
arriba, de lo contrario fub1.method1
.
Salidas adicionales
Según la norma IEC 61131-3, los métodos, al igual que las funciones normales, pueden tener salidas adicionales declaradas. Al llamar al método, asigna variables a las salidas adicionales.
Puede encontrar información detallada al respecto en el tema "Función".
Sintaxis cuando se llama
<function block name>.<method name>(<first input name> := <value> (, <further input assignments>)+ , <first output name> => <first output variable name> (,<further output assignments>)+ );
declaración
METHOD PUBLIC DoIt : BOOL VAR_INPUT iInput_1 : DWORD; iInput_2 : DWORD; END_VAR VAR_OUTPUT iOutput_1 : INT; sOutput_2 : STRING; ENDVAR
llamar
fbInstance.DoIt(iInput_1 := 1, iInput_2 := 2, iOutput_1 => iLocal_1, sOUtput_2 => sLocal_2);
Cuando se llama al método, los valores de las salidas del método se escriben en la variable de salida declarada localmente.
Llamar a un método incluso si la aplicación está en estado STOP
En la descripción del dispositivo se puede definir que una determinada instancia de bloque de función (de un bloque de biblioteca) siempre llame a un determinado método en un ciclo de tarea. Si el método toma los parámetros de entrada del siguiente ejemplo, funciona CODESYS el método también se inicia cuando la aplicación activa se encuentra actualmente en estado STOP:
VAR_INPUT pTaskInfo : POINTER TO DWORD; pApplicationInfo: POINTER TO _IMPLICIT_APPLICATION_INFO; END_VAR (*Now the status of the application can be queried via pApplicationInfo and the instructions can be implemented: *) IF pApplicationInfo^.udState = 1 THEN <instructions> END_IF;
Método de llamada recursivamente
Sugerencia
Utilice recursiones principalmente para manipular tipos de datos recursivos, como listas vinculadas. En general, es recomendable tener cuidado al usar la recursividad. Una recursividad inesperadamente profunda puede conducir a un desbordamiento de la pila y, por lo tanto, a una parada de la máquina.
Dentro de su implementación, un método puede llamarse a sí mismo:
Directamente por medio de la
ESTE
punteroindirectamente utilizando una instancia de bloque de funciones local del bloque de funciones básico
Por lo general, se emite una advertencia del compilador para una llamada recursiva de este tipo. Si el método se proporciona con el pragma {attribute 'estimated-stack-usage' := '<estimated stack size in bytes>'}
, se suprime la advertencia del compilador. Para ver un ejemplo de implementación, consulte el Atributo 'estimated-stack-usage' capítulo.