2014-06-05 36 views
0

這是理想的目標。從VB.Net讀取MatLab Simulink的值

我們有一個simulink模型,當它運行時,我們希望所有結果值都發送到我們的vb.net應用程序。

我想我已經找到了一些方法,但在潛水之前想要一些輸入。我過去並沒有使用matlab或simulink,這使得它比現在更難。

有一個用於matlab的COM對象,但不允許在simulink運行時實時訪問變量。 Simulink完成後僅將其數據轉儲到matlab。

選項#1:回調? 我一直在閱讀,似乎我能夠添加一個回調塊,以便值發送到matlab基於計時器。然後我必須不斷地調用vb中的matlab來獲取這些值。這看起來效率不高,並可能在同時運行simulnk時佔用大量資源? How do I get data from a Simulink block into a MATLAB GUI?

選項#2: 我發現了一個「Simulink的編碼器」 The MathWorks公司的網站上,似乎是理想的解決方案,但想澄清,如果有人在這裏使用了它。我已經申請了一次審判,但在獲得之前還有幾圈可以跳過。

在我看來,編碼器會採用simulink模型並在C/C++代碼中創建算法?這是否意味着我可以創建一個C應用程序並將該代碼用作源代碼?所以不是運行simulink與我的應用程序,我只是運行代碼並輸入參數給我們輸出變量?

我也讀過一些關於matlab輸出DLL或多路複用器的信息?所以可以與.net應用程序一起使用?

任何輸入/意見讚賞:)

回答

2

真的沒有一個簡單的回答你的問題,最好的/正確的方法來降低到您所需要的功能。

首先,關於Simulink編碼器:是的,它會將Simulink模型轉換爲C代碼,此時您可以像使用其他C代碼一樣使用該C代碼。

此時,您將不再使用Simulink,也不需要許可證。 這對於部署應用程序可能很有用。

但有限制。你(通常)僅限於固定步長解算器。您不能轉換M代碼S函數。您不能在MATLAB函數塊中定義coder.extrinsic函數。您只能更改參數和模型輸入。您不能更改拓撲結構,即塊的數量和互連(無需重新生成代碼)。請參閱Coder Limitations以獲得更全面的列表。

使用運行時對象(在您提供的鏈接中提及)並不理想,有時不能很好地擴展(即如果有許多要查看的信號可能會產生問題),但實際上是隻有在模擬過程中才能從模型中獲取數據。 (有event_listeners,可以連接到塊,但這並不能很好地擴展)

請注意,您提到的COM限制不是Simulink的限制。出於效率原因,Simulink只在模型暫停或停止時轉儲數據。這與MATLAB-COM API本身無關。

你還提到MATLAB生成DLL的和多路複用器[大概你的意思是這裏的mex]。請注意,MATLAB有不同的代碼生成機制(即m代碼)而不是Simulink。只有Simulink編碼器對您有用,而不是MATLAB編碼器或MATLAB編譯器。 Mex(假設這就是你的意思)是從MATLAB調用編譯代碼的機制,並且不會與你在這裏提出的問題有任何關係。

+0

非常感謝您的回覆。首先,是的,我的意思是mex,我的錯誤。我今天剛剛收到了Simulink Coder的試用版,所以其中一些現在更有意義。它現在看起來也是最可行的選擇。 我不確定是否應該爲此創建一個新問題,但我無法找出其他某些功能。是否可以定義輸入和輸出,以便生成的代碼具有接受輸入變量並返回輸出變量的函數?或者我會不得不創建某種包裝來做到這一點? –

+0

它確實需要一個新的問題。但簡而言之,生成的代碼反映了模擬過程中發生的情況:有代碼用於初始化,代碼用於逐步調整模型(通過調用用於更新狀態和塊輸出的代碼,以及代碼終止),輸入和輸出端口位於模型用於輸入和輸出信號,爲了具有可調用的功能,需要將模型的相關部分放入原子子系統,並將塊參數的「代碼生成」選項設置爲適當的值。 –