版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
MWORKS.Sysplorer外部接口外部函數(shù)(C/C++/Fortran)李鵬宇蘇州同元軟控信息技術(shù)有限公司2025年4月23日目錄1.Modelica外部函數(shù)概況2.外部函數(shù)入門-Modelica調(diào)用C3.外部函數(shù)高級-Modelica調(diào)用c++/Fortran高級特性和外部編輯器4.常見問題說明1.1Modelica為什么要支持外部函數(shù)許多工程應(yīng)用程序需要與其他軟件進(jìn)行集成。使用外部函數(shù),Modelica可以方便地與其他編程語言和軟件進(jìn)行交互,如MATLAB、Simulink、LabVIEW和Python等。Modelica通過使用外部函數(shù)可以輕松地集成其他編程語言編寫的庫,如數(shù)學(xué)庫和物理模型庫,從而擴(kuò)展其功能。這可以讓用戶更加靈活地選擇合適的庫來解決特定的問題。提高M(jìn)odelica的靈活性和可擴(kuò)展性加速仿真過程外部函數(shù)可以使用高效的算法和數(shù)據(jù)結(jié)構(gòu)來加速仿真過程。例如,如果Modelica無法快速求解一個復(fù)雜的數(shù)學(xué)問題,可以使用外部函數(shù)來調(diào)用數(shù)值計(jì)算庫來解決該問題,從而加速仿真過程。支持與其他軟件的集成1.2外部函數(shù)簡介CC++Fortran外部函數(shù)Modelica模型doublegetreal_arg(doublea){ returna*2;}Python其他DLLEXEfunction
IncTest1
input
Real
dummy_u;
output
Real
dummy_y;
//外部函數(shù)聲明external
"C"dummy_y
=
getreal_arg(dummy_u)
annotation
(IncludeDirectory="modelica://ExternalFunctions/Resources/Include",
Include="#include\"useabc.c\"");
end
IncTest1;示例:C函數(shù)調(diào)用Modelica模型能被C調(diào)用的對象都可以1.2外部函數(shù)簡介function
IncTest1
input
Real
dummy_u;
output
Real
dummy_y;
//外部函數(shù)聲明external
"C"dummy_y
=
getreal_arg(dummy_u)
annotation
(IncludeDirectory="modelica://ExternalFunctions/Resources/Include",
Include="#include\"useabc.c\"");
end
IncTest1;Tips:這里IncludeDirectory注解中.c文件所在路徑采用了Modelica模式URI的方式來表示:說明見下頁對應(yīng)文件夾本示例路徑:軟件安裝目錄..\Docs\Samples\ExternalFunctions函數(shù)聲明引用配置1.2外部函數(shù)簡介Modelica模式URI說明:
使用MWORKS.Sysplorer建模時,有可能用到數(shù)據(jù)文件等外部資源。要使模型仿真時能正確找到相應(yīng)的文件,建模時需要遵循相應(yīng)的規(guī)范。外部資源統(tǒng)一以Modelica模式的URI表示,其形式為:modelica://Package_Name/Relative_PathPackage_Name是Modelica模型中package的名字,Relative_Path是相對路徑。這種URI在模型翻譯后得到絕對路徑,取Package_Name所在文件位于的文件夾作為基準(zhǔn)路徑,與Relative_Path組合形成完整的本地路徑。示例:modelica://Modelica.Mechanics/C.jpgmodelica://Modelica/Mechanics/C.jpg假設(shè)Modelica所在的package.mo文件位于“C:\Modelica3.2.1\Modelica”,而Modelica.Mechanics所在的.mo文件位于“C:\Modelica3.2.1\Modelica\Mechanics”,那么,這兩個都表示同一個文件“C:\Modelica3.2.1\Modelica\Mechanics\C.jpg”。1.2外部函數(shù)簡介ModelicaC輸入輸出Realdoubledouble*Integerintint*Booleanintint*Stringconstchar*constchar**Enumerationtypeintint*基本類型復(fù)合類型數(shù)組:基本類型地址的傳遞結(jié)構(gòu)體:Modelica中使用記錄類record對應(yīng)1.2外部函數(shù)簡介return指針變量C代碼中使用return返回輸出值,Modelica中使用output類型變量對應(yīng)。如:input
Real
dummy_u;output
Real
dummy_y;external
"C"
dummy_y=getreal_arg(dummy_u)//c代碼doublegetreal_arg(doubledummy_u){returndummy_y;}C代碼中使用指針變量輸出值,Modelica中使用output類型變量對應(yīng)。如:input
Real
dummy_u;output
Real
dummy_y;external
"C"
getreal_arg(dummy_u,dummy_y)//c代碼voidgetreal_arg(doubledummy_u,double*dummy_y)目錄1.Modelica外部函數(shù)概況2.外部函數(shù)入門-Modelica調(diào)用C3.外部函數(shù)高級-Modelica調(diào)用c++/Fortran高級特性和外部編輯器4.常見問題說明2.外部函數(shù)入門-Modelica調(diào)用CC文件調(diào)用:在annotation中用Include注解包含被調(diào)用函數(shù)實(shí)現(xiàn)的C文件;鏈接庫調(diào)用:在annotation中用Library注解指定鏈接庫,從而調(diào)用指定庫中的函數(shù)。MWORKS.Sysplorer既支持動態(tài)鏈接庫(包含.lib、.dll文件),也支持靜態(tài)鏈接庫(包含.lib文件);代碼調(diào)用:在annotation中用Include注解直接嵌入C代碼。示例1:C文件調(diào)用doubleadd(doublea,doubleb){returna+b;}調(diào)用的外部函數(shù)內(nèi)容如下,該函數(shù)的目的是將輸入值相加。modelUriTest1//將外部函數(shù)封裝成function
functionIncTest1
input
Reala1;
input
Realb1;
output
Realc1;//外部函數(shù)聲明//IncludeDirectory注解指定包含文件所在的位置,以URI的modelica模式表示//Include指定外部函數(shù)所需的頭文件
external"C"c1=add(a1,b1)
annotation(IncludeDirectory=
"modelica://ExternFunc/Include",Include="#include\"add.c\"");
endIncTest1;//調(diào)用函數(shù)IncTest1
Realy=IncTest1(2.0,3.0);endUriTest1;Include注解:Include="#include"add.c"",表示add.c為外部函數(shù)所需的頭文件。IncludeDirectory注解:IncludeDirectory="modelica://ExternFunc/Include",表示add.c位于ExternFunc/Include文件夾中。Tips:這里IncludeDirectory注解中.c文件所在路徑采用了modelica模式URI的方式來表示,見第二章2.外部函數(shù)入門-Modelica調(diào)用C示例2:鏈接庫調(diào)用modelTestExternFuncUseDll
functioncall_lib
input
Integera;
input
Integerb;
output
Integery;
//Library指定鏈接庫
//LibraryDirectory指定庫文件所在的位置
external
"C"y=add(a,b)
annotation(Library=“dll_2010”,LibraryDirectory="modelica://ExternFunc/library/dll/win32");
endcall_lib;
parameter
Integera=1;
parameter
Integerb=2;
Integeraddr;equation
addr=call_lib(a,b);endTestExternFuncUseDll;將示例1中的函數(shù)封裝成dll,命名為dll_2010,將lib與dll放在“modelica://ExternFunc/library/dll/win32”目錄下。Modelica中外部函數(shù)聲明時用Library注解指定鏈接庫名(注意:不帶擴(kuò)展名)。LibraryDirectory注解指定鏈接庫文件和dll(或so)文件所在的位置。LibraryDirectory指定位置中可以使用不同的平臺文件夾存放各平臺的庫文件和dll(或so)文件,
例中MWORKS.Sysplorer求解器設(shè)置為“32位求解器”:win32[32位MicrosoftWindows]win64[64位MicrosoftWindows]linux32[Intel32位Linux]linux64[Intel64位Linux]Tips:這里L(fēng)ibraryDirectory注解中鏈接庫所在路徑采用了modelica模式URI的方式來表示,見第二章2.外部函數(shù)入門-Modelica調(diào)用C示例3:代碼調(diào)用modelUriTest2//將外部函數(shù)封裝成function
functionIncTest2
input
Realx1;
input
Realx2;
output
Realy;//外部函數(shù)聲明
//Include引用外部函數(shù)的關(guān)鍵字
//add(doublex,doubley){returnx+y;}外部函數(shù)的具體實(shí)現(xiàn)
external
"C"y=add(x1,x2)
annotation(Include=
"doubleadd(doublex,doubley){returnx+y;}");
endIncTest2;//調(diào)用函數(shù)IncTest2
Realy1=IncTest2(1.0,2.0);endUriTest2;在沒有外部文件(C文件或庫文件)的情況下,可以直接將C代碼嵌入到Include注解中。但是由于這種方式不適合調(diào)試,所以不建議使用。對應(yīng)于如下的C函數(shù)原型:doubleadd(doublex,doubley);翻譯為C中的調(diào)用為:y=add(1.0,2.0);返回值y=1.0+2.0=3.0。目錄1.Modelica外部函數(shù)概況2.外部函數(shù)入門-Modelica調(diào)用C3.外部函數(shù)高級-Modelica調(diào)用c++/Fortran高級特性和外部編輯器4.常見問題說明3.1外部函數(shù)初級-Modelica調(diào)用C++/FortranCC++Fortran外部函數(shù)Modelica模型Python其他C++、Fortran不能直接被Modelica調(diào)用,需要封裝成C接口。C++在調(diào)用之前需要封裝成C接口,需要注意的是:類、二維數(shù)組等參數(shù)或返回值需要拆開,分解成C的基本數(shù)據(jù)類型,然后再使用C函數(shù)封裝。而且不要忘了在函數(shù)前面使用extern“C”前綴修飾;FORTRAN語言中的接口調(diào)用有兩種形式,F(xiàn)UNCTION和SUBROUTINE。若為FUNCTION,則調(diào)用方式與C基本一致,若為SUBROUTINE,則需要通過如下步驟調(diào)用:將FORTRAN代碼生成為dll文件;使用C代碼對dll進(jìn)行封裝調(diào)用;使用Modelica調(diào)用C代碼。DLLEXE能被C調(diào)用的對象都可以3.1外部函數(shù)初級-Modelica調(diào)用C++/Fortran示例1:Modelica調(diào)用FortransubroutineADD(x,y,z)!DEC$ATTRIBUTESDLLEXPORT::ADD!導(dǎo)出函數(shù)
!DEC$ATTRIBUTESREFERENCE::z!返回值
implicitnoneREAL::x,yREAL::zz=x+yendsubroutineStep1:C調(diào)用Dll代碼示例DllCaller.c:voidUserDll_Terminate(inthandle){DllAndFunc*terminate_handle=(DllAndFunc*)handle;FreeLibrary(terminate_handle->mLibrary);free(terminate_handle);}Step2:構(gòu)建Modelica函數(shù):functionUserDll_InitializeinputStringDllPath;outputIntegerhandle;external"C"handle=UserDll_Initialize(DllPath)annotation(Include="#include\"DllCaller.c\"",IncludeDirectory="C文件路徑");endUserDll_Initialize;初始化函數(shù)functionUserDll_ADDinputRealhandle;inputRealx;inputRealy;outputRealz;external"C"UserDll_ADD(handle,x,y,z)annotation(Include="#include\"DllCaller.c\"",IncludeDirectory="DllCaller.c文件路徑");endUserDll_ADD;主體函數(shù)functionUserDll_TerminateinputIntegerhandle;external"C"UserDll_Terminate(handle)annotation(Include="#include\"DllCaller.c\"",IncludeDirectory="DllCaller.c文件路徑");endUserDll_Terminate;//C代碼#include<stdio.h>#include<windows.h>//函數(shù)定義typedefvoid(*ADDFUNC)(double*,double*,double*);//Dll和函數(shù)結(jié)構(gòu)體定義typedefstruct{HMODULEmLibrary;ADDFUNCmFunc;}DllAndFunc;intUserDll_Initialize(char*Dll_path){DllAndFunc*handle=(DllAndFunc*)malloc(sizeof(DllAndFunc));handle->mLibrary=LoadLibraryA(Dll_path);handle->mFunc=(ADDFUNC)GetProcAddress(handle->mLibrary,"ADD");if(handle->mLibrary==NULL){printf("mLibrarynull");}if(handle->mFunc==NULL){printf("mLibrarynull");}return(int)handle;}voidUserDll_ADD(inthandle,doublex,doubley,double*z){DllAndFunc*func_handle=(DllAndFunc*)handle;func_handle->mFunc(&x,&y,z);return;}初始化函數(shù)主體函數(shù)modelCallFORTRANparameterRealx=23.12412412;parameterRealy=42.56345235;parameterStringDllpath="Dll路徑";outputRealz;Integerhandle;equationwheninitial()thenhandle=CallFORTRANDll.FunctionsPcg.UserDll_Initialize(Dllpath);endwhen;whensample(0,0.1)thenz=CallFORTRANDll.FunctionsPcg.UserDll_ADD(handle,x,y);endwhen;whenterminal()thenCallFORTRANDll.FunctionsPcg.UserDll_Terminate(handle);endwhen;endCallFORTRAN;終止函數(shù)終止函數(shù)Fortran代碼示例3.2外部函數(shù)高級特性示例1:數(shù)組類型輸入輸出調(diào)用示例2:控制外部函數(shù)調(diào)用頻率——條件調(diào)用voidArrayTest(double*input_data,double*output_data){output_data[0]=input_data[0]+10;output_data[1]=input_data[1]+10;}input_data為傳入?yún)?shù),output_data為輸出參數(shù),用來接收函數(shù)計(jì)算結(jié)果。模型中可以借助外部函數(shù)計(jì)算獲取數(shù)組型數(shù)據(jù),外部函數(shù)形式如下:functionArrayTest
input
Realinput_data[2];
output
Realoutput_data[2];external
"C"ArrayTest(input_data,output_data)annotation(IncludeDirectory=
"modelica://ExternFunc/Include",Include="#include\"array.c\"");endArrayTest;對外部函數(shù)的包裝和調(diào)用過程如下所示某dll模塊ExtLib.dll,其中有兩個接口Initial()、StepRun(),希望能夠在求解前調(diào)用初始化接口Initial(),在求解過程中,每隔2s調(diào)用一次StepRun,那么Modelica代碼可以如下編寫:modeltestlog1
functionExtLib_Initial
external
"C"Initial()
annotation(Include="voidInitial(){return;}");
endExtLib_Initial;
functionExtLib_StepRun
input
Realx;
external
"C"StepRun()
annotation(Include="voidStepRun(){return;}");
endExtLib_StepRun;
Integeri(start=0);
annotation(experiment(StartTime=0,StopTime=10));initial
algorithm
ExtLib_Initial();//初始算法段中初始化外部函數(shù)
Modelica.Utilities.Streams.print("Initialhasbeencalled.");algorithm
whensample(0,2)then
//通過when控制函數(shù)的調(diào)用時機(jī)ExtLib_StepRun(1);i:=i+1;//用i做計(jì)數(shù)器
Modelica.Utilities.Streams.print(String(i));//打印i以觀察調(diào)用次數(shù)
end
when;endtestlog1;3.3外部函數(shù)編輯器啟動MWORKS.Sysplorer,選擇文件
>
新建
>
externalfunction,在彈出的新建模型對話框中填寫模型信息后點(diǎn)擊確定,彈出
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026廣東深圳市寶安區(qū)西鄉(xiāng)桃源居幼兒園(集團(tuán))招聘工作人員7人備考題庫附參考答案詳解(奪分金卷)
- 2026廣東深圳大學(xué)藝術(shù)學(xué)部趙璐特聘教授團(tuán)隊(duì)博士后招聘1人備考題庫附參考答案詳解(黃金題型)
- 2026四川成都積微物聯(lián)集團(tuán)股份有限公司面向中鋁集團(tuán)內(nèi)部企業(yè)招聘17人備考題庫含答案詳解(能力提升)
- 2026新疆和田地區(qū)醫(yī)療保障研究會招聘6人備考題庫及參考答案詳解
- 2026華東理工大學(xué)招聘46人(上海)備考題庫及答案1套
- 2026新疆博爾搭拉州博樂市同和口腔醫(yī)院招聘2人備考題庫必考題
- 2026江西省高速公路服務(wù)區(qū)LNG加氣站加氣工崗招聘2人備考題庫必考題
- 2026浙江臺州市第一人民醫(yī)院高層次衛(wèi)技人才招聘41人備考題庫含答案
- 2026中共寧夏區(qū)委黨校(寧夏行政學(xué)院)自主招聘教師10人備考題庫含答案詳解(精練)
- 2026北京大興區(qū)魏善莊鎮(zhèn)社區(qū)衛(wèi)生服務(wù)中心招聘臨時輔助用工人員4人備考題庫及答案詳解(真題匯編)
- 2025年度電氣工程師述職報告
- 檔案館機(jī)房設(shè)施設(shè)備管理制度
- 醫(yī)院行風(fēng)建設(shè)培訓(xùn)會課件
- 2025年中國抑郁障礙防治指南
- 2024年輕工行業(yè)經(jīng)濟(jì)運(yùn)行報告
- 電解銅銷售合同范本
- FGR的基因檢測策略與臨床解讀
- 建筑施工工地安全隱患排查清單
- 電力工程安全培訓(xùn)課件
- 中糧貿(mào)易錄用通知書
- 高二半期考試物理考題及答案
評論
0/150
提交評論