2013-07-31 19 views
2

有幾種C S函數之間共享C結構(僅實例化一次)的方法嗎?這就是我的意思:我有一個Simulink模型,包含很多以C S函數實現的模塊。這些塊中需要很多模型參數,我想創建一個保存所有模型參數的單個對象,並且在開始模擬時僅實例化一次。現在我爲每個S函數實例化這個對象,以便訪問這些參數,但是在S函數中共享這個對象會很好。如何在C S函數中共享C結構?

只是一個純粹的猜測:我可以將我的模型參數結構放置在一個單獨的DLL中,然後從每個C S函數中訪問它嗎?你有沒有做過這個?

回答

1

我已經成功地實現從他們閱讀和測試的DLL想法(即收集DLL中一個結構中的所有模型參數 - 加上任何必要的計算 - 並將其鏈接到其他C S函數)。 Simulink是一個單一的過程,我相信模擬是一個單一的線程(如果沒有辦法使它成爲線程安全的)。

帶有來自DLL的模型參數的結構充當單例(每個模擬僅實例化一次,並在其他S函數間共享)。

更新(從MathWorks公司一些回覆):

模擬部分從Simulink中始終是單線程的。因此,共享DLL沒有線程安全問題。

不同S函數塊的全局變量將共享相同的內存位置。這意味着將爲所有Simulink加載共享庫的單個實例。因此,加載共享庫的所有S函數實例都將引用相同的共享庫和數據。

或者,您也可以考慮使用數據存儲塊來實現全局變量。這將需要從每個S函數到適當的數據存儲塊的信號連接。但是不需要S函數之間的連接。

1

雖然看起來很複雜,但您可以將這些值分配並存儲在單獨的DLL中。幾年前在s函數之間共享DLL,我發現Matlab/Simulink的DLL加載是不透明的並且難以管理(例如加載依賴的DLL)。

更簡單的方法 - 具有一個S-功能分配結構在其DWork向量:

http://www.mathworks.com/help/simulink/sfg/about-dwork-vectors.html

則指針值存儲到一些工作空間/全局變量,在那裏他們可以通過稍後訪問其他的s功能。

也許最簡單的方式來寫,以工作區/全局變量使用mexEvalString,並使用mexGetVariable(Mathworks公司的文件是偉大的這些和其他功能)

+0

謝謝。我會試一試。但首先:一個Simulink模型中的所有S函數是否共享內存?我可以簡單地實例化塊中的結構,並將其地址作爲輸入(或參數)傳遞給其他塊(也是S函數,但不同於持有結構的函數)? – remus

+0

是的,我認爲他們使用相同的內存空間,問題是找到一個很好的機制來傳遞它們之間的地址。將它們作爲參數傳遞將很困難--Simulink期望在開始之前設置所有s函數的參數 –

+0

寫入工作區變量/從工作區變量讀取是傳遞地址的一種機制。我猜你也可以將它們作爲數據輸入傳遞給它們......雖然它們不會在模擬長度上發生變化,但在每個模擬刻度上傳遞相同的值似乎有點奇怪 –