Inizializzare array in funzione simulink

di il
5 risposte

Inizializzare array in funzione simulink

Ciao ragazzi del forum.
è il mio primo messaggio
volevo chiedervi:
c'è un modo in Simulink per inizializzare un array prima dell'ingresso nel "blocco Function"???
quello che riporto è un banale contatore utilizzato come esempio .
function y = fcn(VALORE,ID)
y=zeros(1,2)
persistent contatore;

if isempty(contatore)  
contatore=zeros(1,2)
end

if (ID==0)
return 
end

y(ID) = contatore(ID)
contatore(ID) = contatore(ID) + VALORE
inizializzando l'uscita y all'interno della funzione significa che ogni volta che una nuova entità entra all'interno del blocco questa ricrea l'array y=zeros(1,2).

parte dell'uscita di tale funzione è:
y =
    55     0

contatore =
    60    36

y =
     0     0

y =
     0    36

contatore =
    60    39
io vorrei che tutti questi zero di inizializzazione non si vedano ogni volta perchè altrimenti li riporta anche nei grafici
grazieeee

5 Risposte

  • Re: Inizializzare array in funzione simulink

    Non sono sicuro di avere capito la tua domanda.

    Quello che hai riportato:
    y =
        55     0
    contatore =
        60    36
    y =
         0     0
    y =
         0    36
    contatore =
        60    39
    
    è quello che appare sulla Command Window.

    Ho provato a creare un semplice modello Simulink con un blocco "Function" e nei grafici (Sink) non vengono riportati i valori "y=0".

    Vuoi che nella Command Window non vengano stampate le righe che seguono?
    
    y =
         0     0
    
    Se è solo questo il problema, basta aggiunger ";" all'istruzione di inizializzazione del vettore "y" nella funzione.

    y=zeros(1,2);

    In caso contrario, puoi pubblicare un'immagine del tuo modello Simulink (meglio sarebbe se potessi inserirlo, ad esempio, in DropBox o sito simile).

    Hope this helps.
  • Re: Inizializzare array in funzione simulink

    Ciao Ask_raf
    grazie per la risposta.
    Sul "punto e virgola" hai ragione ma era fatto apposta, per vedere i risultati.

    Per il resto confermo che sono i risultati della Command Window.

    Dai risultati mi aspetterei che entrambe le y (quindi sia y(1) che y(2)) aumentino senza tornare a zero come invece avviene.

    Ti allego il file di Simulink..praticamente utilizzo Simulink e Simevents.

    https://www.dropbox.com/s/rehmo6ueuibec6a/prova.slx?dl=0

    grazie
    pabligno
  • Re: Inizializzare array in funzione simulink

    Purtroppo non sono riuscito a "far girare" il tuo modello (io uso R2012a) per cui non sono in grado di "vedere" il comportamento anomalo che riferisci.

    Ad ogni modo, la funzione che hai scritto sembra corretta.

    Forse il problema è nei blocchi che precedono blocco "Function" (FIFO Queue, Get Attribute).

    Come ho scritto nella risposta precedente ho creato un modello molto semplice con due blocchi "Constant" che generano i valori "VALORE" e "ID" in input ad un blocco "Function" che, a sua volta invia l'output ad uno "Scope".

    Avendo aggiunto ";" in

    y=zeros(1,2);

    e

    y(ID) = contatore(ID)

    ed avendolo tolto in:

    contatore(ID) = contatore(ID) + VALORE

    Nella Command Window ottengo:
    
    y =
         0     0
    y =
         5     0
    y =
        10     0
    y =
        15     0
    y =
        20     0
    
    Lo "0" che compare è dovuto al fatto che l'output della funzione (y) è dichiarato come array (1x2) e nel modello fornisco un solo valore di input per "VALORE" e "ID".

    Ho provato a far generare due valori ai blocchi "Constant" per "VALORE" e "ID" (rispettivamente:

    VALORE = 5
    ID = 1

    VALORE = 3
    ID = 2

    ed ho ottenuto:
    
    y =
         0     0
    y =
         5     3
    y =
        10     6
    y =
        15     9
    y =
        20    12
    y =
        25    15
    
    Per poter gestire 2 valori, ho dovuto modificare la seguente istruzione:
    
    % if (ID==0)
    if (~all(ID))
       return 
    end
    
    A parte questo, il modello sembra funzionare.

    Guardando i valori di "y" stampati nella Command Window ed il grafico dello "Scope" non vedo il comportamento anomalo che descrivi nella domanda.

    Di seguito l'immagine del modello e dello "scope".

    Hope this helps.
    Allegati:
    16082_f63dd3da81a2d4e3524a76b7280fcc5f.jpg
    16082_f63dd3da81a2d4e3524a76b7280fcc5f.jpg

    16082_f717a5808df01914dcf53e9cb8193840.jpg
    16082_f717a5808df01914dcf53e9cb8193840.jpg
  • Re: Inizializzare array in funzione simulink

    Ciao ask_raf
    di nuovo grazie per la risposta.
    Con il solo Simulink effettivamente non dà problemi, i quali sorgono utilizzando sia Simulink che Simevents.
    comunque ho risolto utilizzando una nuova variabile persistent di appoggio "y1" che poi passo alla y.
    Riporto il codice, magari potrà esser utile a qualcuno.
    function y = fcn(VALORE,ID)
    y=zeros(1,2);
    
    persistent start;
    persistent y1;
    
    if (isempty(start)&&isempty(y1))  
        start=zeros(1,2);
        y1=zeros(1,2);
    end
    
    if (~all(ID))
       return 
    end
    
    y1(ID) = start(ID);
    y = y1
    start(ID) = start(ID) + VALORE;
    ottenendo:
    y =
        40    30
    
    y =
        45    30
    
    y =
        50    30
    
    y =
        50    33
    
    y =
        55    33
    
    y =
        55    36
    
    y =
        60    36
    Riporto il grafico corretto ottenuto dopo la correzione:

    Risultato corretto
    Risultato corretto

    Questo invece è il risultato che ottenevo prima (motivo per il quale ho aperto la richiesta sul forum):

    forum3.JPG
    forum3.JPG

    Invece per pura curiosità, questo è il file ".slx":
    questo è il mio grafo Simulink\Simevents
    questo è il mio grafo Simulink\Simevents

  • Re: Inizializzare array in funzione simulink

    Sono contento che tu sia riuscito a risolvere il problema

    E' stato anche molto bello ed altruistico da parte tua pubblicare la soluzione!

Devi accedere o registrarti per scrivere nel forum
5 risposte