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 :

Constantes et variables globales sous simulink


Sujet :

Simulink

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut Constantes et variables globales sous simulink
    Bonjour,

    J'ai un modèle SIMULINK qui est composé de plusieurs blocs de fonctions MATLAB. j'utilise les mêmes constantes dans plusieurs fonctions MATLAB... A ce jour, elles sont déclarées dans chaque fonction... :-(
    J'aimerai avoir un code plus propre de manière à changer la constante à un seul endroit... J'ai écrit une fonction InitVar. J'aimerai maintenant pouvoir consommer ces constantes et variables dans les autres fonctions...

    Lorsque que je compile, cela provoque une erreur lorsque j'appelle une variable globale.

    Comment doit on faire?

    Voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function InitVar
     
        global N_encoche;
        global L_stator;
        global Nb_couches;
     
        N_encoche = 144;
        L_stator = 0.25;
        Nb_couches = 3;
    end
    Puis j'utilise la fonction qui effectue la lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function y = ReadGlobal()
    global N_encoche
    y = N_encoche;
    end
    Nom : Matlab.png
Affichages : 6377
Taille : 26,8 Ko

    mais j'ai une erreur de compilation:
    Global declaration not resolved to a Data Store Memory block registered via the Ports and Data Manager.

    Merci de votre aide!

  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 : 40
    Localisation : France

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

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

    Défini tes variables dans MATLAB puis utilise les comme des paramètres de tes blocs. Pour une MATLAB Function ça signifie les mettre en entrée de la fonction puis de les déclarer comme des paramètres avec un clic-droit.
    Documentation

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Merci de prendre le temps de traiter ce sujet Duf42!

    J'ai réussit à ajouter un paramètre (G_Encoche) mais pas avec un clic droit...
    J'ai ouvert le code de la fonction, et j'a utiliser le menu "Edit data". Est ce la même chose?
    Nom : Param.png
Affichages : 6152
Taille : 23,1 Ko

    Ensuite pour créer la variable sous matlab j'ai créé une fonction SetDat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function  SetData
     
    global G_Encoche;
    G_Encoche = 14;
     
    end
    J'ai exécuté la fonction dans les commandes en ligne : SetData.
    J'ai exécuter ma fonction de test dans simulink mais cela génère une erreur

    % Invalid setting in 'MATLAB Function' for parameter 'G_Encoche'
    %
    % Caused by:
    % Error evaluating MATLAB Function parameter data 'G_Encoche' in its parent workspace.
    % Undefined function or variable 'G_Encoche'.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    J'ai réussit à faire fonctionner si je déclare G_Encoche dans le Workspace...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    La déclaration d'une variable dans le Workspace et l'appel de cette variable via l'option paramètre dans une MATLAB Function fonctionne comme je le souhaite.
    Cependant, j'ai un grand nombre(>20) de paramètres à passer. J'ai pensé à utiliser une classe pour passer tous les paramètres.

    http://www.mathworks.com/company/new...in-matlab.html

    La création de la classe et la lecture de ses propriétés fonctionne bien sous MATLAB. Lorsque que je souhaite accéder à la classe (Que je vois dans le Workspace) via une MATLAB function sous SIMULINK, j'obtiens une erreur:

    Expression 'M' for initial value of data 'M' (#44) must evaluate to a numeric or logical. 
    M étant l'objet que j'ai créé...

    Des pistes pour passer des paramètres à SIMULINK sous forme de classe ou structure...???

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Salut,

    J'ai réussit à ajouter un paramètre (G_Encoche) mais pas avec un clic droit...
    J'ai ouvert le code de la fonction, et j'a utiliser le menu "Edit data". Est ce la même chose?
    Oui c'est bon, c'est la même chose.

    Du coup, quand tu passe ta variable en paramètre, Simulink va chercher dans le Workspace de Matlab la variable portant le même nom que celle que tu as déclaré (dans ton cas G_encoche) dans ton bloc.

    Si tu veux déclarer tes variables d'entrées de ton bloc Simulink depuis Matlab, il te suffit d'écrire un script avec tes différents paramètres d'initialisation et d'exécuter ton script avant ton modèle simulink, afin d'avoir tes variables déclarées dans le Workspace de Matlab

    En espérant que ça t'aide

    Camille

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    En fait j'ai créé un fichier Var.m qui initialise toutes mes variables. Ces variables sont créées dans le Worspace. Ensuite je sauvegarde mon Workspace dans un fichier Param.mat. Ensuite, lorsque j'appel mon modèle simulink, lors de l'initialisation, il y a un script qui s'execute (init_cond.m) dans lequel j'ai une ligne load('Param.mat'). Je ne sais pas si c'est une bonne façon mais cela fonctionne.

    Toutefois, il me reste un problème à résoudre. Je souhaite regroupé toute ces variables dans une structure. Ensuite j'aimerai (Comme en C), passer ma structure de données en paramètre de ma fonction au lieu de passer chaque paramètre.

    Comment peut on faire cette action sous simulink ? (qui est si simple à réaliser en C...)

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maStructure = load('Param.mat');
    et toutes tes variables de ton .mat seront chargée dans la structure maStructure , qu'il suffit de passer en paramètre à une fonction

    encore plus simple qu'en C

    Fabien

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    J'utilise déjà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maStructure = load('Param.mat');
    dans ma mtalab function...

    ...mais lorsque je compile avec le rapid Accélérator cela ne fonctionnait pas... Cependant, je ne faisait pas de la bonne manière.

    Il faut mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maStructure = load('Param.mat');
    dans un script sous Matlab. Cela a pour effet de créer 'maStructure' dans le workspace.

    Ensuite déclarer le paramètre maStructure dans la Matlab Function de Simulink (via le menu edit data) et voilà!

    Ma question initiale est résolu. Avant de marquer le post comme tel je veux juste faire une dernière vérif...

    En tout cas merci à tous!

  10. #10
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut


    Presque résolu...

    Le passage de structure dans une MATLAB Function fonctionne lorsque l'on compile ne mode "normal", "accelerator" mais pas "rapid accelerator" !

    Des idées pour que cela fonctionne en "rapid accelerator" ???

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    essaye d'encapsuler la matlab function dans un sous system, et de masquer celui ci
    puis tu passes à ce sous système ta structure, dont tu extrais les variables utiles à la matlab function dans le mask

    sans garantie
    Fabien

  12. #12
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    J'ai ressorti ma variable S qui est une strucrure de données au plus haut niveau de mon modèle SIMULINK. Lorsque je compile, il me génère cette erreur :
    Invalid structure-format variable specified as workspace input in 'Modele_Thermique/Parametres'. If the input signal is a bus signal, the variable must be a structure of MATLAB timeseries objects. Otherwise, the variable must include 'time' and 'signals' field, and the 'signals' field must be a structure with a 'values' fields.
    Toutes les autres variables du workspace que j'utilise on deux colonnes, col 1: le temps, col2:data. Avec cette structure S, je n'ai pas cette notion de temps, car ces données sont les mêmes pour chaque itération...

    Comment faites vous pour passer ce genre de structure non temporelle?

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    avec un bloc "constant" par exemple

    Fabien

Discussions similaires

  1. [AC-2000] Variable global sous Visual Basic
    Par Jason T dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/06/2009, 15h19
  2. Réponses: 1
    Dernier message: 26/02/2009, 07h11
  3. Variable globale sous FF
    Par Death83 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/08/2007, 20h15
  4. Réponses: 6
    Dernier message: 21/09/2006, 10h02
  5. Constantes / Variables globales utilisateur
    Par vynce dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/11/2005, 14h56

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