Sei sulla pagina 1di 13

Lezione 4.

1 20/10/20

Linguaggio simscape e componenti: implementazione base


In questa lezione si vedrà il linguaggio simscape e come utilizzarlo per creare nuovi componenti.
Fino ad ora abbiamo visto come utilizzare i componenti già esistenti all’interno della libreria
simscape.

Esiste un simscape component generico che può essere caratterizzato con un utilizzo di un file .ssc
(simscape component): questo file è scritto su un linguaggio simscape che non è nient’altro che un
linguaggio basato su linguaggio matlab che presenta l’aggiunta di alcuni costrutti che lo
caratterizzano e l’hanno ribattezzato con il nome di linguaggio simscape.; i file che sono ad esso
associato sono dei file con estensione .ssc .
Se si vuole creare lo script di un nuovo componente , basta digitare nella command window il
comando “sscnewfile(‘nomecomponente’)” e si aprirà un nuovo script già precompilato con
alcuni costrutti di base. Nella slide che segue si può vedere un esempio che contiene anche inputs e
outputs.
Andiamo a vedere come è strutturato.
È diviso in questo modo: vi è una parte di dichiarazioni che servono a strutturare il nostro
componente; nella parte delle equations e delle altre classi che si possono utilizzare c’è una sezione
che mi permette di costruire il comportamento del componente.

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

• Nella parte dei Parameters andiamo a definire tutti quelli che sono i parametri che vogliamo
rendere disponibili all’utente in fase di inserimento del componente. Quindi ci saranno tutte
le variabili, tutti i dati che utilizzerò durante la simulazione, ma solo una parte di questi lo
darò disponibile alla modifica all’esterno, tutti gli altri diventano come delle variabili locali e
quindi definiti internamente al componente.
I parameters, per intenderci, sono l’equivalente di ciò che usavamo nella costruzione della
maschera dei subsystem , in particolare dove utilizzavamo il promote, nella dialog box
avevamo la possibilità di andare a definire il valore di un parametro prima di andare a fare il
run della simulazione.
In maniera analoga con i parameters, definendo tutta una serie di parametri, ovvero il
costrutto, e la sintassi che bisogna utilizzare è quella che segue: nome della variabile, cioè il
nome del parametro da utilizzare (che richiameremo all’interno del codice), a cui si associa
un vettore di elementi; nel vettore di elementi, il primo rappresenta il valore iniziale
associato a quel parametro, mentre il secondo elemento è la sua unità di misura.
Per esempio, nella slide qui sopra si nota x= [1,’m’] ; inoltre con il simbolo di ‘%’ viene definito
il nome da associare a quel parametro all’interno della dialog box. Nella dialog box, nella
slide in basso, si può notare che è stato associato il valore ‘lunghezza’; in particolare è
associato il valore 1 espresso in metri.

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

• L’altra definizione che andiamo a fare è all’interno del block delle variabili. Per le variabili
utilizziamo lo stesso principio: si vanno a specificare tutte quelle variabili che ritengo utili per
la descrizione del comportamento del sistema, cioè le variabili , come i parametri e gli input
e gli output, sono tutti quei valori che utilizzerò nel blocco delle equazioni per definire il
comportamento del sistema tramite relazioni matematiche.
Per le variabili ho la possibilità di esplicitarle sia in modo contratto sia in modo esteso: in
modo contratto lo è , per esempio nella slide che segue, la variabile velocità impostata sul
valore inziale 0 e unità di misura in metro al secondo; l’altezza invece è esplicitata in modo
esteso, cioè oltre al valore e unità di misura, ho la possibilità di esprimere le priorità su quella
variabile e il valore nominale. La “priorità” può essere espressa su tre livelli (none,low,high):
in questo caso l’altezza impostata con priorità none, è equivalente a non esplicitarla. Se
andiamo a vedere nella dialog box, il tab delle variables compare in questo modo: velocità e
altezza con il valore iniziale tutte e due a zero e le unità di misura; il tab delle priority ha per
la velocità none e per l’altezza high. Si nota in particolare che per la velocità v in realtà nel
codice del componente non è stato esplicitato il valore dell’attributo priority perché di
default se non è esplicitato è come se esso fosse settato su none.
Per chiarirci: la priority è la priorità che quella variabile ha di settare la variabile globale del
sistema sul suo valore, ciò significa che se ci sono più blocchetti che al loro interno hanno
come variabile la velocità ‘v’ (immaginiamo che nella meccanica traslazionale mettiamo più
elementi che a loro interno hanno la variabile v tra quelle di simulazione; se sono collegati
l’uno all’altro, so che tra i rami deve fluire forza e velocità, quella velocità deve essere unica
all’istante iniziale perché la priority mi sta dando il valore all’istante iniziale) quella che ha
priorità più alta è quella che setterà il valore della velocità all’istante iniziale.
Si nota però che anche nella guida, gli implementatori sebbene rendono disponibile questa
funzione perché può essere utile, consigliano fortemente di non utilizzarla o di utilizzarla solo

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

