Skip to main content

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

ejemplo 31. métodos sobrecargados

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>)+ );
ejemplo 32. ejemplo

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:

ejemplo 33. ejemplo
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 puntero

  • indirectamente 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.