Beispiel 10 - Betriebsstundenzähler, Signal-Timeout
Beispiel 10a - Betriebsstundenzähler
Aufgabe
Aus einem digitalen Steuersignal COMPRESSOR soll die Betriebsdauer des zugehörenden Aggregats bestimmt werden und in Stunden zur Anzeige kommen.
Lösung
CompressorOnTime_h = integrate(bool(COMPRESSOR), {storage: 'tot_compressor'}) / 3600; // output in hours
Verwendete Funktionen
Erläuterung
Das Integral über einer Konstanten im Zeitraum von 0 bis zur Zeit t ergibt mit die Zeit, über der integriert wird:
Integriert man über ein wechselndes, digitales Schaltsignal mit den Werten 0 und 1 erhält man die akkumulierte Zeit, für die das Signal auf 1 stand.
Die Angabe des storage ist zwingend, um nach einem Neustart der Software mit dem zuletzt berechneten Wert zu satrten.
Beispiel 10b - Signal-Timeout
Aufgabe
Für ein Messsignal MEASURE soll geprüft werden, ob das Signal noch aktiv ist. Dafür wird angenommen, dass das Messsignal einer physikalischen Größe durch das Rauschen immer wenigstens minimal kleine Schwankungen liefert.
Der Sensorausfall kann auch durch eine Unterbrechung der Datenkommunikation (CAN, MVB) bedingt sein. In diesem Fall kommen auf dem smartCORE-Kanal keine neuen Daten mehr an.
Der Timeout-Zustand soll gesetzt werden, wenn das Messsignal für 10 Sekunden keine Aktivität zeigt.
Lösung 1
#timeless MEASURE
MEASURE_TimeOut = integrate(1, onchange(MEASURE), {upper: 100}) > 10;
Verwendete Funktionen
Erläuterung
Auch hier wird ein Integral zur Zeitmessung eingesetzt. Anders als beim Besipiel 8b wird jedoch der Reset-Eingang der Integralfunktion benutzt, um die Integration immer wieder bei 0 beginnen zu lassen.
Als Ereignis dafür wird die Funktion onchange()
verwendet, die immer dann einen minimal kurzen Impuls liefert, wenn sich das Messsignal MEASURE ändert.
Ein Persistenter Speicher am Integral wird nicht benötigt, allerdings wird der Integralwert nach oben (upper) auf 100 begrenzt. So kann der Vergleich für den Timeout nach 10 Sekunden bequem berechnet werden.
Das Macro #timeless
wird benötigt, da bereits die Datenkommunikation als unsicher angesehen werden muss. Da das Mathe-Modul Daten immer zeitrichtig auswertet, würde die Berechnung der Integralfunktion aussetzen (also auch keine Alarmierung!), bis ein neuer Messwert eingetroffen ist - oder nach inputTimeoutS automatisch neue Datensätze generiert werden.
Durch den timeless-Mode wird dieser Kanal generell von der zeitrichtigen Verrechnung ausgenommen. Wird der Kanal dennoch für Berechnungen benötigt, kann man die Aktivitätsüberwachung(en) in eine eigene Instanz des Mathe-Moduls verlagern.
Das Macro #timeless
akzeptiert mehrere Signalnamen, die voneinander durch ,
zu trennen sind. Anführungszeichen sollten verwendet werden, wenn der Signalname Sonderzeichen enthält. Die Verwendung der $'...'
Syntax ist hier unzulässig, da nicht auf den Wert des Kanals zugegriffen wird.
Lösung 2
#timeless MEASURE
MEASURE_TimeOut = !pulse(onchange(MEASURE), {duration: 10, restart: true});
Verwendete Funktionen
Erläuterung
Hier wird die Funktion pulse()
verwendet, um aus einem Ereignis einen Impuls der vorgegebenen Laufzeit duration zu erzeugen. Kommt ein neues Ereignis noch vor Ablauf der Laufzeit, wird durch die Einstellung restart: true der Impuls verlängert, sodass ab dem neuen Ereignis wieder die Laufzeit abgewartet wird.
Als Ereignis dafür wird wieder die Funktion onchange()
verwendet, die immer dann einen minimal kurzen Impuls liefert, wenn sich das Messsignal MEASURE ändert.
Da das Ergebnis der Funktion pulse()
hier eher als Aktivitäts-Monitor zu verstehen ist, ergibt sich der TimeOut durch die Invertierung mit dem !
-Operator.
Das Macro #timeless
hat dieselbe Funktion wie in Lösung 1.