(17.02.2016 18:22 )GerdW schrieb: [ -> ]Dann ist die Lösung recht einfach: als zweite Umschaltbedingung für die States kommt dann noch hinzu, dass der State für mindestens x Sekunden gehalten wird…
In der Theorie ist das in der Tat einfach. In der Praxis weiß ich nicht, wie ich "Status für Zeit x halten" befehlen kann bzw den Status mit einer Timer-Funktion verknüpfen kann. Ich würde eine While-Schleife in jedem der beiden Case-Stati einfügen deren Abbruchbedingung mit einer Timer-Funktion verknüpft ist- aber das würde dann heißen dass es nach Ablauf der eingestellten Mindestzeit x ja gar nix mehr macht.
Eine simple Möglichkeit wäre, einfach ein Metronom/ eine Verzögerung in die case-stats einzubauen aber das ist unelegant und versaut auch die Messung wenn da solche Zeitsprünge drin sind
(17.02.2016 20:17 )Flenzelot schrieb: [ -> ]In der Theorie ist das in der Tat einfach. In der Praxis weiß ich nicht, wie ich "Status für Zeit x halten" befehlen kann bzw den Status mit einer Timer-Funktion verknüpfen kann.
Nimm als Selektor für die Statemachine nicht den Enumerator "Laden/Entladen/etc.". Mach einen neuen Enumerator, der z.B. die Werte "Start Schrittkette", "Vorauswahl Laden/Entladen", "Laden", "Pause nach Laden", etc. In den entsprechenden Cases dieses neuen Enumerators fragst du dann den bestehenden Enumarator ab ...
Eine Zeitverzögerung ist ganz einfach:
Im State "X-1" wird eine Variable resettet (z.B. Wert = 100, ergibt im Raster von 20ms 2 Sekunden). Diese Variable wird in einem Schieberegister auf der While-Schleife (ersatzweise ein Rückkopplngsknoten), die sich um die Statemachine befindet, gespeichert. Im State "X", wird 20ms gewartet und die Variable dekrementiert. Ist sie Null, wird nach State "X+1" verzweigt, ansonsten wird weiterhin State "X" ausgeführt. Außerdem wird im State "X" nachgekuckt (gekuckt klingt zwar blöd für einen Programmierer, wir reden aber auch nur von einer Struktur), ob denn das Warten abzubrechen ist und in welchem Case (z.B. "X+7") weitergemacht werden muss.
Hallo Flenzelot,
IchSelbsts Lösung ist die sauberere, du kannst aber auch weiterhin mit deinem Enum "Laden"/"Entladen" arbeiten.
Zusätzlich dazu kommt dann das schon erwähnte Schieberegister mit dem Zähler: bei einem State-Wechsel wird der Zähler auf "N" gesetzt. Im State wird der Zähler runtergezählt und erst, wenn er wieder auf Null steht, darf der nächste Statewechsel ausgelöst werden…