Saltar al contenido principal

Ejemplo 10 - Contador de horas de funcionamiento, timeout de señal

Ejemplo 10a - Contador de horas de funcionamiento​

Tarea​

A partir de una señal de control digital COMPRESSOR se debe determinar la duración de funcionamiento del grupo correspondiente y mostrarla en horas.

Solución​

CompressorOnTime_h = integrate(bool(COMPRESSOR), {storage: 'tot_compressor'}) / 3600; // output in hours

Funciones utilizadas​

Explicación​

La integral de una constante CC en el intervalo de 0 a un tiempo t da, con C=1C = 1, el tiempo sobre el que se integra:

Ton=∫0tC⋅dτ=C⋅tT_{on} = \int_{0}^{t} C \cdot d\tau = C \cdot t

Si se integra una señal de conmutación digital cambiante con los valores 0 y 1, se obtiene el tiempo acumulado durante el cual la señal estuvo en 1.

La indicación de storage es obligatoria para que, tras un reinicio del software, se comience con el último valor calculado.

Ejemplo 10b - Timeout de señal​

Tarea​

Para una señal de medición MEASURE se debe comprobar si la señal sigue activa. Para ello se supone que la señal de medición de una magnitud física presenta siempre, debido al ruido, al menos fluctuaciones mínimas.

El fallo del sensor también puede deberse a una interrupción de la comunicación de datos (CAN, MVB). En este caso ya no llegan datos nuevos al canal de smartCORE.

El estado de timeout debe activarse cuando la señal de medición no muestra actividad durante 10 segundos.

Solución 1​

#timeless MEASURE
MEASURE_TimeOut = integrate(1, onchange(MEASURE), {upper: 100}) > 10;

Funciones utilizadas​

Explicación​

También aquí se emplea una integral para la medición del tiempo. A diferencia del Ejemplo 8b, sin embargo, se utiliza la entrada de reinicio (reset) de la función de integración para que la integración comience una y otra vez en 0.

Como evento para ello se utiliza la función onchange(), que proporciona un impulso mínimamente breve cada vez que cambia la señal de medición MEASURE.

No se necesita una memoria persistente en la integral, pero el valor de la integral se limita por arriba (upper) a 100. Así, la comparación para el timeout a los 10 segundos puede calcularse cómodamente.

La macro #timeless es necesaria porque ya la propia comunicación de datos debe considerarse poco fiable. Como el módulo matemático evalúa los datos siempre con la secuencia temporal correcta, el cálculo de la función de integral se interrumpiría (¡y con él también la generación de alarmas!) hasta que llegara un nuevo valor medido, o hasta que se generaran automáticamente nuevos registros de datos tras inputTimeoutS.

aviso

Con el modo timeless, este canal queda excluido en general del cálculo con la secuencia temporal correcta. Si el canal se necesita de todos modos para cálculos, la supervisión o supervisiones de actividad pueden trasladarse a una instancia propia del módulo matemático.

consejo

La macro #timeless acepta varios nombres de señal, que deben separarse entre sí con ,. Deben utilizarse comillas si el nombre de la señal contiene caracteres especiales. El uso de la sintaxis $'...' no está permitido aquí, ya que no se accede al valor del canal.

Solución 2​

#timeless MEASURE
MEASURE_TimeOut = !pulse(onchange(MEASURE), {duration: 10, restart: true});

Funciones utilizadas​

Explicación​

Aquí se utiliza la función pulse() para generar, a partir de un evento, un impulso con la duración duration indicada. Si llega un nuevo evento antes de que transcurra la duración, el ajuste restart: true prolonga el impulso, de modo que a partir del nuevo evento se vuelve a esperar la duración completa.

Como evento para ello se utiliza de nuevo la función onchange(), que proporciona un impulso mínimamente breve cada vez que cambia la señal de medición MEASURE.

Como el resultado de la función pulse() debe entenderse aquí más bien como un monitor de actividad, el TimeOut resulta de la inversión con el operador !.

La macro #timeless tiene la misma función que en la solución 1.