基于CAPL的诊断控制
项目背景
需要将某语音控制功能模块集成到已上市的不带语音控制功能的车辆上,并实现语音控制天窗,车窗等的动作,用于展示集成的效果。
集成方案
利用CANoe设备作为节点,连接语音控制模块和车辆,语音控制模块和车辆相互独立运行,该节点可以: 1. 接受语音控制模块的命令,然后以诊断服务控制车辆执行器的动作;2. 获取车辆总线上报文,转发必要的信息给语音控制模块。
最终实现的可通过语音控制的功能有: 天窗的开闭,车窗的开闭,电动尾门的开闭等。
技术实施
1. 诊断命令的执行由环境变量来触发,环境变量由语音控制模块发出的命令控制;
2. 执行诊断命令控制时,通常有多个步骤,比如切换诊断模式,写入fingerprint,Security access等,但是由于CAPL程序也是基于事件触发的,所以在定义类似流程上比较麻烦,本项目中采用了比较简单的方法,通过timer设计delay来实现各步骤的连接,不足之处在于某些控制流程需要四,五个步骤,一个流程就需要多个timer来实现,导致程序变量和跳转较多,可读性较差,只能通过合理明确的命名变量来梳理;在程序的设计上,由于不同流程存在使用同一个步骤的情况,所以提供了潜在的步骤复用的可能性,但是设计复用的程序可能会带来更多的问题,所以该程序中较少复用特定的步骤。
程序结构
on envVar EnvSAD_Close
tstCase_SAD = 1;
if(getValue(this) == 1)
DiagRequest BV_xxx.DiagnServi_DiagnSessiContrExtenSessi req;
DiagSendRequest(req);
settimer(MS_Timer_Wait_After_Diagsession_Open_SAD_Close_Step1_Sunroof_Close,Delay_Time_After_Diagsession_Open_SAD);
on timer MS_Timer_Wait_After_Diagsession_Open_SAD_Close_Step1_Sunroof_Close
DiagRequest BV_xxx.Sliding_sunroof_Short_Term_Adjustment req;
diagSendRequest(req);
setTimer(Timer_Wait_After_SAD_Sunroof_Close_SAD_Close_Step2_Sunroof_Stop,10);