仿真测试自动化实操,三步搞定测试脚本卡死问题

发布于 更新于
936
详情介绍
智行者IC社区持续更新技术干货、实操教程、案例分享与常见问题解答,为学习者提供实用的学习参考资料。

以我实际测试Matlab R2023b plus Simulink的情况来看,曾遭遇过自动化脚本运行到一半突然卡死的情况出现,也曾碰到仿真数据无法对上的问题发生。

第一步:精准配置仿真环境参数

把Simulink模型开启,在顶部菜单栏那儿点击“仿真”这个标签,寻觅“模型配置参数”。在“求解器”选项卡里面,把类型设定成“固定步长”,求解器挑选“ode3(Bogacki-Shampine)”。最为关键的一步:在“数据导入/导出”当中,勾选“记录仿真输出”,并且将输出最大点数设置为50000。

针需要避坑,其中有常见的报错表述内容为 “仿真时间过长,引导致内存出现溢出的情况”。其核心原因在于你并未对输出点数加以限制,进而系统则将会无限地缓存全部的中间数据。而对应的解决办法就是,要把输出的点数降低回到50000,同时还要勾选 “压缩输出” 这样的选项,如此一来能够节省大概40% 的内存。

第二步:编写可复用的测试脚本框架

在Matlab命令窗口当中输入edit runTest.m以此新建脚本,核心参数推荐值为,设置set_param(‘modelName’,’StopTime’,’100′),其理由是该时长能够覆盖绝大多数的瞬态响应场景,并且不会导致单次仿真超出3分钟。然后按以下数字编号步骤操作:

1. 当调用sim()函数时,去指定作为输出的变量,呈现为: out = sim(‘modelName’)。

2. 对sim,在其之前、之后分别添加try-catch语句,以此来捕获仿真中断所产生的报错。

3. 选用assert语句,用以对比仿真输出跟预设阈值,从而自动判定Pass或者Fail。

【新手避坑】:常见出现报错情况: “模型名称无效”,或者“变量未被定义”。之所以出现错误,原因在于sim()函数未能找到模型路径。解决的办法为:在脚本开头添加load_system( ‘modelName’ )来进行强制加载模型,或者将模型文件与脚本放置在同一目录当中。

第三步:批量执行与结果自动归档

进行两种实操方案的对比,方案A采用parfor循环并行运行多个仿真参数组合,此方案适用于有8核以上CPU的办公机,能够节省60%的时间,方案B运用for循环串行运行,适合电脑配置一般的情况,虽说运行速度慢,但是不容易出现死机情况。明确取舍的逻辑为,对于复杂非线性模型选择方案B,对于简单线性模型选择方案A。

设定一个主函数,对于i从1开始一直到paramList的长度, out序列的第i个值等于对modelName进行模拟得到的值,将‘out’保存到以‘result_’加上数字i再加上‘.mat’组成的文件名所对应的文件中后结束循环。运行完毕后通过dir(‘*.mat’)去列出所有结果文件。

【新手避坑】:高频出现且完整的报错情况:呈现 “索引突破数组的范围” 或者 “不能够进行文件写入” 这样的表述。一步到位达成解决的流程:先对 paramList 变量开展是否为空的检查,借助 whos 命令去确认;随后确认当下的文件夹具备写入的权限,通过 cd 操作切换至你的工作目录;最终检查文件的名称不包括特殊的字符,提议仅仅运用数字以及下划线。

针对连续非线性系统仿真而言,这套方法运用起来格外顺畅,然而,当你所测试的对象是离散事件系统(举例来说,像状态流图这种)时,要是直接去套用,就会出现怪异的时序错误。与之相对的替代办法是,要么改用Stateflow自身所带的sfrun函数,要么将步长类型重新改回到“自动”这种状态。

常见问题(FAQ)

Simulink仿真内存溢出怎么解决?
通常是输出点数没有限制,系统会无限缓存全部中间数据。把输出最大点数设为50000,同时勾选压缩输出,这样能节省大概40%的内存。
自动化测试脚本里怎么捕获仿真中断?
先用 set_param 把StopTime设为100,然后在调用sim函数的前后分别添加try-catch语句,捕获仿真中断产生的报错;再用assert语句对比仿真输出与预设阈值,自动判定通过或者失败。
批量仿真报出索引超出数组范围怎么办?
先用whos命令确认paramList变量是不是为空;再确认当前文件夹具备写入权限,必要时用cd切换工作目录;再检查文件名称不含特殊字符,建议只用数字和下划线。
0 / 600
0 讨论
热门最新
总结
暂无总结