2016-08-24 68 views
1

我有一個Modelica文件,在仿真期間通過外部庫* .a文件引用c代碼。在JModelica中引用外部文件

例如:

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; 

當打開在OpenModelica的Modelica的模型所需的文件似乎被自動加載,因爲它模擬,並給出相應的結果。

但是,當我嘗試使用JModelica-SDK-1.12編譯Modelica文件時,收到無法找到庫* .a文件的錯誤。

所以我的問題是:在JModelica中使用compile_fmu時引用其他文件的正確方法是什麼?

沒有成功,我已經試過:

# 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/'}) 

奇怪的是,當我使用JModelica-1.17(非SDK)文件編譯罰款,但結果並沒有什麼意義。我建議嘗試SDK版本,看看它是否修復了我之前發佈的文章here中的錯誤。

回答

2

嘗試將外部庫定位到名爲您當前所在平臺的子文件夾中。因此,在您的示例中,我將庫(libCAdd.a)放在名爲linux64的子文件夾中,因爲我在64位Linux機器上,然後運行代碼。

+0

嗨克里斯蒂安安德森,似乎已經解決了這個問題。非常感謝你! –

2

如果是一小片的C代碼,作爲最後的選擇,你可以嘗試包括C文件直接在Modelica的代碼:

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

希望的JModelica人將盡快給你一個更好的答案。 您也可以嘗試在其網站上詢問此問題: http://www.jmodelica.org/forum

+0

謝謝你的快速回復。我會試一試。當我嘗試將C代碼直接放入Modelica文件中時,我收到了「未定義的函數參考」等錯誤。換句話說,當模型被實例化時,該功能就會丟失。作爲參考:https://www.dropbox.com/s/lrz2sy0yics80w5/CallDirect.mo?dl=0 –

+0

我似乎已經明白了。我相信C函數名稱需要匹配Modelica函數名稱的名稱,是否正確? 在C和Modelica之間工作時,我應該遵循一個語法。我發現有限的信息? Xogeny書(http://book.xogeny.com/behavior/functions/external/)和這個互操作性文章(https://www.openmodelica.org/doc/OpenModelicaUsersGuide/latest/interop_c_python.html)一直是最好的我迄今爲止發現的資源。但調試通常需要更深入的信息。感謝您的時間。 –