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 :

Variable enumérée en externe d'un modèle Simulink possible ? Comment ?


Sujet :

Simulink

  1. #1
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 45
    Points
    45
    Par défaut Variable enumérée en externe d'un modèle Simulink possible ? Comment ?
    Bonjour
    J’ai un modele simulink (relativement complexe) qui utilise des variables de type Simulink.IntEnumType

    Je veux passer une variable Simulink.IntEnumType en external input vers un modele
    Pour ce test mon modele comprend un In1 et un scope (et c’est tout).

    Ces variables ENUM sont définies dans un fichier de définition de classe tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % Definition  classe pumpOrder  
     
    classdef pumpOrder < Simulink.IntEnumType
        enumeration
            noOrder(1000)          %unknown(0)
            start_pump(1011)       % Running (11) a modifier plus tard en runningPV (11)  runningGV (12)(12)
            stop_pump(1010)        % standby(10)
            mnt_pump (1019)        % maintenance (19)
        end
    end
    Dans le workspace je peux définir des variable de la class pumpOrder par
    Je veux ensuite passer cette variable W au modele en utilisant « External input » et un port d’entré par ex In1 et l’option input du configuration parameter [t,u]
    (jai choisit d'avoir une seule valeur pour simplifier mais avec 2 ou 10 valeurs c'est le même probleme)

    ca ne marche par j’ai le message d’errreur suivant
    Error evaluating expression '[t,u]' for 'ExternalInput' specified in the Configuration Parameters dialog for block diagram 'EssaiSimplifiedpump2': Cannot find a member of the 'pumpOrder' enumeration class that corresponds to each element of the given input argument.
    Dans given input argument , je n’ai que un element « noOrder » et cet élément existe bien dans la description de class pumpOrder

    Donc je ne comprend pas ce qui ce passe...
    j'ai essayer de passer le type du bloc In1 à pumpOrder (au lieu de inhereted) mais ca ne change rien...

    j'ai l'impression que c'est l'interpolation de u pour les différentes valeur de t qui pose pb, mais je ne sais pas coment régler cela.

    Est-ce que l’utilisation de Simulink.IntEnumType est possible en entré « External input » et comment ?

    l'exemple est dans le ZIP

    Mise a jour 24-01-2019 :
    en cherchant sur le site matworks j'ai trouvé plusieurs choses
    1) que les entrée externe acceptent tout type de signez yc les ENUM
    2) que dans le cas des ENUM il faut décocher la case interpolate data du inblock correspondant
    puis ailleurs "
    to load discrete signals data from the workspace , in the inport block dialog box
    1) Set the sample time parameter to a discrete value such 2
    2) Clear the interpolate data parameter

    j'ai essayé mais ce ne marche pas même message que avant

    Après divers indice me laissene à penser que le bout de logiciel qui interprete [t,u] ne trouve pas les membres de la classe que j'ai défini (alors que le fichier de définition de class est dans le path matlab)
    est ce que il y a une operation spéciale à faire ?

    enfin la syntaxe de [t,u] n'est pas claire pour moi dans le cas de plusieurs entrées de classe différentes. Je ne peux pas les concaténer en une seul matrice u .
    comment faire dans ce cas ?

    pour résumer j'ai besoin d'aide sur ce sujet aucun progres en 4 jours et la voie de contournement si elle existe sera compliquée

    merci
    Fichiers attachés Fichiers attachés

  2. #2
    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

    les inputs possibles (dans le panneau de configuration) sont de type tableau de double, timeseries, structure ...
    hors tu utilise un tableau [t,u] ou t est un double, et u non !

    du coup en mettant comme inputs u (au lieu de [t,u] ), défini par u = timeseries(W,t);.
    et également en définissant comme datatype Enum: pumpOrder dans l'onglet signal attribute, ca marche


    Fabien

  3. #3
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 45
    Points
    45
    Par défaut
    Bonjour
    merci Fabien
    mais non ça ne marche pas ou plus exactement je ne sais pas le faire marcher

    Certes entrer avec des timeserie permet au modele de démarer et de recevoir les valeurs ENUM. par contre les instants de changement de valeur des variablmeENUM ne sont pas maitrisés....
    Résumé

    Je dois utiliser des variables simulink renumere en entrée d’un modele que je souhaute ultérieurement compiler.
    Il sembler que la seule methode soit d’utiliser des time series, c'est-à-dire une timE serie par port d’entrée de mon modele;

    J’ai réussi à créer des time série dont le DATA est la variable emumeré;

    Par contre je ne parviens pas à[B] maitiser le moment ou la data change de valeur en entrée du modèle lors de la simulation /B].
    Un changement de valeur sur Enum1 programmé à t=1,6 et 10 s sont pris en compte à t=2s, 4s, 6s ?
    Mais je n’ai jamais rentrer un quelconque pas de 2 secondes !.
    C’est le même comportement avec les Enum et les entrées doubles !
    Question 1 : dans l’entre « external input » d’un modele, si on utilise des timeseries,
    a) est ce que toutes les timeserie doivent avoir le même vecteur temps ?
    b) est ce que le vecteur temps doit être avec un pas de temps constant c'est-à-dire un espace de temps identique entre 2 datasuccessif ?
    c) Si oui cet espace de temps doit il être égal au pas de simulation ? –(0.1s pas fixe dans mon example)
    d) Quel est le caractère de séparation entre 2 timeserie dans le chap external input ; espace, virgule et point-virgule semble avoir le même effet ?


    Question 2 : comment simulink interprète entre 2 échantillons de time série.
    a) Lorsque la case interpolate du in block est cochée
    b) Lorsque la case interpolate du in block n’est pas cochée
    c) Quelle difference entre décocher la case « interpolate » du in bloc) et utiliser la commande « TSDataE2=setinterpmethod(TSDataE2,'zoh') » pour pour empêcher d’interpoler DANS LA STRUCTURE MËME DE LA TIME SERIE?
    (cette ciommande change (lohgiquement le trace d’une tim serie via plot(TSEnum2) (par ex) mais semble n’avoir aucun effet sur le modèle simulink.


    Question 3 : est ce que il y a un endroit ou dire à simulink d’aller lire les timeséries tous les X secondes ?

    Pourquoi dans le modele « TestEntresSimples4 » les entrée E1 et E2 sont mise à jour aux instants adéquats ?
    Et dans le modèle TestEntresSimples2 , les entrée E1 et E2 sont mise à jour plus tard pour t= 2 et t= 6s ? la seule différence est l'ajout des variable enumerée ( qui d'alleurs ne sont pas non plus mises à jour aux instants adéquats)
    Je n’y comprends rien.
    ET CA FAIT DES JOURS QUE JE SUIS BLOQUE AVEC CE TRUC

    cata
    Fichiers attachés Fichiers attachés

  4. #4
    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
    hello

    bon moi j'arrive à faire ca :
    Nom : Capture.JPG
Affichages : 363
Taille : 37,0 Ko

    ci joint mon modèle modifié :
    EssaiSimplifiedpump2_modifie.7z

    et le code associé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    W1 = pumpOrder.noOrder ;
    W2 = pumpOrder.start_pump
    W3 = pumpOrder.stop_pump
    u = timeseries([W1 W2 W3 W2 W3 W1]', [0 2.2 8.6 11.2 15 18])
    sinon pas d'interpolation dans l'input : cela va te décaler les données :
    chaque enum est associé à un nombre :

  5. #5
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 45
    Points
    45
    Par défaut
    Merci Fabien

    Maintenant ca marche à peu près effectivement

    on peut mettre des timeseries avec des ENum ou des double et des vecteurs temps differents, cela semble marcher correctement

    Cata

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

Discussions similaires

  1. modèle simulink --> .m
    Par Wassim123 dans le forum Simulink
    Réponses: 2
    Dernier message: 24/02/2009, 16h36
  2. Transmettre une variable à un script externe ?
    Par renaud26 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/01/2009, 12h31
  3. Intégration de code C à un modèle Simulink
    Par ManiMatworker dans le forum Simulink
    Réponses: 2
    Dernier message: 19/05/2008, 15h45
  4. Réponses: 4
    Dernier message: 26/07/2007, 13h07
  5. variable global fichier externe?
    Par molesqualeux dans le forum C
    Réponses: 4
    Dernier message: 01/02/2006, 16h13

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