更全的杂志信息网

基于Embedded Coder的ECU数据管理系统开发*

更新时间:2016-07-05

0 引言

基于模型的ECU软件开发愈加重要[1-2]。对于发动机ECU系统来说,查表模块要满足离线数据烧写和在线标定两方面的需求:离线烧写时将查表模块数据全部定义到固定的Flash区域中,在烧写时,烧写工具将该Flash区域的数据全部烧写为新的值;进行在线标定时,内存管理模块将Flash中的查表模块数据拷贝到RAM中,标定RAM中的查表模块数据,并且让发动机ECU软件读取RAM中的查表模块数据。因此,需要在查表插值函数中,先通过内存管理模块得到查表模块的实际地址,再进行查表插值计算,返回查表结果。而Simulink自带的Lookup Table模块,在生成代码时会自动生成查表插值函数,但是该函数无法调用底层的内存管理模块,只能使用Flash中的查表模块数据进行计算,无法满足在线标定的需求。因此针对原有的底层模块,自定义开发与之匹配的Simulink查表模块是十分有必要的。另外,借鉴传统手写代码中有益的经验,在MATLAB/Simulink环境下开发数据字典对模型中的变量及数据类型进行管理可以减少模型定点化工作,提升开发速度。

1 变量存储管理

Simulink提供了名为 Simulink的包(Package),用于描述变量的名称、维数、物理值、取值范围、单位、描述以及数据类型的名称[3]。Simulink包在生成代码时不支持变量的Flash段定义,而是将模型中的变量当做普通变量来处理。另一方面,不同类型的标定变量的存储结构与查表差值函数的接口定义、数据读取方法直接相关。尤其对于曲线和曲面变量,Simulink生成代码时会将模型中的每个变量独立定义,这就导致属于同一CUR/MAP的轴参数等出现分散定义的情况,地址不一定连续,顺序也很可能是混乱的,这对于查表插值函数的影响相对较小,调整函数接口即可顺利读取到变量的轴数据地址,但是这将给a2l文件的生成带来极大麻烦,因为很难通过软件来识别分析每个轴变量分别属于哪个CUR/MAP,也就无法生成正确的描述信息来描述标定变量。所以要设计专门的包将标定变量定义到指定的Flash段中,从而尽可能减小对已有查表插值函数的改动,并且便于手工修改变量,最大限度兼容已有的手写代码的变量结构定义方式。

当大信号不存在时,ri只存在和两项.其中Ecw =Tw,可得由于可化简为(2Pw)1/2 mi Tw,当mi =-1时,则ri~N(-Tw(2Pw)1/2,2N0Tw);当mi =+1时,则ri~N(Tw(2Pw)1/2,2N0Tw).信息传输中p(mi=-1)和 p(mi=+1)为0.5,系统机密信号BER为[14]

1.1 数据类型实现

MATLAB中可以表示浮点数和定点数变量,浮点数变量有两种表示方法:一种是矩阵类型的变量,使用双精度浮点数,可在m语言和Simulink中使用;另一种是Parameter数据类,可在Simulink中使用。定点数变量也有两种表示方法:一种是Parameter数据类;另一种是fi对象,适用于m语言。所以本文使用Parameter数据类来表示数据类型[4-5]。另外,根据从前手写代码的经验和规则,使用斜率和偏移来定义定点数,使用单精度浮点数来表示浮点数,并将以前使用的数据类型都导入到MATLAB中。

刘静萍表示,当前,公司的巡视整改工作取得了预期成效。下一阶段,务必要巩固巡视整改成果,继续努力开创云南电网公司党建工作新局面。一是务必要把政治建设摆在首位,坚定两个“维护”。二是务必要把思想建设作为基础性建设,不断坚定理想信念。三是要着力加强组织建设,落实党的组织路线。四是要坚持把纪律和规矩挺在前面,注重抓早、抓小。五是要提升基层党委组织力和党支部战斗力。

1.2 变量及其存储实现

在Embedded Coder自动生成代码时,要尽可能按照不同查表模块结构定义方式生成变量。基于Embedded Coder的包自定义适合单片机的包,使得Simulink模型中的变量的各项属性满足在代码生成时的各种要求。建立包的过程如图1所示。

图1 创建包的流程

