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 :

aide S-function


Sujet :

Simulink

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 56
    Points : 38
    Points
    38
    Par défaut aide S-function
    J'ai effectué quelques recherches, mais je n'es pas trouver de solution, ou n'arrive pas à appliquer les raisonnements misent en exergue.

    Je recherche donc a réaliser une S-function MATLAB.

    Je n'arrive pas rendre opérationnelle la fonction suivante :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    function [sys,x0,str,ts] = atmosphere_sfction(t,x,u,flag)
     
     
    switch flag,
     
      case 0
        sys=mdlInitializeSizes;
     
      case 3
     
    gamma=1.4;
    r=287.0529;
    ro_alt_0=1.225;
     
    if (0<=u)&&(u<=11000);
        Ps=101325*((1-(22.5576934*(10^-6))*u)^5.2558774);
        T=288.150-0.0065*u;
        a=sqrt(gamma*r*T);
        ro=(Ps/(r*T));
        d=ro/ro_u_0;
        sys=[Ps T a ro d];
    elseif (11000<u)&&(u<=20000);
        Ps=22632*exp((-157.688446*(10^-6))*(u-11000));
        T=216.65;
        a=sqrt(gamma*r*T);
        ro=(Ps/(r*T));
        d=ro/ro_u_0;
        sys=[Ps T a ro d];
    elseif (20000<u)&&(u<=32000);
        Ps=5474.9*((1+(4.6157398*(10^-6))*(u-20000))^-34.1632061);
        T=216.65+0.001*(u-20000);
        a=sqrt(gamma*r*T);
        ro=(Ps/(r*T));
        d=ro/ro_u_0;
        sys=[Ps T a ro d];
    elseif (32000<u)&&(u<=47000);
        Ps=868.014*((1+(12.2457904*(10^-6))*(u-32000))^-12.2011445);
        T=228.65+0.0028*(u-32000);
        a=sqrt(gamma*r*T);
        ro=(Ps/(r*T));
        d=ro/ro_u_0;
        sys=[Ps T a ro d];
    end 
     
      case { 1, 2, 4, 9 }
        sys=[];
     
      otherwise
        error(['Unhandled flag = ',num2str(flag)]);
     
    end
     
     
    function sys = mdlInitializeSizes()
     
    sizes = simsizes;
    sizes.NumContStates  = 0;
    sizes.NumDiscStates  = 0;
    sizes.NumOutputs     = 1; 
    sizes.NumInputs      = 1;  
    sizes.DirFeedthrough = 0;   
    sizes.NumSampleTimes = 0;
     
    str=[];
    x0  = [];
    sys=simsizes(sizes);
    Mon problème vient du fait que je n'es pas réellement compris le fonctionnement de la fonction (utilisation des flags, et surtout les initialisations, déclarations).

    L'objectif de cette fonction est de renvoyer dans un vecteur (ici "sys") différentes valeurs (correspondant à la température, la pression statique, la densité, etc.) de l'atmosphère pour une altitude donnée (variable "u").

    Merci d'avance pour 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,

    Pourrais-tu nous éclairer sur ce qui ne fonctionne pas?

    Obtiens-tu un résultat (si oui lequel)? Un message d'erreur?

    Duf
    Simulink & Embedded Coder

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Le problème c'est que je n'es pas de message d'erreur.

    Pour tester le bloc avec ma fonction, j'ai mis une constante en entrée et un display en sortie. Or, les valeurs du display sont toujours à 0 et ce peut importe la valeur d'entrée.

    Quand j'exécute le simulink, j'obtiens en sortie la variable "tout" qui est le vecteur temps.

    A titre d'exemple, lorsque j'ai 0 en entrée, la valeur de la composante "ro" devrait être de 1,225.


    Edit : J'ai essayé de simplifier mon programme en ne recherchant non plus un vecteur en sorti, mais juste une des valeurs (j'ai choisi "ro"). Cela fonctionne bien. Mon problème est donc plutôt : Comment déclare-t-on que la sortie est un vecteur de dimension x*x ?

    Merci d'avance.

    Pour info, voici le code fonctionnant pour une seule valeur :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    function [sys,x0,str,ts] = essai_s_fctv(t,x,u,flag)
     
    switch flag,
     
      case 0
        [sys,x0,str,ts]=mdlInitializeSizes;
     
      case 3
        sys=mdlOutputs(t,x,u);
     
      case { 1, 2, 4, 9 }
        sys=[];
     
      otherwise
        error(['Unhandled flag = ',num2str(flag)]);
     
    end
     
    function [sys,x0,str,ts] = mdlInitializeSizes()
     
    sizes = simsizes;
    sizes.NumContStates  = 0;
    sizes.NumDiscStates  = 0;
    sizes.NumOutputs     = -1;  
    sizes.NumInputs      = -1;  
    sizes.DirFeedthrough = 1;  
    sizes.NumSampleTimes = 1;
     
    sys = simsizes(sizes);
    str = [];
    x0  = [];
    ts  = [-1 0];   
     
     
    function sys = mdlOutputs(t,x,u)
     
    gamma=1.4;
    r=287.0529;
    ro_alt_0=1.225;
     
    if (0<=u)&&(u<=11000);
        Ps=101325*((1-(22.5576934*(10^-6))*u)^5.2558774);
        T=288.150-0.0065*u;
        a=sqrt(gamma*r*T);
        ro=(Ps/(r*T));
        d=ro/ro_alt_0;
        sys=ro;
    elseif (11000<u)&&(u<=20000);
        Ps=22632*exp((-157.688446*(10^-6))*(u-11000));
        T=216.65;
        a=sqrt(gamma*r*T);
        ro=(Ps/(r*T));
        d=ro/ro_alt_0;
        sys=ro;
    elseif (20000<u)&&(u<=32000);
        Ps=5474.9*((1+(4.6157398*(10^-6))*(u-20000))^-34.1632061);
        T=216.65+0.001*(u-20000);
        a=sqrt(gamma*r*T);
        ro=(Ps/(r*T));
        d=ro/ro_alt_0;
        sys=ro;
    elseif (32000<u)&&(u<=47000);
        Ps=868.014*((1+(12.2457904*(10^-6))*(u-32000))^-12.2011445);
        T=228.65+0.0028*(u-32000);
        a=sqrt(gamma*r*T);
        ro=(Ps/(r*T));
        d=ro/ro_alt_0;
        sys=ro;
    end

  4. #4
    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
    Alors,

    Le code que tu as posté en tout premier renvoi une erreur avant même l'exécution chez moi. Rien de bien grave mais tu n'as pas initialisé les valeurs des variables de sortie lors de l'initialisation du modèle (flag = 0) donc certaines sont indéfinies.

    Tu as un fichier template pour les S-fonctions MATLAB de niveau 1: . Utilise-le pour définir la structure de ton code, ca sera plus lisible.

    As-tu vu que tu peux débugger ta S-function dans MATLAB (en utilisant les points d'arrêt), ce qui te permettrait de voir exactement ce qu'il se passe.

    Chez moi (avec ton code), lorsque l'entrée vaut 0, on ne rentre dans aucun des IF...ELSEIF et comme tu n'as pas défini de ELSE, la variable sys n'est pas définie (et vaut donc 0).

    Concernant le fonctionnement de la fonction, je te conseille de lire cette page de la documentation: MathWorks documentation: MATLAB S-function.
    Il faut savoir que les modèles Simulink (et donc les S-functions) utilisent plusieurs "phases" pour les calculs, dont les 2 principales vont être dans ton cas: l'initialisation (flag=0, fonction mdlInitializeSizes) et le calcul des sorties (flag=3 et normalement fonction mdlOutputs).
    L'initialisation ne s'effectue qu'à l'initialisation du modèle (avant la simulation) et le calcul des sorties à chaque pas de temps.
    Simulink & Embedded Coder

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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Merci de ton aide

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Je fais une nouvelle fois appel à vous ....

    Comme déclare-t-on que la sortie d'une S-function est une matrice ? Et non un vecteur.

    Merci d'avance.

Discussions similaires

  1. [Débutant] Aide lancer "function"
    Par Youni92 dans le forum MATLAB
    Réponses: 5
    Dernier message: 14/05/2010, 08h22
  2. [AJAX] aide Squeezebox function mal reconnue
    Par Maf77 dans le forum AJAX
    Réponses: 0
    Dernier message: 25/07/2009, 21h22
  3. Aide S-function en francais ?
    Par Dezailes dans le forum MATLAB
    Réponses: 0
    Dernier message: 22/05/2008, 19h26
  4. Réponses: 11
    Dernier message: 23/05/2007, 10h53
  5. [debutant] function aide
    Par lazzeroni dans le forum Oracle
    Réponses: 1
    Dernier message: 27/06/2006, 14h28

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