Método

Descripción general

Un método es un elemento del lenguaje, similar a una función, que puede utilizarse en el contexto de un bloque de funciones. Se puede considerar una función que contiene una instancia del bloque de funciones respectivo. Como tal, el método tiene un valor de retorno, y su parte de declaración propia para variables temporales y parámetros.

También, como medio de programación orientada a objetos, puede utilizar interfaces para organizar los métodos disponibles en un proyecto.

NOTA: Al copiar o desplazar un método o una propiedad de un POU a una interfaz, las implementaciones contenidas se eliminan de forma automática. Al copiar o desplazar de una interfaz a un POU, se solicita especificar el lenguaje de implementación deseado.

Inserción de un método

Para asignar un método a un bloque de funciones o a una interfaz, seleccione el nodo de interfaz o bloque de funciones correspondiente en el Árbol de aplicaciones, haga clic en el botón de signo más de color verde y ejecute el comando Método. Como alternativa, puede hacer clic con el botón derecho en el nodo de interfaz o bloque de funciones y ejecutar el comando Agregar objeto > Método en el menú contextual.

En el cuadro de diálogo Añadir método, introduzca un Nombre, el Tipo de retorno deseado, el Lenguaje de implementación: y el Modificador de acceso (véase a continuación). Si el método no tiene una implementación y la implementación la proporciona el bloque de función derivado, seleccione la opción Resumen. Para elegir el tipo de datos de retorno, haga clic en el botón para abrir el cuadro de diálogo Asistente….

Modificador de acceso: por motivos de compatibilidad, los modificadores de acceso son opcionales. El modificador PUBLIC está presente como equivalente a no establecer ningún modificador.

Como alternativa, seleccione una de las opciones de la lista de selección:

  • PRIVATE: el acceso en el método se restringe al bloque de función.

  • PROTECTED: el acceso en el método se restringe al bloque de función y su derivación.

  • INTERNAL: el acceso en el método se restringe al espacio de nombres actual (la biblioteca).

Haga clic en Abrir para confirmar. Se abrirá la vista del editor de métodos.

Accesibilidad al crear bloques de funciones heredados

EcoStruxure Machine Expert facilita la programación orientada a objetos utilizando la herencia dentro de los bloques de funciones. Al ejecutar Agregar objeto sobre un bloque de funciones que hereda de otro, los elementos Acción, Método, Propiedad y Transición utilizados en el bloque de funciones base se enumeran para seleccionarlos.

  • Los elementos Acción, Método, Propiedad y Transición con Modificador de acceso = PUBLIC, PROTECTED e INTERNAL definidos en el bloque de funciones base están disponibles para seleccionarlos. Puede adaptar la definición para el objeto heredado. En el objeto heredado, se asigna el mismo Modificador de acceso que a los elementos origen.

  • Los elementos Acción, Método, Propiedad y Transición con Modificador de acceso = PRIVATE no se pueden seleccionar porque el acceso está restringido al bloque de funciones base.

Declaración de un método

Sintaxis:

METHOD <modificador de acceso> <nombre del método>: <tipo de datos de retorno>VAR_INPUT ... END_VAR

Para obtener una descripción sobre cómo declarar métodos de manejo de interfaces, consulte el capítulo Interfaz.

Llamada a un método

Las llamadas a métodos también se conocen como llamadas a funciones virtuales. Para obtener información adicional, consulte el capítulo Invocación de métodos.

Para llamar a un método, tenga en cuenta lo siguiente:

  • Los datos de un método son temporales y solo son válidos durante la ejecución del método (variables de pila). Esto significa que las variables y los bloques de funciones declarados en un método se reinicializan en cada llamada al método.

  • Solo se permite que los métodos definidos en una interfaz tengan variables de entrada, salida y entrada/salida, pero no cuerpo (parte de la implementación).

  • Los métodos como las funciones pueden tener salidas adicionales. Se deben asignar durante la invocación al método.

  • El modificador de acceso declarado define cómo se puede llamar al método:

    • INTERNAL: el método puede llamarse en su propio espacio de nombres.

    • PROTECTED: el método puede llamarse en su propia POU y sus derivados.

    • PRIVATE: el método puede llamarse en su propia POU.

    • PUBLIC: no se aplica ninguna restricción para llamar al método.

NOTA: Si no se define ningún valor de retorno para el método, se devuelve el valor de la primera salida. Si no hay ninguna salida disponible para el método, se genera un mensaje de error del compilador.

Implementación de un método

