基于代码生成的车身网络电控系统设计.doc_第1页
基于代码生成的车身网络电控系统设计.doc_第2页
基于代码生成的车身网络电控系统设计.doc_第3页
基于代码生成的车身网络电控系统设计.doc_第4页
基于代码生成的车身网络电控系统设计.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于代码生成的车身网络电控系统设计叶青林 马忠梅 张幽彤 摘要:使用UML建模软件Enterprise Architect(EA)设计了车身网络电控系统,借助EA的代码生成功能,经过对代码生成模板的修改,生成可编译的C语言代码,实现了CAN网络、LIN网络及二者之间网关的组建。同时搭建车身网络实验平台,完成车身网络中各部件的实时控制,验证了生成代码的有效性。关键词:车身网络,统一建模语言(UML),代码生成中图分类号:TP31 文献标识符:ADesign of Car-body Network Electronic Control System Based on Code GenerationYe Qinglin Ma Zhongmei Zhang Youtong(Automobile Electronics Innovation Center, Beijing Institute of Technology, Beijing 100081, China)Abstract: This paper introduces a process of designing car-body network using Enterprise Architect (EA), an UML modeling and design platform. By the code generation function provided by EA and modified code generation template, C codes implementing CAN, LIN and gateway between them are produced. A demonstration bench is built to real-time control the device in car-body, verifying the validity of the generated codes.Keywords: Car-body Network; Unified Modeling Language (UML); Code Generation引言随着汽车智能化技术的发展,汽车车身电控系统的设计得到广泛重视,车身是汽车中与乘员接触最密切的部分,其智能化的程度对于汽车驾乘人员影响较大。车身网络通过总线将各种电子装置与设备连接起来,实现相互之间的信息共享,同时简化了布线,提高了信息传送的可靠性。在车身电子方面,国内外进行了系列的研究。英国Warwick大学的Yue Guo等人比较了基于SysML开发方法和基于Simulink+Stateflow开发方法在驾驶信息系统开发过程中的优缺点1。第一种方法在捕捉系统需求方面提供了更全面的支持;而第二种方法则可生成更高质量的系统实现代码。上海理工大学陈家琪等人利用VC+6.0开发了基于CAN总线的车身电子测试系统,实现了对车身电子试验台的性能参数(开关量、电压、脉冲、CAN数据报文等)的准确稳定的输入输出2。此测试系统仍采用传统的方法设计并手动编写代码,容易在编写代码过程中引入人为错误。哈尔滨工业大学焦晓伟等人采用Stateflow图形化建模工具构建符合AUTOSAR标准的车身应用层软件模型,再利用Targetlink代码生成工具基于模型实现代码自动生成3。这种方法虽然引入模块化设计方法并自动生成代码,但所使用的工具较多而给设计和开发增加额外的开销和学习成本。尽管国内外在车身电子方面做了许多研究,但仍存在许多不足。本文试图在简化车身网络电控系统的代码生成方面进行探索研究。介绍采用基于框架结构和高级语言描述的车身网络系统的开发方法,仅使用一款UML建模工具同时实现系统的设计及程序代码的自动生成,进一步简化车身网络的设计与开发过程,提高软件可重用度,降低开发成本,减少人为错误。1 EA及代码生成功能Enterprise Architect(EA)是澳大利亚Sparx Systems公司开发的一套UML建模及设计平台。与市面上其它UML建模软件相比,EA的特点是体积小巧,使用简便,对UML标准的支持完整等。EA除支持UML 2.0标准的所有13种图之外,还支持其它的扩展图,包括分析图、自定义图、需求图、维护图、用户界面图、数据库模式图、文档、业务建模与业务交互图等4。为便于扩展、定制以及二次开发,EA提供了丰富的SDK。代码模板框架(Code Template Framework,CTF)是SDK的一部分,EA的代码生成功能正是通过基于此框架的代码生成模板实现的4。代码生成模板指定了从UML元素到给定编程语言的转换过程,其修改通过代码模板编辑器实现,打开方法为EA主菜单Settings-Code Generation Template,或使用快捷键Ctrl+Shift+P。代码生成模板以纯文本形式编写,其语法风格兼具标记语言和脚本语言的语法特性。这种语法主要关注三种基本结构:字面文本,宏和变量。(1)字面文本:在代码生成模板中,除了空行将被忽略以外,所有不是宏或变量的定义及引用的文本,都将作为字面文本而直接输出到生成的代码中。如:class %className%开头的“class”及其后的空格就是字面文本。由于百分号%、美元符号$和双引号”在代码生成模板中有特殊的意义,故要在最终代码中生成这三种符号时,可分别使用宏%pc%、%dl%和%qt%代替。(2)宏:宏既可用于访问UML模型中的元素值,又可用于对生成的代码进行结构化处理。所有的宏都由两个百分号%包含其中。CTF中包含模板替代宏,域替代宏,标记值替代宏,控制宏,函数宏和EASL代码生成宏等六种基本的宏。正是这些丰富的宏定义造就了EA强大的代码生成功能。仍以上述例子做说明,“%className%”就是一个域替代宏,在生成的代码中将以当前的类名替代,故若当前类为Foo,则上述语句的输出为“class Foo”。(3)变量:变量的定义和引用为在代码生成模板中存取数据提供了方便。CTF中的变量采用弱类型定义,即变量的数据类型可以被忽略且一个变量可以被赋予不同数据类型的值。变量的值可以来自各种宏,双引号包含的字面文本和其它变量的引用等。变量的定义和引用使用美元符号加一个合法标识符,如:$foo = %className%则变量$foo将存储当前类的名称,需要引用此变量时直接使用$foo即可。代码生成模板可以是上述三种基本结构的任意组合。通过这三种基本语法结构的灵活运用就可以自定义从UML模型到目标代码的转换规则,以适应不同语言及编译器的要求。2 软硬件设计为了方便调试及验证生成代码的有效性,本设计搭建以CAN总线为主干、LIN总线为下层网络的车身网络演示实验台5。2.1 硬件拓扑根据车身电器的功能和位置,设计实验台拓扑及布局如图1所示。其中,粗实线为CAN总线及其节点,细实线为LIN总线及其节点。图1 实验台拓扑布局图图中主干CAN总线上共有8个节点,是下层LIN网络上的主机节点,同时又是CAN/LIN网关。其中的数据采集节点使用USBCAN卡搭建,其余网关节点使用飞思卡尔公司16位单片机MC9S12XS128作为主控芯片。MC9S12XS128同时具有CAN网络控制器(MSCAN模块)和LIN网络控制器(SCI模块),故只需再连接相应的CAN网络收发器TJA1050和LIN网络收发器TJA1020即可完成CAN/LIN网关节点的硬件设计,其功能框图如图2所示。图2 CAN/LIN网关节点功能框图LIN从机节点使用飞思卡尔公司8位单片机MC9S08DZ60作为主控芯片,使用其SCI模块连接LIN网络收发器TJA1020,再连接其它外围执行器组成,其功能框图如图3所示。图3 LIN从机节点功能框图2.2 软件建模考虑到目前大多数单片机所支持的软件编译器均以C语言为主,而在C语言中没有类及继承等相关概念,同时出于可移植性的考虑,软件模型采用分层思想,将整个设计的软件结构分为四层6:第零层为自定义类型及中断服务程序返回值的宏定义,第一层为单片机及其内部功能模块类的抽象,第二层为外围硬件类及网络协议的抽象,第三层为车身网络各个节点类的抽象。上层的类通过调用下层类提供的函数完成特定功能,各层的依赖关系如图4所示。图4 软件模型层次图对于第一层单片机及其内部功能模块类,其函数功能通过对单片机寄存器的读写实现,故使用类的成员函数实现,将寄存器的读写代码直接写在成员函数Behavior属性的Initial框中。如使能S12中的MSCAN模块的代码如下:CANCTL1(MSCANx) |= CANCTL1_CANE_MASK;其中的CANCTL1是为了便于对多个MSCAN模块做统一处理,并方便地选择使用某个特定模块而手动编写的函数宏。在使用时只需将MSCANx赋值为相应的整数值(MC9S12XS128只有一个MSCAN模块,故MSCANx的值只能是0)。对于第二层外围硬件类及网络协议,需要调用第一层类的操作,这可以通过活动图实现。在活动图中,新建一个Action,根据需要选择Call Operation(调用成员函数)或Call Behavior(调用活动图的行为),再指定具体调用哪个成员函数或行为即可。调用的参数通过Action的Arguments属性传递。最后再将各个Action按照程序流程连接起来即可。图5为使用CAN协议(上层协议使用J1939)发送一个数据帧的活动图。图5 使用CAN协议发送数据帧活动图为了能够实现行为图(包括活动图)的代码生成,必须将所有的行为图及其元素都放在某个类中。上述活动图经过转换后生成的代码如下所示:VOID CANDoSend(INT8U priority, INT8U src, INT8U dst, INT8U dataLength, PINT8U pData)INT8U i = 0;CANTxFrame.dataLength = dataLength;(VOID)CANSetPriority(&CANTxFrame, priority);(VOID)CANSetPDUFormat(&CANTxFrame, 0x00);(VOID)CANSetPDUSpecific(&CANTxFrame, dst);(VOID)CANSetSrcAddr(&CANTxFrame, src);(VOID)CANSetStdExt(&CANTxFrame, TRUE);(VOID)CANSetMisc(&CANTxFrame);while (i dataLength)CANTxFrame.datai = pDatai;i+;(VOID)MSCANDoSend(CANTxFrame.ID, CANTxFrame.dataLength, CANTxFrame.data);对于第三层车身网络节点类,除了与第二层相同的调用第一、第二层类的操作之外,还需要对中断服务程序(ISR)进行建模。ISR的建模涉及到两个问题:ISR的返回值和ISR的定位问题。(1)ISR的返回值:CodeWarrior支持两种ISR的声明方式。第一种是使用预编译指令pragma一个TRAP_PROC符号。TRAP_PROC会提示编译器下面的函数是ISR,编译会使用一个特殊的中断返回指令来结束这个函数(一般是RTI指令)。此方法需要同时修改CodeWarrior工程中的PRM文件,将ISR与中断向量表中的向量联系起来,不便于使用UML建模。第二种是使用与C51类似的interrupt关键字,并指定相应的中断向量号,这样就同时完成了ISR的声明和与中断向量表的关联。在EA中修改类的代码生成模板,添加一个衍型(stereotype)并命名为define,并添加相应的模板代码,其核心部分如下:$parent=%list=ClassBase separator=,%$commaPos = %FIND($parent, ,)%if $commaPos != -1%$parent = %LEFT($parent, $commaPos)%endIf%#define %className% %opTag:type% $parent修改完成后,在建模过程中只需将类的衍型设置为define,将类名设置为新定义的符号,类的父类设置为原符号即可。以S12中CAN0模块的接收中断的返回值为例,可将类名设置为ISR_CAN0_RX,将父类设置为interrupt 38 void(此父类并不存在)。最后生成的代码如下:#define ISR_CAN0_RX interrupt 38 void然后将ISR的返回值指定为ISR_CAN0_RX即可。(2)ISR的定位问题:由于中断服务程序的声明和定义都必须被定位于non-banked区域,通过使用“#pragma CODE_SEG NON_BANKED”实现。同时中断服务程序末尾需要添加“#pragma CODE_SEG DEFAULT”,否则后面的函数也会被定位在non-banked区域而导致错误。因此中断服务程序必须被“#pragma CODE_SEG NON_BANKED”和“#pragma CODE_SEG DEFAULT”包围起来。这也可通过修改代码生成模板实现。结合ISR返回值的宏定义,只需判断当函数返回值的前三个字符是“ISR”时,就在函数前后输出上述两条pragma预编译指令即可。生成ISR声明的代码生成模板的核心部分如下:$retLeft3 = %LEFT($ret, 3)%if $retLeft3 = ISR%#pragma CODE_SEG NON_BANKEDn%endIf%(输出ISR声明)%if $retLeft3 = ISR%n#pragma CODE_SEG DEFAULT%endIf%仍以上述CAN0模块的接收中断为例,最终生成的函数声明如下:#pragma CODE_SEG NON_BANKEDISR_CAN0_RX ISR_CAN0_RX_Handler(VOID);#pragma CODE_SEG DEFAULT其中的ISR_CAN0_RX为(1)中定义的宏。对生成ISR定义的代码生成模板做同样处理即可。软件建模及代码生成模板修改完成之后,就可批量生成代码,再使用CodeWarrior编译并下载到各个节点的单片机中进行调试及验证了。3 调试与验证本设计除了使用USBCAN卡作为数据采集节点以外,为了验证两种总线协议的实现是否符合标准,更直观地查看总线帧中各个字段的值以及随时检测总线上是否发生帧错误等,使用PC示波器PicoScope 5203搭配总线协议分析软件WaveBPS捕获两种总线信号并进行协议分析。PicoScope的两个通道,可同时捕获CAN总线及LIN总线上的信号,进一步方便了网关节点的调试。图6为在控制面板节点(源地址为0x26)打开左转向灯时发送给车灯节点(目标地址为0x20)的CAN数据帧,其中标记为S的位是根据位填充规则自动插入的填充位。图6 WaveBPS解析出的CAN帧图7为车灯节点收到上述CAN数据帧后,根据网关路由策略及帧转换规则,发送到LIN总线上的帧的数据场。其中第一个数据字节设置为CAN数据帧中的源地址0x26,其余数据字节为CAN帧的数据场。由于LIN帧的数据场只能是2/4/8字节,故此处LIN数据场有4个字节。各个字节前后的位分别为起始位

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论