se è strettamente indispensabile perché comunque potrebbe creare problemi nel run della
simulazione.
(Consiglio di Vitolo: se non si ha stretta necessità, lasciare sempre su none cosi l’evoluzione del
sistema dall’istante iniziale non ha problemi. )
Il valore nominale, dunque, è il valore atteso per quella variabile; atteso significa che
comunque devo avere una certa percezione di cos’è l’evoluzione di quella variabile.
Si nota che per le variabili, all’interno di MATLAB, come abbiamo sempre detto, sui rami
viaggiano due tipi di variabili: una è quella di sforzo e una è quella di flusso, che MATLAB
chiama through variables e across variables.
All’interno dello script di un componente non vi è distinzione , a meno che non lo si vada a
caratterizzare dopo.
In particolare, un’altra classe di componenti che possiamo creare sono le classi domain,
quelle cioè che definiscono il dominio di appartenenza di un componente: si ricorda che
all’interno di simscape ci sono già una serie di domini (per esempio quello elettrico, termico,
meccanico rotazionale, ecc..) , e tutti questi domini hanno un file definito , come si vede nella
slide che segue, dove è riportato, per esempio, il dominio della meccanica traslazionale.
Nel dominio della meccanica traslazionale , per esempio , è presente una variabile di sforzo
e una variabile di flusso: si nota che per matlab , viene definita come across variables, per
esempio la velocità, e nella slide è definita con il nome di variables come costrutto normale
(ovvero senza aggiungere nessuna specifica al costrutto) . Per definire, invece, le variabili di
tipo through bisogna dare un attributo alla variables che è ‘balancing=true’: tale
comando impone che il set di variabili che vengono definite all’interno di questo costrutto,
sonno esplicitamente delle variabili di tipo through all’interno del dominio.
Ricapitolando, quindi, per ogni dominio si troverà un costrutto di questo tipo: uno variables
e uno variables con balancing=true , all’interno del quale c’è la variabile di tipo sforzo e di
tipo flusso.

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

Di seguito si riporta un estratto della guida: sono riportati tutti i domini con tutte le variabili di tipo
across e le variabili di tipo through per ogni dominio; in generale , si nota che: all’interno della
costruzione di un modello simscape, una variabile di tipo through è una variabile che può essere
misurata con un sensore che viene posto in serie all’elemento; mentre quella across è una variabile
che può essere misurata con un sensore che viene posto in parallelo all’elemento.
Nel dominio termico, la across variable è la temperatura mentre la through variable è heat flow,
ciò significa, per quanto detto sopra , che sul ramo nel dominio della temperatura viaggeranno
sempre tutte e due le variabili.
In maniera analoga, nel dominio della meccanica traslazionale: come across variable vi è la velocità,
mentre come trhough variable vi è la forza; quindi , anche in questo caso, significa che sul ramo
della meccanica traslazionale ci saranno sempre forza e velocità che viaggiano insieme.
Specifichiamo che “viaggiano insieme” non significa che sul ramo all’interno del dominio di simscape
ci sia un verso, anzi , quello che abbiamo definito “verso” è all’interno del componente, ma
semplicemente, tale espressione serve per identificare come vengono calcolate le grandezze
all’interno del componente; in particolare all’interno delle equazioni viene definito necessariamente
un segno, quindi il segno viene identificato come verso ma non è un significato di flusso del dato,
semplicemente è come viene preso il verso positivo e il verso negativo, di fatti, come abbiamo visto,
un blocchetto collegato in un verso o nell’altro, ha valore assoluto uguale, ma vede cambiare solo il
segno.

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

• Veniamo ai Nodes , ovvero i nodi di collegamento.


