資源簡介
通過c編寫的pid s函數,可以通過這個例子更好地理解pid,以及學會如何編寫s函數。,,,,,,,,,,,
代碼片段和文件信息
/*
?*?文件名:?sfuntmpl_doc.c
?*?摘要: ...
?*?Copyright?1990-2002?The?MathWorks?Inc.
?*?版本:?1.50.4.1?$
?*/
//?第一段用來說明函數的內容包括函數文件名以及大致內容
?
/*
?*?You?must?specify?the?S_FUNCTION_NAME?as?the?name?of?your?S-function.
?*/
#define?S_FUNCTION_NAME??your_sfunction_name_here
#define?S_FUNCTION_LEVEL?2
// 第二段中包括函數名稱的定義以及級別的控制
/*?
?*??需要包括simstrc.h用來定義SimStruct和它相關的宏定義
?*
?* 以下幾個頭文件在被編譯成MEX文件時被matlabroot/simulink/include/simstruc.h調用
?*
?* matlabroot/extern/include/tmwtype.h??? -?普通類型,如real_T
?*??matlabroot/extern/include/mex.h?????????-?MATLAB?MEX?文件?API?程序api??API(Application?Programming?Interface應用程序編程接口)
?*??matlabroot/extern/include/matrix.h??????-?MATLAB?MEX?文件?API?程序
?*
?* 以下幾個頭文件在用RTW編譯時被matlabroot/simulink/include/simstruc.h調用
?*?
?*??matlabroot/extern/include/tmwtypes.h????-?普通類型,如real_T
?*??matlabroot/rtw/c/libsrc/rt_matrx.h??????-??MATLAB?API?程序?宏定義
?*/
#include?“simstruc.h“
/*??錯誤處理
?*??-------------
?*??采用以下技術報告在s-function碰到的錯誤
?*???????ssSetErrorStatus(S“error?encountered?due?to?...“);
?*???????return;???????
?*???
?*??注意ssSetErrorStatus中第二個參數必須是存在于靜態存儲區內。
?*??它不能是程序中的一個局部變量。例如下列程序導致不可預測的錯誤
?*
?*??????mdlOutputs()
?*??????{
?*?????????char?msg[256];?????????{非法:?修正為?“static?char?msg[256];“}
?*?????????sprintf(msg“Error?due?to?%s“?string);
?*?????????ssSetErrorStatus(Smsg);
?*?????????return;
?*??????}
?*
?*??ssSetErrorStatus錯誤處理機制是mexErrMsgTxt函數的替代物。mexErrMsgTxt
?*??利用“異常處理“立即中止S-function的運行并返回simulink控制權。為了在S-function
?*??支持異常處理機制?。Simulink必須設置每個S-function的異常處理優先級
?*??給仿真帶來了額外的開銷。
?*??
?*??如果不調用mexErrMsgTxt或者其他可能導致異常發生的程序,應該采用SS_OPTION_EXCEPTION_FREE_CODE
?*??選項。這個功能選擇在緊跟的命令中在mdlInitializeSizes函數體內完成。
?*?????????ssSetOptions(S?SS_OPTION_EXCEPTION_FREE_CODE);
?*
?*??設置該選項,將提高S-function的性能,Simulink將跳過異常處理設置。應該特別留意修改代碼當
?*??通過設置SS_OPTION_EXCEPTION_FREE_CODE不在使用異常處理時。如果此時S-function產生異常,不可預測的結果將發生
?*
?*??異常取消的代碼是指從不“long?jumps“代碼也就是遠跳轉的。如果它包括有任何調用可能產生“long?jumps“的代碼,
?*??那么S-function不是異常取消的代碼。例如調用mexErrMsgTxt時拋出異常,將結束S-function的執行。
?*??使用mxCalloc可能導致不可預測的問題。當memory分配產生錯誤將產生遠跳轉。如果需要分配內存,
?*??應該直接使用stdlib.h?calloc程序并且執行自己的錯誤處理函數。
?*
?*??所有的mex程序都有遠距離跳轉的可能性(或者產生異常)。例外集中mx程序也有產生遠距離跳轉的可能性。
?*??為了避免復雜度太高,只有獲取指針和確定參數個數的程序可以被使用。例如以下幾者永遠不會拋出異常
?*??:mxGetPr?mxGetDatamxGetNumberOfDimensions?mxGetM?mxGetN?mxGetNumberOfElements.
?*??
?*??如果你的實時方法中不含有可能產生異常的代碼,你可以使用下面的選項
?* ssSetOptions(S?SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE);
?* 另外一些方法在S-function是有可能產生異常的代碼,包括以下幾種方式
?* mdlGetTimeOfNextVarHit?mdlOutputs?mdlUpdate?and?mdlDerivatives
?*
?* 警告&打印字符串
?* -------
?* 使用ssWarning(Smsg)顯示警告
?* -當S-function在Simulink中編譯為mex時,ssWarning等效于ssWarning
?*??—當S-function在Real-Time?Workshop時,ssWarning等效于
?* ?printf(“Warning:?in?block?‘%s‘?‘%s‘\n“?ssGetPath(S)msg);
?* 如果目標有標準輸入和輸出設備。否則它會變為一個注釋并且不在執行
?*
?* 使用ssPrintf(fmt?...)打印一條信息
?* -當S-function在Simulink中編譯為mex時,ssPrintf?等效于?mexPrintf。
?* -在S-function在Real-Time?Workshop中使用時,如果有標準輸入和輸出設備時,ssPrintf等效于printf
評論
共有 條評論