Contenuto principale

Esecuzione degli stati in parallelo

Utilizzando la scomposizione parallela, è possibile impostare un grafico Stateflow® in modo che tutti gli stati di un livello gerarchico si attivino nello stesso passo. È possibile utilizzare gli eventi per consentire a uno stato di attivare un comportamento in un altro stato.

Quando un grafico o uno stato che utilizza la scomposizione parallela diventa attivo, anche tutti gli elementi secondari diretti del grafico o dello stato diventano attivi. Gli elementi secondari, chiamati stati paralleli, appaiono nell'area di disegno con un bordo tratteggiato.

Ad esempio, in questo grafico, gli stati ParentA e ParentB utilizzano la scomposizione parallela. Quando ogni stato principale diventa attivo, anche entrambi gli stati secondari diventano attivi.

Ad ogni passo temporale, il grafico esegue le azioni e valuta le transizioni per ciascuno stato parallelo in un livello della gerarchia in ordine sequenziale, come indicato dal numero nell'angolo in alto a destra di ciascuno stato. Ad esempio, quando ParentB diventa attivo, il grafico entra sia in ChildC che in ChildD. Poiché ChildC ha un ordine di esecuzione pari a 1, imposta y su 3. Dopo di che, nello stesso passo temporale, ChildD sovrascrive y con 4.

È possibile modificare l'ordine di esecuzione facendo clic con il tasto destro del mouse su uno stato, quindi su Execution Order (Ordine di esecuzione) e scegliendo un nuovo ordine.

In questo esempio, si utilizzano gli stati paralleli per completare un modello incompleto di un sistema di batterie. Quindi, si utilizzano gli eventi per creare interazioni tra gli stati. Il sistema di batterie comprende due componenti indipendenti:

  • Una batteria principale ricaricabile

  • Una batteria di emergenza non ricaricabile che mantiene le funzioni essenziali se la batteria principale si scarica

Apertura del modello

Il modello sfGetStartedParallel rappresenta la logica di controllo di un sistema di batterie ricaricabili. Per costruire il modello, seguire le istruzioni riportate nei passaggi precedenti del tutorial.

Fare doppio clic sul blocco Chart per accedere al grafico della batteria.

Il grafico presenta due stati non paralleli che rappresentano la batteria principale e quella di emergenza. Ogni batteria contiene stati secondari annidati che rappresentano le modalità operative di carica, scarica o standby. Inoltre, le batterie utilizzano dati di input, di output e locali:

  • isCharging: un dato di input che indica se il sistema di batterie è collegato a una sorgente di alimentazione. Determina lo stato attivo della batteria principale.

  • deviceDemand: un dato di input che indica il fabbisogno energetico del dispositivo collegato.

  • maxWatts: un dato locale che indica l'output energetico massimo della batteria principale.

  • sentPower: un dato locale che indica l'output in watt della batteria principale. Se deviceDemand è minore di maxWatts, il valore risultante è uguale a deviceDemand. In caso contrario, è uguale a maxWatts.

  • mainCharge e emergencyCharge: dati locali che indicano la carica di ciascuna batteria in percentuale.

Per dettagli sul funzionamento della batteria principale, vedere i passaggi precedenti del tutorial.

Abilitazione della scomposizione parallela

È possibile abilitare l'esecuzione parallela per gli stati secondari facendo clic con il tasto destro del mouse sul componente principale e selezionando Decomposition > Parallel (Scomposizione > Parallela).

Poiché gli stati MainBattery e EmergencyBattery non presentano uno stato principale, il grafico viene considerato lo stato principale. Abilitare la scomposizione parallela per il grafico facendo clic con il tasto destro del mouse su un'area vuota dell'area di disegno e selezionando Decomposition > Parallel (Scomposizione > Parallela). I bordi dei due grafici diventano tratteggiati, ad indicare che si tratta di stati paralleli.

Trasmissione e ricezione di eventi

È possibile abilitare un componente del grafico affinché attivi dei comportamenti in altri componenti del grafico o del modello tramite la trasmissione di eventi. Ad esempio, in un grafico con due stati paralleli, è possibile trasmettere un evento in uno stato per provocare una transizione nell'altro.

Per trasmettere un evento da uno stato o da una transizione, utilizzare l'operatore send nel seguente formato:

send(event_name,receiving_state)

Per ricevere la trasmissione dell'evento in una transizione, inserire il nome dell'evento nell'etichetta della transizione. L'evento non richiede parentesi tonde né parentesi graffe. La transizione deve essere un elemento secondario diretto o indiretto dello stato ricevente.

I requisiti del progetto per il sistema di batterie prevedono che la batteria di emergenza si scarichi quando la batteria principale si scarica e passi in modalità standby quando la batteria principale inizia a caricarsi. Commutare la modalità operativa della batteria di emergenza tramite la trasmissione di eventi dalla batteria principale.

1. Nello stato MainBattery, nell'azione entry dello stato secondario Empty, trasmettere un evento chiamato toggleOn allo stato EmergencyBattery:

entry:
sentPower=0;
send(toggleOn,EmergencyBattery);

2. Nello stato MainBattery, nell'azione entry dello stato secondario Charge, trasmettere un evento chiamato toggleOff allo stato EmergencyBattery:

entry:
sentPower=3.5;
send(toggleOff,EmergencyBattery);

3. Nello stato EmergencyBattery, fare doppio clic sulla transizione da Standby a Discharge e inserire l'etichetta toggleOn.

4. Fare doppio clic sulla transizione da Discharge a Standby e inserire l'etichetta toggleOff.

5. Nel riquadro Symbols (Simboli), fare clic sul pulsante Resolve undefined symbols (Risolvi simboli non definiti) per definire toggleOn e toggleOff come eventi locali. Nelle azioni entry e nelle transizioni, toggleOn e toggleOff assumono un colore arancione, ad indicare un evento.

Simulazione del modello

Il modello registra due valori nel Simulation Data Inspector:

  • L'attività dello stato Empty in MainBattery, dove 1 è attivo e 0 è inattivo.

  • Il nome dello stato secondario attivo di EmergencyBattery.

Simulare il modello e osservare questi valori.

  1. Tornare al modello ad alto livello di Simulink. Il blocco Manual Switch modifica la modalità operativa della batteria principale. Quando il valore è 1, la batteria si carica. Quando il valore è 0, la batteria si scarica.

  2. Per simulare il modello, nella scheda Simulation (Simulazione), fare clic su Run (Esegui). Il blocco Chart mostra l'esecuzione del grafico.

  3. Fare doppio clic sul blocco Manual Switch per scaricare la batteria. Dopo alcuni secondi, quando la batteria principale transita a Empty, fare doppio clic sul blocco Manual Switch per caricare la batteria. Ripetere questa procedura più volte.

  4. Per interrompere la simulazione, nella scheda Simulation (Simulazione), fare clic su Stop (Interrompi).

  5. Per aprire il Simulation Data Inspector, nella scheda Simulation (Simulazione), fare clic su Data Inspector.

  6. Per visualizzare l'attività dello stato Empty, nella scheda Inspect (Esamina), fare clic su MainBattery.Discharge.Empty:IsActive.

  7. Per visualizzare lo stato secondario attivo dello stato EmergencyBattery, nella scheda Inspect (Esamina), fare clic su EmergencyBattery:ActiveChild.

Quando la batteria principale è esaurita, la batteria di emergenza si scarica. Quando la batteria principale esce dallo stato Empty e inizia a caricarsi, la batteria di emergenza passa in modalità standby.

Vedi anche

Argomenti