I nodi per quanto riguarda i domini fisici, definiscono quelle che si chiamano delle
“conserving ports” , e queste hanno sempre lo stesso costrutto , cioè con lo stesso costrutto
andiamo, in altre parole, ad identificare per le porte il dominio di appartenenza.
Nell’esempio riportato in basso, si può vedere il nodo R come viene definito.
Abbiamo visto che nella costruzione della nostra libreria c’è la possibilità, a partire da una
directory più alta, di fare tanti subpackege fino ad arrivare ad inserire un componente al suo
interno; ricordiamo che la libreria della foundation library è organizzata così come riportato
a sinistra nella slide successiva; all’interno di questa poi ci sono dei file.ssc che identificano
il dominio di un dato sistema.
Quindi, per esempio se andiamo a prendere foundation -> mecanichal -> traslational,
all’interno di questo percorso c’è il translational.ssc che è la definizione del domino
meccanico traslazionale, che è il file visto prima con le due variabili forza e velocità.
Ebbene, questo costrutto mi permette di associare ad R, ovvero alla mia grandezza che ho
definito con R, questo percorso e questo file.scc ; avrò modo di prendere due grandezze che
sono R.f e R.d .
Il simbolo % identifica un commento e dopo posso mettere un particolare costrutto che è
label:location, dove per “location” si indica la posizione della porta.

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

• Si nota che se nell’implementazione sono presenti delle variabili di tipo Through ,allora ci
sarà necessariamente un costrutto che è quello dei Branches, perché questo va a definire
come fluisce la grandezza attraverso il componente. Si può notare nella slide che segue un
esempio pratico.
Ci sono due nodi , uno C e uno R, e in questo componete ci sono due variabili, una la velocità
e una la forza. La forza è una variabile di tipo di Through, quindi necessariamente se non la
si vuole definire nell’equazioni, posso utilizzare questo costrutto, cioè f: R.f ->C.f ; questa
dicitura sta a significare che la variabile “f” ha un flusso che va dalla porta R alla porta C.
Quindi abbiamo creato una corrispondenza: in altre parole, significa che all’interno del
blocchetto, tale forza fluisce senza essere manipolata.
Per capire bene questo concetto della conservazione dell’energia attraverso il blocchetto
delle variabili di flusso, supponiamo di avere due nodi, un nodo 1 e un nodo 2, e supponiamo
che su questi viaggi una variabile ‘a’ che è una variabile di flusso. Supponiamo che abbiamo
definito 3 variabili di flusso a1 a2 a3. Se per questi nei branches vado a definire il costrutto
che segue:
a1 : nodo1.a→nodo2.a
a2 : nodo1.a→nodo2.a
a3 : nodo2.a→nodo1.a
Sto dicendo che sul nodo1 poiché a1 dal nodo è uscente, sarà -a1; sulla seconda espressione
a2 è uscente, cioè entra nel nodo2 quindi sarà sempre negativa -a2; sul nodo1 a3 è entrante
e sarà presa positiva. L’equazione equivalente al nodo1 con questo costrutto nel branches è
del tipo -a1 -a2 +a3 ==0
In altre parole stiamo dicendo che tutto ciò che entra è uguale a tutto ciò che esce. La stessa
cosa accade facendo l’equilibrio per il nodo 2: avremo ovviamente tutto cambiato di segno

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

rispetto al nodo 1; e l’equazione di conservazione equivalente a quel costrutto che c’è tra
banches e le end è equivalente a dire che a2+a1-a3==0 sul nodo 2.
Ricordiamo infine che , quello che generalmente usiamo come “riferimento” (cioè il
reference) andandolo a scrivere tramite codice si usa tradurlo con il simbolo dell’asterisco *
e il costrutto per f è del tipo : R.f -> *; ciò si traduce, in altre parole con : per questo valore
non creare nessuna equazione di conservazione perché lo sto mettendo su un riferimento
fisso, non vi è un flusso.

• Altro importante costrutto che generalmente usiamo e troviamo all’interno dei nostri
blocchetti sono gli inputs e gli outputs. Gli inputs e gli outputs non lavorano più sulle
conserving port ma lavorano sulle signal port.
Quando abbiamo inputs e outputs il simbolo di ingresso e uscita sul blocchetto non è più un
quadrato ma un triangolino, infatti il quadrato non ha verso, motivo per cui per le conserving
port c’è un simbolo quadrato, perché il quadrato sta a significare che su quella porta non c’è
un verso definito; per inputs e outputs il verso è ben definito e il triangolo ne traduce bene
la direzione, ovvero il verso del flusso su quella porta.
A differenza della conserving port , la signal port ha un solo parametro, una sola variabile
che fluisce attraverso quella porta. Vediamo con maggiore attenzione l’esempio riportato
nella slide che segue:
S= (0, ‘N’); % S:left
Per p invece
p=(0, ‘m’); %p:right
Attraverso questi input e output non fluisce più l’energia o la potenza, ma fluisce solo una
grandezza ovvero la forza o la velocità; ricordiamo che però potrebbero essere disponibili
all’esterno anche altre variabili che non sono definite tra quelle di forza e di flusso, ma sono
calcolate all’interno del componente; un esempio è la posizione.

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

