LabVIEW call Matlab dll file

dear 各位先進:


小弟最近在碰到了一個狀況
那就是要去使用LabVIEW整合一個Matlab的code
該code經過測試後,使用的語法都是LabVIEW中有支援的
但在執行時間上實在差太多了
(Matlab大概20s, MathScript放了一天後直接當給你看)


造成此差異的原因經過很多的查證後
證實了是因為該code中有一個語法(ODE15s)對MathScript來說太複雜!?
經過單獨對此語法的測試後發現
(使用matlab約1.5s, MathScript約953s)
因此在複雜的程式計算中,
就完全無法負荷了。


因此目前小弟打算用別的方式
就是將Matlab的code先Build為DLL檔
期許此方式能夠增快運算的時間

因此寫了一個很簡單的小程式想來做這方面的測試
但在使用LabVIEW呼叫Matlab的DLL檔時發現
CLF的選項中,並沒有我當初的函數名稱
而且莫名其妙的跑出了四個陌生的函數名
經過一一選取使用後,沒有一個是正確的執行結果…


在此請教各位先進,此問題該朝哪個方向來做呢??

PS. 有測試過使用DEV C++所製作的DLL檔,可以正常運作。

相關的截圖於附檔


LabVIEW call matlab dll file.rar

我不確定LabVIEW 8.2是否有此function,可以確定的是LabVIEW 8.6以後有專門給matlab使用的script,如下圖所示

