Convierte un bloque de función en una función definidas por el usuario para ahorra pasos de programa
El principal propósito de estas funciones es simplificar la sustitución de los bloques de función (FBs) por funciones (FUNs). Varias instancias a FB en subrutinas separadas se reemplazan por una función en una subrutina.
Bloque de función |
Función convertida |
![]() |
![]() |
No todas las instrucciones Panasonic se pueden utilizar en una función común. Ejemplo de instrucciones que no se pueden utilizar en una función común:
Algunas instrucciones del contador de alta velocidad F166_HighSpeedCounter_Set, F165_HighSpeedCounter_Cam
Algunas instrucciones de posicionamiento como F166_PulseOutput_Set, F171_PulseOutput_Trapezoidal
Comprobar estas restricciones en detalle.
Se necesita mucho menos código de programa
Se necesitan menos relés internos (R)
Se pueden utilizar en bucles utilizado arrays de las DUTs
Se necesita tiempo y esfuerzo de desarrollo y mantenimiento adicional
Se debe verificar con precaución la función convertida
Necesita una mayor comprensión de la función por parte del usuario
La monitorización es más compleja puesto que no se pueden monitorizar instancias, solo se monitoriza la última llamada.
Se necesitan más registros de datos (DT)
Aumenta el ciclo de scan y disminuye el rendimiento del PLC
El comportamiento de las funciones de temporizador puede diferir ligeramente comparado con los FBs de tipo temporizador
Comprobar en detalle si el comportamiento de la nueva función se corresponde con el comportamiento del FB especialmente si se llama varias veces a la nueva función.
Utilizar Funciones en lugar de Bloques de función solamente cuando sea necesario
No utilizar Funciones en lugar de Bloques de función si no es realmente necesario
Analizar en detalle que bloque de función debería convertirse para obtener el máximo beneficio con el mínimo esfuerzo
Los principales criterios para decidir si se debe convertir un bloque de función son: ¿Cuántas veces se llama al bloque de función? ¿Cuántos pasos necesita el bloque de función?
Con la siguiente fórmula se puede calcular cuántos pasos de programa se pueden ahorrar con la conversión.
Para la siguiente situación actual:
Dado un bloque de función
Que se llama X veces
Utiliza Y pasos => Número total de pasos: X * Y pasos
Utiliza TON, SR, relés de pulso
El FB descrito puede reemplazarse por una función con los siguientes requisitos:
Pasos adicionales para X llamadas para copiar los datos de la DUT dos veces, es decir. X * 2 * 7 pasos aproximadamente (por ejemplo, para dos FP10_BKMV)
Y * 2 pasos para una llamada a la función común (se toman algunos pasos adicionales)
Una llamada común de:
TON_FUN que utiliza xxx pasos
SR_FUN que utiliza xxx pasos
R_TRIG_FUN que utiliza xxx pasos
Este ejemplo proporciona solamente unas cifras aproximadas.
Dado un bloque de función
Que se llama 30 veces
Utiliza 750 pasos => Número total de pasos: 30 * 750 pasos = 22.500 pasos
Utiliza TON, SR, relés de pulso
El FB descrito puede reemplazarse por una función con los siguientes requisitos:
Pasos adicionales para 30 llamadas para copiar los datos de la DUT dos veces, es decir, 30 * 2 * 7 pasos aproximadamente (por ejemplo, para dos FP10_BKMV)
750 * 2 pasos para una llamada a la función común (se toman algunos pasos adicionales)
Una llamada común de:
TON_FUN que utiliza 200 pasos
SR_FUN que utiliza 35 pasos
R_TRIG_FUN que utiliza 35 pasos
Nº total de pasos: 420 pasos + 1.500 pasos + 200 pasos + 35 pasos + 35 pasos = 2.190 pasos
Resultado: Utilizando esta función se ahorra aproximadamente 22.500 pasos - 2.190 pasos = 20.310 pasos.
Procedimiento de conversión de un bloque de función de usuario XXX a una función XXX_FUN
Se recomienda mantener las convenciones a la hora de asignar nombres a las funciones.
En todos los ejemplos se utiliza una function XXX con una VAR_IN_OUT dutXXX del tipo de datos XXX_FUN_INSTANCE_DUT
Operación |
Ejemplo de programación inicial |
Ejemplo de programación convertida |
---|---|---|
Llamadas ![]() |
![]() |
|
FB Cabecera de la POU ![]() |
FUN Cabecera de la POU ![]() |
|
DUT XXX_FUN_INSTANCE_DUT ![]() |
||
Set Reset |
![]() |
![]() |
KEEP |
![]() |
![]() |
Asignación condicional, cálculos |
![]() |
![]() |
Incremento/decremento de valores de variables |
![]() |
![]() |
Relés de pulso |
![]() |
![]() |
Al final de la función: Si es necesario, asignar algunas variables a las variables de salida correspondientes: |
![]() |
|
SR |
![]() |
![]() |
RS |
![]() |
![]() |
TON |
![]() |
![]() |
TM_100ms |
![]() |
![]() |
En todos los ejemplos se utiliza una function XXX con una VAR_IN_OUT dutXXX del tipo de datos XXX_FUN_INSTANCE_DUT
Operación |
Ejemplo de programación inicial |
Ejemplo de programación convertida |
---|---|---|
Set Reset |
|
|
KEEP |
|
|
Asignación condicional, cálculos |
|
|
Incremento/decremento de valores de variables |
|
|
Relés de pulso |
|
|
Al final de la función: Si es necesario, asignar algunas variables a las variables de salida correspondientes: |
|
|
SR |
|
|
RS |
|
|
TON |
|
|
TM_100ms |
|
|