S-Function 的扩展能力真的是 Simulink 里的一把利器。写过 Simulink 模型的朋友都遇到过内置模块不够用的情况吧?这时候,自己写个S-Function就挺香的,是要实现一些比较复杂的算法逻辑,或者跟硬件打交道的时候。
M 文件 S-Function用起来比较快,调试方便,就是执行效率差点;MEX 文件写起来虽然麻烦点,但跑起来真是稳、快,适合那种对性能有要求的场景。像什么大数据、实时仿真,直接上 C 写 MEX,绝对不亏。
S-Function靠的是一套回调机制,像初始化、更新、输出这些步骤都有对应的函数,你可以插手每一步操作,想怎么控制流程都行。比如你要做一个有状态控制的模型,就可以把状态变量存在SimStruct
里面,自己维护状态变更,灵活度那是相当高。
还有一点比较关键的就是直接馈通。就是说你当前步的输出如果依赖当前输入,那 Simulink 就得安排顺序,不然仿真容易出问题。所以写 S-Function 时记得声明好哪些端口有直接馈通。
再来是动态维矩阵,也挺常见,比如你信号帧长度会变的情况,S-Function 也能得来。只要你在mdlInitializeSizes
里声明好可变维度,Simulink 就能帮你动态适配。
采样时间和偏移量也别忽略,是你做多速率系统的时候,设定对了能避免一堆时序 bug。要是不清楚采样原理,建议先把 Simulink 里的多速率机制摸熟一点。
想快速上手的话,推荐看看这些范例,有 M 文件的、C/C++的,连 Fortran 的都有,比较适合按场景学习,比如你想做离散控制器或者过零事件,基本都能找到模板。
哦对了,用 C 写的话别忘了SimStruct
是核心,所有信息都藏在里面。像输入输出端口、状态变量、工作向量这些,全靠它维护。写的时候细心点,初始化别漏了,内存别乱用。
调试时建议多用ssSetErrorStatus
,一出错就抛异常,找问题快多。要是你 S-Function 经常出奇怪的错,十有八九是内存没管好或者状态乱了。
如果你写 Simulink 模型经常觉得受限,又不想重写一整套系统,那真挺建议你学一下 S-Function。不用复杂,先从 M 文件写起,慢慢熟练后再搞 MEX,一步步来效率也高。