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

classic Classic list List threaded Threaded
5 messages Options
cedricbdo cedricbdo
Reply | Threaded
Open this post in threaded view
|

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

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.


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr

model_test.mdl (26K) Download Attachment
Alain LAMY Alain LAMY
Reply | Threaded
Open this post in threaded view
|

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

Bonjour,

Cette réponse arrive sans doute un peu tard...

Le problème vient a priori du code C:

*outputArgs = *(model_test_Y.Out1);

qui n'initialise pas tous les arguments de sortie, mais seulement le 1er élément.
Ca serait la même chose en entrée s'il y avait plus que 1 entrée.  

Par ailleurs, les fonctions appelées par call ont normalement une interface: void fct(...).
Vaudrait mieux renvoyer un code d'erreur dans une variable de sortie supplémentaire,
par exemple: void SetInput_CDV(double* inputArgs, int *ret)
[ et ajouter aussi  le nombre d'éléments du tableau en argument:
void SetInput_CDV(double* inputArgs, int *nb, int *ret)   ]  

Rem: Le "_" en début des noms des fonctions ne me semble pas utile.

Alain
cedricbdo cedricbdo
Reply | Threaded
Open this post in threaded view
|

Re: Utilisation de la fonction call sur une dll.

Bonjour,

J'ai réussi à solutionner le problème depuis. Votre solution est d'ailleurs en grande partie la même que j'ai mise en place par la suite.
Je vous remercie tout de même pour votre réponse.

Bonne journée,

Cédric


__________________________________

Cédric Benslimane
Stagiaire STAMPE/CDV - Cellule FCL


Phone: +33 (0) 5 67 20 94 40
Email: [hidden email]



Bâtiment ZEPHYR
3, rue Dieudonné Costes - BP 80075
31703 Blagnac Cedex - France

|-----Message d'origine-----
|De : [hidden email] [mailto:users-fr-
|[hidden email]] De la part de Alain LAMY
|Envoyé : samedi 22 juin 2013 10:23
|À : [hidden email]
|Objet : Re: [Users-fr] Utilisation de la fonction call sur une dll.
|
|Bonjour,
|
|Cette réponse arrive sans doute un peu tard...
|
|Le problème vient a priori du code C:
|
|*outputArgs = *(model_test_Y.Out1);
|
|qui n'initialise pas tous les arguments de sortie, mais seulement le 1er
|élément.
|Ca serait la même chose en entrée s'il y avait plus que 1 entrée.
|
|Par ailleurs, les fonctions appelées par call ont normalement une
|interface:
|void fct(...).
|Vaudrait mieux renvoyer un code d'erreur dans une variable de sortie
|supplémentaire,
|par exemple: void SetInput_CDV(double* inputArgs, int *ret)
|[ et ajouter aussi  le nombre d'éléments du tableau en argument:
|void SetInput_CDV(double* inputArgs, int *nb, int *ret)   ]
|
|Rem: Le "_" en début des noms des fonctions ne me semble pas utile.
|
|Alain
|
|
|
|
|--
|View this message in context: http://mailinglists.scilab.org/Users-fr-
|Utilisation-de-la-fonction-call-sur-une-dll-tp4026727p4026891.html
|Sent from the Liste utilisateur (en français) mailing list archive at
|Nabble.com.
|_______________________________________________
|users-fr mailing list
|[hidden email]
|http://lists.scilab.org/mailman/listinfo/users-fr


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.
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Adrien Granger Adrien Granger
Reply | Threaded
Open this post in threaded view
|

[Users-fr] Difficultés sur Loadmatfile

Bonjour,

Nous éprouvons des difficultés à charger certaines données en .mat avec la
fonction loadmatfile
Il s'agit d'une table regroupant plusieurs tables. En essayant de fragmenter
cette table en plusieurs .mat, nous éprouvons toujours des difficultés pour
importer juste une seule des tables, par exemple, Age_DC.mat

Nous avons effectué plusieurs tests pour comprendre d'où venait le problème,
sans succès.

Tout élément de réponse est le bienvenu.
Cdt,




_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr

don_societes.mat (42K) Download Attachment
Adrien Granger Adrien Granger
Reply | Threaded
Open this post in threaded view
|

[Users-fr] Difficultés sur Loadmatfile - Pièce jointe

La pièce jointe n'est pas passée au premier envoie je retente après
compression

Cdt,
Adrien

-----Message d'origine-----
De : [hidden email]
[mailto:[hidden email]] De la part de Adrien Granger
Envoyé : mardi 25 juin 2013 11:36
À : 'French users mailing list for Scilab.'
Cc : 'Soraya Chebak'
Objet : [Users-fr] Difficultés sur Loadmatfile

Bonjour,

Nous éprouvons des difficultés à charger certaines données en .mat avec la
fonction loadmatfile Il s'agit d'une table regroupant plusieurs tables. En
essayant de fragmenter cette table en plusieurs .mat, nous éprouvons
toujours des difficultés pour importer juste une seule des tables, par
exemple, Age_DC.mat

Nous avons effectué plusieurs tests pour comprendre d'où venait le problème,
sans succès.

Tout élément de réponse est le bienvenu.
Cdt,




_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr

don_societes.zip (36K) Download Attachment