2016-08-24 1 views
1

J'ai un fichier Modelica qui référence le code c pendant la simulation via un fichier * .a de la bibliothèque externe.Référencement de fichiers externes dans JModelica

Par exemple:

model CallAdd 
    input Real FirstInput(start=0); 
    input Real SecondInput(start=0); 
    output Real FMUOutput(start=0); 
    function CAdd 
     input Real x(start=0); 
     input Real y(start=0); 
     output Real z(start=0); 
     external "C" annotation(Library = "CAdd", LibraryDirectory = "modelica://CallAdd"); 
    end CAdd; 

equation 
    FMUOutput = CAdd(FirstInput,SecondInput); 
    annotation(uses(Modelica(version = "3.2.1"))); 
end CallAdd; 

Lors de l'ouverture du modèle Modelica dans OpenModelica les fichiers requis semblent être automatiquement chargé car il simule et donne des résultats appropriés.

Toutefois, lorsque j'essaie de compiler le fichier Modelica avec JModelica-SDK-1.12, le message d'erreur indiquant que le fichier * .a de la bibliothèque est introuvable s'affiche.

Donc, ma question est: Quelle est la bonne façon de référencer des fichiers supplémentaires lors de l'utilisation de compile_fmu dans JModelica?

sans succès, j'ai essayé:

# Import the compiler function 
from pymodelica import compile_fmu 
model_name = "CallAdd" 
mo_file = "CallAdd.mo" 

# Compile the model and save the return argument, for use later if wanted 
my_fmu = compile_fmu(model_name, mo_file, target="cs",compiler_options = {'extra_lib_dirs':'C:/ToFolderContainingLib/'}) 

La chose étrange est que quand j'utilisais JModelica-1.17 (non-SDK) le fichier compilé bien, mais les résultats n'a pas de sens . J'ai été recommandé d'essayer la version SDK pour voir si elle a corrigé mes erreurs dans mon post précédent here.

Répondre

2

Essayez de positionner la bibliothèque externe dans le sous-dossier nommé comme plate-forme actuellement active. Donc, dans votre exemple, je positionnerais la bibliothèque (libCAdd.a) dans le sous-dossier nommé linux64, car je suis sur une machine Linux 64 bits, puis j'exécuterai le code.

+0

Bonjour Christian Andersson, qui semble avoir résolu le problème. Merci beaucoup! –

2

Si est un petit morceau de code C, comme dernière solution, vous pouvez essayer d'inclure le fichier C directement dans le code Modelica:

external "C" annotation(Include=" 
// the entire C code here 
"); 

Espérons que les gens JModelica vous donnera une meilleure réponse bientôt. Vous pouvez également essayer de demander ceci sur leur site Web: http://www.jmodelica.org/forum

+0

Merci pour votre réponse rapide. Je vais essayer. Quand j'ai essayé de mettre le code C directement dans un fichier Modelica dans le passé, j'ai reçu des erreurs comme "Référence indéfinie à la fonction". En d'autres termes, lorsque le modèle est instancié, la fonction est perdue. Pour référence: https://www.dropbox.com/s/lrz2sy0yics80w5/CallDirect.mo?dl=0 –

+0

Je semblais avoir compris. Je crois que le nom de la fonction C doit correspondre au nom de la fonction Modelica, est-ce correct? Y a-t-il une syntaxe que je devrais suivre lorsque je travaille entre C et Modelica. J'ai trouvé des informations limitées? Le livre Xogeny (http://book.xogeny.com/behavior/functions/external/) et ce post d'interopérabilité (https://www.openmodelica.org/doc/OpenModelicaUsersGuide/latest/interop_c_python.html) ont été les meilleurs ressources que j'ai trouvé jusqu'à présent. Mais le débogage nécessite souvent des informations plus approfondies. Merci pour votre temps. –