一、Configuration Parameters模型参数配置
1、仿真时间
(1)在Solver选项卡中可以设置仿真的起始时间和结束时间,一般起始时间设为0,而结束时间按需设置。
(2)如果希望仿真不会自动暂停(也就是没有人为干预的情况下仿真持续进行),可以将仿真结束时间设为“inf”。
2、仿真步长
(1)Simulink仿真本身是一个数值求解的过程,在做软件开发时,基本都需要将Simulink模型转换为嵌入式软件,那么求解器选项的Solver选项卡需要按照下图所示配置,固定步长值取决于任务调度周期。
(2)Type有固定步长Fixed-step和可变步长Variable-step两个选项,相比于固定步长,可变步长可以根据系统每时每刻的情况自动得出当下的最佳步长,既不会使仿真的速度太慢,也不会丢失太多结果的精度。
3、数据输入/输出
(1)在Data Import/Export选项卡中可以配置数据的输入和输出,这里的输入和输出是针对Simulink视角的数据传输而言的。
(2)Load from workspace栏下可配置从工作区中载入Simulink的变量,这个配置了解即可,因为在工作区中定义的变量默认可以直接被Simulink中的模块使用,不需要做其它冗余的操作(这个在前面章节的一些举例中有体现)。
(3)Save to workspace or file栏下可配置Simulink保存到工作区或者文件中的变量,这个配置也不进行过多介绍,前面的章节中有介绍将数据输出到工作区或文件的模块。
4、诊断
在仿真的过程中难免会遇到报错,在参数配置中可对各种非预期情况的处理进行设置,可以选择报错并中断仿真(error),或者仅给出警告(warning),亦或是不作任何提醒和处理(none)。
5、使用脚本对参数进行配置
(1)可以用set_param命令来配置模型参数,该命令至少有三个参数(均为字符串类型,要用单引号包含),第一个参数是模型文件名(无后缀),第二个参数是命令中的参数名,第三个参数是需要配置的参数值(针对勾选与否的配置,其参数值为“on”/“off”),后两个参数是成对的,可以不止一对,其意义是为某个参数配置相应的值。
(2)命令使用参数名的查看方法如下图所示,右键对话框中的参数名,点击“What’s This”,即可看到该参数在命令中使用的参数名(command-line)。
(3)可以将若干条参数配置命令写进M文件中,这样,在启动MATLAB时直接运行该M文件,就可以一键自动配置参数。(下例中模型文件名为“untitled”)
set_param('untitled','StartTime','0.0'); %仿真开始时间
set_param('untitled','StopTime','10.0'); %仿真结束时间
set_param('untitled','SolverType','Fixed-step'); %仿真步长是否可变
set_param('untitled','FixedStep','0.01'); %设置仿真步长
%set_param无法直接设置求解器Solver
二、四个测试简介
1、MIL测试
(1)MIL测试是模型在环测试(Model in the Loop),通过纯软件仿真的形式,主要验证模型功能的正确性,是否满足设计的功能需求,旨在尽早发现问题。
(2)MIL测试通过指定输入和期望结果,将仿真结果与期望结果进行比对,根据判定标准验证模型是否正确。此外,还需要进行模型覆盖率度量,确保满足一定的覆盖率标准,如语句覆盖、分支覆盖等。这种测试方法在嵌入式系统开发的初期阶段及建模阶段中进行,是一种设计验证方法,不同于硬件在环测试(HIL),后者主要用于代码验证。
(3)MIL测试的目的是在模型的开发环境下(如SIMULINK)进行仿真,通过输入一系列的测试用例,验证模型是否满足了设计的功能需求。由于MIL测试是基于模型驱动的,因此它允许在非常早期的设计阶段识别和纠正错误和漏洞,这对于提高软件质量至关重要。
(4)MIL测试的实施通常涉及自动化测试工具,这些工具支持多种语言编写测试用例,即使是不了解编程语言的用户也可以基于表格或图形创建和设置测试程序和测试用例。此外,这些工具还支持测试序列的灵活参数化,使得测试项目维护简单,修改参数即可实现多车型复用,提高了测试效率和灵活性。
2、SIL测试
(1)Simulink自动生成C代码的过程可能会出错,为了检查生成的C代码是否有误,可以进行SIL测试。
(2)SIL测试是软件在环测试(Software in the Loop),它是一种在软件环境中验证控制系统有效性的测试方法。它通过运行系统环境中的车辆模型和虚拟ECU(电子控制单元)中的I/O模型来模拟控制器所需的各种传感器信号,并能接收台架传感器的信号和虚拟ECU发出的控制信号,这种测试方法通过将虚拟ECU的代码信息(包括基础软件和硬件参数等)与系统环境模型相连接,最终实现闭环仿真对控制系统进行测试验证。
(3)SIL测试使用与MIL相同的测试用例,查看对于相同的测试用例,其输出是否与MIL阶段一致。
3、PIL测试
(1)PIL测试是处理器在环测试(Processor-in-the-Loop testing),用于对处理器上的嵌入式软件进行测试和验证,这些软件之后将被用于ECU。
(2)PIL测试的控制算法通常在一个叫评估板的物件上执行,有时也会在真正的ECU上执行,这两种变体都使用控制器中的真实处理器,而不是像在软件在环测试中使用PC。
(3)PIL测试提供了一个可在专用微控制器上验证实际控制算法的框架,通过软件在环仿真进行了验证,保证了PIL测试平台的准确性和保真度。利用了嵌入式代码生成功能,通过对生成的代码进行最少的修改就可以进行控制器设计和测试,并且在开发过程中无需使用真正的硬件,从而避免了安全隐患和损坏昂贵硬件的任何风险。
4、HIL测试
(1)HIL测试是硬件在环测试(Hardware-in-the-Loop Testing),它是一种嵌入式软件测试技术,通过使用软件模型来模拟真实的测试系统,并连接来自控制器的真实信号,使控制器误以为自己安装在了组装好的产品中,从而进行测试和设计迭代。
(2)HIL测试通过接入真实的控制器,采用或部分采用实时仿真模型来模拟被控对象和系统运行环境,实现整个系统的仿真测试。实时仿真硬件(也称HIL测试机柜)用于尽可能逼真地模拟真实被控对象,以有效地“欺骗”控制器,使其以为它正在控制一个真实的被控对象。
三、Simulink模型生成C代码
1、模型参数设置
(1)求解器选项卡中需要将Type设置为固定步长,Solver设置为离散求解器,并根据任务调度周期设置固定步长的具体值。
(2)在代码生成选项卡中需要将系统目标文件更改为ert.tlc,具体方法见下图(必须是嵌入式代码生成器Embedded Coder)
(3)可以选择在生成代码的同时生成一份报告,并自动打开。
2、模型编译操作
(1)这里以下图所示的模型文件为例进行编译。
(2)按下Ctrl+B,或者点击下图红箭头指示的按钮,即可开始编译,如果编译成功,将会生成一份报告。
(3)C文件代码的可读性不强,一般重点关注与C文件同名的H文件,其中往往提供了非常多的接口给其它文件调用。
3、数据管理
(1)数据字典的创建步骤:
①右键模型编辑区空白处,选择“Model Properties”。
②原本模型文件中的变量默认可以来自工作区,这里需要改为数据字典。
(2)信号对象的添加与使用:
①数据字典创建完成后,打开模型浏览器,可以在字典中添加信号对象(信号线上的量,名称要与信号线上的标注相同,这样才能一一对应),相应地,然后要左击信号线,选择“Properties”,在弹出的对话框中勾选“Signal name must resolve to Simulink signal object”,这样,信号名就解析为模拟链接信号对象。
②在嵌入式软件中,针对每一个信号对象,都需要为它们定义明确的数据类型(值得一提的是,由于浮点数占用的空间较大,且可能没有浮针对点数较高效的处理器,所以基本不使用浮点类型),并将存储类设置为ExportedGlobal,这样,它就成了一个可供外部使用的全局变量。
③以上步骤完成后,对模型文件进行编译(信号对象不可关联多个信号,所以例子中Y信号线只能有一个信号,故需要对模型进行修改),代码文件会发生一些变化。
(3)参数对象的添加与使用:
①在上面模型的基础上进行修改,在输入U后面新增一个增益模块,增益系数(增益模块的Gain参数)命名为K,此时K是个未定义的变量。
②打开模型浏览器,可以在字典中添加参数对象(模块中的参数量,名称要一一对应)。
②在嵌入式软件中,针对每一个参数对象,都需要为它们定义明确的数据类型(基本不使用浮点类型),并将存储类设置为ExportedGlobal,除此之外还需要设置初始值,这样,它就成了一个可供外部使用的全局变量。
③以上步骤完成后,对模型文件进行编译,代码文件会发生一些变化。
(4)表格对象的添加与使用:
①在上面模型的基础上进行修改,在正弦波发生器后面新增一个一维查表模块。
②打开模型浏览器,可以在字典中添加表格对象。
③和之前介绍查表模块一样,对表格对象可以配置其维度、表格内容、各维度的数据类型等,本例中以一维表为例。
④双击查表模块,将Data specification更改为“Lookup table object”,并将其后的Name属性配置为之前建立的表格对象的名称,这样,查表模块就可以直接和表格对象绑定。
⑤点击下图红箭头指示的三个点,打开表格对象的专属对话框,为结构类型名称命名(总之不要为空,命名规范与变量名相同),否则无法通过编译甚至仿真。
(5)前面举例都是将对象的存储类设置为ExportedGlobal,这是为了其它文件可以访问到本文件中定义的变量,如果设置为ImportedExtern,那么对应的变量则应在其它文件中已有定义,本文件可以对其进行访问。这项设置是为了方便若干个模型文件生成的代码文件可以链接在一起。