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

MATLAB Discussion :

[Simulink][S-function] comment utiliser un serveur COM ?


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Par défaut [Simulink][S-function] comment utiliser un serveur COM ?
    Bonjour à tous,

    Mon problème est le suivant :

    J'utilise un périphérique (centrale inertielle) dont le fabricant fournit des interfaces COM. Ces interfaces fonctionnent très bien dans le cadre d'un fichier M classique. Mais les choses se compliquent lorsque je souhaite utiliser ce code dans une S-function.

    Le but est d'effectuer l'initialisation (création du serveur COM et configuration du matériel) une seule fois par simulation, car cette partie prend beaucoup de temps de calcul.
    Ensuite, une partie "mesures" s'effectue à chaque pas de simulation.

    Jusqu'ici pas de problème.
    Seulement voilà, après avoir créé mon serveur COM (fonction 'actxserver'), dans le callback d'initialisation, il n'est plus reconnu à l'extérieur de cette callback (comme s'il n'était déclaré qu'en local).

    Dans le Help (section "Releasing COM Interfaces and Objects"), on peut lire que Matlab efface automatiquement les objets COM dès lors qu'ils "Out of scope". Donc serait-il possible de les conserver, pour ne pas avoir à les redéclarer à chaque cycle ?

    voici l'essentiel du programme :

    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
    function MTi_G(block)
        setup(block);
    function setup(block) 
        [...]
    function Initialization(block)
        cmtcom = actxserver('MotionTracker.CMT.1');
        try
            cmtcom.cmtCreateInstance('demo1');
            cmtcom.cmtOpenPort(5);
            deviceId = cmtcom.cmtGetDeviceId;
            cmtcom.cmtGotoConfig; 
            cmtcom.cmtSetDeviceMode(2111,5,100,deviceId);
            cmtcom.cmtGotoMeasurement;  
            pause(0.01);
        catch 
            [...]
        end
     
    function Output(block)  
            cmtcom.cmtGetNextDataBundle;
            cmtcom.cmtDataContainsRawAcc;
            data = cmtcom.cmtDataGetRawAcc;
            block.OutputPort(1).Data = data;
     
    function Terminate(block)
           delete(cmtcom)
    - Si je regroupe le code d'initialisation et de fermeture dans le callback 'Outputs', tout marche bien, (mais bien sûr très lentement).
    - Sinon, comme je l'ai tapé ci-dessus, il ne reconnait plus l'objet 'cmtcom', une fois passée l'initialisation.

    Merci de votre aide,
    et merci de votre compréhension car je débute avec ces notions.

    thegill

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Salut,

    Ce que tu cherches à faire, c'est de conserver des variables de fonctions en fonctions ?

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    As-tu essayé en passant l'identifiant du contrôle en argument d'entrée/sortie des fonctions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function cmtcom=Initialization(block)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Par défaut
    ouah, je ne m'attendais pas à des réponses si rapides

    --> Christophe :
    Dans mon programme, j'arrive à passer des variables (genre int, float et toute la clique...) d'une fonction à une autre, en utilisant un vecteur Dwork.

    Seulement, je dois indiquer le type de données à mettre dans ce vecteur. Comme il s'agit d'un identifiant de contrôle (cmtcom), je ne sais pas vraiment de quel type il s'agit. (pointeur, peut-être ? mais je crois que c'est difficile à gérer avec Matlab)

    --> Dut :
    J'avais bien tenté, à un moment, de passer l'identifiant de contrôle en argument des fonctions, mais peut-être avais-je commis une erreur de syntaxe (les habitudes du C...). J'essaie ça demain.

    merci merci !
    thegill

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Par défaut
    voilà, j'ai bien tenté de passer l'identifiant du contrôle (cmtcom) en argument de sortie de 'Initialization' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function cmtcom = Initialization(block)
    et en argument d'entrée de Output :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Output(block, cmtcom)
    mais Matlab ne reconnait pas ce nouvel argument d'entrée :
    "Error [...] : Input argument 'cmtcom' is undefined"

    Le problème est que je n'ai pas accès au prototype de la fonction 'Initialization', celle-ci étant simplement enregistrée (et non pas créée) au cours de la callback 'setup' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    block.RegBlockMethod('Outputs', @Output);
    J'ai aussi essayé de créer une nouvelle fonction, dans un fichier M séparé. La fonction s'éxécute normalement (avec des variables classiques en argument), mais pas moyen de passer l'identifiant de contrôle en entrée de 'Outputs'.


    thegill

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    As-tu essayé avec la fonction ACTXGETRUNNINGSERVER ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/09/2010, 09h28
  2. Réponses: 1
    Dernier message: 17/04/2009, 17h56
  3. Comment trouver un serveur COM dans la ROT?
    Par Zalathorn dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2008, 15h28
  4. comment utiliser le port com a mes application?
    Par zakichanedz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/05/2007, 20h03
  5. [COM] Comment utiliser l'objet COM ?
    Par splinternabs dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 14/04/2006, 11h58

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