如何使用s-function builder
1. 双击页面空白处,搜索找到S-Function Builder
2. 双击模块键入编辑界面
注意:(1)模块的数据处理部分(即要实现的功能)都在下面这个函数里写。
void system_Outputs_wrapper(const real_T *u0,
real_T *y0,
const real_T *p0, const int_T p_width0)
{
/* Output_BEGIN */
要编写的代码
/* Output_END */
}
(2)real_T 即 c语言中的double类型,输入u0、输出y0和参数p0的声明加了指针*,且观察端口和参数栏他们的维度,可知输入、参数的后面要加[0],输出的格式应该为:
//此示例将输出设置为输入*参数
*y0 = u0[0] * p0[0]
如果中间定义了什么变量,可以直接用以下定义,不用加指针*。
int_T a;
real_T b;
坑
- 因为s-function builder用的是C mex环境,代码可以直接在前面提到的函数
void system_Outputs_wrapper()中写,然后按编译按钮;会生成6个文件,分别是rtwmakecfg.m文件(没什么用)、FUN.mexw64文件、.mat文件(没什么用)、tlc文件、FUN.c文件、FUN_wrapper.c文件。
也可以把wrapper.c文件用visual studio打开,这样写代码比较方便,然后在matlab的命令行 打出 mex FUN.c FUN_wrapper.c进行编译。 s-function builder 对精度要求比较高,如果将一大串式子赋给A,A再赋给B,会丢失好多值,建议直接将一大串式子直接赋给B,减少中间变量的过程。(如果画的图不理想很大可能是这个原因)
事实证明,并不是这个原因哈哈哈哈。因为输出的定义为指针类型,我最开始是按照编辑器自带的示例y0[0] = u0[0]
写的,但可能是野指针跑飞的原因,换成了*y0 = u0[0],结果就好了
。