汽车仪表是如何计算总计里程和小计里程的?

现在汽车仪表大部分的总计里程和小计里程都是显示在屏幕上的,这包括段码屏、点阵屏、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的文章。

时间: 2024-09-29 22:11:25

汽车仪表是如何计算总计里程和小计里程的?的相关文章

sqlservere小计合计总计

SELECT CASE WHEN GROUPING(F1) = 1 THEN '总计' WHEN GROUPING(F1) = 0 AND GROUPING(F2) = 1 THEN F1+'合计' WHEN GROUPING(F1) = 0 AND GROUPING(F2) = 0 AND GROUPING(F3) = 1 THEN F1+'的'+F2+'小计' ELSE F1 END AS F1 , CASE WHEN GROUPING(F3) = 1 THEN '' ELSE F2 END

给RDLC报表添加小计和总计

利用RDLC报表的添加总计功能,可以很方便的给报表添加小计和总计功能.? 操作步骤如下: 1.设定报表的分组字段,如下图:? 2.点击行组下面“详细信息”右边的三角箭头,在下拉菜单中选择添加总计-晚于(在下面)或早于(在上面),就可增加小计行. 3.点击行组下面“Group1”右边的三角箭头,在下拉菜单中选择添加总计-晚于(在下面)或早于(在上面),就可增加总计行. 4.添加小计和总计后的报表模板如下图所示:? 5.报表实际运行效果如下图所示:?

Smartforms 总计小计

第一步:在表格接口中定义总计参数(P_TOTAL_S)和总行数(P_TOTAL_L)参数,如下图: 第二步:在全局定义(全局数据的tab页中)中定义:当前页(Z_CURRPAGE),小计(Z_SUBTOTAL_S),小计(Z_SUBTOTAL_S_L),总数(Z_COUNT),总数(Z_COUNT_L),如下图示: 第三步:在全局定义(货币/数量字段tab页中)中定义数量.金额字段,如下图所示: 第三步:在LOOP循环的计算tab页中定义计算规则,如下图所示: 第四步:添加程序行并添加如下代码:

Oracle分组小计、总计示例(grouping sets的使用)

1.首先创建一个表 Sql代码 [sql] view plain copy create table TE ( ID        VARCHAR2(2), T_CODE    VARCHAR2(4), T_NAME    VARCHAR2(4), T_AMOUNT  INTEGER, T_DEPT    VARCHAR2(4), T_PROJECT VARCHAR2(4), T_TYPE    VARCHAR2(1) ) 2.录入数据如下: Sql代码 [sql] view plain cop

Sql使用WITH ROLLUP 进行分类汇总及小计功能

效果如下: 测试代码如下: CREATE TABLE #test    (      Name VARCHAR(10) ,      [procedure] CHAR(1) ,      model VARCHAR(5) ,      quantity INT    ); INSERT  INTO #test        SELECT  'A' ,                '1' ,                'φ50' ,                500        UNI

oracle group by rollup decode grouping nvl等判断或者小计合计心得

在做oracle 047第12题时,遇到group by 语句,由此遇到group by  rollup,decode,grouping,nvl,nvl2,nullif,RATIO_TO_REPORT等. 1. decode  与if...then,case...when...这类流数据语句功能差不多 decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下: IF 条件=值1 THEN RETURN(值1) ELSIF 条件=值2 THEN RETU

Sql分组合计小计查询

效果如下: 用的表和字段: -table 实收水费:hx_t_received --字段收费部门id:hx_fdepartmentid  1.收费部门名称:hx_fdepartmentname 应收水费信息ID:hx_freceivableid --收费类别:hx_ftype (水费(1):再分[开户(table) 供水类别:自来水(100000001)==水费,中水(100000002)==中水费],代理费(2)==污水处理费) --实收金额:hx_freceivedamount  创建时间:

查询报表增加小计功能

SELECT ISNULL(T1.KHMC, '总计')客户名称, ISNULL(T1.DJMC, '小计')单据名称, CAST(SUM(T1.SL) AS INT)数量 FROM ( SELECT vl.DM1, k.KHMC, vl.DJMC, vl.SL FROM VW_LSXHDMX AS vl INNER JOIN KEHU AS k ON k.CKDM = vl.DM1 ) T1 GROUP BY T1.KHMC , T1.DJMC WITH ROLLUP

排序(sort)、小计(subtotal)

排序在ALV中也是一个比较重要的功能,在有合计(参照-->SALV教程11-Aggregations应用-合计(total).小计(subtotal).平均值(average))的场合下,排序能实现排序字段的小计(subtotal). 具体实现方法: 1,通过get_sorts方法得到类CL_SALV_SORTS的引用, 2,通过add_sort方法添加排序的字段,如果还要小计,输入参数subtotal就要传入’X' 完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1