目录
一、前言
Simulink从2017b以后更加工程化和实用化,基于MBD的功能日趋完善,从需求定义、模型链接,测试用例,模型测试,代码生成等等,那对于初识它的朋友可能需要先了解一些前期知识,然后在项目和工程中实战积攒经验,变成一个老手。
二、Simulink 知多少
派生对象包括Simulink Signal ,Simulink Parameter, Simulink Bus, Simulink Alias, Simulink Variant, 创建方式包括在脚本以构造函数的方法创建,在模型浏览器创建。
Simulink Parameter是Simulink 参数对象 , 在工程中常以配置参数的方式设置; Simulink Lookup Table是与lookup table模块相对应的数据类型,插值点和插值点对应数据的集合。Breakpoint是插值点的集合。Simulink Signal是信号,与信号线相关联。Numeric/Alias Type是其他数据类型的别名。Bus是总线,类似于结构体。Simulink.Variant有两种状态满足条件激活,未激活是0激活是1。
如何对Bus中的各元素进行初始化,使用Bus Assignment 。
如何保存工作空间数据?点击数据工作空间,然后Ctrl+S即可。可以保存.mat或者m文件。
数据字典即数据源,模型运行时不需要重新加载。使模型和数据字典关联,模型运行时自动从数据字典里搜索数据。数据字典,可回溯,因为数据字典不仅记录数据,还记录对数据的修改行为和版本。如何创建数据字典?
手动创建数据字典?
Simulink.data.dictionary.create('DataDictionary\dic2.sldd');
obj=Simulink.data.dictionary.open('DataDictionary\dic2.sldd');
importFromBaseWorkspace(obj,'varList',{'Sig','Var'});
listEntry(obj)
saveChanges(obj)
close(obj)
Bus针对结构体,Mux可以合成向量,Mux要求多个元素具有相同的数据类型。
Selector是Signal Routine里面的模块,主要用于提取向量或者元素。
Weighted Sample Time Math与采样时间相关的模块
Goto模块用于连接两个断开连线的端口,Goto设置为Global表示全局可见(其他子系统都可见),设置为Scoped表示定义范围内可见,此时要结合Goto Tag Visibility模块一起使用,表示该层级及该层级以下的子系统均可以识别。
Multiport Switch 可以实现switch case功能。
Signal Specification 模块是虚拟模块,允许您指定连接到其输入和输出端口上的信号的属性,如果指定的属性与其端口上连接的模块所指定的属性冲突,Simulink® 软件将在编译模型时显示错误消息,在模型的仿真中不起任何作用。
零阶保持器(ZOH,Zero-Order Hold)是将输入信号每过一个采样时间更新一次,并保持到下一次采样,多用于将连续信号离散化。
Signal Builder可以生成各式各样的信号,也可以从workspace和外部导入。
1.创建excel文件
2.导入到SB中:打开设置,选择File下Import from File
如何查看模型模块的执行顺序?
如何设置多速率模型?打开Block parameter参数,设置为原子,然后设置采样时间[0.2,0.1]表示偏置为0.1后开始,速率为0.2。
三、滤波算法
3.1 均值滤波
均值滤波是典型的线性滤波算法
,是指用当前像素点周围nxn个像素值的均值来代替当前像素值。
当前是指设置一个缓冲区Buf,存储上N个时刻的值,然后取平均值作为当前值。
3.2 中值滤波
中值滤波法是一种非线性平滑技术
,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
中值滤波的方法
是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列,选取中间的数值。
3.3 低通滤波
一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。滤波系数越小,滤波结果越平稳,灵敏度越低;滤波系数越大,灵敏度越高,滤波结果越不稳定。
四、Model Verification
模型检查模块主要分为基本用途,防止报错,底层实现,结果观测,梯度检测提示
Check Discrete Gradient 模块用于检查本时刻和上一时刻差值。
Assertion模块对是否为零进行验证,为零报错。
Check Static Range 检查输入信号的最大最小值,超出范围报错。
五、Model Coverage
执行覆盖度Execution Coverage,EC是最基本的覆盖形式。对于每个项目,执行覆盖度确定项目是否在仿真期间执行
决策覆盖度Decision Coverage,DC:分析表示模型中决策点的元素,例如 Switch 模块或 Stateflow 状态。对于每个项目,决策覆盖度确定通过仿真所遍历的项目的仿真路径总数的百分比
条件覆盖度Condition Coverage,CC:分析输出其输入(例如,逻辑运算符模块)和Stateflow转移的逻辑组合的模块。当测试用例导致模型中逻辑模块的每个实例的每个输入以及转移的每个条件在仿真期间至少为真一次,在仿真期间至少为假一次时,测试用例可实现完全覆盖。条件覆盖度分析报告测试用例是否完全覆盖了模型中每个模块。
收集模型的覆盖度时,可能无法实现 100% 的条件覆盖度。例如,如果指定短路逻辑模块,通过在配置参数的覆盖度窗格中选择将 Simulink 逻辑模块视为短路,您可能无法实现该模块的 100% 条件覆盖度。
修正条件决策覆盖度MCDC:Simulink Coverage 软件修正的条件/决策覆盖度分析扩展了决策和条件覆盖度功能。它分析输出其输入和 Stateflow 转移的逻辑组合的模块,以确定测试用例测试逻辑模块输入和转移条件的独立性的程度。
- 当一个输入的变化(独立于任何其他输入)导致模块输出发生变化时,测试用例可实现模块的完全覆盖。
- 当至少一次条件的更改触发每个条件的转移时,测试用例可实现 Stateflow 转移的完全覆盖。
在模型配置中点击Coverage,勾选Enable coverage analysis,在Coverage metrics中选择具体的覆盖度类型,运行模型后会自动弹出覆盖度窗口。
六、Simulink测试实例
具备成为VIP的条件1&&2&&(3||4);1年龄满18岁,2至少充过100元,3游戏年龄至少1年,4被举报次数少于3次
使用Signal Builder作为测试输入,设置输入及输出VIP
简单的模型设置为:
子系统为:
测试输出结果:
打开Simulink Data Inspector
七、Simulink Test
Test Sequence && Test Assessment
使用Test Sequence 模块可以指定测试步骤,行为,转移。当输入时间序列步骤时,应当提供时间定义的测试向量。一个test sequence 可以包含测试步骤,且测试步骤是富有层级的,根据Tag进行跳转。编写示例:
Test Assessment与Test Sequence非常类似,但是作为评估仿真测试场景,步骤来使用,关键词是Verify
示例1:
模型如下:
设置TestSequence
设置Test Assessment:
示例2:
1.打开sltestTestSequenceExample
2.右击shift_controller建立Test Harness,Sources and Sink 选择Test Sequence
3.添加常量Limit设置为2,并编写序列步骤
4.将仿真时间设置为15s,然后运行test harness
Simulation Inspector
示例3:
八、Test Manager
TestManager的组件包含下面的关系:Test File >Test Suite > Test Case > Simulation = Baseline,
Test File对应模型文件,Test Suite 对应子系统,Test Case 对应子功能。
simulation test 不依赖于其他的文件,只要TestHarness可以执行通过,那么simulation test也可以通过。Baseline test依赖外部文件,比如期望输入和输出。
模型:
simulation test
然后对每一个子系统建立一个test harness,建立4个harness, constant 作为输入。
九、Test Harness
Baseline test 测试模型如下:
该子系统的功能是对值进行有效性验证:
对该子系统创建Test Harness:
创建Signal Builder信号Group1和Group2:
Test File:一个Test File对应一个模型文件
Test Suite:每一个测试文件中,都可以定义若干个Test Suite,可以把同一类型或同一功能的测试用例放到一个Test Suite中
Test Case:每一个Test Suite中,可以定义若干个Test Case,Test Case中规定了测试详细的执行信息。实际测试执行的时候也针对每一个Test Case进行测试的
Create Test Case from External File:测试用例的具体信息从excel模板中提取,这篇文章重点介绍以这种形式来创建测试用例
在Harness中打开Test Manager, 创建TestFile并对Test Suit和Test case命名,在case中“System Under Test”选择模型及harness 文件名,Baseline Criteria中加载期望输出,(如果不会,可以点击Capture给你创建一个示例),如果有多个输出,要对列的名字加以命名。
在“Iterations”栏中点击“Auto Generate”,并在右上角+号栏选择Baseline,选择相应的文件
点击运行即可生成测试结果,也可以导出测试报告Report。
TestCase 设置项描述:
TAGS:可以给一个标签名,比如按照功能,测试类型等,方便以后批量查找测试用例
DESCRIPTION:可以给描述测试用例的测试步骤,方法等,方便理解
REQUIREMENTS:可以和需求关联。Matlab现在有“Simulink Requirements”这个Toolbox,可以在里面写需求文档,将需求和模型,以及对应的测试用例关联起来,以满足A-ASPICE或者ISO26262所规定的软件开发流程中的可追溯性的要求。
SYSTEM UNDER TEST:里面设置了要被测试的模型,或者针对模型中所创建的某一个Test Harness模型进行测试
PARAMETER OVERRIDES:这里如果是根据excel模板生成的测试用例的话,是锁定不能修改的,里面列出了某个测试用例中,需要改变的参数
CALLBACKS:里面分为3个不同时刻的,运行我们想要的脚本
INPUTS:定义测试的输入信号,这里如果是根据excel模板生成的测试用例的话,是锁定不能修改的。另外这边有两个选项可以勾选,如果勾选“Include input data in test result”的话,在最后的结果中,也会显示输入信号。如果勾选“Stop simulation at last time point”的话,仿真测试到最后一个输入点的时候就会停止。
SIMULATION OUTPUTS:可以在里面再选取模型中logged的信号作为观测量
CONFIGURATION SETTINGS OVERRIDES:可以在仿真测试的时候对原模型的设置进行覆盖
BASELINE CRITERIA:里面设置了期望值,以及比较仿真测试结果和期望值的一些参数。这里如果是根据excel模板生成的测试用例的话,是锁定不能修改的。但可以点击Edit在excel文件中修改。对比数据时,可以设置绝对误差,相对误差,时序领先误差和时序滞后误差。
ITERATIONS:迭代测试。这里如果是根据excel模板生成的测试用例的话,是锁定不能修改的。会根据测试用例数自动生成,表示这个测试会根据不同的配置重复进行
COVERAGE SETTINGS:统计覆盖度的设置。如果需要统计模型的覆盖度的话,就勾选“Record coverage for referenced models”和“Record coverage for system under test”
test Sequence基本知识:
ramp(et)根据测试步执行的时间返回值,也就是测试步执行时间,可以用这个函数来线性变化输出,et表示的是当前测试步执行的时间
Heaviside(x):创建一个阶跃信号,x<0时输出0,x>0时输出1
swatooth(x)创建一个锯齿波,要指定测试步骤内的锯齿波周期数,请将此运算符与经过时间(et)运算符一起使用;sawtooth(et/10) 10s一个周期的锯齿波
square(x)创建周期为1且范围为-1到1的方波。在区间0<=x<1中,square(x)返回1表示0<=x<0.5,返回-1表示0.5<=x<1。square(et/10) 10s一个周期的方波
triangle(x)创建周期为1且范围为-1到1的三角形波。在区间0<=x<0.5时,三角形(x)增加。三角波和锯齿波的区别在于三角波的上升和下降时间相等;triangle(et/10)10s一个周期的三角波
verify(expression,errorMessage)为失败的verify语句返回指定的错误消息。如果在Test manager中运行测试,错误消息将显示在仿真日志中。如果在Test manager之外运行测试,则诊断查看器中将显示该消息
在实时环境中,验证语句失败不会产生警告。但是,如果在Test manager中运行实时测试用例,则失败将显示在测试用例结果的验证语句部分。还可以使用getVerifyRuns访问有关验证运行的信息
verify(expression,identifier,errorMessage) 比上面一个多了标识,
verify(x > y && z > 10,'TestReq1:bothGreater','x, y, and z are %d,%d,%d',x,y,z)该验证语句的结果以标签TestReq1:bothCreate开头,如果测试失败,则以errorMessage开头。
assert(expression)对逻辑表达式求值。如果assert语句的计算结果为false,仿真将停止并返回错误。assert(expression,errmsg)为失败的assert语句返回指定的错误消息字符串(errmsg)
test Harness总结:
1.如果验证的模型比较简单,直接上输入:Signal Builder仿真,输出 baseline excel
2.模型比较复杂也可以用上述方法,Signal Builder使用外部excel作为输入,建立多个group,然后使用迭代的方法进行测试,输出 baseline excel
3.建立testharness使用test sequence 作为输入,拷贝之前建立的测试用例excel,每一个case对应一个testHarness。
4.使用import和output,这样的话建立testFile使用模板来建立比较快速
5.使用Constant 作为输入,使用Model Verification来对比;直接在Constant中建立测试用例即可,每一个case对应一个testHarness
十、 学习
命令窗口demo,doc,help xx。
Video Portal Main Page - MATLAB & Simulink (mathworks.cn)
首页 - MATLAB中文论坛 (ilovematlab.cn)
参考:
MATLAB Simulink的各种模型覆盖度 - 知乎 (zhihu.com)
使用Simulink Test进行单元测试 - 知乎 (zhihu.com)Test Sequence与Test Manager联合测试Simulink模型_赞哥哥s的博客-CSDN博客