Tipos de métodos

 

Métodos FB_Init, FB_Reinit y FB_Exit

Finalidad general de los métodos

Es posible utilizar de manera explícita los métodos FB_Init y FB_Reinit para influir en la inicialización de las variables de bloque de funciones, así como en el comportamiento al salir de los bloques de funciones.

En este capítulo se describen los métodos, así como las aplicaciones y los efectos de los métodos en diferentes situaciones que requieren la inicialización de variables.

FB_Init

De forma predeterminada, se encuentra disponible de manera implícita el método FB_Init. Este método lo utiliza EcoStruxure Machine Expert para inicializar un bloque de funciones o una estructura.

Para influir en la inicialización, puede declarar de manera explícita el método FB_Init ampliando el código de inicialización predeterminado proporcionado. De este modo, podrá evaluar el valor de retorno.

FB_Reinit

El método FB_Reinit debe declararse de manera explícita.

Si está disponible el método FB_Reinit, se llamará una vez copiada la instancia del bloque de funciones correspondiente (durante un cambio en línea tras modificar la declaración de un bloque de funciones). Reinicializa el módulo de la nueva instancia. El valor de retorno no se evalúa. Para lograr que se reinicialice el bloque de funciones base, llame FB_Reinit de manera explícita para dicho bloque de funciones. De este modo, podrá evaluar el valor de retorno.

FB_Exit

El método FB_Exit debe declararse de manera explícita.

Si hay una implementación, el método se llamará antes de que el controlador elimine el código de la instancia del bloque de funciones (llamada implícita). El valor de retorno no se evalúa.

En los apartados siguientes se proporcionan casos de uso de estos métodos correspondientes a diferentes situaciones de uso.

Primera descarga

Cuando descarga una aplicación en un controlador que se encuentra en el estado predeter­minado, las ubicaciones de la memoria de las variables se establecerán en el estado inicial deseado. Las áreas de datos de los bloques de funciones se establecen en los valores deseados. Es posible influir en este proceso mediante la implementación explícita de FB_Init para los bloques de funciones del código del programa de la aplicación.

Los parámetros del método bInCopyCode establecidos en FALSE y bInitRetains establecidos en TRUE indican que se está ejecutando una primera descarga.

Cambio en línea

Cuando se ejecuta un comando Cambio en línea, pueden utilizarse los métodos FB_Exit, FB_Init y FB_Reinit para influir en la inicialización de los bloques de funciones.

Durante el cambio en línea, las modificaciones realizadas en la aplicación en la modalidad offline se descargarán en el controlador. Las instancias de los bloques de funciones se actualizan con las nuevas instancias de la siguiente manera:

Si solo ha realizado cambios en la parte de implementación del bloque de funciones y no en la parte de declaración, las áreas de datos no se sustituirán. No se llamarán los métodos FB_Init, FB_Reinit ni FB_Exit.

Si ha realizado cambios en la parte de declaración de un bloque de funciones, el proceso de copia descrito en el apartado FB_Reinit se ejecutará cuando se ejecute el comando Cambio en línea. En el cuadro de diálogo Información de aplicación se proporciona una lista de los objetos que se han modificado desde la última descarga. Para abrir este cuadro de diálogo, haga clic en el botón Detalles... del cuadro de diálogo cuando seleccione la opción Iniciar sesión con modificación en línea.

Los parámetros del método FB_Init y FB_Reinit bInCopyCode establecidos en TRUE y bInitRetains establecidos en FALSE indican que se está ejecutando un cambio en línea.

Llamadas ejecutadas durante un cambio en línea

La ejecución del comando Cambio online puede cambiar el contenido de las direcciones.

Caution_Color.gifATENCIÓN

PUNTERO NO VÁLIDO

Verifique la validez de los punteros al utilizarlos en direcciones y ejecutar el comando Cambio en línea.

El incumplimiento de estas instrucciones puede causar lesiones o daño al equipo.

Durante un cambio en línea, se ejecutan consecutivamente las siguientes llamadas:

Paso

Acción

Comentario

1

FB_Exit

old_inst.FB_Exit(bInCopyCode := TRUE);

FB_Exit se llama para iniciar un proceso de limpieza antes de iniciarse el proceso de copia.

Este prepara los datos para el siguiente proceso de copia e influye en el estado de la nueva instancia.

Otras partes de la aplicación son notificadas acerca de los cambios de posición que se ejecutan en la memoria.

Tenga en cuenta que las variables de tipo POINTER o REFERENCE conservan sus valores durante un cambio en línea, por lo que es posible que ya no hagan referencia a las ubicaciones de memoria deseadas una vez finalizado el proceso. Las variables de tipo INTERFACE se adaptan durante el cambio en línea. Es posible que los recursos externos, como los controladores de socket, archivo o de otro tipo, sean adoptados por la nueva instancia, por lo que a menudo no necesitan un tratamiento a parte durante el cambio en línea cuando el recurso del sistema no queda afectado por el proceso de copia del cambio en línea. Si este tratamiento fuera necesario, deberá realizarse en las implementaciones de Init o Reinit.

2

FB_Init

new_inst.FB_Init(bInitRetains := FALSE, bInCo­pyCode := TRUE);

