matlab版本——2017a
17a的S-Function Builder模块没有语言设置选项,默认为C
1.在工程文件夹下创建一个独立的文件夹,用来存放生成的S函数
2.在新建的文件夹下创建一个新的空白slx文件(simulink model),并在这个模型中拖入模块——S-Function Builder
3.双击模块进入配置界面
(1)配置界面中各参数具体含义可以自行搜索,在这里需要注意的是左上角参数——S-function name,这个参数就是接下来生成的s-function的函数名。
(2)使用该模块时所有的参数,输入输出变量都需要在模块配置中配好,虽然Simulink在生成S-Function时会先生成c的源码再编译,但由于自动代码生成的多层封装,想以代码的方式来自定义与添加变量比较麻烦,这里添加一个输入变量示意,此时一共有两个输入一个输出
(3)输入输出关系等运算在这个界面下配置,注意这里使用变量需要使用指针的方式
对使用指针的解释——这个模块会生成两个.c的源文件——s_fun.c与s_fun_wrapper.c(我这个S函数叫s_fun),通过下图的源码不难看出我们需要实现的功能(配置输入输出关系)位于s_fun_wrapper.c这个文件下的函数s_fun_Outputs_wrapper;中实现,而这个函数中的功能是我们在上图自定义的。通过查看函数的参数我们可以发现这里需要以指针的方式访问变量。
官方注解——y0[0] = u0[0]; 这里没有" * "的原因是因为数组名本身就是一个指针。
(4)编译前将Matlab的工作文件夹放在新创建的,用来放生成的S函数的文件夹下,不要放在工程的主目录下,否则编译的所有文件都会存放在主目录下,特别乱
(5) 配置好所有参数后点击右上角的Build即可编译,在编译的时候可能会报错,需要注意的一点是自行添加的变量默认是没有名字的,如下图,未命名变量在编译时会报错。
(6)编译成功,模块设置内的文本框出现以下文本
(7)编译生成的文件如下图所示,这里把生成S函数的模型也保存在这个文件夹下了,S函数与S函数的生成模型(.slx)不能重名,这里将生成S函数的模型命名为s_fun_create。这里保存模型是为了便于修改后再次编译。
4. .mexw64文件就是生成的s函数,这里为s_fun.mexw64(你的S函数名+mexw64)
5.复制粘贴,将这个生成好的S函数拷贝到主工程的文件夹下
6.主工程下添加S_Function模块,配置中只需要修改第一个参数——S-function name。
将这个参数修改为刚拷贝到主工程文件夹下的那个s函数的名字,不需要加后面的后缀(.mexw64)
8.运行测试,这里可以看出这个自定义加法的S函数还是挺靠谱的(手动狗头)