Per le unità di misura, posso sia specificarle esplicitamente e dicendo che in ingresso e in
uscita da quell’oggetto deve esserci una grandezza espressa in un’unità di misura imposta.
Possiamo anche pensare di settare l’unità di misura su 1, in questo caso sto dicendo a quel
blocchetto che indipendentemente dal valore, associa a questo valore la grandezza
dell’elemento a cui è collegato, quindi se in ingresso arrivano newton in ingresso saranno
newton, se in uscita è stato collegato a una sorgente e quella sorgente deve erogare tensione
vuol dire che in uscita dal blocco il valore calcolato sarà espresso in tensione.

• Tutte queste dichiarazioni che abbiamo visto devono confluire nella determinazione del
comportamento del nostro componente. Comportamento che viene definito all’interno
della struttura del blocco delle equazioni. Nelle equazioni possiamo utilizzare tutto quello
che abbiamo definito come variabili, parametri, inputs o outputs; per semplicità , di seguito
è riportato un esempio.
Supponiamo che abbiamo definito come outputs una variabile W settata su zero ed espressa
in radianti al secondo. Come variabile abbiamo preso una “w” espressa con valore iniziale
zero e unità di misura radiante al secondo. Nelle equazioni siamo andati a definire la w e
l’abbiamo calcolata come la differenza che c’è ai capi dei due nodi R e C; di fatti, la W non è
nient’altro che W==w. In altre parole è come se avessimo creato un sensore di misura della
velocità angolare, e dal calcolo estraiamo la velocità e la rendiamo disponibile in outputs.
Si nota che tutti i blocchi che abbiamo visto precedentemente per la parte di dichiarazione
vengono caricati prima di lanciare la simulazione, in quanto è come se andassimo a definire
quelli che sono gli istanti iniziali del componente, mentre tutto il blocco delle equations viene
lanciato continuamente durante la simulazione in quanto tutto ciò che sta all’interno
dell’equations evolve durante la simulazione.

Ricordiamo che all’interno del blocco delle equazioni posso usare tutta una serie di
operatori. Quelli che troveremo più spesso sono:

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

▪ ‘der’ ovvero l’operatore di derivata, che si può richiamare o der(x) o x.der ; questi
due costrutti sono l’equivalente di fare la derivata di x nel tempo.
▪ Assert ci permette di andare a definire un controllo sulla correttezza dell’inserimento,
un esempio si può osservare nella slide successiva.
È stato fatto
assert(k>0)
v==x.der;
In questa situazione abbiamo dato la possibilità di inserire il valore all’esterno : k è un
parametro e può essere specificato dall’operatore che utilizza il blocchetto durante la
costruzione del modello: Abbiamo definito che k deve essere maggiore di zero; se si
mette involontariamente qualche valore negativo, allora l’operatore assert fa un
controllo sulla correttezza, ciò ci dice che se k>0 si può procedere, altrimenti si restituisce
un messaggio di error o warning.
Assert ha , quindi, una condizione, se la condizione è vera procede normalmente, se la
condizione non è vera restituisci un messaggio e fai quell’azione che ho implementato.

Si nota che per quanto riguarda gli inputs e gli outputs si inseriscono i valori iniziali perché per
essi posso anche non collegare niente: se non collego niente in ingresso e in uscita, allora il valore
che sarà utilizzato per il calcolo durante la simulazione sarà zero. Se gli do un valore allora
durante la simulazione sarà valutata la grandezza associata ad S con l’ingresso che gli ho dato.
Vediamo l’analisi dei componenti di simscape che riprendono i concetti visti: il primo tra questi è
quello della molla. (si nota che nella pagina che segue vi è una slide riassuntiva)
SPRING

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

