经本人实际测试, Simulink R2021b以及ModelSim 10.7, 在仿真测试时遇到过信号不同步, 模型出现跑飞情况, 端口配置还报过错, 这些都是实际操作中遇过的坑点, 新手只要依照……
经本人实际测试, Simulink R2021b以及ModelSim 10.7, 在仿真测试时遇到过信号不同步, 模型出现跑飞情况, 端口配置还报过错, 这些都是实际操作中遇过的坑点, 新手只要依照步骤一步步去操作, 便能够轻松躲开这类常见问题。
1. 仿真模型搭建与参数配置
一开始, 开启Simulink, 创建空白的模型, 于Library Browser之中拖进Signal Generator、Scope以及Gain模块。双击Signal Generator, 将Wave form设定成Sine, 把Amplitude填写为1, 将Frequency填写成50Hz。把Gain模块参数填写为2, Scope维持默认采样时间-1意味着继承。接下来, 点击Model Configuration Parameters, 将Stop timedef设置为零点儿五, Solver选择fixed-step ode4, Fixed-step size填入零点零零零五。
新手要避开坑, 新手容易碰到“仿真跑不完”这种情况, 或者结果波形很诡异。常见的报错是代数环警告, 其原因是反馈回路没有添加Unit Delay或者Memory模块。 解决问题的办法是: 在反馈路径上添加一个Unit Delay, 延迟一个步长, 以此破坏代数环。
第二步, 对模型输入以及输出和Workspace变量进行连接。用右键点击Scope输出线, 从中选择Signal Properties, 于Logging name处填写sim_out。与此同时, 将Model Explorer打开, 在Base Workspace里添加From Workspace模块, Data参数填写成[t_data, u_data], 在这里t_data是时间向量, u_data是输入信号矩阵, 其列数需和模块端口数相一致。
在新手需要避开的坑里面, 常有报错“当Simulink不能加载那个MAT文件的时候”, 其缘由乃是变量名出现了拼写错误, 或者工作区没有在之前提前加载数据的情况。而核心的出错缘由在于, From Workspace模块的Data参数必须使用变量名, 而不能够直接去写数字矩阵。方法是这样的: 在MATLAB的命令窗口之中, 首先运行这样的: t_data设定为从0开始, 以0.001为步长直到0.5;u_data等于sin函数作用在2乘以圆周率乘以50再乘以t_data的结果, 之后再去运行该模型。
2. 仿真运行与结果分析
第一件事, 开启仿真, 点击Run按钮。处于仿真结束状况之后,于命令行键入plot(sim_out.time, sim_out.signals.values)去查看波形。要是波形不正确, 核查Scope的采样时间是不是被设置成-1, 亦或是模型有没有含代数环。
【新手需避坑】, 常见波形呈现“锯齿状”或者“缺失数据”, 其原因在于, Fixed-step size设置得过大, 进而致使采样点不足。推荐把0.0001秒作为步长, 如此一来, 既能确保精度, 又不会拖慢仿真速度。要是步长小于0.0001, 仿真时间会急剧增加, 并且对于存在高频噪声的系统而言是多余的。
接着是第二步, 要对两种方案加以对比, 其中方案A采用fixed-step solver(像是ode4这样的), 而方案B则采用variable-step solver(比如ode45那样的)。方案A适宜进行嵌入式代码生成, 其步长是固定不变的, 结果能够得以复现, 然而模型的柔韧性欠佳;方案B适用于纯算法验证, 仿真的速度比较快, 不过生成的代码较为复杂。舍弃与选取的逻辑是这样的, 要是你打算去做硬件在环也就是HIL测试, 那就必定得选方案A, 要是仅仅是进行算法原型验证, 那方案B会更加节省时间。
这个高频报错“Derivative of state ‘1’ in block, ‘…’at time 0.0 is not finite”要给新手避坑, 其原因是模型里存在除零或者无穷大运算。一次性解决的流程如下: 首先, 将仿真暂停, 进而查看报错块的路径;接着, 把该块打开, 以此检查输入信号有无可能是零;然后, 在输入端添加一个Saturation模块, 对上下限予以限制, 就像[0.001, 1000]这样;随后, 再次进行仿真。要是仍然出现报错, 就要检查模型里是否包含代数环, 要是有的话再添加Unit Delay。
此种方法不适用于并非实时仿真也不是纯数学验证的场景, 举例来说好比你要解复杂的微分方程, 还要做蒙特卡洛模拟, 在这样的状况下, Simulink的固定步长仿真极有可能会严重地拖慢速度。而替代的方案是直接运用MATLAB脚本去写ode45求解器, 它具备灵活以及高效的特点, 不过却少了Simulink所拥有的图形化调试便利。
微信扫一扫
还没有评论呢,快来抢沙发~