Ausführung von Steuerungsdiagrammen mithilfe der zeitlichen Logik
Die zeitliche Logik steuert die Ausführung eines Diagramms in Bezug auf die Zeit. Bei Zustandsaktionen und Übergängen können Sie zwei Arten der zeitlichen Logik verwenden:
Ereignisbasierte zeitliche Logik verfolgt wiederkehrende Ereignisse. Sie können jedes explizite oder implizite Ereignis als Basisereignis verwenden.
Die absolute Zeitlogik verfolgt die verstrichene Zeit, seit ein Zustand aktiv wurde. Das Timing für zeitliche Logikoperatoren der Absolutzeit hängt vom Typ des Stateflow®-Diagramms ab:
Diagramme in einem Simulink®-Modell definieren die Absolutzeit-basierende zeitliche Logik in Bezug auf die Simulationszeit.
Eigenständige Diagramme in MATLAB® definieren die Absolutzeit-bezogene zeitliche Logik in Bezug auf die Istzeit, die auf eine Genauigkeit von 1 Millisekunde begrenzt ist.
Zeitliche Logikoperatoren
Mit den in diesem Diagramm aufgeführten Operatoren können Sie das Verhalten eines Stateflow-Diagramms auf der Grundlage der zeitlichen Logik definieren. Diese Operatoren können auftreten in:
on
-ZustandsaktionenAktionen auf Übergangspfaden, die von einem Zustand ausgehen
Jeder zeitliche Logikoperator hat einen zugehörigen Zustand, d. h. den Zustand, in dem die Aktion auftritt oder von dem der Übergangspfad ausgeht. Das Stateflow-Diagramm setzt den von jedem Operator verwendeten Zähler jedes Mal zurück, wenn der zugehörige Zustand reaktiviert wird.
Operator | Syntax | Beschreibung | Beispiel |
---|---|---|---|
after |
| Gibt true zurück, wenn das Ereignis E mindestens n Mal aufgetreten ist, seit der zugehörige Zustand aktiv wurde. Anderenfalls gibt der Operator false zurück. | Lassen Sie eine Zustandsmeldung anzeigen, wenn das Diagramm eine Übertragung des Ereignisses
|
Verlassen Sie den zugeordneten Zustand durch einen Übergang, wenn das Diagramm eine Übertragung des Ereignisses after(5,E) | |||
| Gibt Das implizite Ereignis | Verlassen Sie den zugeordneten Zustand durch einen Übergang, wenn das Diagramm mindestens zum siebten Mal nach der Aktivierung des Zustands aufgerufen wurde, jedoch nur, wenn die Variable after(7,tick)[temp > 98.6] | |
| Gibt Geben Sie in Diagrammen im Simulink-Modell die Zeit in Sekunden ( Geben Sie in eigenständigen Diagrammen in MATLAB die Zeit in Sekunden ( | Setzen Sie die Variable
| |
at |
| Gibt true zurück, wenn das Ereignis E genau n Mal eingetreten ist, seit der zugehörige Zustand aktiv wurde. Anderenfalls gibt der Operator false zurück. | Anzeige einer Statusmeldung, wenn das Diagramm die dritte Übertragung des Ereignisses
|
Übergang aus dem assoziierten Status, wenn das Diagramm die fünfte Übertragung des Ereignisses at(5,E) | |||
| Gibt Das implizite Ereignis | Übergang aus dem assoziierten Zustand, wenn das Diagramm zum siebten Mal seit Aktivierung des Zustands aufwacht, aber nur, wenn die Variable at(7,tick)[temp > 98.6] | |
| Gibt Die Verwendung von | Setzen Sie die Variable
| |
before |
| Gibt Der zeitliche Logikoperator | Zeigt Sie eine Statusmeldung an, wenn das Diagramm die erste und zweite Übertragung des Ereignisses
|
Übergang aus dem assoziierten Zustand, wenn das Diagramm eine Übertragung des Ereignisses before(5,E) | |||
| Gibt Das implizite Ereignis Der zeitliche Logikoperator | Übergang aus dem assoziierten Zustand, wenn das Diagramm aktiviert wird, aber nur, wenn die Variable before(7,tick)[temp > 98.6] | |
| Gibt Geben Sie die Zeit in Sekunden ( Der zeitliche Logikoperator | Setzen Sie die Variable
| |
every |
| Gibt | Zeigt eine Statusmeldung nach jeder dritten Verarbeitung einer Übertragung des Ereignisses
|
Verlässt den assoziierten Zustand nach jeder fünften Verarbeitung einer Übertragung des Ereignisses every(5,E) | |||
| Gibt Das implizite Ereignis | Verlässt den assoziierten Zustand nach jedem siebten every(7,tick)[temp > 98.6] | |
| Gibt alle Die Verwendung von | Inkrementiert die Variable
| |
temporalCount |
| Gibt die Anzahl der Vorkommen des Ereignisses Die Verwendung von | Greift jedes Mal, wenn das Diagramm eine Übertragung des Ereignisses
|
temporalCount(tick) | Gibt die Anzahl der Male zurück, die das Diagramm aktiviert wurde, seit der zugehörige Zustand aktiv wurde. Das implizite Ereignis Die Verwendung von | Speichert den Wert der Eingangsdaten en,du: M(temporalCount(tick)+1) = u; | |
| Gibt die Zeitspanne zurück, die seit dem Aktivieren des zugehörigen Zustands vergangen ist. Geben Sie die Zeit in Sekunden ( | Speichert die Anzahl von Millisekunden, seit der Zustand aktiviert wurde. en,du: y = temporalCount(msec); | |
elapsed |
| Gibt die Zeitspanne zurück, die seit dem Aktivieren des zugehörigen Zustands vergangen ist. Äquivalent zu | Speichert die Anzahl von Sekunden, seit der Zustand aktiviert wurde. en,du: y = elapsed(sec); |
et | Eine alternative Methode zur Ausführung von elapsed(sec) . | Wenn das Diagramm eine Übertragung des Ereignisses E{disp(et);} | |
count |
| Gibt die Anzahl der Male zurück, die das Diagramm aktiviert wurde, seit der bedingte Ausdruck Das Stateflow-Diagramm setzt den Wert des Operators In Diagrammen eines Simulink-Modells kann der Wert | Verlassen des zugeordneten Zustands durch einen Übergang, wenn die Variable [count(x>=2) > 5] |
Speichern der Anzahl von Diagrammausführungen, seit die Variable en,du: y = count(x>5); | |||
duration |
| Gibt die Zeitspanne zurück, die vergangen ist, seit der bedingte Ausdruck Geben Sie die Zeit in Sekunden ( Das Stateflow-Diagramm setzt den Wert des Operators Der zeitliche Logikoperator | Verlassen des Zustands durch einen Übergang, wenn die Variable [duration(x>=0) > 0.1] |
Speichert die Anzahl von Millisekunden, seit die Variable en,du: y = duration(x>5,msec); |
Sie können Anführungszeichen für die Schlüsselwörter 'tick'
, 'sec'
, 'msec'
und 'usec'
verwenden. Zum Beispiel ist after(5,'tick')
äquivalent zu after(5,tick)
.
Hinweis
Die zeitlichen Logikoperatoren after
, at
, before
und every
vergleichen den Schwellenwert n
mit einem internen Zähler vom Typ Ganzzahl. Wenn n
eine Festkommazahl ist, die entweder durch eine Steigung, die keine ganzzahlige Potenz von zwei ist, oder durch eine Abweichung ungleich Null definiert ist, kann der Vergleich aufgrund von Rundungen zu unerwarteten Ergebnissen führen. Weitere Informationen finden Sie unter Relational Operations for Fixed-Point Data.
Beispiele für zeitliche Logik
Definieren von Zeitverzögerungen
Dieses Beispiel zeigt, wie zwei absolute Zeitverzögerungen in einem zeitkontinuierlichen Diagramm definiert werden.
Die Ausführung des Diagramms erfolgt in folgenden Schritten:
Wenn das Diagramm aktiviert wird, wird zuerst der Zustand
Input
aktiviert.Nach 5,33 Millisekunden Simulationszeit erfolgt der Übergang von
Input
zuOutput
.Der Zustand
Input
wird inaktiv und der ZustandOutput
wird aktiv.Nach 10,5 Sekunden Simulationszeit erfolgt der Übergang von
Output
zuInput
.Der Zustand
Output
wird inaktiv und der ZustandInput
wird aktiv.
Die Schritte 2 bis 5 werden wiederholt, bis die Simulation endet.
Wenn ein Diagramm eine diskrete Abtastzeit hat, erfolgt jede Aktion im Diagramm zu ganzzahligen Vielfachen dieser Abtastzeit. Wenn der Simulink®-Solver beispielsweise einen festen Schritt von 0,1 Sekunden verwendet, erfolgt der erste Übergang vom Zustand Input
zum Zustand Output
bei t = 0,1 Sekunden. Dieses Verhalten tritt auf, weil der Solver das Diagramm nicht genau bei t = 5,33 Millisekunden aktiviert. Stattdessen aktiviert der Solver das Diagramm in ganzzahligen Vielfachen von 0,1 Sekunden, z. B. t = 0,0 und 0,1 Sekunden.
Ermitteln der verstrichenen Zeit
In diesem Beispiel stellt ein Step (Simulink)-Block eine Einheit für die schrittweise Eingabe in ein Stateflow-Diagramm dar.
Das Diagramm bestimmt, wann die Eingabe u
gleich 1 ist:
Wenn die Eingabe vor t = 2 Sekunden gleich 1 ist, erfolgt ein Übergang von
Start
zuFast
.Wenn die Eingabe zwischen t = 2 und t = 5 Sekunden gleich 1 ist, erfolgt ein Übergang von
Start
zuMedium
.Wenn die Eingabe nach t = 5 Sekunden gleich 1 ist, erfolgt ein Übergang von
Start
zuSlow
.
Verwenden der absoluten Zeitlogik in aktivierten Subsystemen
Sie können die absolute Zeitlogik in einem Diagramm verwenden, das sich in einem bedingt ausgeführten Subsystem befindet. Wenn das Subsystem deaktiviert ist, wird das Diagramm inaktiv und der zeitliche Logikoperator pausiert, während das Diagramm im Ruhezustand ist. Der Operator setzt die Simulationszeit nicht fort, bis das Subsystem wieder aktiviert und das Diagramm aktiv ist.
Dieses Modell verfügt über ein aktiviertes Subsystem, bei dem der Parameter States when enabling auf held
gesetzt ist.
Das Subsystem enthält ein Diagramm, das den Operator after
verwendet, um einen Übergang auszulösen.
Der Signal Editor (Simulink)-Block liefert ein Eingabesignal mit diesen Eigenschaften:
Das Signal aktiviert das Subsystem bei t = 0.
Das Signal deaktiviert das Subsystem bei t = 2.
Das Signal aktiviert das Subsystem bei t = 6 erneut.
Dieses Diagramm zeigt die gesamte im Diagramm verstrichene Zeit. Wenn das Eingabesignal das Subsystem zum Zeitpunkt t = 0 aktiviert, wird der Zustand A
aktiv. Während das System aktiviert ist, erhöht sich die verstrichene Zeit. Wenn das Subsystem bei t = 2 deaktiviert wird, geht das Diagramm in den Ruhezustand über und die verstrichene Zeit wird nicht mehr erhöht. Für 2 < t < 6 bleibt die verstrichene Zeit bei 2 Sekunden eingefroren, da das System deaktiviert ist. Wenn das Diagramm bei t = 6 aktiviert wird, beginnt die verstrichene Zeit wieder, sich zu erhöhen.
Der Übergang von Zustand A
zu Zustand B
hängt von der verstrichenen Zeit ab, während Zustand A
aktiv ist, nicht von der Simulationszeit. Daher erfolgt der Übergang bei t = 9, wenn die verstrichene Zeit im Zustand A
5 Sekunden beträgt. Wenn der Übergang stattfindet, ändert sich der Ausgabewert y
von 0 auf 1.
Dieses Modellverhalten gilt nur für Subsysteme, bei denen Sie den Parameter für die Blockaktivierung States when enabling auf held
setzen. Wenn Sie den Parameter auf reset
setzen, wird das Diagramm vollständig neu initialisiert, wenn das Subsystem erneut aktiviert wird. Standardübergänge werden ausgeführt und alle Zähler der zeitlichen Logik werden auf 0 zurückgesetzt.
Notation für ereignisbasierte zeitliche Logik in Übergängen
In Stateflow-Diagrammen in Simulink-Modellen unterstützen die Operatoren after
, at
und before
zwei unterschiedliche Notationen, um ereignisbasierte zeitliche Logik in einem Übergang auszudrücken.
Die Trigger-Notation definiert einen Übergang, der nur vom Basisereignis für den zeitlichen Logikoperator abhängt. Die Trigger-Notation folgt dieser Syntax:
wobei gilt:temporalLogicOperator(n,E)[C]
temporalLogicOperator
ist ein boolescher zeitlicher Logikoperator.n
ist die Anzahl der Vorkommen des Operators.E
ist das Basisereignis des Operators.C
ist ein optionaler Bedingungsausdruck.
Wenn Sie die Trigger-Notation verwenden, kann der Übergang nur dann erfolgen, wenn das Diagramm eine Übertragung des Basisereignisses
E
verarbeitet.Die Bedingte Notation definiert einen Übergang, der von Basis- und Nicht-Basis-Ereignissen abhängt. Die bedingte Notation folgt dieser Syntax:
wobei gilt:F[temporalLogicOperator(n,E) && C]
temporalLogicOperator
ist ein boolescher zeitlicher Logikoperator.n
ist die Anzahl der Vorkommen des Operators.E
ist das Basisereignis des Operators.F
ist ein optionales Nicht-Basis-EreignisC
ist ein optionaler Bedingungsausdruck.
Wenn Sie die bedingte Notation mit einem Nicht-Basis-Ereignis
F
verwenden, kann der Übergang nur erfolgen, wenn das Diagramm eine Übertragung vonF
verarbeitet. Wenn Sie das Nicht-Basis-Ereignis weglassen, kann der Übergang erfolgen, wenn das Diagramm ein explizites oder implizites Ereignis verarbeitet.Die bedingte Notation für zeitliche Logikoperatoren wird in eigenständigen Diagrammen in MATLAB nicht unterstützt.
Diese Übergangskennzeichnung zeigt beispielsweise über die Trigger-Notation einen Übergang aus dem zugehörigen Zustand an, wenn das Diagramm eine Übertragung des Basisereignisses E
verarbeitet, beginnend mit der fünften Übertragung von E
, nachdem der Zustand aktiv wurde.
after(5,E)
Im Gegensatz dazu zeigt diese Übergangskennzeichnung mit einer bedingten Notation einen Übergang aus dem zugehörigen Zustand an, wenn der Zustand für mindestens fünf Übertragungen des Basisereignisses E
aktiv war, auch wenn das Diagramm keine Übertragung von E
verarbeitet.
[after(5,E)]
Hinweis
Der Operator every
unterstützt Trigger- und bedingte Notationen. Für diesen Operator sind jedoch beide Notationen gleichwertig. Die Übergangsbezeichnungen every(5,E)
und [every(5,E)]
zeigen einen Übergang aus dem zugehörigen Zustand an, wenn das Diagramm die k-te Übertragung des Basisereignisses E
verarbeitet, nachdem der Zustand aktiv wurde, wobei k ein Vielfaches von fünf ist.
Bewährte Verfahren für die zeitliche Logik
Vermeiden von zeitlicher Logik auf Übergangspfaden ohne einen Zustand als Quelle
Der Wert eines zeitlichen Logikoperators hängt davon ab, wann der zugehörige Zustand aktiv wurde. Damit jeder zeitliche Logikoperator einen eindeutigen zugehörigen Zustand hat, verwenden Sie diese Operatoren nur in:
on
-ZustandsaktionenAktionen auf Übergangspfaden, die von einem Zustand ausgehen
Verwenden Sie keine zeitlichen Logikoperatoren für Standardübergänge oder Übergänge in grafischen Funktionen, da diese Übergänge nicht von einem Zustand ausgehen.
Verwenden von absoluter zeitlicher Logik anstelle von tick
in Diagrammen in Simulink-Modellen
In Diagrammen in einem Simulink-Modell ist der Wert von Verzögerungsausdrücken, die eine zeitliche Logik mit absoluter Zeit verwenden, semantisch unabhängig von der Abtastzeit des Modells. Im Gegensatz dazu hängen Verzögerungsausdrücke, die eine auf dem impliziten Ereignis tick
basierende zeitliche Logik verwenden, von der vom Simulink-Solver verwendeten Schrittweite ab.
Zusätzlich wird die absolute Zeitlogik in Diagrammen mit Eingangsereignissen unterstützt. Das implizite Ereignis tick
wird nicht unterstützt, wenn ein Stateflow-Diagramm in einem Simulink-Modell über Eingangsereignisse verfügt.
Vermeiden der Verwendung von at
für die absolute zeitliche Logik in Diagrammen in Simulink-Modellen
In Diagrammen in einem Simulink-Modell wird die Verwendung von at
als absoluter zeitlicher Logikoperator nicht unterstützt. Verwenden Sie stattdessen den Operator after
. Nehmen wir zum Beispiel an, Sie möchten eine Zeitverzögerung mit dem Ausdruck at(5.33,sec)
definieren.
Um einen Laufzeitfehler zu vermeiden, ändern Sie die Übergangsbezeichnung in after(5.33,sec)
.
Unerwartete Ergebnisse bei großen Parameterwerten
Eine absolute zeitliche Logikbedingung in Stateflow, wie after(x,sec)
, wird möglicherweise nicht zum erwarteten Zeitpunkt nach dem Eintritt in einen Zustand mit den folgenden Bedingungen zu true
ausgewertet:
Das Diagramm hat eine periodische diskrete Abtastzeit.
Die Diagrammlogik sorgt dafür, dass der Zustand länger als
2147418
Zeiteinheiten aktiv bleibt. Die Zeiteinheiten sind die kleinsten Zeiteinheiten in jedem zeitlichen Logikausdruck, der von diesem Zustand verwendet wird. Wenn der Zustand beispielsweise zwei ausgehende Übergänge hat, von denen einerafter(x,sec)
und der andereafter(x,msec)
verwendet, sind die Zeiteinheitenmsec (milliseconds)
.
In der Regel treten unerwartete Ergebnisse auf, wenn die Zeitdauer im Zustand größer als 2147418
Zeiteinheiten ist. Dies kann sich jedoch je nach Abtastzeit des Diagramms ändern.
Vermeiden der Verwendung von every
für die absolute zeitliche Logik in Diagrammen in Simulink-Modellen
In Diagrammen in einem Simulink-Modell wird die Verwendung von every
als absoluter zeitlicher Logikoperator nicht unterstützt. Verwenden Sie stattdessen einen äußeren Schleifen-Übergang mit dem Operator after
. Nehmen wir zum Beispiel an, Sie möchten während der Ausführung des Diagramms alle 2,5 Sekunden eine Statusmeldung für einen aktiven Zustand drucken.
Um einen Laufzeitfehler zu vermeiden, ersetzen Sie die Zustandsaktion durch einen äußeren Schleifen-Übergang.
Fügen Sie einen Verlaufsknoten im Zustand hinzu, damit das Diagramm die Einstellungen des Zustands vor jedem Schleifen-Übergang speichert. Weitere Informationen finden Sie unter Wiederaufnahme früherer Aktivitäten unterhalb der Zustandsebene durch Verwendung von Verlaufsknoten.
Vermeiden der Verwendung von zeitlicher Logik in Übergangspfaden mit mehreren Quellen in eigenständigen Diagrammen in MATLAB
Eigenständige Diagramme in MATLAB unterstützen nicht die Verwendung von zeitlichen Logikoperatoren auf Übergangspfaden, die mehr als einen Zustand als Quelle haben. Zum Beispiel erzeugt dieses eigenständige Diagramm einen Laufzeitfehler, weil der zeitliche Logikausdruck after(10,sec)
einen Übergangspfad auslöst, der mehr als einen Zustand als Quelle hat.
Um das Problem zu lösen, verwenden Sie Ausdrücke der zeitlichen Logik auf separaten Übergangspfaden, die jeweils einen einzigen Zustand als Quelle haben.
Vermeiden der Vermischung von absoluter zeitlicher Logik und Bedingungen in Übergangspfaden von eigenständigen Diagrammen in MATLAB
In eigenständigen Diagrammen in MATLAB erstellen die Operatoren after
, at
und every
MATLAB timer
-Objekte, die implizite Ereignisse zum Aktivieren des Diagramms generieren. Die Kombination dieser Operatoren mit Bedingungen auf demselben Übergangspfad kann zu unbeabsichtigtem Verhalten führen:
Wenn eine Bedingung auf dem Übergangspfad falsch ist, wenn der
timer
das Diagramm aktiviert, führt das Diagramm die Aktionenduring
undon
des aktiven Zustands aus.Das Diagramm setzt das
timer
-Objekt, das mit den Operatorenafter
undat
verknüpft ist, nicht zurück. Wenn die Bedingung auf dem Übergangspfad zu einem späteren Zeitpunkt wahr wird, findet der Übergang erst statt, wenn ein anderes explizites oder implizites Ereignis das Diagramm aktiviert.
In diesem Diagramm beispielsweise kombiniert der Übergangspfad von Zustand A
zu Zustand B
den zeitlichen Logikauslöser after(1,sec)
und die Bedingung [guard]
. Der Übergang von Zustand A
zu Zustand C
hat den Auslöser after(5,sec)
der absoluten zeitlichen Logik. Jeder Übergang ist mit einem timer
-Objekt verbunden, das ein implizites Ereignis generiert. Anfangs ist die lokale Variable guard
false
.
Wenn Sie das Diagramm ausführen, wird Zustand A
aktiv. Das Diagramm führt die Aktion entry
aus und zeigt die Meldung Hello!
an. Nach 1 Sekunde aktiviert der timer
, der mit dem Übergang von A
zu B
verbunden ist, das Diagramm. Da der Übergang nicht gültig ist, führt das Diagramm die Aktion during
im Zustand A
aus und zeigt die Meldung Hello!
ein zweites Mal an.
Angenommen, nach 2 Sekunden erhält das Diagramm das Eingangsereignis E
. Das Diagramm führt die Aktion on
im Zustand A
aus und ändert den Wert von guard
in true
. Da das Diagramm den timer
, der mit dem Operator after
verbunden ist, nicht zurücksetzt, findet der Übergang von A
zu B
erst statt, wenn ein anderes Ereignis das Diagramm aktiviert.
Nach 5 Sekunden aktiviert der timer
, der mit dem Übergang von A
zu C
verbunden ist, das Diagramm. Da der Übergang von A
zu B
gültig ist und eine höhere Ausführungsreihenfolge hat, wird der Übergang zu Zustand C
im Diagramm nicht berücksichtigt und die Meldung Farewell!
wird nicht angezeigt. Stattdessen wird Zustand B
aktiv und das Diagramm zeigt die Meldung Good bye!
an.
Verwenden von Diagrammen mit diskreten Abtastzeiten für eine effizientere Codegenerierung
Der für diskrete Diagramme, die sich nicht in einem ausgelösten oder aktivierten Subsystem befinden, generierte Code verfolgt mit Ganzzahl-Zählern die Zeit, anstatt sich auf die von Simulink bereitgestellte Zeit zu verlassen. Dieses Verhalten ermöglicht eine effizientere Codegenerierung in Bezug auf Overhead und Speicher und ermöglicht die Verwendung dieses Codes in den Simulationsmodi Software-in-the-Loop (SIL) und Processor-in-the-Loop (PIL). Weitere Informationen finden Sie unter SIL and PIL Simulations (Embedded Coder).
Siehe auch
after
| at
| before
| every
| temporalCount
| elapsed
| count
| duration
| timer
| Signal Editor (Simulink) | Step (Simulink)
Themen
- Control Oscillations by Using the duration Operator
- Implement an Automatic Transmission Gear System That Controls Transient Signals
- Zählen von Ereignissen mithilfe des temporalCount-Operators
- Events in Standalone Charts
- Wiederaufnahme früherer Aktivitäten unterhalb der Zustandsebene durch Verwendung von Verlaufsknoten