①simulink根据flag的具体数值判断系统是计算连续部分还是离散部分,并调用相应的子函数,simulink在处理混合系统时将同时调用S-function的mdlUpdate、mdlOutput和mdlGetTimeOfNextVarHit子函数。对于离散系统而言,在mdlUpdate、mdlOutput中需要判断是否需要更新离散状态和输出。
②在初始化子函数中有个simsizes函数
关于这个函数,用“帮助”里给出的信息:
simsizes用来设定s-function函数的尺寸
simsizes是一个帮助函数,用在M文件S函数中去提供关于S函数的具体信息。
这个信息包括输入,输出,状态和其他模块的特性的数量。
给simulink这些信息,在初始化阶段先调用未有预设值的simsizes函数
如: sizes=simsizes;
在初始化适合S函数的说明后,simsizes函数会被重新调用将这个结构转变成矢量才能够被simulink处理。
如 :sys=simsizes(sizes)
③flag值未定义
有时总会出现:
Input argument “flag” is undefined.
switch flag,
error in ==>xxxxx at 107
这个问题我没有找到原因,弄好的方式是改变下初始化参量的位置,把flag放在了最后的位置,但是这应该不是原因。
④ S函数名字和simulink的文件名
S-function的名字和editor中的调用.m文件名要一致,但不要和simulink的文件名一致。
⑤自带S-function的实例
在Matlab中输入sfundemous命名,可以查看s-function的相关实例。
或在User-defined function 模块库中的sfundemous模块可以查看实例。
⑥过零检测的作用
变步长解算方法会动态地评估下一个采样时刻计算所使用的步长,当前后两个采样点的值变化大时,则缩小采样步长;反之,当前后两个采样点的值变化小时则增大步长。这种做法使得解算器在计算不连续临近区域时使用较小的步长,因为不连续点临近区域值变化幅度大。这种做法能保证计算的精确度,但是却有可能导致采样过于密集、步长过小而导致仿真时间太长。
simulink使用过零检测技术来精确定位不连续点,以免仿真时步长过小导致仿真时间太长,一般情况下能够提高仿真速度,但有可能使得仿真到达规定时间长度之前就停止。当采用变步长解算方法仿真时,如果遇到步长自动变得很小导致仿真时间很长或基本没有进度,可以考虑勾选开启过零检测功能。
简单地来说,变步长求解器可以在非连续点添加时间步长来仿真非连续动态系统。过零检测就是为这些不连续点设定的。(摘自:空天遮阳伞)
⑦示波器点约束
有时示波器只显示仿真的后一部分,前面时间的结果没有显示。
示波器有“5000"limit data points to last限制勾选,去掉了勾选就正常显示了。
simulink的基础总结:
首先,simulink的基本知识,包括simulink的工作环境,工作原理,simulink求解器,simulink的应用工具箱和模块库,和基本操作。
重点需要关注的是:simulink求解器的设置和应用,还有模块库中各模块的作用,还有基本操作,例如连线分岔,用Ctrl+点连线,将虚线牵引到所要连接的模块。
其次,
系统仿真的基本概括,包括simulink建模与仿真(离散系统,连续系统,混合系统),命令行动态仿真,模型线性化,求平衡点(稳定),子系统应用(使能,触发,触发使能),控制流语句(if-else,switch,while,for),子系统
封装,S-function(自定义模块)
这里上面形成一定的覆盖,但是还有很多细节需要确认和应用时遇到再确认。
总之,还需要继续应用才能更加清楚。