Introduzione alle S-function

Home Su Successiva

Cos’è una S-Function

Quando utilizzare una S-Function

Caratteristiche generali delle S-Function

Stadi di simulazione e routine di S-Function

Introduzione alle C-MEX S-Function

Concetti di base  

Direct Feedthrough

Impostazione dinamica dell’ampiezza dell’ingresso

Impostazione del tempo di campionamento e dell'offset

Cos’è una S-Function.

Una S-Function è una descrizione, mediante linguaggio di programmazione, di un sistema dinamico, il cui codice può essere scritto utilizzando i linguaggi Matlab o  C. Le S-Function scritte con quest’ultimo linguaggio sono compilate come MEX-file (Memory Executable) utilizzando il comando mex disponibile all'interno dell'ambiente Matlab

Il codice generato è contenuto in una libreria dinamica o DLL (Dynamic Link Library), che viene invocata dal Matlab in modo dinamico, ovvero il Matlab, nel momento in cui il Simulink ne richiede l'uso, cerca la DLL nel path del Matlab e ci si collega utilizzando le funzioni che la DLL esporta. Una volta effettuato, il collegamento diventa stabile (la DLL risulta in permanente utilizzazione da parte del Matlab) per cui la DLL non è più cancellabile (da Explorer) o modificabile (da un programma esterno a Matlab) finché dal Matlab non viene eseguita l'istruzione "clear mex" o viene ricompilata di nuovo tramite l'istruzione "mex". 

La forma di una S-Function è molto generale e può descrivere sistemi continui, discreti e ibridi. Quasi tutti i modelli Simulink possono essere, quindi, realizzati come S-Function.

Le S-Function vengono inglobate nei modelli Simulink utilizzando il blocco S-Function nella sottolibreria Nonlinear Block (Matlab 5.x) o User-Defined Blocks (Matlab 6.x). Accedendo alla finestra di dialogo del blocco è possibile specificare il nome della S-Function da utilizzare.

Si tenga presente che qualora esistano due S-Function, di cui una scritta come C MEX-file e l’altra come M-file (Matlab file), sarà la prima ad essere utilizzata. Si possono utilizzare le finestre di Simulink e le relative istruzioni per inserire documentazioni inerenti al blocco, inserire parametri additivi ecc.

Quando utilizzare una S-Function.

L’utilizzo più comune di una S-Function è come blocco utente di Simulink. E’ possibile utilizzarle in svariate applicazioni, tra cui citiamo:

Aggiungere blocchi di utilità generale a Simulink;
 Inserire codice C già esistente in una simulazione;
 Descrivere un sistema come una sequenza di istruzioni;
 Utilizzare animazioni grafiche;
Velocizzare notevolmente la simulazione integrando codice C;

Una stessa S-function può essere utilizzata in più punti della stessa simulazione, modificando solamente i parametri con cui la S-function viene invocata.

Caratteristiche generali delle S-Function.

Ciascun blocco interno ad un modello Simulink possiede le seguenti caratteristiche generali: un vettore degli ingressi u, un vettore delle uscite y, ed un vettore degli stati x, come nella seguente figura:

Il vettore degli stati può contenere stati continui, discreti, o una combinazione di essi. La relazione matematica tra ingressi, uscite, e stati sono espresse dalle seguenti equazioni:

Uscite: y = f0(t,x ,u)

Derivata: dx/dt = fd(t,x,u)

Aggiornamento: xd(k+1) = fu (t, x, u) 

dove x = [xc , xd].

Il vettore degli stati viene quindi suddiviso in due parti: una contenete gli stati continui e l’altra i discreti. Gli stati continui occupano la prima parte del vettore, e i discreti la seconda. Per blocchi privi di stati x è un vettore vuoto. Nei MEX-file delle S-Function, ci sono due vettori separati per gli stati continui e discreti.   

Stadi di simulazione e routine di S-Function.

Durante l’esecuzione di un modello Simulink effettua chiamate successive ai singoli blocchi, e quindi anche alle S-Function, onde effettuare su essi specifiche operazioni relative allo stadio attuale in cui si trova la computazione, es. inizializzazione del blocco, definizione dei parametri, calcolo delle uscite e così via. La successione di questi stadi può essere visualizzata con il presente diagramma di flusso:

Figura 2: Come Simulink esegue la simulazione

L’esecuzione di questi passi è realizzata mediante routine che eseguono il loro compito durante ciascun passo.Queste azioni si possono classificare come:

Inizializzazione – Durante questo stadio Simulink:
  1. Inizializza SimStruct, una struttura che contiene informazioni sulla S-Function;
  2. Definisce numero e dimensione delle porte di ingresso e di uscita;
  3. Definisce gli istanti di campionamento;
  4. Predispone aree di memorizzazione e l’array size.
