编写C语言的S函数Word文档格式.docx
- 文档编号:15723950
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:17
- 大小:22.47KB
编写C语言的S函数Word文档格式.docx
《编写C语言的S函数Word文档格式.docx》由会员分享,可在线阅读,更多相关《编写C语言的S函数Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
与M-fileS-function不同的是,CMEX-file可以访问并修改Simulink内部用来存储S-function信息的数据结构。
更多的回调方法和对Simulink内部数据结构的访问能力,使得CMEX-fileS-function可以实现更丰富的模块特性,如处理矩阵信号和多种数据类型。
CMEX-fileS-function只需实现Simulink定义的回调方法的一个小子集即可。
如果不实现某个回调方法,相应的功能将被省略掉。
这有利于快速开发简单的模块。
通常CMEX-fileS-function的形式如下:
#defineS_FUNCTION_NAMEyour_sfunction_name_here
#defineS_FUNCTION_LEVEL2
#include"
simstruc.h"
staticvoidmdlInitializeSizes(SimStruct*S)
{
}
<
additionalS-functionroutines/code>
staticvoidmdlTerminate(SimStruct*S)
#ifdefMATLAB_MEX_FILE
/*IsthisfilebeingcompiledasaMEX-file?
*/
simulink.c"
/*MEX-fileinterfacemechanism*/
#else
cg_sfun.h"
/*Codegenerationregistrationfunction*/
#endif
mdlInitializeSizes是Simulink与S-function交互时调用的第一个方法。
随后Simulink将调用其他S-function方法(都以mdl开头)。
仿真结束时,Simulink调用mdlTerminate。
注意:
与M-fileS-function不同,CMEX-fileS-function回调方法不是每个都具有flag参数。
这是因为,Simulink仿真时直接在适当的时间调用每个回调方法。
4.2自动建立S-function模块
S-FunctionBuilder是通过规范定义和用户提供的C代码建立S-function的Simulink模块。
S-FunctionBuilder还用作普通的S-function在Simulink模型中的包装。
通过S-FunctionBuilder建立S-function。
1.将MATLAB当前目录设置到需要建立S-function的目录。
2.创建新的Simulink模型。
3.从SimulinkUser-DefinedFunctionslibrary中将S-FunctionBuilder拖入新建的ulink模型。
图4.
4.双击模块打开S-FunctionBuilder对话框。
图5.
5.输入所需信息和用户代码。
(详见下节)
6.如果还未设置mex编译器,用mex–setup在MATLAB命令行设置。
7.点Build按钮,启动建立过程。
Simulink建立MEX文件实现指定的S-function,并存放在当前目录
8.保存包含S-FunctionBuilder模块的模型。
部署生成的S-Function
要在其他模型中使用生成的S-Function,首先必须检查生成的S-Function所在的目录是否在MATLAB路径中。
然后把S-FunctionBuilder模块从创建它的模型复制到目标模型并设置其参数。
S-FunctionBuilder如何建立S-Function
4.3S-FunctionBuilder对话框
4.4基本的CMEX-fileS-function实例
本节介绍一个CMEX-fileS-function实例:
timestwo,实现输出信号放大为输入信号的2倍。
以下是模型图:
图6.
S-functiontimestwo的回调方法如图7所示:
图7.
以下是timestwo.c文件的代码:
#defineS_FUNCTION_NAMEtimestwo
ssSetNumSFcnParams(S,0);
if(ssGetNumSFcnParams(S)!
=ssGetSFcnParamsCount(S)){
return;
/*ParametermismatchwillbereportedbySimulink*/
}
if(!
ssSetNumInputPorts(S,1))return;
ssSetInputPortWidth(S,0,DYNAMICALLY_SIZED);
ssSetInputPortDirectFeedThrough(S,0,1);
ssSetNumOutputPorts(S,1))return;
ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);
ssSetNumSampleTimes(S,1);
ssSetOptions(S,
SS_OPTION_WORKS_WITH_CODE_REUSE|
SS_OPTION_EXCEPTION_FREE_CODE|
SS_OPTION_USE_TLC_WITH_ACCELERATOR);
staticvoidmdlInitializeSampleTimes(SimStruct*S)
ssSetSampleTime(S,0,INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S,0,0.0);
ssSetModelReferenceSampleTimeDefaultInheritance(S);
staticvoidmdlOutputs(SimStruct*S,int_Ttid)
int_T
i;
InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);
real_T
*y
=ssGetOutputPortRealSignal(S,0);
width=ssGetOutputPortWidth(S,0);
for(i=0;
i<
width;
i++)
*y++=2.0*(*uPtrs[i]);
这个实例包括3部分:
宏定义和头文件;
回调方法的实现;
Simulink(或Real-TimeWorkshop)接口。
宏定义和头文件
示例程序中包含两个宏定义:
第一个指定S-function的名字,第二个指示该S-function是Level-2格式的。
然后是包含头文件"
,在其中定义了SimStruct数据结构和MATLAB应用程序接口(API)函数。
SimStruct是Simulink用于保持S-function信息的数据结构,"
中还有用于MEX文件设置或获取SimStruct属性值的宏定义。
回调方法的实现
mdlInitializeSizes:
Simulink调用mdlInitializeSizes方法查询S-function模块的输入输出端口数,端口容量,以及S-function所需的其他对象(如,状态个数等)。
Timestwo实现的mdlInitializeSizes方法指定了下面信息
●零参数:
意味着S-function对话框的参数框必须为空。
否则,Simulink将报告参数不匹配。
●一个输入和一个输出端口:
输入输出端口的宽度可以动态变化。
Simulink将把所有输入信号乘以2作为输出信号的结果。
注意,在这种情况下(一个输入一个输出端口),Simulink对S-function宽度的默认处理是输入和输出宽度相等。
●一个采样时间
例子timestwo在mdlInitializeSampleTimes中指定实际的采样时间。
●代码无异常处理
指定无异常处理的代码可以加速S-function的执行。
作这项指定必须谨慎。
通常,如果用户S-function与MATLAB没有交互,指定无异常处理的代码是安全的。
mdlInitializeSampleTimes:
Simulink调用mdlInitializeSampleTimes设置S-function的采样时间。
每当timestwo模块的前驱模块执行一次,timestwo模块就执行一次,所以timestwo模块采用继承的采样时间。
mdlOutputs
Simulink在每个时间步调用mdlOutputs计算模块的输出。
Timestwo模块的mdlOutputs方法实现了将输入信号乘以2,将结果写到输出信号。
Timestwo模块的mdlOutputs方法使用了SimStruct中的宏:
InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);
来实现对输入信号的访问。
这个宏返回一个指针向量,必须通过*uPtrs[i]来访问。
Timestwo模块的mdlOutputs方法还使用了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编写 语言 函数