[Users-fr] Utilisation de la fonction call sur une dll.

BENSLIMANE Cedric Cedric.BENSLIMANE at aeroconseil.com
Jeu 23 Mai 11:59:03 CEST 2013


Bonjour à tous,

 

Je cherche actuellement à utiliser une dll dans Scilab 5.4.0.

J'explique ici mon problème.

J'ai créé une dll grâce à l'outil RTW (Real-Time Workshop) sur Matlab à partir d'un modèle Simulink qui est le suivant :

 

 

Ce modèle se nomme « model_test » et l'entrée et la sortie sont toutes les deux de dimensions 2.

 

 

L'outil RTW me permet de créer un code C recréant ce schéma, dont je me suis ensuite servi pour créer la dll.

J'ai créé celle-ci grâce à un wrapper dans le quel se trouve 5 fonctions :

-          Initiate : qui initialise le modèle

-          SetInput_CDV : qui permet de définir les entrées du modèle

-          OneStep_CDV : qui réalise un pas de calcul

-          getOuput_CDV : qui permet d'obtenir la sortie

 

Pour info, voilà comment sont définis les fonctions SetInput_CDV et getOutput_CDV.

 

char* SetInput_CDV(double* inputArgs)

{

    *(model_test_U.In1) = *inputArgs;                                               /*Change Model name and name of Input here*/

                return "t";

}

 

char* getOutput_CDV(double* outputArgs)

{              

                *outputArgs = *(model_test_Y.Out1);                                               /*Change Model name and name of Output here*/

    return "t";

}

 

U représente la structure des entrées et Y la structure des sorties.

 

Voilà ensuite comment je veux utiliser ma dll dans Scilab.

 

func_names = [ '_SetInput_CDV', '_Initiate_CDV', '_OneStep_CDV', '_getOutput_CDV', '_Cleanup_CDV' ];

flag="c";

dll = link("model_test.dll", func_names, flag)

Ini=call("_Initiate_CDV")
In=call("_SetInput_CDV",2,1,"d") //la valeur d'entrée de In1 est donc 2
OS=call("_OneStep_CDV")
Out=call("_getOuput_CDV","out",[2,1],1,"d")//la sortie est bien de dimension 2 et de type double
 

J'obtiens en résultat : 

Out  =

 

    4.         

    2.97D-313  

 

On a bien la dimension 1 qui est égale à 4 (gain1=2, In1=2)

En revanche on devrait avoir 10 pour la dimension 2 (5*2) mais cette valeur n'est pas reconnue et j'obtiens un nombre aléatoire en sortie.

 

Savez-vous comment faire pour bien obtenir en sortie un vecteur de dimension 2 avec les bons résultats soit Out=[4,10] ?

 

Je vous remercie pour votre aide.

 

Cordialement,

 

Cédric

 

 

Ps : je met en pièce jointe mon modèle Simulink



Le contenu de ce message est prévu uniquement pour le destinataire nommé. Il contient des informations qui peuvent être confidentielles. A moins d'être le destinataire nommé ou autorisé par le destinataire, vous ne pouvez pas copier, employer ou révéler à une autre personne le contenu de ce message. Si vous le recevez par erreur, s'il vous plait, informez nous immédiatement et détruisez le.

The contents of this e-mail are intended for the named addressee only. It contains information that may be confidential. Unless you are the named addressee or an authorized designee, you may not copy or use it, or disclose it to anyone else. If you received it in error please notify us immediately and then destroy it. 
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <https://lists.scilab.org/pipermail/users-fr/attachments/20130523/702a2d08/attachment.htm>
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: image001.png
Type: image/png
Taille: 12954 octets
Desc: image001.png
URL: <https://lists.scilab.org/pipermail/users-fr/attachments/20130523/702a2d08/attachment.png>
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: model_test.mdl
Type: application/octet-stream
Taille: 19488 octets
Desc: model_test.mdl
URL: <https://lists.scilab.org/pipermail/users-fr/attachments/20130523/702a2d08/attachment.obj>


Plus d'informations sur la liste de diffusion users-fr