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 :

Piloter Simulink en boucle avec script


Sujet :

Simulink

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Par défaut Piloter Simulink en boucle avec script
    Bonjour à tous,

    Voilà, j'ai un modèle Simulink qui me permet de rejouer des données acquises par une carte National Instrument (utilisation de look-up table).

    J'ai besoin de faire tourner ce modèle en boucle depuis une fonction matlab, sachant que cette fonction incrémente une des valeurs du modèle en fonction de la valeur d'une de ses sorties (je sais c'est compliqué).

    Pour la variable qui doit être incrémentée, j'utilise un bloc 'constant'.

    Mon problème est que la variable ne semble pas s'incrémenter...

    Voici mon code :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    function [crit,reg] = Calibration(pmin,pas,pmax)
     
    size_crit = (pmin + pmax)/pas;
     
    crit = zeros(size_crit,1);
     
    j = 1;
     
    for i = pmin:pas:pmax
        Consigne_pression(i); % Entrée consigne
        pause(60) % On laisse le temps à la pression pour se stabiliser
        Script(i); % chargement des constantes
        acquisition; % acquisition de données sur 1500 points
        load vitesse.mat
        sim('modele_test_reglage');
        tmp = find(yout == 1);
        while (isempty(tmp) ~= 1)
            crit(j) = crit(j) + 1;
            sim('modele_test_reglage');
            tmp = find(yout == 1);
        end % end while
        display(crit(j))
        j = j + 1;
        crit(j) = crit(j-1);
    end % end for
     
    reg = polyfit(i,crit,6); % renvoie les coefficients de la régression polynômiale
    z = polyval(reg,i);
    plot(i,crit,'o',i,z) % trace le résultat
    grid
     
    end % End function calibration.m

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Bonjour,

    Pour commencer tu n'es pas dans un script mais dans une fonction alors que par défaut Simulink va chercher les valeurs des paramètres dans le workspace de base de MATLAB, il y a donc de fortes chances pour que ton modèle ne voit pas les valeurs que tu changes.

    Si c'est bien ca le problème, la fonction ASSIGNIN peut t'aider à le résoudre.

    Duf

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Par défaut
    Je te remercie pour ta réponse.

    Comment dois-je utiliser assignin ? Pour les variables à l'intérieur de ma fonction ?

    Dois-je utiliser assignin pour toutes les variables intervenant dans mon Simulink ?

  4. #4
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    oui

    sinon tu peux aussi utiliser l'ancienne syntaxe (tjrs compatible) de sim en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    opts = simset('SrcWorkspace', 'current');
    sim('modele_test_reglage', tfin, opts);

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Par défaut
    Désolé mais je n'y arrive pas...

    J'ai supprimé ma fonction afin d'essayer avec un simple script mais rien n'y fait.

    Même lorsque je teste directement sans passer par le script (donc à l'invite de commande matlab).

    En fait, j'ai des données enregistrées par acquisition (carte national instruments). Ces données, je les met dans un vecteur.

    Je rejoue ce vecteur dans mon simulink avec une look-up table. Pas de problème jusque là...

    Maintenant, dans mon simulink j'ai une 'Embedded Matlab Function' dont je veux faire varier un des paramètres d'entrée. Ce paramètre est ma variable 'crit' et j'utilise donc un bloc 'constant'.

    Pour cela, voici ce que je tape dans mon script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    crit = zeros(size_crit,1); % Mon vecteur crit
    j = 0;
    sim('modele_test_reglage'); % Lancement de la simu
    tmp = find(yout == 1); % On cherche la présence de 1 dans yout
    while (isempty(tmp) ~= 1) % Tant qu'il y a des 1,
        crit(j) = crit(j) + 1; % On incrémente la valeur de la composante de crit
        sim('modele_test_reglage'); % On rejoue la simu
        tmp = find(yout == 1); % On recherche des 1, etc.
    end % end while
    display(crit(j)) % Dès qu'il n'y a plus de 1, on affiche la valeur de la composante
    j = j + 1; % Et on passe à la composante suivante...
    en fait, en sortie de mon 'Embedded Matlab Function', je récupère un vecteur nommé 'yout' après simulation

    Tant que toutes les composantes de ce vecteur ne sont pas toutes nulles, j'incrémente la valeur de 'crit'. Lorsque toutes les composantes du vecteur 'yout' sont nulles, j'ai donc trouvé la bonne valeur pour 'crit', je fais une nouvelle acquisition de données (pour une pression de consigne différente) et rebelotte...

    A la fin, je récupère mon vecteur 'crit' avec toutes les bonnes composantes obtenues par simulation pour chaque consigne en pression de mon banc. Ca ressemble un peu à une dichotomie (pour le principe seulement).

    J'espère avoir été clair et que cela vous aidera à me sortir de là...

  6. #6
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Dans ton modèle crit est un scalaire?

    Est-ce que c'est normal que dans ton code crit soit un vecteur de 0 puis un vecteur de 1, de 2, etc?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle avec matrices dans un script de fonction
    Par Emreh dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/06/2015, 17h36
  2. [AJAX] faire tourner un script php en boucle avec ajax
    Par mitmit dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 05/05/2007, 10h33
  3. Boucle avec un TIBDataSet
    Par SebCBien dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/09/2004, 17h33
  4. Boucle avec variable à incrémenter
    Par snoop dans le forum Linux
    Réponses: 2
    Dernier message: 19/03/2004, 11h07
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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