![](upload://wtZXh2cxiPSNBRp6DRhwFLvfL9.jpeg)

如果8.2版沒有的話可以使用LabVIEW新版試用看看

Dear ancle:

首先很感謝你的回覆,
關於你提到的Matlab Script的部分,8.2是沒有的。

印象中好像是到2009,NI將此部分獨立出來當作一個Toolkit
並且由原本的MathScript更名為Matlab Script 

關於你建議的我會去下載新版來試試看
但我仍然想學會dll的呼叫部分,
因為在目前的case中是因為還有辦法透過關係
跟原作者拿到Matlab的原始code來做測試

但大多時候我想我可能只能拿到dll檔而已
畢竟演算法是屬於另外的人開發的

仍感謝你的回覆,謝謝

關於呼叫matlab的dll這一方面我沒有應用過所以沒辦法幫你,我有遇過的case是用LabVIEW來寫和matlab相同功能的程式,輸出結果二者差異不大,但是程式不是我寫的,只是知道可以這樣做

沒關係,這部分我會繼續測試

到時有什麼發現再來繼續跟大家討論

ps.關於使用 MathScript 來import MATLAB Code的部分
    我已經做過一兩次,都是可行的,
    但是有很多matlab中比較高階或者複雜的運算,
    對於使用MathScript來說真的比較力不從心,
    或許是因為基本的資料型態定義就不一樣吧。
    像是在做一些疊代或者解方程等等數值運算,
    雖然還是會動但時間真的就不敢恭維了,
    另外就是目前的工作中,
    專業的分析模擬演算法是由另外一些專長的人去寫的
    我算是負責GUI跟硬體IO操控
    所以就會發生我目前的狀況了…

如果可以的話是否可以上傳你的matlab的script,我來幫你測試看看,雖然對你的問題沒有幫助

OK阿,我傳我用來測試指令的那個簡單程式給你try看看


PS.(該程式就是我測完後執行時間分別為1.5s與953s的code)


ODE15S__Test.rar

不好意思,matlab我不熟,可以請上傳LabVIEW的code有輸出入節點的嗎?

![](upload://9VBnPHtHkJbeYoh80m76H8vYrmi.jpeg)

OK,有做了一個LabVIEW的CODE在裡面


ODE15S__Test.rar

1.原來是只要指定路徑就好

![](upload://9W5PG3gFtbL9Okz386aco5HYg5E.jpeg)

2.以下是我用我所說的function測試三四次的結果及時間

![](upload://vbh4jOEfo6AMkZgusjXy0W0HC56.jpeg)

3.後來我用matlab也是測試三四次的時間發現其實是差不多的

![](upload://g99jikEv4DbJRskXhVbot4oylps.jpeg)

大驚了!!!!!

所以代表如果這次我搞不定 call libary function node

還有另一條路就對了...

沒想到MathScript 跟 Matlab Script差這麼多...(殘念)

感謝ancle的幫忙測試喔

不過我還是會繼續研究dll的部分拉  

[QUOTE=ancle]

1.原來是只要指定路徑就好

![](upload://9W5PG3gFtbL9Okz386aco5HYg5E.jpeg)

2.以下是我用我所說的function測試三四次的結果及時間

![](upload://vbh4jOEfo6AMkZgusjXy0W0HC56.jpeg)

3.後來我用matlab也是測試三四次的時間發現其實是差不多的

![](upload://g99jikEv4DbJRskXhVbot4oylps.jpeg)

[/QUOTE]可否請教~我將上面程式vdp1000.m檔放在D:\ODE15S__Test,然後用在labview下使用mathlab script功能(指定路徑到D:\ODE15S__Test),執行時整個labview直接就關閉了~~可否請問是什麼問題?又執行labview時matlab是否要先開啟?BYRONJAMES40737.0041203704

貌似LabVIEW就已經有ODE solver了,直接用就好了,何必拉script又是外掛DLL的:

http://zone.ni.com/reference/en-XX/help/371361F-01/lvanlsconcepts/ode_solvers_in_labview/

http://zone.ni.com/reference/en-XX/help/371361F-01/gmath/ode_solver/

再次印證了Google大神有拜有保庇的真理…

<font =“apple-style-span” size=“3”>Dear Denny :

<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>主要是原本的演算法是用Matlab開發的,
<span =“apple-style-span” style="font-size: medium; ">且遠不是我給的測試用程式那麼簡短,
<span =“apple-style-span” style="font-size: medium; ">因此才會有這麼一段討論串出現,
<span =“apple-style-span” style="font-size: medium; ">
<font =“apple-style-span” size=“3”>另外也是非常感謝您提供的資訊, Thanks. :slight_smile:

請教各位先進~~我試將上面程式vdp1000.m檔放在D:\ODE15S__Test,然後用在labview下使用mathlab script功能(指定路徑到D:\ODE15S__Test),執行時整個labview直接就關閉,請問各位先進這可能是什麼問題?另執行labview時matlab是否要先開啟?

[QUOTE=BYRONJAMES]

請教各位先進~~我試將上面程式vdp1000.m檔放在D:\ODE15S__Test,然後用在labview下使用mathlab script功能(指定路徑到D:\ODE15S__Test),執行時整個labview直接就關閉,請問各位先進這可能是什麼問題?另執行labview時matlab是否要先開啟?

[/QUOTE]

1.我不知道是什麼原因造成的,起碼我之前測試都正常

2.目前我的電腦已經沒有matlab,我忘了需不需要先開啟,起碼你可以自己試看看

謝謝ANCLE的寶貴回復~~我再找其他有LABVIEW的電腦試看看~~謝謝!

 

是的~

要執行時需要將matlab開啟

<font =“apple-style-span” size=“3”>Dear all:

<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>抱歉最近太忙現在才看到, 作為回饋我把當初的狀況描述一下
<font =“apple-style-span” size=“3”>在LabVIEW中碰到要引用matlab code的時候
<font =“apple-style-span” size=“3”>有幾個方式
<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>1.Mathscript
<font =“apple-style-span” size=“3”>2.MATLAB script
<font =“apple-style-span” size=“3”>3.system exec
<font =“apple-style-span” size=“3”>4.Call library function node
<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>=========================
<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>第一種主要是LV裡面有寫入執行MATLAB code的運算核心
<font =“apple-style-span” size=“3”>但在前期版本(2009↓)中, 其運算速度較慢, 且很多matlab的語法並不支援
<font =“apple-style-span” size=“3”>但優點是其TOOL是包含在主程式內, 無須另外花費, 且可以脫離MATLAB環境, 
<font =“apple-style-span” size=“3”>也不需要安裝MATLAB的函數庫
<font =“apple-style-span” size=“3”>到後期的版本其支援與法與速度皆有提升, 但仍不太理想
<font =“apple-style-span” size=“3”><小弟近期使用2010版, 仍是有不支援的語法, 且執行速度仍是無法達到要求>
<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>第二種其實只是採用呼叫的方式, 因次電腦必須有安裝MATLAB
<font =“apple-style-span” size=“3”>優點是執行速度幾乎與MATLAB一樣, 而且很方便
<font =“apple-style-span” size=“3”>缺點就是要$$, 且在Build為exe或者install檔案後, 移植到其他電腦上會有問題
<font =“apple-style-span” size=“3”><是否別台電腦只要也有安裝matla和lv的RT就OK小弟就沒測了>
<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>第三種是種透懶的方式, 就是將MATLAB的CODE先BUILD成EXE檔, 
<font =“apple-style-span” size=“3”>接著在LV中只要作為呼叫EXE檔處理就可以了
<font =“apple-style-span” size=“3”>缺點在於程式必須前加工, 將I/O的部分處理掉
<font =“apple-style-span” size=“3”><小弟在這邊是採用檔案讀取的方式>
<font =“apple-style-span” size=“3”>且因為預設好的關係, 其檔案安裝路徑不能隨意更改
<font =“apple-style-span” size=“3”>還有就是在運行速度上, 也是會有2秒左右的等待時間
<font =“apple-style-span” size=“3”>還有必須安裝MATLAB的函數庫
<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>第四種也是小弟現在還在學習的方式, 
<font =“apple-style-span” size=“3”>主要是將MATLAB code BUILD為DLL檔案, 
<font =“apple-style-span” size=“3”>在LV中可以透過呼叫DLL的方式來處理
<font =“apple-style-span” size=“3”>能做到更好的整合
<font =“apple-style-span” size=“3”>但缺點在於, MATLAB的資料格式與一般的C CODE不同
<font =“apple-style-span” size=“3”>因此也是必須要再加工, 目前找到的資料是可以用C再寫一個資料轉換的程式
<font =“apple-style-span” size=“3”>接著就可以讓LV呼叫了
<font =“apple-style-span” size=“3”>
<font =“apple-style-span” size=“3”>以上, 若有誤請整正, 謝謝
<font =“apple-style-span” size=“3”>BR, Ken
<font =“apple-style-span” size=“3”>