Esempio 10 - Contatore delle ore di esercizio, timeout del segnale
Esempio 10a - Contatore delle ore di esercizio
Compito
Da un segnale di controllo digitale COMPRESSOR deve essere determinata la durata di funzionamento del relativo gruppo e visualizzata in ore.
Soluzione
CompressorOnTime_h = integrate(bool(COMPRESSOR), {storage: 'tot_compressor'}) / 3600; // output in hours
Funzioni utilizzate
Spiegazione
L'integrale di una costante nell'intervallo da 0 al tempo t fornisce, con , il tempo su cui si integra:
Integrando un segnale di commutazione digitale variabile con i valori 0 e 1 si ottiene il tempo accumulato in cui il segnale era a 1.
L'indicazione di storage è obbligatoria per ripartire, dopo un riavvio del software, dall'ultimo valore calcolato.
Esempio 10b - Timeout del segnale
Compito
Per un segnale di misura MEASURE deve essere verificato se il segnale è ancora attivo. A tale scopo si assume che il segnale di misura di una grandezza fisica presenti sempre, a causa del rumore, almeno fluttuazioni minime.
Il guasto del sensore può essere causato anche da un'interruzione della comunicazione dati (CAN, MVB). In questo caso sul canale smartCORE non arrivano più nuovi dati.
Lo stato di timeout deve essere impostato quando il segnale di misura non mostra alcuna attività per 10 secondi.
Soluzione 1
#timeless MEASURE
MEASURE_TimeOut = integrate(1, onchange(MEASURE), {upper: 100}) > 10;
Funzioni utilizzate
Spiegazione
Anche qui si utilizza un integrale per la misura del tempo. A differenza dell'Esempio 8b, però, viene utilizzato l'ingresso di reset della funzione di integrazione per far ripartire ogni volta l'integrazione da 0.
Come evento per questo viene utilizzata la funzione onchange(), che fornisce un impulso di durata minima ogni volta che il segnale di misura MEASURE cambia.
Per l'integrale non è necessaria una memoria persistente; il valore dell'integrale viene però limitato verso l'alto (upper) a 100. In questo modo il confronto per il timeout dopo 10 secondi può essere calcolato comodamente.
La macro #timeless è necessaria perché già la comunicazione dati deve essere considerata non affidabile. Poiché il modulo matematico elabora i dati sempre in modo corretto rispetto al tempo, il calcolo della funzione di integrazione verrebbe sospeso (quindi anche nessun allarme!) fino all'arrivo di un nuovo valore misurato, oppure fino alla generazione automatica di nuovi record dopo inputTimeoutS.
Con la modalità timeless questo canale viene escluso in generale dall'elaborazione corretta rispetto al tempo. Se il canale è comunque necessario per calcoli, il monitoraggio dell'attività può essere spostato in un'istanza separata del modulo matematico.
La macro #timeless accetta più nomi di segnale, da separare con ,. Se il nome del segnale contiene caratteri speciali, è opportuno utilizzare le virgolette. L'uso della sintassi $'...' non è ammesso in questo caso, perché non si accede al valore del canale.
Soluzione 2
#timeless MEASURE
MEASURE_TimeOut = !pulse(onchange(MEASURE), {duration: 10, restart: true});
Funzioni utilizzate
Spiegazione
Qui viene utilizzata la funzione pulse() per generare da un evento un impulso con la durata prestabilita duration. Se un nuovo evento arriva prima della scadenza della durata, con l'impostazione restart: true l'impulso viene prolungato, così che dal nuovo evento si attenda di nuovo l'intera durata.
Come evento viene utilizzata di nuovo la funzione onchange(), che fornisce un impulso di durata minima ogni volta che il segnale di misura MEASURE cambia.
Poiché il risultato della funzione pulse() è da intendersi qui piuttosto come monitor di attività, il TimeOut risulta dall'inversione con l'operatore !.
La macro #timeless ha la stessa funzione che nella Soluzione 1.