查表模块要在Simulink中进行使用,在Simulink环境中可以封装S函数来实现自定义功能。使用C语言编写查表模块的S函数。查表模块S函数模块的开发流程如图2所示,主要分为编写S函数文件和S函数模块封装两部分。下面以曲线(Curve)模块为例来详细描述如何创建查表模块。

2 创建查表模块

查表模块用于在模型中使用定点或浮点数据查表进行建模仿真,在创建查表模块时可以分为两个步骤:查表模块的封装和相应的底层内存管理模块封装。

其中,n为统计年限,xi是第i年的年雷暴日,x¯为所统计的63年内年平均雷暴日,t¯为自然数序列的平均值,用公式表示为t¯=(n+1)/2,rxt的正(负)值表示该要素在所统计年限内有增加和减少的趋势,rxt绝对值越大表明该要素增加和减少的程度越明显,即表示气候变化趋势越明显[5]。

2.1 查表模块封装

首先创建一个自定义的包,在该包上定义所需的数据类:定义Parameter数据类用于表达标定变量,定义Signal数据类用于表达监控变量。各数据类的属性会默认继承Simulink包中相应数据类的属性。发动机电控系统的查表模块必须定义在指定的Flash段空间内,所以需要定义数据类的自定义储存类CSC(Custom Storage Class)来定制变量的储存属性,例如数据类型(结构体或非结构体)、内存块Memory Section(定义变量声明和定义所在的储存区域)、链接属性(是否声明为外部变量)等属性。

图2 曲线查表模块开发流程

(6)RTW回调:用户来将参数传递给RTW文件,具体流程如图8所示。

(5)输出回调:用来获取输入、CUR数据,设置输出,流程如图7所示。

(2)参数检查回调,用来检查x轴数据类型名称、维数、单调性是否有效,检查y轴数据类型名称是否有效、维数是否与x轴一致,具体流程如图4所示。

(4)运行时参数回调:用来建立运行时参数(Run-Time Parameter),即将 CUR的轴变量注册成为运行时参数以获取其储存值,具体流程如图6所示。

图3 初始化回调流程

首先,根据曲线插值查表模块的特性编写S函数的C源代码,其中须包含Simulink规定的必须有的宏定义和头文件,针对查表模块还应当包含定点数相关的头文件等;实现参数的获取和设置的各种回调方法,具体包括:

图4 参数检查回调流程

(3)采样时间回调:设置采样时间信息,具体流程如图5所示。

(1)初始化回调:设置S函数的参数信息、状态信息、输入输出端口信息、采样时间信息、工作向量信息、仿真选项,具体流程如图3所示。

心肌炎的病因多为病毒,没有特效治疗。恢复期在家中特别要注意宝宝的饮食,心肌的成分主要是肌蛋白,为了增强心肌的力量应给宝宝足够的蛋白质。

中小企业是经济发展的重要支撑,建立和完善中小企业收益分配是推动社会主义市场经济发展的重要手段,是促进经济持续健康发展的重要途径,有利于调动职工积极性,促进企业更快发展,同时也是构建社会主义和谐社会的迫切需要。鉴于企业收益分配如此重要的作用,有必要对其进行研究,以更好的推动社会和经济的发展进步。

曲线插值查表模块含有1个输入、1个输出和7个参数,7个参数分别为:(1)CUR的x轴变量;(2)CUR的y轴变量;(3)CUR的x轴数据类型;(4)CUR的y轴数据类型;(5)CUR的x轴数据类型编号;(6)CUR的y轴数据类型编号;(7)CUR名称。

然后,将C源代码编译为mex文件。在Simulink中自建模块库,使用S-Function模块完成参数封装,并与mex文件链接,完成查表模块的封装。

图5 采样时间回调流程

图6 运行时参数回调流程

图7 输出回调流程

图8 RTW回调流程

2.2 底层内存管理模块封装

继续以曲线插值查表模块为例,为使该模块生成的代码能够与底层库中的查表插值函数和内存管理函数相结合,定义以下接口方式使得曲线插值查表模块生成如下格式的代码来调用查表插值函数:

输出=曲线查表插值函数(x轴Flash地址,x轴点数,x输入)

在底层库的查表插值函数中,首先调用内存管理模块的接口函数,根据CUR的Flash地址查得其RAM地址,再读取RAM地址中的CUR,进行查表插值。在代码生成时,CUR模块要生成两部分代码:一是要生成头文件中的查表插值函数的声明语句,只需生成一遍;二是对于每个CUR模块生成一次查表插值函数调用语句。底层内存管理模块封装具体流程如图9所示。

