7.2.3 基于模型的程序开发语言
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级计算语言和交互式环境。在现在的汽车电子开发中,可视化设计是一个重要的趋势,而Matlab特别是它能够实现的自动代码生成工具Auto-Coding(通过其自有的Real Time Workshop和Embedded Coder),为这一趋势提供了非常方便的工具链。Matlab工具在汽车电子系统的开发中已经被广泛地应用。其实,较早应用模型进行软件开发的是在航空业,欧洲的空中客车公司很早以前就已经应用Matlab进行算法的开发了。出于安全性和可靠性的考虑,汽车业界对于这个工具的使用一直比较谨慎,现在,基于模型的设计开发模式已经得到几乎所有OEM的认同并被广泛使用。可以毫不夸张地说,MathWorks已经成为现代工业界的微软。
这个工具系统主要包括MATLAB,Simulink和Stateflow等几个部分。它们的相互关系如图7-3所示。

图7-3 MATLAB软件工具
Matlab拥有数百个内部函数的主体和30多种工具包。工具包又可以分为功能性工具包和学科工具包。功能工具包用来扩充MATLAB的符号计算、可视化建模仿真、文字处理及实时控制等功能。学科工具包是专业性比较强的工具包,如控制工具包、信号处理工具包、通信工具包等都属于此类。常用工具箱见表7-7。
表7-7 Matlab常用工具箱

Matlab提供的工具包为不同的系统应用提供设计和分析的工具(图7-4)。Matlab同时是Simulink、Stateflow和RTW的应用基础。

图7-4 Matlab主页面
Simulink是MATLAB中的一种可视化仿真工具,是一种基于MATLAB的框图设计环境,是实现动态系统建模、仿真和分析的一个软件包(图7-5)。Simulink有如下功能:
1)可以提供有层次的框图界面。
2)利用预先建立的控制模块库协助设计,比如数字信号处理模块库,通信模块库等。
3)可以搭建模拟、离散和混合信号的模型。
4)可以整合MATLAB,RTW和Stateflow等工具。
5)支持客户定制代码和传统代码(legacy block)。

图7-5 Simulink模型图
Simulink常用的模块库主要有10种:
1)Continuous(连续模块库)。
2)Discontinuities(非连续模块库)。
3)Discrete(离散模块库)。
4)Lookup Tables(查表模块库)。
5)Math Operations(数学计算模块库)。
6)Logic and Bit Operations(逻辑运算模块库)。
7)Ports&Subsystems(端口和子系统模块库)。
8)Signal Routing(信号路径模块库)。
9)Sinks(接收器模块库)。
10)Sources(输入源模块库)。
Stateflow是一种可视化的设计工具,利用有限状态机原理(finite state machine theory)对目标对象和系统进行建模和仿真。Stateflow是有限状态机的图形化工具(图7-6),用于解决复杂的逻辑问题,用户可以通过Stateflow实现在不同状态之间的转换,可以直接嵌入到Simulink仿真模型中,并且在仿真的初始化阶段,Simu-link会把Stateflow绘制的逻辑图形通过RTW提供的编译程序转换成特定的C语言,使二者有机地结合在一起。

图7-6 Stateflow有限状态机模型图
1)对于模型。
①模型设计是除了直接编写程序以外的另一种开发、设计、仿真和测试的方法。
②基于模型的设计方法是较为直观的可视化方法。可以清楚地将系统逻辑和技术需求展现给开发者。
③基于模型的设计方法有很高的可重复使用性和可维护性。(https://www.daowen.com)
2)对于自动代码生成。
①最直接的好处是将手动编写代码的工作部分省略掉,采用模型直接生成代码的方式,在减少工作量的同时,减少了可能造成错误。
②不需要看预编译的C代码或模型自动生成的代码,通过直观可视化的模型使得设计更一致、更容易同步。
③对于不同的处理器和编译器,只需一次设置,如果更换,也只用修改一次。
④许多工具可以对自动生成的代码进行测试(如Software in Loop Test、SIL、软件在环测试),使测试更方便。
目前汽车界使用Matlab模型设计和自动代码生成技术的汽车公司有GM、Del-phi、Bosch、Ford、Chrysler、Nissan、Honda、PSA、Renault、TNO、Visteon、Mo-torola、Magneti Marelli、Denso、Ricardo、Hitachi、Continental Teves等。模型化的设计开发能提高工作效率,减少出错概率,让开发工作变得更简单。
本书前面已经介绍的控制系统软件开发过程,应用Matlab这样的可视化工具开发也同样需要遵循这些过程,只不过开发的过程会依据工具的能力和作用有所调整。
用Matlab开发需求定义和管理。需求是一种状态,是保证一个产品的质量必须要满足的状态,或产品必须拥有或将要达到状态或质量。状态或质量的表征可以是一种需求被满足的合约、标准或类似的正规表述文件。
需求的特点和品质见表7-8。
表7-8 需求的特点和品质

