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

  1. #1
    Membre du Club
    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
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
          W=pumpOrder.noOrder ;


    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]
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    t=[1] ; u=W ;
    (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

  2. #2
    Modérateur

    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
    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

  4. #4
    Modérateur

    hello

    bon moi j'arrive à faire ca :


    ci joint mon modèle modifié :


    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
    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

###raw>template_hook.ano_emploi###