2014-07-18 26 views
0

我用C編寫了一個Simulink S函數(Level 2)。結果塊有一個輸出和一個參數。該參數存儲在一個變量,它在文件範圍定義,建立塊後右:Simulink:如何在2級s函數中使用局部變量?

#define NUM_PARAMS 1 
#define NUM_INPORTS 0 
#define NUM_OUTPORTS 1 

unsigned short int MASK_INDEX; 

我將其指定mdlInitializeSizes內,並執行其值的一些操作:

static void mdlInitializeSizes(SimStruct *S) { 
    // Check Parameters 
    ssSetNumSFcnParams(S, NUM_PARAMS); 
    if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) { 
      return; 
    } 

    MASK_INDEX = *mxGetPr(ssGetSFcnParam(S, 0)); 

    (...) operations 
} 

我的問題是,變量MASK_INDEX似乎是全局的,並在所有相同類型的塊之間共享。因此,它對所有塊保持相同的值。

作爲一種變通方法,我每次都重新加載它,並重新做的操作,例如:

static void mdlOutputs(SimStruct *S, int_T tid) { 
    MASK_INDEX = *mxGetPr(ssGetSFcnParam(S, 0)); 

    (...) operations 
} 

我怎樣才能得到一個真正的「局部變量」,這樣我就不必每次重複這一切?

+0

這正是[Work Vectors](http://www.mathworks.com/help/simulink/state-and-work-vector.html)的用途。 –

回答

2

你還沒有提到你聲明的地方MASK_INDEX,但從你的描述來看,它聽起來像是在文件範圍。如果是這樣,那麼是的,這個變量將在所有實例中共享。這不是以任何方式與S函數分離的,它是大多數(如果不是全部)平臺上的共享庫的行爲方式。共享庫的單個實例將由應用程序加載,在這種情況下爲MATLAB;因此只有一個全局變量副本。

最簡單的選擇是每次要訪問參數時使用ssGetSFcnParam。如果您深入瞭解這些S函數宏,它們只是訪問SimStruct的字段,因此重複訪問不太可能會導致性能下降。我甚至看到了用於包裝常用用例的宏,比如你使用的宏。

如果你真的想要緩存對話框參數,最簡單的可能是使用ssSetUserData。聲明一個struct包含一個MASK_INDEX成員(您不要使用struct,但此方法更具可擴展性)。在mdlStart內使用mxMalloc動態分配實例,並將其分配給該塊的用戶數據。請確保您在呼叫mdlInitializeSizes中設置SS_OPTION_CALL_TERMINATE_ON_EXIT。然後定義mdlTerminate函數,在該函數中您將使用ssGetUserDatamxFree訪問分配的struct。現在您可以使用ssGetUserData訪問mdlOutputs內的struct成員。

還有其他更高級的選項,例如work vectors,可能是PWork vector

如果參數是可調參數,另一種選擇是使用runtime parameters,它允許您緩存並可選地轉換塊的對話框參數。

在你的情況,我只是堅持使用ssGetSFcnParam每次在mdlOutputs內。

+0

我的不好......你說得對,我已經在任何方法之外定義了它,就在'#define NUM_OUTPORTS 1'後面(我會編輯我的問題)。我將嘗試'ssSetUserData'方法並返回。我想緩存這個值的原因是我每次都必須再做一次操作(數組查找)。 – Flo

+0

它的工作原理:-)謝謝 – Flo

相關問題