现代汽车电子控制系统的开发过程有一种可执行的需求(Executable Require-ment),它是在原有描述性需求的基础上进一步具体化,Matlab模型集合就是一种可执行的需求。
(1)可执行需求的特点
1)包含控制逻辑算法的模型集合,并可以直接执行、验证。
2)通常由多个相对独立而又互相联系的对象组成,每个对象可以完成部分控制算法,同时可以和其他的对象传递数据。
3)为了更清晰并有更好的可读性和可更改性,模型集合一般会有多个层级。
(2)可执行需求的多重好处
1)需求文件可以在模型完成时自动生成(Matlab本身有Doc模块,可嵌入模型的功能及需求描述),不但节省时间还可以实现与应用的无缝连接。
2)本身形象易懂,可视化的逻辑开发,大大缩短了开发时间。由于可以重复使用,为其他产品或以后的产品开发提供基础。
3)由于可以直接执行,在应用相应的测试工具测试后,可以大大减少代码缺陷,节省系统测试的时间和人力。
4)开发人员可以更专注于逻辑,而不是语言本身,RTW已经将底层的汇编等工作集成,可以将开发人员从这些劳动中解放出来。
(3)可执行需求的基本元素
1)一个被很好组织与构架的图形模型,具有要实现的逻辑功能、算法和调用逻辑。
2)一个可视化的客户界面,可以通过鼠标或键盘的输入进行实时的操作,同时还可以进行更改并将运行情况和结果显示给用户。
3)一般还应该至少有一个清晰地描述如何对模型集合进行测试验证以及预计的验证结果的描述文档(对模型集合进行测试的内容将是一个独立的过程)。
4)好的模型集合还应该有充足的说明文档,方便有经验的模型读者(但没有本模型经验)解读和理解模型。
5)对于要求较为严格的嵌入式系统,还需要一个模型自动生成的C代码实例来对生成软件的结构和特点进行说明。模型自动生成的代码和手写代码有明显的不同,自动生成代码可读性很差但非常精简,内存空间用量是经过优化的。手写的C程序,可读性好,但大多数程序员的优化能力是不如电脑的。
6)模型集合还需要一套机制,它能有效地将文档中的需求与模型真实地连接起来,同时将模型与最终生成的代码进行版本控制管理(Version Control)。版本控制还需要某些专门的版本控制软件来实现,如ClearCase,CMsynergy等。
用Matlab进行控制软件分析和设计时,其输入应是产品的开发设计需求,而输出则包括系统模型(Matlab/Simulink/StateFlow所组成的模型集合),数据库(所有模型中用到的数据的名称、类型、标点、单位和初始值等),功能测试计划书(测试流程、对象、期望结果等,一般包含功能测试向量和系统输入输出对应值列表以及范围覆盖测试)等内容。软件工程师们所熟悉的传统的软件开发到这里实际上已经基本结束了,除了后面的一些编译、连接等工作还需要软件工程师利用RTW来完成外,主要的开发工作已经完成。这个时候需要考虑Matlab的自动代码生成和普通模型开发的区别,具体见表7-9。
表7-9 普通系统模型与需要自动代码生成的系统模型的要求对比

模型开发完成后,需要对Matlab模型生成的软件进行必要的测试。传统的C语言程序,需要经过编译、连接生成可执行代码后烧录入CPU,这样的程序是很难进行测试的,而现有的一些PC环境下的仿真测试功能有限,而且使用过程繁琐复杂,没有普遍使用。而用Matlab进行模型开发就可以随时进行模型验证,模型在环(Model in the Loop,MiL)的仿真测试方法是一种非常流行且有效的验证方法,它无需将模型转换成代码,只需要做一些简单的定义(时间,步长,输入,输出等),就可以用Matlab的现有平台对搭建的模型进行测试。快速、简便和有效是MiL的最大特点。许多的算法逻辑问题会被尽早地发现,保证了开发质量。MiL测试的输入是软件的模型集合、数据库、输入矢量和输出矢量。MiL测试仅仅能测试逻辑、算法、功能、覆盖率等较为明显的问题,许多嵌入系统的固有问题(比如实时性)还必须要进行下一步的代码验证,如系统集成测试、硬件在环测试(Hardware in Loop,HiL)等。
系统软件集成和测试的输入是软件模型、数据库、自动生成的软件源代码、功能测试向量和汽车数据以及模型覆盖测试向量。
高水平的软件开发是专业开发人员根据制定的有效流程应用适当的开发工具和技巧开发而来的,目标就是用尽量少的人,尽量快速地开发出尽可能高质量的软件。