关于MATLAB/Simulink中的S函数报错: Output returned by S-function 'xxx' in 'xxx' during flag=3 call must be a real vector of length x
S函数在系统仿真时经常用到,它可以实现难以用simulink模块搭建出来的功能,即以代码的方式实现所需功能。最近笔者考虑将带可变参数的传递函数用S-function来实现,遇到以下报错:
根据报错信息,问题出在‘mdlOutputs’子程序中,原因可能是
① 输出为非实数
② 输出的长度和初始设置不统一
针对这两个问题,容易发现解决,可参考其他帖子。
笔者检查后发现并不是这两个问题,而是变参数计算的程序位置放错造成的,这是由于对S函数运行过程欠缺理解。
根据上图S函数仿真步骤,仿真在初始化mdlInitializeSizes
(flag=0)后,会通过初始参数计算第一步输出mdlOutputs
(flag=3),而并不是定势思维地先更新状态(flag=1或2)。而笔者程序中变参数的计算部分我放在了状态更新子程序mdlDerivatives
中,造成计算输出时无法获得参数,计算失败而报错。当把参数更新放到mdlOutputs
中,发现问题解决。
所以,当你遇到此问题,并排除已知的两个问题后仍未解决,可考虑是否因为输出计算时参数未知而造成出错。