möglicherweise bin ich auf einen Fehler in der Logik gestoßen. Die Logik-Verarbeitung wird ja so erklärt, dass bei Auslösen oder Aktualiserung einer Triggerbedingung das Programm ausgelöst wird, dann aber vom Anfang her abgearbeitet wird, wobei die angetroffenen Bedinungsblöcke wie "nur prüfen" ausgewertet werden, also so, dass Veränderungen dabei keine Rolle spielen und nur der aktuelle Zustand von Bedeutung ist. Weil eine Lüftersteuerung partout immer mit unerwartetem Verhalten überraschte, habe ich versucht mit einem Testprogramm der Sache auf den Grund zu gehen.
Die erste Version besteht aus drei aufeinenanderfolgenden Abfragen, ob ein Wert _X oberhalb eines oberen Schwellwertes (A, 70) ist, danach ober unter einem unteren Schwellwert (B, 30) liegt und, wenn das auch nicht zutrifft, ob er unter einem mittleren Schwellwert (C, 50) liegt. Zuletzt wird noch eine Bedingung geprüft, ob eine weiterer Wert _Y einen Schwellwert (D, 2) erreicht oder über schritten hat. Beim Test den Programms ergab sich das folgende, weitgehend erwartungsgemäße Resultat: Beim Auslösen der jeweiligen Schwellwert A,B,C in die festgelegte (aktive) Richtung wird die zugehörige Aktion ausgelöst und folgende Teile werden nicht mehr bearbeitet. Wird der Schwellwert entgegen der Richtung (passiv) ausgelöst, läuft das Programm bis zum Test der zweiten Variable weiter. Hat diese statisch den Schwellwertbedingung erfüllt, wird auch hier die zugehörige Aktion ausgelöst. Ist der Schwellwert nicht erreicht, wird die SONST-Aktion ausgelöst. Wird _X verändert , ohne dass sich eine zugehörige Bedingung ändert, oder nur aktualisiert wird überhaupt keine Aktion ausgeführt, also auch nicht die SONST-Aktion.
Bei Veränderungen der Variable _Y werden zunächst statisch die Schwellwertbedingungen für _X geprüft. Nur wenn keine davon erfüllt ist, im Bereich C<X<A gelangt die Abarbeitung bis zum Test von _Y, der dann entsprechend ausgewertet wird. Unerwartet ist, dass diese Bearbeitung aber auch stattfindet, wenn _Y nur aktualisiert wird und dabei keine Schwellwertbedingung von _Y verändert wird (letzte Ergebnisspalte). Die Prüfung auf Veränderung findet also nicht vor dem Aufruf des Programmes statt, sondern anscheinend erst im zugehörigen Bedingungsblock.
Nun werden die beiden letzten SONST-WENN-Blöcke getauscht, d.h. zuerst erfolgt der Test der Variable _Y, danach erst der Schwellwert C: Auch hier wieder das Ergebnis, das an einer Stelle überrascht: Erwartungsgemäß wird das Auslösen der Schwellwerte A und B in der aktiven Richtung erkannt (findet vor dem Test von _Y statt). Bei passiver Richtung gelangt das Programm zum Test von _Y und verarbeitet auch diesen korrekt.
Wird aber der Schwellwert C ausgelöst wenn die Bedingung _Y>=D erfüllt ist, sollte auch hier die zughörige Aktion ausgelöst werden, denn es ist ja eine statisch erfüllte Bedngung. Tatsächlich wird aber überhaupt keine Aktion ausgelöst, also auch nicht die SONST-Aktion. Wenn _Y>=D nicht erfüllt ist, gelangt die Verarbeitung aber zum Test von _X auf den Schwellwert C.
Die Änderung von _Y zeigt nun, dass erwartungsgemäß bei _X die Schwellwerte A und B statisch ausgewertet werden und Vorrang vor dem Test von _Y haben. Nur im Bereich von C<_X<A erreicht das Programm den Test von _Y. Der SONST-Teil wird nur bei Triggern des Schwellwertes D durch _Y in passiver Richtung erreicht. Wie zuvor, wird das Programm auch von der Aktualisierung von _Y ausgelöst, hier erkennbar aber nur bis zum Test von _Y verarbeitet. Die Feststellung, dass _Y sich nicht verändert hat findet offenbar hier statt und der restliche Teil des Programms wird nicht mehr verarbeitet:
Zusammengfasst:
- Programme werden grundsätzlich von jeder Aktualisierung eines Signals, dass in Auslösebedingungen verwendet wird, ausgelöst. Die Bedingung "Bei Veränderung" spielt dabei keine Rolle.
- Das Programm wird (wie bekannt), vom Anfang her abgearbeitet, wobei die Signale, die nicht das Programm ausgelöst haben (d.h. nicht aktualisiert wurden), wie statische Bedingungen behandelt werden.
- Das Programm wird abgebrochen sobald erkannt wird, dass sich der Zustand der Bedingung des auslösenden Signal nicht verändert (!) hat und alle Bedingungen für dieses Signal das Merkmal "Bei Veränderung" haben. Anscheinend findet dies im ersten Block statt, in dem das auslösende Signal getestet wird.
- Passiv ausgelöste Triggerbedingungen werden wie eine statisch nicht erfüllte Bedingung behandelt, so dass das Programm mit dem folgenden Block fortgesetzt wird.
- Es gibt in diesem Konzept keine Erklärung dafür, warum bei Auslösen der Schwelle C im 2. Programm die Bedingung _Y>=D nicht erkannt wird.
Die Zeilen der Tabellen repäsentieren den jeweiligen Programmblock, die Spalten die ausgelöstgen Triggerbedingungen. Die grünen Felder stehen in der Zeile mit der ausgelösten Aktion. Im Feld ist dabei vermerkt, welche Bedingung die jeweils andere Variable dabei haben muss. Die Spalten mit drei Übergangssymbolen bedeuten, dass der Wert beliebig aktualisiert wurde, ohne dass dabei ein Schwellwert ausgelöst wurde.
Hoffe, dass es nützlich ist.