La molla ha la definizione di un parametro che è la costante elastica della molla; il dato iniziale è
1000 N/m, e ha definito al suo interno una variabile che è la x che inizialmente è settata su ‘0’,
definita con una priority high, capiamo che tale x è la deformazione , ovvero lo schiacciamento.
Si aggiunge , inoltre , il comando Assert, per un controllo sul parametro k , in quanto esso può
essere solo maggiore di 0.
La velocità all’interno di quel blocco è definita come x.der quindi è la derivata dello spostamento;
X è definita come variabile e infine la forza F è calcolata come k*x.
IDEAL FORCE SOURCE
Qui compare l’input ‘S’: questo è quello che genera una forza con un valore che gli viene dato in
ingresso; esso è settato con un valore inziale pari a zero ed è espresso in Newton.
Come nodi ha C ed R presi dalla foundation.mechanical.transaltional.translational quindi stiamo nel
dominio della meccanica traslazionale: C ed R sono definiti uno in bottom e uno in top, quindi
troveremo R in alto e C in basso, nel modello simscape.
Le variabili che sono definite al suo interno sono la velocità e la forza; come branches c’è R.f che va
su C.f, questo significa che ,all’interno del blocco del componente, la forza fluisce senza subire
manipolazione: infatti, andando a vedere nelle equations, l’unica che viene calcolata è la velocità
che viene calcolata come differenza di velocità agli estremi.
Alla forza viene associato il valore ‘-S’. visto che i due nodi C ed R hanno sempre due variabili, ci
saranno una C.f e una C.v, una R.f e R.v. e queste 4 variabili devono essere sempre totalmente
definite all’interno del componente.
R.f e C.f sono uguali, e all’interno delle equazioni ad f viene associato -S , in altre parole significa che
R.f e C.f saranno uguali a -S.
Due variabili sono state definite, restano da definire C.v e R.v, che vengono definite all’interno
dell’equazione dove:
v==C.v – R.v

Quanto scritto, significa che se la velocità è inizialmente zero C.v e R.v inizialmente sono zero; poi
tutto quello che è nell’equazione viene di volta in volta calcolata durante gli step di simulazione,
all’evolvere di v anche C.v e R.v evolveranno di conseguenza, perché questo blocchetto sarà
collegato ai due estremi ad altri blocchi. Il più delle volte colleghiamo C.v al riferimento e R.v sarà
l’evoluzione del sistema.

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

IDEAL MOTION ROTATIONAL SENSOR


Notiamo che un sensore rispetto a una sorgente è caratterizzato dal fatto che semplicemente invece
di avere un input ha un output, e quindi avremo , ovviamente, una signal port sull’oggetto.
Il motion rotational sensor ci permette di misurare (o anche ha in output) la velocità angolare e la
posizione angolare: queste quantità vengono calcolate nelle equations.
Generalmente gli output non sono niente altro che delle assegnazioni secche delle variabili che
evolvono all’interno del mio componente: a W ho associato la variabile w; ad a ho associato phi; si
ha un set di variabili, e lo si rende disponibile all’esterno associandolo all’output.
ROTATIONAL ELECTROMECHANICAL CONVERTER
L’ultimo esempio riportato è come costruire un blocco per mettere in comunicazione due domini
differenti.
In questo caso necessariamente dovrò avere per quel blocco la definizione di tutte le porte associate
ai due domini.

MSSM Vincenzo Mele


Lezione 4.1 20/10/20

Se andiamo a prendere il rotational electromechanical coverter, da una parte esso deve essere
collegato al dominio elettrico e da un’altra parte vi è la connessione al dominio meccanico (in questo
caso delle rotazioni).
Dovrò avere un collegamento per la parte elettrica richiamando il dominio elettrico, quindi nei nodi
sono stati definiti un nodo p e n che fanno parte della foundation.electrial.electrical(dominio
elettrico); poi sono stati definiti per la parte meccanica due nodi R e C che sono delle
foundation.mechanical.rotational.rotational appartenenti al dominio delle rotazioni: su queste
porte fluirà coppia e velocità angolare mentre su p e n ci sarà tensione e corrente.
Come parametro, cioè quello che si può settare quando utilizzo questo componente, c’è il k che è la
costante di proporzionalità che lega velocità e tensione (coppia e corrente): il k li lega così come è
stato definito nelle equazioni.
Le variabili che sono state definite sono: corrente, tensione, coppia, velocità angolare.
I branches definiti sono per la corrente e per la coppia perché sono le nostre due variabili di flusso,
rispettivamente per il dominio elettrico e per il dominio meccanico rotazionale.
Nei branches si vede che la corrente fluisce dal polo positivo al polo negativo p→n. per il dominio
meccanico la coppia è considerata positiva quando fluisce dalla porta R alla porta C (R →C).
Infine ad essi dobbiamo assegnare dei valori, cioè come questi vengono calcolati durante la
simulazione: la nostra tensione viene calcolata come differenza di potenziale ai capi (p.v – n.v),
mentre la velocità angolare viene calcolata come differenza agli estremi R e C.
La tensione v che è nel dominio elettrico, è associata alla velocità angolare nel dominio meccanico
secondo il fattore k, mentre la coppia è associata alla corrente tramite il -k.

MSSM Vincenzo Mele

Potrebbero piacerti anche