所有数据均采用SPSS 19.0统计学软件进行处理,计数数据以[n(%)]表示,组间比较采用χ2检验,计量资料以(±s)表示,组间比较采用 t检验,P<0.05 为差异有统计学意义。

图9 内存管理模块封装流程

3 仿真与代码实验

在发动机控制系统中使用的数据类型基本上是定点数数据类型。本节以无符号、16位、斜率为 2-5、偏移为0的定点类型为例,研究运用定点数所建立的查表模块在仿真和生成代码中的表现。实验通过两个定点数进行加法、减法、乘法、除法的不溢出和溢出计算来比较定点运算在仿真和代码中的表现。仿真设计如图10所示。

实验中,定点数 a_fixed等于 1,通过 Lookp_1D_CUR查表模块得出输出为7.11,由于该定点类型的精度为0.031 25,因此查表得出的输出为7.125。另一个定点数b_fixed等于11.7,同样也丢失了一些精度,但在工程应用中还可以接受。从图10中可以看出,对于不溢出的加法、减法、乘法、不除0除法运算,计算结果受两个输入的影响也损失了一定精度。除0在理论上是不存在的,仿真实验中计算结果为2 047.968 75,即储存值达到最大值为65 535。d_fixed+e_fixed实验了溢出加法计算,a_fixed查表后的结果减去b_fixed实验了溢出减法计算,d_fixed与f_fixed相乘实验了溢出乘法计算,其结果如图10所示,与理论计算结果一致。

图10 仿真实验

将该实验模型生成代码后查看其代码的表现,结果显示在进行加法、减法、乘法计算时,单片机中的计算结果与前述仿真结果一致。在进行除法计算时,单片机中的计算结果为:如果被除数小于除数,则结果为0,否则结果为商的整数部分。这与仿真结果明显不同。这是因为Simulink的除法模块在进行除法计算时,是先将除数与被除数当做浮点数来计算浮点形式的商,然后再用定点类型来显示这个商。这是定点代码在代码中的表现与在仿真中的表现的最大差异处。

4 结论

本文基于Embedded Coder进行了发动机的变量存储管理、查表模块封装和底层内存管理模块封装,从而定制了生成代码中的变量定义方式和储存方式,并将其与底层库中的查表插值函数接口相匹配,使得查表模块可以进行仿真计算、离线数据标定,其生成发动机控制代码能够支持在线标定和离线烧写。仿真和代码实验结果表明,所建查表模块可以满足开发需求;定点数在仿真和代码中的表示都会损失一定的精度;定点数在仿真和代码中进行加法、减法、乘法计算结果一致,除法计算会有差异。

参考文献

[1]DILLABER E,KENDRICK L,JIN W,et al.Pragmatic strategies for adopting modelbased design for embedded applications[J].SAE Technical Paper,2010,2010-01-0935.

[2]HODGE G,YE J,STUART W.Multi-target modeling for embedded software development for automotive applications[J].SAE Technical Paper,2004,2004-01-0269.

[3]The Math Works Inc.Embedded Coder reference[Z].2015.

[4]ERKKINEN T.Fixed-point ECU development with model-based design[J].SAE Technical Paper,2008,2008-01-0744.

[5]REDDY V,NADARAJAH S,BEALS G.Tips for fixed-point modeling and code generation for simulink[EB/OL].[2017-10-23].http://cn.mathworks.com/matlabcentral/fileexchange/7197-tips-for-fixed-point-modeling-and-code-generation-for-simulink-6.

阴晋冠,苏铁熊,冯云鹏,刘涛,贾利,周慧芳,张艳岗
《电子技术应用》 2018年第05期
《电子技术应用》2018年第05期文献

服务严谨可靠 7×14小时在线支持 支持宝特邀商家 不满意退款

本站非杂志社官网,上千家国家级期刊、省级期刊、北大核心、南大核心、专业的职称论文发表网站。
职称论文发表、杂志论文发表、期刊征稿、期刊投稿,论文发表指导正规机构。是您首选最可靠,最快速的期刊论文发表网站。
免责声明:本网站部分资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有
如有不愿意被转载的情况,请通知我们删除已转载的信息 粤ICP备2023046998号