Calcolo del prossimo istante di campionamento – Se si sta utilizzando un passo variabile si effettua il calcolo del successivo istante di campionamento.
Calcolo dell’uscita nell’istante di campionamento principale – Al completamento di questa fase le uscite del blocco saranno disponibili nell’istante di tempo attuale.
Aggiornamento degli stati discreti nell’intervallo principale – Ciascun blocco esegue l’aggiornamento degli stati discreti per il prossimo istante.
Integrazione – Questa si applica a modelli con stati continui e/o attraversamenti dello zero non campionati. Se la S-Function lavora con stati continui il calcolo delle uscite e delle derivate della S-Function avviene nell’istante di tempo secondario. Se la S-Function ha  attraversamenti dello zero non campionati, Simulink calcola le uscite e gli attraversamenti dello zero nell’istante secondario.

Introduzione alle C-MEX S-Function.

Le C-MEX S-Function sono realizzate come funzioni in linguaggio C. Esiste un set di routine per S-Function le quali vengono chiamate direttamente da Simulink per eseguire il loro compito e possono essere utilizzate nella scrittura delle S-Function.

Tabella 1: Stadi di simulazione.

Stadio della simulazione 

Routine S-Function

Inizializzazione

mdlInitializeSizes

Calcolo istante camp. succ.(facoltativo )  

mdlGetTimeOfNextVarHit

Calcolo uscite

mdlOutputs

Aggiornam. stati discr.

mdlUpdate

Calcolo derivate

mdlDerivatives

Fine simulazione

mdlTerminate

Le routine C-MEX S-Function devono contenere le funzioni definite nella tabella.La presenza di maschere predefinite (vedi sfuntmpl.c e sfuntmpl.doc, situate nella directory simulink/src) forniscono un adeguato sostegno alla scrittura del codice. Se ne consiglia l’uso al fine di limitare errori di scrittura.

Concetti di base.

Una piena comprensione dei seguenti concetti aiuterà ad una corretta scrittura delle S-Function:

Direct feedthrough
Ampiezza ingresso impostata dinamicamente
Impostazione tempo di campionamento e offset

Direct feedthrough

Con questo termine si definisce la caratteristica del nostro algoritmo di presentare un’influenza diretta degli ingressi sulle uscite.Una S-Function ha questa caratteristica se:

La funzione di uscita (mdlOutputs) è una funzione dell’ingresso u. C’è quindi un direct feedthrough quando le istruzioni interne a mdlOutputs utilizzano la variabile d’ingresso u. Per uscite s’intendono anche quelle grafiche (Scope, XY Graph, ecc.).

La S-Function ha un passo di campionamento (chiamata a mdlGetTimeOfNextVarHit) variabile dipendente da u.

Un esempio di algoritmo che non richiede direct feedthrough è il seguente:

Uscite: y = x

Derivata: dx/dt = u

dove x è lo stato, dx/dt è la derivata rispetto al tempo, u è l’ingresso e y l’uscita.

Impostazione dinamica dell’ampiezza dell’ingresso

Le S-Function possono essere realizzate in modo tale da prevedere un’impostazione dinamica dell’ampiezza dell’ingresso, determinata cioè a tempo di esecuzione e stabilita dall’ampiezza delle uscite dei blocchi collegati alla S-Function, essa può essere utilizzata per definire il numero di stati continui, discreti e il numero di uscite.

Le C-MEX S-Function consentono, quindi, di definire porte di accesso e di uscita multiple di forma vettoriale. Vedremo in seguito esempi in tal senso.

Impostazione del tempo di campionamento e dell’offset.

Le C-MEX S-Function consentono un alto grado di flessibilità nello stabilire quando avviene l’esecuzione fornendo il seguente insieme di scelte:

Campionamento continuo – Per S-Function che hanno stati continui e/o zeri non campionati. In questo caso le uscite cambiano nell’istante di tempo secondario.
Tempo di campionamento continuo ma fisso nell’istante di tempo secondario – Per S-Function che necessitano di esecuzione ad ogni passo di simulazione principale, ma non cambia valore durante quello secondario.
Tempo di campionamento discreto – Per S-Function il cui comportamento è funzione di intervalli discreti, si può quindi definire un tempo in cui Simulink chiama il blocco ed anche un ritardo (offset) nel campionamento, es.:

               TimeHit = (n * period) + offset

          Dove n è un intero, e il suo primo valore è sempre zero.

Tempo di campionamento variabile – Tempo di campionamento la cui ampiezza viene definita all’inizio di ciascun passo di campionamento e può variare da passo a passo.
Tempo di campionamento ereditato – Quando la nostra S-Function non ha caratteristiche interne particolari, stati continui, discreti ecc., si può fare in modo che assuma il tempo di campionamento dei blocchi che in qualche modo ne influenzano il comportamento, ad es.:
Il blocco connesso all’ingresso
Il blocco di destinazione
Il tempo di campionamento più veloce nel sistema

Si potranno definire questi parametri utilizzando le routine di S-Function appropriate che vedremo in 

Esempi di C-MEX S-Function possono essere trovati nella directory simulink/src, ne citiamo alcune: timestwo.c, csfunc.c, dsfunc.c, dlimint.c, vsfunc.c, mixed.c ed altre.

Questa pagina è stata aggiornata il 03/01/04.

Testo originale: Massimo Demofonte

Aggiornamento e adattamento: Leonardo Daga

Leonardo Daga's Warehouseâ, http://leonardodaga.insyde.it
Send any Comments to: leonardo.daga@gmail.com