本文章用来做simulink的S-function函数的学习笔记:
自动生成s-function:s-function builder根据要求和c语言代码来构建一个s-function块。
新建simulink模型,从library browser中拖拽出s-function builder块
双击s-function builder,打开其对话框。
对话框中可以设置s-function名字、参数、库等。先在命令行中输入mex -setup配置,再点击build按键开始创建。创建过程中,生成三个文件:mysfun.c, mysfun_wrapper.c, mysfun .tlc。其中mysfun.c包含所生成的s-function标准部分的源代码,mysfun_wrapper.c包含了在对话框中输入的客户代码,mysfun.tlc允许simulink在加速模式下运行所生成的s-function,并允许RTW包含由该s-function生成的代码。simulink 如何与C S-function 相互作用
从两个层面来介绍这种相互作用,进程层面(在仿真的哪一时刻simulink调用s-function)和数据层面(在仿真时simulink与s-function如何交换信息)。
进程层面:
下图为simulink调用s-function回调函数的顺序:
实线框部分表示在模型初始化或每个仿真步长内需使用的回调函数;虚线框部分表示在初始化阶段或在仿真循环的一些或所有采样步长内使用的回调函数。
数据层面:
s-function块具有输入和输出信号、参数、以及内部状态,再外加其它一般的工作域。一般对于块输入和输出信号的读写通过一个块I/O向量来,也可以来源于外部输入或接地输入。快输出可以通过根输出端口块传递到外部输出。s-function可以通过两种渠道(指针或相邻的输入)来访问输入信号。
指针访问:
通过函数InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S, portIndex)
来访问输入信号,这是个指针数组,portIndex从0开始,每个输入端口都有一个索引号,访问该信号的一个元素使用*uPtrs[element]。
输入数组指针能够指向内存中非相邻的单元。使用real_T *y = ssGetOutputPortSignal(S, outputPortIndex);
获取输出信号。访问相邻的输入信号:
通过使用ssSetInputPortRequiredContiguous
宏,S-function的mdlInitializeSizes函数可以指定其输入信号的元素必须占据相邻的内存区间。如果输入是相邻的,其它函数可以使用ssGetInputPortSignal来访问输入。输入指针数组能够指向块I/O向量中的非相邻入口,特定端口的输出信号组成了一个相邻的向量。访问输入元素并将它们写入输出元素的代码:
int_T element;
int_T portWidth = ssGetInputPortWidth(S, inputPortIndex);
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S, inputPortIndex);
real_T *y = ssGetOutputPortSignal(S, outputPortIdx);
for(element = 0; element<portWidth; element++){
y[element] = *uPtrs[element];
}
如果有什么错误望指教。
参考:《MATLAB的S-function编写指导》。