Hauptinhalt

Die Übersetzung dieser Seite ist veraltet. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

Entwerfen einer Mensch-Maschine-Schnittstellenlogik mithilfe von Stateflow-Diagrammen

Dieses Beispiel zeigt, wie die Logik einer grafischen Benutzeroberfläche in einem eigenständigen Stateflow®-Diagramm modelliert wird. Eigenständige Diagramme implementieren die klassische Diagramm-Semantik mit MATLAB® als Aktionssprache. Sie können das Diagramm mithilfe der vollständigen Funktionalität von MATLAB programmieren, einschließlich der Funktionen, die für die Codegenerierung in Simulink® eingeschränkt sind. Weitere Informationen finden Sie unter Create Stateflow Charts for Execution as MATLAB Objects.

Sie können ein eigenständiges Stateflow-Diagramm ausführen, indem Sie seine Eingangsereignisse aufrufen und temporale Operatoren verwenden. Der ereignis- und zeitgesteuerte Ausführungsworkflow eignet sich für die Gestaltung der Logik, die Mensch-Maschine-Schnittstellen (HMIs) und grafischen Benutzeroberflächen (UIs) zugrunde liegt.

  • Wenn Sie den MATLAB App Designer verwenden, rufen Callback-Funktionen aus den Schnittstellen-Widgets Ereignisse im Diagramm auf.

  • Im Stateflow-Diagramm steuern temporale Operatoren und lokale Daten die Eigenschaften der Benutzeroberfläche.

Weitere Informationen zur Verwendung von MATLAB zur Erstellung grafischer Benutzeroberflächen finden Sie unter Entwickeln von Apps mithilfe von App Designer.

Steuern einer App Designer-Benutzeroberfläche

Diese Benutzeroberfläche enthält einen Ein-/Aus-Schalter, der eine Lampe steuert. Wenn der Schalter auf „Ein“ steht, leuchtet die Lampe in einem von zwei Modi, entweder durchgehend oder blinkend, je nach Position des Modus-Auswahlschalters. Sie können die Blinkfrequenz durch Bewegen des Blinkfrequenz-Schiebereglers steuern. Um die App zu starten, klicken Sie in der Symbolleiste des App Designer auf Run.

Die Datei sf_lamp_logic.sfx definiert ein eigenständiges Stateflow-Diagramm, das die Logik für die Benutzeroberfläche implementiert. Das Diagramm enthält Eingangsereignisse (ON, OFF, BLINKING und SOLID) und lokale Daten (delay und app). Die Aktionen im Diagramm steuern, welche Widgets von jedem Zustand aus zugänglich sind. Zum Beispiel bewirken die Aktionen im Zustand Off, dass das Lampen-Widget, die Modus-Optionsschaltflächen und der Schieberegler für die Blinkrate in der Benutzeroberfläche abgedunkelt erscheinen.

Im Zustand On bezeichnen die Teilzustände Solid und Blinking die beiden Betriebsarten. Um eine blinkende Lampe zu implementieren, stützt sich das Diagramm auf den temporalen Logikoperator after. Wenn das Diagramm in den Zustand Blinking.Off übergeht, erstellt der Ausdruck after(delay,sec) beim ausgehenden Übergang ein MATLAB-Timer-Objekt, das das Diagramm nach einer bestimmten Anzahl von Sekunden ausführt. Das Diagramm wechselt dann in den Zustand Blinking.On und erstellt ein weiteres Timer-Objekt, um den Übergang zurück zu Blinking.Off auszulösen. Während das Diagramm ständig zwischen den beiden Zuständen wechselt, können Sie die Blinkrate anpassen, indem Sie den Wert der lokalen Datenverzögerung ändern oder den Blinkmodus verlassen, indem Sie die Eingangsereignisse SOLID oder OFF aufrufen.

Die Verlaufsverbindung im On-Zustand speichert Informationen über den zuletzt aktiven Teilzustand, sodass die Benutzeroberfläche beim Einschalten der Lampe in den vorherigen Betriebsmodus zurückkehrt.