Para implementar un método, tenga en cuenta lo siguiente:

  • En el cuerpo de un método, se permite el acceso a las variables de instancia del bloque de funciones.

  • Si es necesario, utilice el puntero THIS, que siempre apunta a la instancia actual.

  • No se puede acceder a las variables VAR_TEMP del bloque de funciones en un método.

  • Un método puede llamarse a sí mismo recursivamente.

Llamada a un método

Para llamar a un método, use la siguiente sintaxis:

<return value variable> := <POU name> . <method name> ( <method input name> := <variable name> (, <further method input name> := <variable name> )* );

Ejemplo de declaración:

METHOD PUBLIC DoIt : BOOL
VAR_INPUT
    iInput_1 : DWORD;
    iInput_2 : DWORD;
    sInput_3 : STRING(12);
END_VAR

Ejemplo de llamada:

bFinishedMethod := fbInstance.DoIt(sInput_3 :='Hello World ', iInput_2 := 16#FFFF,iInput_1 := 16);
NOTA: Cuando se llama al método, el valor de retorno del método se asigna, por ejemplo, a variables declaradas localmente. Cuando omita los nombres de las variables de entrada, asegúrese de obedecer el orden de declaración.

Ejemplo de declaración:

METHOD PUBLIC DoIt : BOOL
VAR_INPUT
    iInput_1 : DWORD;
    iInput_2 : DWORD;
    sInput_3 : STRING(12);
END_VAR

Ejemplo de llamada:

bFinishedMethod := fbInstance.DoIt( 16, 16#FFFF,'Hello World ');

Llamada de método recursiva

En la implementación, un método puede llamarse a sí mismo, ya directamente usando el puntero THIS, ya usando una variable local para el bloque de funciones asignado.

  • THIS^. <method name> ( <parameter transfer of all input and output variables>)

    Llamada directa de la instancia de bloque de funciones pertinente con el puntero THIS.

  • VAR fb_Temp : <function block name>; END_VAR

    Llamada usando una variable local del método que instancia temporalmente el bloque de funciones pertinente.

Una llamada recursiva produce un mensaje de compilador. El mensaje de compilador no se emitirá si el método se proporciona con el pragma {attribute 'estimated-stackusage : '<estimated_stack_size_in_bytes>'}. Consulte el capítulo Attribute estimated-stack-usage si desea ver un ejemplo de implementación.

Así, especificar el nombre del método es insuficiente para las llamadas de método recursivas. En este caso, se emitirá el mensaje de compilador siguiente:

Program name, function or function block instance expected instead of
NOTA: Las llamadas recursivas son inherentemente difíciles de implementar y de depurar, y pueden provocar efectos secundarios no deseados como problemas de memoria y timeouts del watchdog.
AVISO
PROBLEMAS NO DESEADOS CON LAS APLICACIONES
  • Implemente algoritmos recursivos solo cuando sea necesario.
  • Asegúrese de comprender bien las técnicas de implementación recursiva y documente bien el código correspondiente.
Si no se siguen estas instrucciones, pueden producirse daños en el equipo.

Métodos especiales para un bloque de funciones

Método

Descripción

Init

Un método denominado FB_init se declara implícitamente de forma predeterminada, pero también se puede declarar explícitamente. Contiene código de inicialización para el bloque de funciones tal como se ha declarado en la parte de declaración del bloque de funciones. Consulte el método FB_init.

Reinit

Si se declara un método denominado FB_reinit para una instancia de bloque de funciones, este se llama después de que se haya copiado la instancia (como durante el Cambio en línea) y se reinicializa el módulo de la nueva instancia. Consulte los métodos FB_init, FB_reinit.

Exit

Si se desea un método de salida denominado FB_exit, este se debe declarar explícitamente. No hay declaraciones implícitas. El método Exit se llama para cada instancia del bloque de funciones antes de una nueva descarga, un reinicio o durante el cambio en línea para todas las instancias movidas o eliminadas. Consulte el método FB_exit.

Las propiedades y las propiedades de interfaz constan cada una de un método de acceso Set o Get.

Llamada al método también cuando la aplicación está detenida

En el archivo de descripción del dispositivo, se puede definir que siempre se llame a un determinado método con una tarea cíclica por una determinada instancia de bloque de funciones (de un módulo de biblioteca). Si este método tiene los siguientes parámetros de entrada, también se procesa cuando la aplicación activa no se está ejecutando.

Ejemplo

VAR_INPUT
pTaskInfo : POINTER TO DWORD;
pApplicationInfo: POINTER TO _IMPLICIT_APPLICATION_INFO;
END_VAR

El programador puede comprobar el estado de la aplicación mediante pApplicationInfo y definir qué debe suceder.

IF pApplicationInfo^.state = RUNNING THEN <instructions> END_IF