IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Simulink Discussion :

[Embedded Matlab Function] Problème avec variable de type persistent


Sujet :

Simulink

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [Embedded Matlab Function] Problème avec variable de type persistent
    Bonjour,

    J’utilise une embedded matlab function dans Simulink. Je souhaite stocker des valeurs (v) dans un vecteur (sv) de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function y = fcn(t,binit,v)
     
    persistent sv
     
    if binit
        sv=[-90 0 0 0 0 0 0 0 0];
    else
        i=round(t/0.5)
        t
        sv(i)=v;
    end
     
    y=0
    Mais, j’ai le message d’erreur suivant :

    Persistent variable 'sv' is undefined on some execution paths.
    Subscripted assignment of an undefined variable is not supported.
    Please initialise 'sv' with a complete assignment, such as sv = zeros(...).

    Function 'Embedded MATLAB Function' (#54.117.119), line 10, column 5:
    "sv"
    Savez-vous pourquoi j’ai cette erreur et comment je peux la résoudre ?

    Merci d’avance.

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Bonjour,
    Je ne connais pas les embedded function, et n'utilise jamais de persistent...mais le message d'erreur signifie qu'avant de faire une affectation dans ta variable sv, tu dois l'avoir initialiser.
    Par exemple, tu pourrais faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function y = fcn(t,binit,v)
     
    persistent sv
     
    if binit
        sv=[-90 0 0 0 0 0 0 0 0];
    else
        sv=zeros(size(t));%sv aura la même taille que t
        i=round(t/0.5)
        t
        sv(i)=v;
    end
     
    y=0
    Bien que je ne suis pas sûre que ton affectation fonctionne à tous les coups, il faut être sûr que i et v feront la même taille.
    Et ce qui est étrange c'est que je suppose que normalement le 1er appel se fait avec binit différent de 0, donc sv devrait être défini dès ce 1er appel.
    Enfin essayes déjà l'intialisation.
    Règles du Forum

    Adepte de la maïeutique

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.

    Le problème avec l'initialisation que tu proposes c'est qu'à chaque passage dans la fonction la variable sv est réinitialisée alors que je veux stocker toutes les valeurs de la variable v qui évolue au cours du temps.

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Alors dans ce cas, ce que tu fais est effectivement faux.
    Tu as 2 solutions :
    Soit v au cours du temps est un vecteur qui fait toujours la même taille : dans ce cas tu peux stocker les différentes valeurs dans une matrice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function y = fcn(t,binit,v)
     
    persistent sv
     
    if binit
        sv=[-90 0 0 0 0 0 0 0 0];
    else    
        i=round(t/0.5)
        t
        sv(i,:)=v;%on remplit la i ème ligne de sv
    end
     
    y=0
    Soit v peut changer de taille, dans ce cas tu peux faire le stockage dans une cellule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function y = fcn(t,binit,v)
     
    persistent sv
     
    if binit
        sv{1}=[-90 0 0 0 0 0 0 0 0];
    else    
        i=round(t/0.5)
        t
        sv{i}=v;
    end
     
    y=0
    Voir sur ce sujet la : Les tableaux de cellules (cell array)
    Règles du Forum

    Adepte de la maïeutique

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ton aide. J'arrive plus ou moins à utiliser les variables "persistent". C'est assez particulier. Il faut utiliser la commande "isempty".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function y = fcn(t,binit,v)
     
    persistent sv
     
     
        sv_init=[-90 1 0 0 0 0 0 0 0];
     
    if isempty(sv) || binit
        sv=sv_init;
    else
        i=round(t/0.5);
        sv(i)=v;
    end
     
    y=0;

Discussions similaires

  1. Problème avec le block "Embedded MATLAB Function"
    Par binch2005 dans le forum Simulink
    Réponses: 4
    Dernier message: 29/10/2010, 14h54
  2. [Embedded function] Problème avec la fonction SAVE
    Par bassemb dans le forum Simulink
    Réponses: 4
    Dernier message: 23/04/2008, 17h24
  3. [Embedded Matlab Function] Problème d'utilisation
    Par berberat dans le forum Simulink
    Réponses: 1
    Dernier message: 21/09/2007, 15h27
  4. [Embedded MATLAB Function] Type mxArray
    Par 250583 dans le forum Simulink
    Réponses: 2
    Dernier message: 28/03/2007, 15h31
  5. Réponses: 2
    Dernier message: 10/12/2006, 09h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo