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 :

Créer une S-function à partir d'un code C existant. legacy_code ?


Sujet :

Simulink

  1. #1
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut Créer une S-function à partir d'un code C existant. legacy_code ?
    Bonjour à tous,

    j'ai écrit un code C permettant l'acquisition et l'envoi de données d'une carte d'E/S connectée sur un port PCIe de mon ordinateur. Le constructeur de cette carte m'a fourni une librairie qui m'a permis d'utiliser des fonctions toutes faites, pour aller "taper" dans le driver de cette carte.
    Ce code C est maintenant fonctionnel, il réalise ce que je souhaite.

    Maintenant, pour les besoins du projet sur lequel je travaille, ce code doit être exécuté dans Simulink. C'est donc tout naturellement que je me tourne vers une S-function, pour pouvoir intégrer du code C.
    N'étant pas du tout familier avec les S-function, on peut dire que j'ai beaucoup de mal à comprendre les mécanismes et le fonctionnement de la structure d'un code C d'une S-function (mdlInitializeSizes, mdlInitializeSampleTimes, mdlOutputs... etc.). Par exemple, je ne comprends pas où je dois initialiser mes variables ? Dans quelle fonction faut-il faire ça ?
    Dans mon code C initial, il y a une fonction main qui lance l'exécution d'un thread, qui lui-même exécute une boucle s'exécutant périodiquement (toutes les secondes). Ben, je ne vois pas DU TOUT comment intégrer cela dans une S-function

    Bref n'étant pas du tout à l'aise, en cherchant dans la documentation de Matlab, une solution de facilité semble correspondre à mon besoin : la fonction legacy_code qui, d'après ce que j'ai compris, permet de transformer un code C existant directement en code C utilisable par une S-function.

    Que pensez-vous de cet utilitaire, réalisant les choses à notre place ? L'idée est quand même de comprendre comment fonctionne une S-function. J'ai peur qu'après coup, je ne sois pas capable de bien m'y retrouver là-dedans.

    Merci de vos conseils
    À lire avant de poster : qu'est ce qu'un ECM (Exemple Complet Minimal) ?
    Règles des forums LaTeX. Quand votre problème est réglé, mettez votre discussion en
    Pour débuter en LaTeX je conseille fortement Tout ce que vous avez toujours voulu savoir sur LaTeX sans jamais oser le demander (merci Woody Allen ), livre téléchargeable gratuitement ou en vente dans le commerce pour 15 €

  2. #2
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Tu te lances dans un problème complexe, attends toi à des problèmes de compilation et des crashs violents sans debug. Si tu utilises des librairies et que tu as un message type 'méthode introuvable' de simulink, un outil qui peut te sauver la mise est le depency walker, que tu trouves facilement sur le net.
    Ceci étant dit, je ne connais pas le legacy code, ca vaut peut etre le coup de s'y intéresser, ça a l'air assez simple, et la doc Matlab est généralement bien faite.
    Une sfunction en C doit implémenter un certain nombre de méthode (mdlstart, mdloutput), et certaines autres méthodes sont implémentées par défaut. J'ai jamais trouvé de liste exhaustive de toutes les méthodes, mais les plus importantes et courantes se trouvent facilement dans les exemples de la doc.
    Dans ton cas tu lances l'execution du thread dans la méthode mdlStart, et tu fais appel au contenu de ta boucle dans mdlOutput. Simulink s'occupe de faire la boucle.
    Si tu as besoin de passer un pointeur d'une méthode (mdlStart) à une autre (mdlOutput) tu peux utiliser la notion de vecteur d'état et de travail :
    http://fr.mathworks.com/help/simulin...rk-vector.html

    Bon courage !
    N'hésite pas si tu as des questions au fur et à mesure de tes découvertes

  3. #3
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Salut FLB,

    je m'excuse de ne répondre que maintenant, mais j'ai été très pris par mon sujet, mes découvertes et mes prises de bec avec les S-function !
    Tout ça pour arriver au constat qu'effectivement, les S-function réclament un certain temps d'apprentissage, bien qu'après coup le mode de fonctionnement ne paraisse pas si complexe.

    Pour répondre un peu plus précisément sur ma méthode, j'ai décidé de créer une libraire (fichier.lib donc) comprenant tout un tas de fonctions auxquelles j'ai pu faire appel depuis ma S-function. De cette manière, le code est très structuré.
    Puisque j'utilisais le compilateur LCC pour compiler ma S-function, j'ai créé ma librairie avec ce même compilateur. Pour cela, j'ai utilisé les exécutables lcc.exe et lcclib.exe (disponibles dans les sous-dossiers d'installation de MATLAB) :
    qui permet de créer l'objet ma_librairie.obj. Ensuite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lcclib ma_librairie.obj
    qui crée ma_librairie.lib.

    Ensuite, j'ai effectivement eu besoin de partager des données entre différentes méthodes (notamment entre mdlStart, mdlOutputs et mdlTerminate). Pour cela, je n'ai pas utilisé les vecteurs d'état et de travail comme tu me l'as suggéré. Je dois bien dire que le temps jouait contre moi et je n'avais pas le temps de faire les choses propres donc j'ai utilisé des sortes de variables globales (que je déteste en temps normal). Je dis bien "sorte de", car j'ai déclaré ces variables en préambule de ma S-function (en static, quand même, histoire d'essayer de faire les choses propres ). Alors bon, je pense que cette manière de procéder n'est pas la plus propre qui soit, je pense que tes suggestions auraient méritées meilleure attention.

    D'une manière générale, je pense que la base d'apprentissage d'une S-function consiste à comprendre le cheminement temporel réalisé lors de l'exécution d'un modèle contenant une S-function :

    Nom : sfunc_c25.gif
Affichages : 425
Taille : 3,6 Ko
    C'est d'abord mdlStart qui est exécutée à l'étape "Start of simulation" (concrètement, au chargement du modèle, avant même t=0), puis mdlInitializeSizes (qui gère le nombre, type des paramètres et des ports d'entrée et de sortie du bloc S-function) et enfin mdlInitializeSampleTimes (qui ne s'occupe que du pas de temps de la S-function). Ensuite, mdlOutputs s'exécute en boucle à chaque pas de temps de la S-function et enfin mdlTerminate s'exécute à la fin de l'exécution du modèle.
    Après, tout un tas d'autres méthodes sont proposées (je crois que la liste exhaustive que tu cherches est disponible ici). J'ai notamment vu mdlUpdate" dont je n'ai pas encore bien compris la différence avec mdlOutputs, mais quoiqu'il en soit, les possibilités semblent assez larges... Comme d'hab avec MATLAB quoi

    Je n'ai pas utilisé le dependancy walker que tu m'as suggéré, le compilateur LCC m'a largement été utile pour débugger mon code C. Je n'ai pas eu de problèmes de "compilation et crashs violents sans debug" (put*** qu'est-ce que tu m'as fait peur quand j'ai lu ça ), mais peut-être que mon utilisation n'a pas été assez poussée pour que je sois confronté à ce genre de soucis.

    En tout cas, merci de ton aide qui m'a permis de débroussailler les premières idées que j'avais en tête

    Edit : j'ai oublié, mais après coup, je dois bien dire que je n'ai pas trouvé utile de faire appel à legacy_code. Et puis je ne suis pas sûr d'avoir bien compris si ça servait uniquement à ce que je pensais initialement...
    À lire avant de poster : qu'est ce qu'un ECM (Exemple Complet Minimal) ?
    Règles des forums LaTeX. Quand votre problème est réglé, mettez votre discussion en
    Pour débuter en LaTeX je conseille fortement Tout ce que vous avez toujours voulu savoir sur LaTeX sans jamais oser le demander (merci Woody Allen ), livre téléchargeable gratuitement ou en vente dans le commerce pour 15 €

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 09/10/2006, 10h12
  2. [C#/SQL Server 2005] Comment créer une base de donnée par le code ?
    Par FraktaL dans le forum Accès aux données
    Réponses: 4
    Dernier message: 09/09/2006, 17h27
  3. créer une partition disque à partir d'un dossier
    Par Ksual dans le forum Windows XP
    Réponses: 10
    Dernier message: 25/01/2006, 18h48
  4. Comment creer une procédure stockée à partir d'un code VBA?
    Par Alcor020980 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 24/05/2005, 19h55

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