Método: FB_Init
, FB_Reinit
, FB_Exit
Puede declarar los métodos explícitamente para influir en la inicialización de las variables del bloque de funciones, así como en el comportamiento al salir de los bloques de funciones.
Sugerencia
El tipo del valor de retorno para los métodos implícitos es BOOL
. El sistema no evalúa el valor, pero el tipo no debe cambiarse.
FB_Init
siempre está disponible de forma implícita y se utiliza principalmente para la inicialización. Para una influencia específica, también puede declarar los métodos explícitamente y proporcionar código adicional allí con el código de inicialización estándar.
FB_Reinit
tiene que ser implementado explícitamente. Si este método existe, se llama después de que la instancia del bloque de funciones afectado se haya copiado. Eso sucede durante un cambio en línea después de cambios en la declaración del bloque de funciones (cambio de firma) para reinicializar el nuevo módulo de instancia. Para reinicializar la implementación básica del bloque de funciones, debe llamar FB_Reinit
explícitamente.
FB_Exit
debe implementarse explícitamente. Si hay una implementación, se llama al método antes de que el controlador elimine el código de la instancia del bloque de funciones (llamada implícita).
A continuación se muestran algunos casos de uso de estos métodos para diferentes condiciones de operación.
Caso operativo "Primera descarga"
Al descargar una aplicación a un PLC con la configuración de fábrica, la memoria de todas las variables debe compensarse con el estado inicial requerido. De esta forma, se asignan los valores necesarios a las áreas de datos de las instancias de bloques de función. Por la implementación explícita de FB_Init
para los bloques de funciones, puede reaccionar específicamente a esta situación en el código de la aplicación. Evaluando los parámetros del método bInCopyCode
(FALSE
) y bInitRetains
(TRUE
), puede detectar claramente esta condición de funcionamiento.
Caso operativo "Cambio en línea"
En el marco del cambio online, puede influir en la inicialización de instancias de bloques de función mediante los métodos FB_Exit
, FB_Init
, y FB_Reinit
. Durante el cambio en línea, los cambios en la aplicación que se realizaron en el modo fuera de línea se aplican en el PLC en ejecución. Por lo tanto, las instancias de bloque de funciones "antiguas" se reemplazan por sus "nuevos hermanos" tanto como sea posible sin incidentes. Si no se realizaron cambios en la parte de declaración de un bloque de funciones en la aplicación antes de iniciar sesión, pero solo en la implementación, las áreas de datos no se reemplazan. Solo se reemplazan los bloques de código. Entonces los métodos FB_Exit
, FB_Init
, y FB_Reinit
no son llamados.
Sugerencia
Si ha realizado cambios en la declaración de un bloque de funciones que conducen a la operación de copia descrita anteriormente, recibirá un mensaje durante el cambio en línea sobre "posibles efectos no deseados". En el Detalles de la vista de mensajes, verá una lista de todas las instancias que se van a copiar.
En el código de la FB_Init
método, el parámetro bInCopyCode
(TRUE
) puede evaluarse para detectar si se está ejecutando o no un cambio en línea.
Las siguientes llamadas ocurren en sucesión durante un cambio en línea:
FB_Exit
old_inst.FB_Exit(bInCopyCode := TRUE);
Puedes llamar
FB_Exit
al salir de la instancia "antigua" para activar tareas de limpieza específicas antes de la operación de copia. De esta forma, puede preparar los datos para la siguiente operación de copia e influir en el estado de la nueva instancia. Puede notificar a otras partes de la aplicación sobre el cambio pendiente de ubicación en la memoria. Presta especial atención a las variables de tipoPOINTER
yREFERENCE
. Es posible que estos ya no se refieran a las ubicaciones de memoria requeridas después del cambio en línea. Variables de interfaz (INTERFACE
) son manejados por separado por el compilador y se adaptan en consecuencia durante el cambio en línea. La nueva instancia puede aplicar recursos externos, como sockets, archivos u otros identificadores, en algunos casos sin cambios. A menudo no tienen que ser tratados de forma especial durante un cambio en línea. (Ver "Caso operativo 'Volver a descargar'")FB_Init
new_inst.FB_Init(bInitRetains := FALSE, bInCopyCode := TRUE);
FB_Init
se llama antes de la operación de copia y se puede utilizar para ejecutar operaciones específicas para el cambio en línea. Por ejemplo, puede inicializar variables en consecuencia en la ubicación "nueva" en la memoria, o notificar a otras partes de la aplicación sobre la nueva ubicación de variables específicas en la memoria.Operación de copia:
copy
copy(&old_inst, &new_inst);
Los valores existentes permanecen sin cambios. Para ello, se copian de la instancia anterior a la instancia nueva.
FB_Reinit
new_inst.FB_Reinit();
Este método se llama después de la operación de copia y debe establecer valores definidos para las variables de la instancia. Por ejemplo, puede inicializar variables en consecuencia en la ubicación "nueva" en la memoria, o notificar a otras partes de la aplicación sobre la nueva ubicación de variables específicas en la memoria. Diseñe la implementación independientemente del cambio en línea. El método también se puede llamar desde la aplicación en cualquier momento para restablecer una instancia de bloque de funciones a su estado original.
Sugerencia
Con el {attribute 'no_copy'}
atributo, puede evitar que se copie durante el cambio en línea para una sola variable del bloque de función. Siempre conserva el valor inicial.
Para más información, ver: Reserva de memoria de ajustes para cambio en línea
Caso operativo "Nueva descarga"
Al descargar una aplicación, se puede reemplazar una aplicación existente en el PLC. Por lo tanto, debe regularse la provisión de memoria para los bloques de función presentes. Puedes usar el FB_Exit
método para implementar los pasos requeridos para esto. Por ejemplo, puede compensar recursos externos (con identificadores de archivos y sockets) en un estado definido.
Puede detectar esta condición de funcionamiento comprobando si el parámetro bInCopyCode = FALSE
Para el FB_Exit
método.
Caso de funcionamiento "Inicio de la aplicación"
Las asignaciones iniciales se procesan antes del primer ciclo de las tareas de la aplicación.
T1 : TON := (PT:=t#500ms);
Este tipo de asignaciones se ejecutan solo después de llamar FB_Init
. Para controlar los efectos de estas asignaciones, puede proporcionar un bloque de funciones o un método de un bloque de funciones con el {attribute ‘call_after_init‘}
atributo. Debe agregar el atributo sobre la parte de la declaración del cuerpo del bloque de funciones y sobre la parte de la declaración del método correspondiente. Una POU que se extiende a otra POU que utiliza el {attribute 'call_after_init'}
atributo también debe tener el atributo. En beneficio de la claridad, recomendamos que los métodos correspondientes se sobrescriban con el mismo nombre, la misma firma y el mismo atributo. Esto requiere llamar SUPER^.MyInit
. El nombre del método se puede elegir sin restricciones. (Excepciones: FB_Init
, FB_Reinit
, y FB_Exit
). El método se llama después de procesar las asignaciones iniciales y antes de iniciar las tareas de la aplicación. Por lo tanto, el método puede reaccionar a la entrada del usuario.
Cuando usas FB_Init
o {attribute 'call_after_init'}
, recuerda que detectar errores en el FB_Init
método o en métodos decorados con el {attribute 'call_after_init'}
El atributo es tedioso, porque la configuración de los puntos de interrupción puede no tener el efecto esperado.
Importante
Si se alcanza el código de inicialización definido explícitamente durante la ejecución, la instancia del bloque de funciones ya está completamente inicializada a través del código de inicialización implícito. Por lo tanto, no debe haber un SUPER^.FB_Init
llamar.
Importante
FB_Init
reemplaza el INI
operador que se utiliza en CoDeSys V2.3. Los métodos no se pueden comparar con el diseño de un constructor, como en C#, C++ o Java. Esto tiene consecuencias para los bloques de funciones que amplían otros bloques de funciones. (Ver más abajo: "Bloques de función derivados")
Interfaz de 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
Puede declarar entradas de bloques de funciones adicionales en un FB_init
método. Luego, debe establecer estas entradas en la declaración de la instancia del bloque de funciones.
Método FB_Init
Para el serialdevice
bloque de funciones
METHOD PUBLIC FB_Init : BOOL VAR_INPUT nbInitRetains : BOOL; // initializing of retain variable 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 de la serialdevice
bloque de funciones:
com1: serialdevice(iCOMnum:=1); com0: serialdevice(iCOMnum:=0);
Interfaz de método FB_Reinit
METHOD FB_Reinit : BOOL
Interfaz de método FB_Exit
No es el parámetro obligatorio bInCopyCode
.
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
Comportamiento de los bloques de funciones derivados
Si un bloque de funciones se deriva de otro bloque de funciones, entonces el FB_Init
El método del bloque de función derivado debe definir los mismos parámetros que el FB_Init
método del bloque de función básico. Sin embargo, puede agregar más parámetros para configurar una inicialización especial para la instancia.
Los bloques de funciones MainFB
, SubFB
, y SubSubFB
se derivan unos de otros. Por lo tanto, SubFB EXTENDS MainFB
y SubSubFB EXTENDS SubFB
solicitar.
FB_Exit
y FB_Init
:fbSubSubFb.FB_Exit(...);
fbSubFb.FB_Exit(...);
fbMainFb.FB_Exit(...);
fbMainFb.FB_Init(...);
fbSubFb.FB_Init(...);
fbSubSubFb.FB_Init(...);