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