现在汽车仪表大部分的总计里程和小计里程都是显示在屏幕上的,这包括段码屏、点阵屏、TFT彩屏等,虽然显示形式不一样,但是从业务需求和软件应用层的实现策略来讲,原理应该都是通用的。本文不涉及具体车型,仅对一般的业务逻辑作介绍,一是为了自己总结记录,二是期望吸引同行或爱好者交流。
1.总计里程
ODO(Total Odometer )即总计里程,顾名思义,主要作用是记录汽车总的行驶里程,一般来讲,在用户使用过程中是无法对其修改或清零的,因为它是对二手汽车价值评估的一项重要数值,当然随意篡改这一数据也是违法的。
在行车过程中,仪表上的总计里程会按每1km或1mile的频率更新数据显示,一般最大显示数字是999,999,单位可以是Km或者Miles。当达到最大值的时候,不会rollover,应该保持在最大值,当然估计还没达到最大值车子就应该报废了,所以只有在开发测试过程中才能有机会看到这一状态。 如果数据失效,一般显示策略是用“---”代表。如果支持不同单位显示,可以通过按键去选择菜单配置项来设置单位,一旦设定,数据会根据单位进行切换,转换后超过最大值的部分会被丢弃。
从内部实现角度,一般是数据源头是EMS过来的CAN信号,比如每1m发一次,仪表每收到1000个CAN信号(1000m)就去更新计算一次ODO,当然也有的策略是每10m仪表更新计算一次,这个具体要看不同的OEM要求了,但是最终显示都是按每1km或1mile更新的。为了在掉电之后ODO数据不会丢失,上电之后能够继续之前的数据累加,ODO数据会存储在非易失性存储器中,比如EERPOM或者内部Flash。在每次上电仪表都会读出之前存储的数据,并作有效性校验,然后每增加1km或者1mile就会往存储器中更新这个值,在掉电之前,最终值也会存进去。
鉴于这个值的重要性,仪表并不是简单的存取它,而是有一定的备份和校验策略。比如,可能仪表会为它分配三块同样的存储区域,每次存储都会将同样的值写到三个地方,而当每次读出来的时候,也是三个地方的值都读出来,比较其中的任意两个值,如果三个中至少有两个相同,那么这个值就是有效的,如果三个值两两互不相同,那么这个值就是无效的,仪表会用一个默认值来替换它,同时有的仪表可能会为此记录一个DTC,直到该值有效才擦除此DTC。这样一来,既保障了数据的有效性,同时也有效阻止随意篡改总计里程。其实,一般仪表出厂之后是允许清零的,可以通过先断电,长按某个按键,再上电,但是这是有限制条件的,比如最多可以4次清零,累积清除里程不得超过512km。
2.小计里程
小计里程(Trip Odometer),用作记录从上次小计里程清零开始到现在所行使的里程,它并不像ODO那么重要,对它清零也不违法,而是用户的一项权利。显示最大值是999.9,单位也是Km或者Mile,精度是0.1,计数超过最大值后,一般策略是rollover,即重新回零计数。如果切换单位,可能会清零重新按新单位显示,也可能直接显示切换后的新数值,这就要看车辆配置和显示策略了。在仪表断电之后,该值会清零重新计数,但是不断电仅熄火的话,这个值不会丢失,因此它也是要存储在非易失性存储器中的。用户一般可以通过长按仪表或者方向盘上的键来把小计里程清零。
从内部实现来讲,原理还是比较简单的,也是通过EMS的那个CAN信号,和ODO同步累加,只不过要每0.1km或者0.1mile更新显示。它不需要备份和校验策略。
3.诊断相关
这里不得不提一下诊断,对于外部来说,能修改总计里程的方法一般也就是通过OBD用诊断命令来做到。但是一般也只是允许改大,不允许改小,除非破解软件。同时还要知道加密算法才能成功执行诊断指令,不同的OEM的加密算法肯定是不同的,除非内部相关人员拿到一手资料,否则只有靠破解,难度就取决于加密的复杂度了。OBD是汽车ECU留给外界的唯一后门,因此现在越来越火的车联网都寻求以它为突破口,获取车辆行驶数据。以后会专门写写关于OBD的文章。