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 :

Utilisation de M-file dans des MATLAB Embedded Functions


Sujet :

Simulink

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Utilisation de M-file dans des MATLAB Embedded Functions
    Bonjour,

    J'ai créé des fonctions Matlab Embarqué dans simulink dans lesquelles je voudrais utiliser des fonctions que j'ai créé dans des M-file.

    J'ai enregistré mes fonctions dans un dossier de mon répertoire de travail :
    \MatlabFunctions\strToNum.m

    Pour l'instant dans ma fonction embarquée matlab, j'ai essayé de la déclarée avec :
    coder.extrinsic('strToNum');
    ou
    coder.extrinsic('MatlabFunctions\strToNum');

    mais dans les 2 cas il me génère une erreur :
    Undefined function or variable 'coder'.

    Function 'getAllContentsNum' (#18.172.177), line 6, column 1:
    "coder"
    Ma fonction matlab embarqué est la 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
    function contentNum = getAllContentsNum(list, sessionIds)
     
    % Retourne toutes les valeurs associées aux ids passés dans le tableau sessionIds au format (1, 10, 'double')
    %
     
    coder.extrinsic('MatlabFunctions\getContent');
    coder.extrinsic('MatlabFunctions\strToNum');
     
    contentStr = zeros(1, 256, 'uint8');
    contentNum = zeros(1, 10, 'double');
     
    for i=1:10
        contentStr = getContent(list, sessionIds(i));
        contentNum(i) = strToNum(contentStr);
    end
    et la fonction que j'appel :
    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
    function num = strToNum(str)
     
    %Retourne la valeur numérique d'une String au format uint8
    %
     
    val = zeros(1,10,'double');
    pow = zeros(1,10,'double');
    num = double(0);
    total = max(size(char(str)));
    i = 1;
    j= total;
    while i<=total && j>1
        val(i) = getNum(str(i));
        i = i+1;
        j = j-1;
    end
    for i=1:total
        num = num + (val(i) * pow(i));
    end
     
    % Retourne la valeur numérique(double) d'un chiffre ASCII(uint8) compris entre 0 et 9 
    function num = getNum(chr)
    ascii = [48:1:57];
    num = double(0);
    for i=1:10  
        if ascii(i) == uint8(chr)
            num = double(i);
        end
    end
    Est ce que quelqu'un peu m'aider sachant que le but final est de générer une dll avec mon code simulink et que ma version matlab est R2007b.

    Merci d'avance

  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,

    Essaye de remplacer 'coder' par 'eml', coder n'est apparu qu'en r2011a et avant ca s'appelait eml.

    Duf

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Effectivement, le eml.extrinsic fonctionne.

    Par contre je suis surpris que le coder.extrinsic ne fonctionne pas car justement j'avais lu dans l'aide de ma version de Matlab qu'il fallait utiliser coder.extrinsic pour la génération de code et j'avais supposé que mes fonctions en aurais besoin pour la création de ma dll.

    Du coup tu penses que je n'aurais pas de soucis pour générer?
    Avant j'utilisais des méthode Matlab comme str2num que je pouvais utiliser tant que j'étais dans l'IDE mais qui me généraient des erreurs lorsque je voulais générer la dll.

    Tu vas me dire que je n'ai qu'a essayer , mais je n'ai pas la licence pour, je ne peux générer que chez le client donc tant qu'à faire si tu sais.

    En tout cas merci

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Comme je le craignais j'ai des erreurs lors de la génération de ma dll du genre :
    Stateflow/Embedded MATLAB code generation for model "TS_V45".....Error using ==> sf
    Errors occurred during parsing of Embedded MATLAB function 'Logic_Interactive_Bite/DatasValues/getAllSessionIds'(#911)
    .Error using ==> sf
    Le problème viendrait de l'import des fonctions m-file avec eml.extrinsic dans les fonctions matlab embarqué de Simulink.
    Mon workspace ressemble à ça :
    MatlabFunctions /
    getContent.m
    getSession.m
    getSessionId.m
    getSessionsNumber.m
    numToStr.m
    strToNum.m

    ATA45_350_v0.mdl

    FSANG_MatlabEmbedded_Lib.mdl
    Avec les fonctions embarqué qui utilisent les .m présents dans MatlabFunctions /.

    Pour le moment j'ai réussi à résoudre le problème en recopiant l'intégralité de mes fonctions .m dans les fonctions embarqués et donc en n'utilisant pas eml.extrinsic.

    Mais vu que ce sont des fonctions réutilisable j'aimerais quand même pouvoir passer par les .m.

    Est ce que c'est possible?

  5. #5
    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
    Normalement si tes fonctions sont compilables tu dois pouvoir les appeler sans passer par eml.extrinsic (à moins que ce ne soit que dans les versions plus récentes...). As-tu essayé?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par duf42 Voir le message
    Normalement si tes fonctions sont compilables tu dois pouvoir les appeler sans passer par eml.extrinsic (à moins que ce ne soit que dans les versions plus récentes...). As-tu essayé?
    Oui c'est ça effectivement, il faut en plus rajouter une instruction (%#eml) dans le corps des fonctions susceptibles d'être utiliser par des Embedded MATLAB functions, ils appellent ça un "pragma" d'après ce que j'ai compris.
    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
    function valOut = numToStr(valIn)
     
    % Transforme une valeur numérique(double) en une String au format uint8
    % Maximum 10^10
     
    %#eml
     
    values = zeros(1,10, 'double');
    powV = zeros(1,10, 'double');
    pow = double(1);
    valOut = zeros(1, 10, 'uint8');
     
    while valIn/pow >= 10
        pow = pow*10;
    end
     
    ...
    Je trouve ça un peu bizarre vu qu'il y a un % devant mais ça à l'air de marcher vu que ça supprime les warnings.

    En tout cas un grand merci, j'ai réussi à générer ma dll et tout fonctionne parfaitement

  7. #7
    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
    Citation Envoyé par amaury972 Voir le message
    il faut en plus rajouter une instruction (%#eml) dans le corps des fonctions susceptibles d'être utiliser par des Embedded MATLAB functions, ils appellent ça un "pragma" d'après ce que j'ai compris.
    Oui j'avais omis ce détail. En fait ce pragma ne correspond pas à du code puisqu'il ne doit pas intervenir à l'exécution mais lorsque MATLAB analyse le code il lui permet d'identifier quels sont les fonctions à compiler, c'est pour ca que c'est un commentaire.

    Pour information, depuis la version 2011a il faut remplacer %#eml par %#codegen.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/04/2012, 09h17
  2. probleme d'utilisation d api c dans des controle forms avec wpf
    Par ZashOne dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 24/07/2007, 12h04
  3. Réponses: 5
    Dernier message: 01/03/2007, 18h08
  4. utilisation du help file dans les composants de la VCL
    Par SOPRA-Eherve dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/09/2006, 22h47
  5. Réponses: 2
    Dernier message: 12/04/2006, 20h48

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