FB_Init permite ejecutar operaciones específicas durante el proceso de cambio en línea.

Estas pueden ser, por ejemplo, inicializar correctamente las variables en las nuevas ubicaciones de la memoria o proporcionar información sobre la nueva posición de determinadas variables a otras partes de la aplicación.

3

Operación de copia copy

copy(&old_inst, &new_inst);

Los valores existentes no sufren cambios. Para ello, se copian de la instancia anterior a la nueva.

4

FB_Reinit

new_inst.FB_Reinit();

El método FB_Reinit se llama tras la operación de copia. Establece las variables de la instancia del bloque de funciones en los valores definidos.

Por ejemplo, puede inicializar correctamente las variables en las nuevas ubicaciones de la memoria o proporcionar información sobre la nueva posición de determinadas variables a otras partes de la aplicación.

Implemente el método FB_Reinit con independencia del cambio en línea, ya que la aplicación puede llamar el método en cualquier momento, siempre que deba restablecerse un bloque de funciones a su estado original.

NOTA: Si añade el pragma {attribute no_copy} a una variable de un bloque de funciones, dicha variable no se copiará durante el cambio en línea; solo se inicializará.

Descarga de una aplicación actualizada

Cuando descargue una aplicación en un controlador que ya ejecuta una aplicación, se sustituirá la aplicación existente. Puede utilizar el método FB_Exit, por ejemplo, para asignar un estado definido a recursos externos (como por ejemplo los controladores de un socket o un archivo).

Los parámetros del método bInCopyCode establecidos en FALSE y bInitRetains establecidos en FALSE indican que se está ejecutando una descarga de una aplicación actualizada.

Inicio de una aplicación

Antes de ejecutarse el primer ciclo de las tareas de una aplicación, se procesan las asignaciones iniciales.

Ejemplo:

T1 : TON := (PT:=t#500ms);

Las asignaciones se ejecutan tras la llamada de FB_Init. Para poder verificar el impacto de estas asignaciones, adjunte el pragma {attribute call_after_init} a un bloque de funciones y a un método de bloque de funciones (por ejemplo, con el nombre MyInit). Inserte este atributo encima de la parte de declaración del bloque de funciones y encima de la parte de declaración del método correspondiente. Adjunte también este pragma a los bloques de funciones que extiendan otros bloques de funciones que utilicen el pragma {attribute call_after_init}. Se recomienda asignar el mismo nombre, la misma firma y el mismo atributo al método correspondiente. Para ello, llame SUPER^.MyInit. Seleccione un nombre de método de su elección (excepto FB_Init, FB_Reinit y FB_Exit). El método se llama después de procesarse las asignaciones iniciales y antes de iniciarse las tareas de una aplicación.

NOTA: Cuando se ejecute el código de inicialización definido de manera explícita, el bloque de funciones ya se habrá inicializado completamente a través del código de inicialización implícito. Por este motivo, no se permite llamar SUPER^.FB_Init.

Interfaz del método FB_Init

METHOD FB_Init : BOOL
VAR_INPUT
  bInitRetains : BOOL; // TRUE: the retain variables are initialized (reset warm /reset cold)
  bInCopyCode : BOOL; // TRUE the instance will be copied to the copy-code afterward (online change)
END_VAR

El valor de retorno no se utiliza.

Puede declarar entradas de bloques de funciones adicionales en un método FB_Init. Asigne las entradas en la declaración de la instancia de un bloque de funciones.

Ejemplo: Método FB_Init de un bloque de funciones serialdevice:

METHOD PUBLIC FB_Init : BOOL
VAR_INPUT
    bInitRetains : BOOL; // Initialization of the retain variables
    bInCopyCode : BOOL; // Instance is copied to copy-code
    iCOMnum : INT; // additional input: number of the COM interface that is to be observed
END_VAR

Instanciación del bloque de funciones serialdevice:

    com1: serialdevice (iCOMnum:=1);
    com0: serialdevice (iCOMnum:=0);

Interfaz del método FB_Reinit

METHOD FB_Reinit : BOOL

Interfaz del método FB_Exit

El parámetro bInCopyCode. es obligatorio.

METHOD FB_Exit : BOOL
VAR_INPUT
bInCopyCode : BOOL; // TRUE: the exit method is called in order to leave the instance which will be copied afterwards (online change).
END_VAR

Bloques de funciones derivados

Si un bloque de funciones es derivado de otro, el método FB_Init del bloque de funciones derivado deberá definir los mismos parámetros que el método FB_Init del bloque de funciones base. No obstante, puede añadir otros parámetros a fin de implementar una inicialización especial para la instancia.

Ejemplo de orden de llamada de bloques de funciones derivados para FB_Exit y FB_Init

Se sobreentiende lo siguiente para las POU mencionadas en esta lista: SubFB EXTENDS MainFB y SubSubFB EXTENDS SubFB:

Paso

Acción

1

fbSubSubFb.FB_Exit(...);

2

fbSubFb.FB_Exit(...);

3

fbMainFb.FB_Exit(...);

4

fbMainFb.FB_Init(...);

5

fbSubFb.FB_Init(...);

6

fbSubSubFb.FB_Init(...);