现代汽车的功能日新月异,而每增加一项功能都要增加相应的电气连接,使得分布车体各处的电缆趋于庞大和昂贵,且导致设计、安装、调试和维护的困难。传统的电气控制系统设计已不能满足汽车对安全性、性能和便利性的要求这种技术进展,现场总线技术的应用就是这种进展导致的必然结果。
1、汽车总线的优点
汽车总线主要具有以下优点:
u 网络总线式结构,只需一根通讯电缆连接,由软件逻辑控制替代传统的直接线束控制 。
u 线路简化,减少线束连接复杂性。
u 无需专用配电盒,部件数量减少,可靠性能增加,总线节点控制器(ECU)可靠性很高(是目前汽车电器可靠性的几十倍)。
u 可实现实时诊断、测试和报警功能。
u 系统可任意扩展。
u 更高的可靠性、更好的服务赢得市场,汽车总线的人性化设计功能更加贴近汽车制造商与客户 。
u 搭建通用信息平台,为客户提供方便,为企业创造价值。
u 汽车总线提供更完善的车况信息,用户自我服务变为可能,降低了制造厂与服务成本:(1)集中显示;(2)历史查询;(3)诊断与测试;(4)语音提示 。
u 准黑匣子功能。
2、拓扑结构
[img]20059216491984456.jpg[/img]
在某品牌商务车上,我们使用了六个通讯节点代替了繁杂的线束,其拓扑结构和各个节点完成的主要功能见图1。
3、软件架构
按照功能,我们将软件分成三层次,即驱动层、转换层和规则处理层。其中,转换层包括输入驱动和输出驱动模块,转换层包括输入转换和输出转换模块。为了实现各层各模块之间的通讯,我们定义了三类消息:驱动层和转换层的消息称之为状态消息,转换层的输入转换和输出转换间的消息称为接口消息,转换层和规则处理层的消息称之为器件消息。
[img]20059216494868313.jpg[/img]
输入驱动子模块负责将输入引脚的电平变化转变为输入状态消息发送给转换层,输出驱动模块将从转换层接受的输出状态消息转变为实际引脚的电平变化;输入转换模块将从驱动层接收的输入状态消息转换为输入器件消息发送给规则层作进一步的转换,或者转换为接口消息送交输出转换模块进行转换输出;输出转换模块将从规则层接收的输出器件状态消息或者直接由输入转换模块来的接口消息转换为输出状态消息发送给驱动层;规则处理模块把从输入转换模块接收的输入器件消息映射为输出器件消息发送给输出转换模块。规则层和转换层的主要区别在于当涉及多个节点进行逻辑关系运算时,使用规则层进行转换,而只在同一个节点进行逻辑关系运算时使用转换层进行转换。另外,为了处理复杂的逻辑关系,我们也允许规则处理模块自己给自己发送消息,这时的消息也成为输入器件消息,同样输出转换模块也可以自己给自己发消息,这时的消息也为接口消息。
在整个系统中,运行规则处理层的节点只有一个,该节点称为主ECU,其他节点称为子ECU,主ECU的转换层和规则处理层可以直接通讯,而子ECU的转换层和主ECU规则处理层间的通讯通过通讯管理模块来实现。子ECU之间不直接进行消息的交换,必须通过主ECU联络。在实际的使用中,我们使用的是CAN总线,使用的芯片是自带CAN收发器的atmel CC03。
为了使转换层和规则处理层的处理方法一致,同时为了让系统在增加新的功能时,不对软件作任何修改,我们摒弃了在程序中直接用If-Then-Else对每一种情况进行逻辑判断的传统方法,代之以类似于专家系统的规则匹配进行逻辑判断。该方法的基本思想是:将各组逻辑关系按一定的组织关系存储在数组中,每组逻辑关系我们称之为一组规则,规则的每个条件和结论都称之为因子,当有消息到来时,在数组中查找该消息的所属的规则,如果找到,则判断该组规则的条件是否都满足,是,则得到Then的结果,如果有必要,在条件不满足时得到Else的结果。该算法的关键是对各种逻辑关系的组织,目前我们采取的方法是将条件和结论都表示成二元组(S,ID),这里的ID表示引脚或器件的逻辑编号,S的最高两位用来区分条件和结论,接下来的一位表示消息的类型,S的其他位表示状态等信息。当S的最高位为10时表示条件,而00为Then的结论, 01为else结论,当有的消息需要延时一段时间发送时,使用11作为延时标志,这时S的其他位和ID一起表示延时的时间。类型字段只需一位来表示,并且只在结论因子中有效,对于输入转换模块,通过1、0来区分是发送给规则处理模块还是直接发给输出转换模块,输出转换模块用1、0来区分是发给输出驱动模块还是发给自己,而规则处理模块用它来区分是发给转换模块还是发给自己。
对于逻辑[<喇叭按钮:按下]==[>喇叭:鸣][Else]==[>喇叭:关],输入转换数组中将表示成:
(10000000 00000101)(00100000 10000110)(01100001 10000110)
这里喇叭按钮的编号为5,状态值为0表示按下,喇叭的编号为134,由于喇叭的按钮和喇叭不在一个节点上,产生的是输入器件消息(类型为1)。当喇叭按钮有按下的时候,输入驱动模块将其打包成消息(0x80,0x05)发送给输入转换层,输入转换模块通过在转换数组中查找到ID为5的规则,通过判断该组规则,得到(0x20,0x85)的器件消息,然后经过通讯模块,将其发送给规则处理模块,规则处理模块将处理后的消息,发给相关的子节点,经输出转换后由输出驱动模块执行。
4、软件实现
[img]20059216501926137.jpg[/img]
上述的软件构架的实现,我们可以采用不同的方案,下面给出基于实时操作系统的一般实现,并假定汽车总线是CAN的情况。与各个模块相对应,对于子ECU,我们定义了五个任务和两个中断服务,分别是输入转换任务(TskInTrans)、输出转换任务(TskOutTrans)、延时处理任务(TskDly)、输出驱动任务(TskOutput)和发送任务(TskCANSend),中断服务包括输入中断服务(ISPIn)和CAN接受中断服务(ISPCAN),而对于主ECU,还需一个规则处理任务(TskRule)。为了实现任务间以及中断和任务间的通讯,定义了四个邮箱和一个延时数组,分别是输入转换邮箱(MailInTrans)、输出转换邮箱(MailOutTrans)、输出邮箱(MailOutput)、发送邮箱(MailCANSend)及延时数组ArrDly,对于主ECU还需增设规则处理邮箱(MailRule),这里的消息被定义成一个二元组(Val,ID),ID编号,Val为状态值,而延时数组的每个元素还包括一个延时字段是个三元组。主ECU的各个任务以及和中断服务间的通讯关系如图3。
图中的延时数组用虚框表示,它类似于消息邮箱,与邮箱中的消息相比,还包括一个延时的时间字段,另外在往延时数组中放入消息时,它不会产生任务调度。延时数组中的延时消息来自于输出转换任务和规则处理任务,延时任务定时执行,它每隔一个时间单位,例如20ms,查询一下延时数组,并将非空的元素的时间节拍减一,如果时间节拍为0,则根据Type字段,将其放入规则邮箱或输出转换邮箱。
对于总线中断服务程序,主ECU和子ECU的处理方式稍微有的不同,对于主ECU,它将总线上来的消息送到规则处理邮箱 而子ECU则将其放入输出转换邮箱;而对于发送的任务,主ECU的消息来自于规则处理任务,子ECU的发送消息来自于输入转换任务。
采用邮箱进行消息传递的并利用查表方法进行逻辑判断,转换任务和规则处理任务流程很类似,限于篇幅,这里仅给出输入转换任务的流程图和示意性代码,另外,对于CAN及输入输出的驱动程序,与具体的硬件有关,这里也不在赘述。
输入转换任务的示意性代码如下(基于Keil C编写):
void TskInTrans () reentrant
{ StrYz Msg; 定义一个消息变量
for( ; ; )
{ Msg =(StrYz *)MsgPend(MailInTrans);//等待输入转换邮箱的消息
While Not EndofInTrans 转换表没查完
{ SeekRule(Msg->ID);从当前规则开始,以消息的编号寻找所属规则
if (IsAllOkJK(CurrentRule))// 如果都满足,则根据消息的类型,将所有的
PostMsg(); Then因子发往规则邮箱或输出转换邮箱
else 否则,移到Else部分后,再将Else因子发往相应的邮箱。
{ MoveToElse();
PostMsg();
}
MoveToNextRule(); 移到下组规则
}
}
}
4、结束语
汽车总线控制是汽车产业的发展方向,要想进行总线控制,必须从软件和硬件两个方面着手,而使用嵌入式操作系统对软硬件进行管理,不论是实时性还是从可靠性来讲,都具有无可比拟的优势,目前,我们正在研究基于实时操作系统的汽车总线控制系统,并已在实验室中在某种商务车上得以实现,相信不久的将来,该套系统将会得到广泛应用。