Ausführen eines eigenständigen Diagramms mithilfe von Ereignissen

Sie können das eigenständige Diagramm ausführen, indem Sie seine Eingangsereignisfunktionen im MATLAB-Befehlsfenster aufrufen. Der Stateflow-Editor zeigt die Auswirkungen jedes dieser Befehle an, indem aktive Zustände und Übergänge durch eine Diagrammanimation hervorgehoben werden.

1. Erstellen Sie das Diagrammobjekt L und initialisieren Sie den Wert von delay auf 0,5. Dieser Wert entspricht einer Blinkfrequenz von einem Blinken pro Sekunde (0,5 Sekunden lang an und 0,5 Sekunden lang aus).

L = sf_lamp_logic(delay=0.5);

2. Schalten Sie die Lampe ein.

ON(L)

3. Wechseln Sie in den Blinkmodus.

BLINKING(L)

4. Setzen Sie den Wert von delay auf 0,25. Dieser Wert entspricht einer Blinkfrequenz von zwei Leuchtimpulsen pro Sekunde (0,25 Sekunden lang an und 0,25 Sekunden lang aus).

L.delay = 0.25;

5. Wechseln Sie in den Solid-Modus.

SOLID(L)

6. Schalten Sie die Lampe aus.

OFF(L)

7. Löschen Sie das Diagrammobjekt L aus dem MATLAB-Workspace.

delete(L)

Verbinden des eigenständigen Diagramms mit der Benutzeroberfläche

Um eine bidirektionale Verbindung zwischen der Benutzeroberfläche und dem eigenständigen Stateflow-Diagramm herzustellen, öffnen Sie das Fenster des App Designer und wählen Sie Code View aus.

1. Erstellen Sie im Fenster des App Designer eine private Eigenschaft lampLogic, um den Handle für das Stateflow-Diagrammobjekt zu speichern.

properties (Access = private)
    lampLogic
end

2. Erstellen Sie eine StartupFcn-Callback-Funktion, die das Diagrammobjekt erstellt und seine lokalen Daten app auf den Handle der Benutzeroberfläche setzt. Weisen Sie das Diagrammobjekt-Handle der privaten Eigenschaft lampLogic zu.

function StartupFcn(app)
    app.lampLogic = sf_lamp_logic(delay=0.5,app=app);
end

3. Erstellen Sie eine CloseRequestFcn-Callback-Funktion, die das Diagrammobjekt löscht, wenn Sie die Benutzeroberfläche schließen.

function UIFigureCloseRequest(app, event)
    delete(app.lampLogic);
    delete(app);
end

4. Fügen Sie für jedes Widget der Benutzeroberfläche eine Callback-Funktion hinzu, die das entsprechende Ereignis im eigenständigen Diagramm aufruft.

  • ValueChangedFcn Callback-Funktion für das Switch-Widget:

function SwitchValueChanged(app, event)
    value = app.Switch.Value;
    switch lower(value)
        case "off"
            OFF(app.lampLogic);
        case "on"
            ON(app.lampLogic);
    end
end
  • SelectionChangedFcn Callback-Funktion für das Modus-Schaltflächen-Widget:

function ModeButtonGroupSelectionChanged(app, event)
    selectedButton = app.ModeButtonGroup.SelectedObject;
    if selectedButton == app.SolidButton
        SOLID(app.lampLogic);
    else
        BLINKING(app.lampLogic);
    end
end
  • ValueChangedFcn Callback-Funktion für das Blinkfrequenz-Schieberegler-Widget:

function BlinkRateSliderValueChanged(app, event)
    app.lampLogic.delay = round(0.5/app.BlinkRateSlider.Value,2);
end

Wenn Sie die Benutzeroberfläche ausführen, können Sie die Auswirkungen der Anpassung der Steuerungs-Widgets auf der Diagrammfläche und auf dem Lampen-Widget beobachten.

Siehe auch

Themen