admin 管理员组

文章数量: 1184232


2024年4月20日发(作者:帝国cms问答模板)

汽车诊断中脚本自动生成工具的研究

【摘 要】通过分析汽车故障诊断软件的脚本开发流程,探寻脚

本开发过程中可自动化开发处理流程。根据归纳的可自动化开发流

程,设计相应的脚本自动生成工具,提高开发人员的工作效率及工

作质量。

【关键词】自动化;xml解析;语义分析

1 汽车故障诊断简介

1.1 汽车故障诊断技术发展简介

汽车诊断技术发展至今,大致经历了以下三个阶段:

第一阶段为20世纪70年代至20世纪80年代初。此阶段中,

汽车的维修方式主要通过维修人员通过摸、看、听等传统方式及个

人经验,通过纯手工工具进行故障判断与排除。纯手工的诊断方法

不但要求维修工程师具有一定的经验,而且最终诊断的准确性也得

不到保障。

第二阶段为20世纪80年代初至20世纪80年代末,此阶段开

始使用故障诊断仪器进行检测。此阶段中,通过使用故障诊断仪器

对故障信息进行采集,虽有效提高了诊断效率与准确性,但依然不

能对汽车故障给出最终判断。最终的诊断结果依旧需经验丰富的汽

车维修工程师给出。

第三阶段为20世纪80年代末至今,此阶段开始大量使用专业

的综合性故障诊断仪器进行汽车故障检测。专业的综合性故障诊断

仪器有着自动化、智能化等特点,它可完成从故障信息采集、故障

判断与定位、读取/清除故障码等一系列功能,减少了故障诊断对

个人经验的依赖性,提高了诊断的正确性及维修工程师的工作效

率。

1.2 汽车诊断软件简介

现行的汽车诊断软件由诊断系统基本平台与业务数据库构成两

者构成。诊断系统平台提供车型选择,数据通信,结果显示等与诊

断业务无关的基本功能;而诊断仪相关的业务则有由数据来驱动。

其中,汽车常规诊断业务数据因具有一定的通用性,故此类业务可

统一成系列数据表格模板;针对诊断业务中的特殊功能则通过特别

定制的脚本实现。

2 方案设计

内嵌于诊断软件的脚本因其主要实现诊断业务中的特殊功能,

所以其业务逻辑相对复杂。根据实际现行经验,完整生成一个最终

可执行脚本大致有以下几个步骤:

根据诊断业务逻辑,画出与其相对应的流程图:

1)依据流程图,手动编写脚本;

2)手动提取诊断业务相关的逻辑数据,生成数据文件;

3)手动编辑脚本测试文件;

4)编译及修改脚本,生成最终可执行脚本文件;

5)测试并修改脚本,生成最终提交脚本文件。

从上述的脚本开发流程中可以得出脚本开发中存在的以下几个

问题:

1)脚本开发过程中,由于大部分工作都需手工完成,可能会存

在一定的人为错误;

2)当需开发脚本的数量很庞大时,开发人员的效率不能保证。

综上,若通过第三方工具替代原开发流程中部分的步骤,不但

可大大减少脚本的开发时间,而且能有效提高最终的业务数据质

量。

2.1 方案概述

考虑到整个脚本开发中,除去最终实测外,只有诊断业务理解

也即流程图的绘制是一定需要人工参与的,而其余部分皆可由自动

化工具替代。因此将流程图作为切入点,软件通过对流程图的解析,

自动生成脚本文件开发所需文件,软件系统框图如图1所示。首先,

本工具会将脚本开发人员需按事先定义好的的流程图规范绘制流

程图通过转化器,生成相应的脚本xml文件,源流程图中的每个图

形被对应转换成xml中的node,每个node都有其唯一对应的id。

随后,转化生成后的脚本xml文件与事先定义的脚本语言规范配置

xml文件一同被系统解析器解析,生成可执行的脚本文件、脚本验

证时的测试文件及诊断业务数据文件。本软件按功能模块可以分成

流程图转换与系统解析两大部分,下面将会进行详细阐述。

图1

2.2 详细论述

2.2.1 流程图转换

由流程图转换后的xml文件(),将作为系统解析器

的输入文件。处理了原始流程图中的分页跳转、页内跳

转和子流程。文件有以下三大节点类型:process(过程

处理), screen(终端显示), session(数据收发)。process节

点对应流程图中terminator(起/止符)、condition(条件判断)

以及deal(运算处理)图形;screen节点对应流程图中的screen

图形; session节点则对应流程图中的send command图形。由于

文件涵盖了生成最终文件所需所有信息,所以指定了流

程图规范来描述信息,同时便于解析工具解析。

运算处理节点(deal):

运算处理项中所涵盖的内容包括单一的赋值运算及复杂的逻辑

运算等情况;其次,各表达式中使用的变量类型及其作用域又是各

不相同的。综上所述,结合脚本使用情况,规定了下列规范:

变量命名中需表明变量类型,基本格式为:数据类型_描述。数

据类型可参照c语言,若数据类型为数组形式时,需在数据类型字

段中加上“array”及在描述字段后加上“[]”符号。例:

int_speed=90,byte_angle=0x30,bytearray_version[]=0x20,

0x21,0x30

流程图中单个节点中,可有多行表达式。且每一行表达式中可

嵌套多个运算表达式。

数据收发节点(数据的一次收发可看成为一个会话,故简称

session):

数据收发部分由发送与接收两个部分组成,分别通过关键字

“cmd”与“rcv”区分表示。

鉴于接收与发送的数据长度为可变的,故在关键字后需追加

“[]”。

发送的数据包可以是直接字符型的,例:cmd[]=0x14,0xff,

0xff;也可是由变量与直接字符混合组成的,例:cmd[0]=0x14,

cmd[1-2] =int_ecode。符号“[]”不填写内容时,表示需发送数

据即为赋值的内容;符号“[]”填写数字时,表示需发送的数据列

中的内容将被等号右边的内容替换,符号“[]”所填内容为被替换

的数据起止地址。

接收数据的表达式中需填写有用的数据包最大长度,例:

rcv[16]。

2.2.2 系统解析

系统解析器首先会对转换后的xml文件与脚本规范xml文件中

定义类目进行匹配,检测。检测无误后,方可进入内容解析。xml

内容解析由标签管理,变量管理,表达式解析及命令拼接这四部分

构成。解析的过程有两步:

第一步:初析。本阶段只完成各节点内容到脚本语言的语义翻

译,保留xml文件中各节点相关原始信息,如变量名,节点间跳转

id,数据信息等。

第二步:精析。此阶段通过查询各数据表,取得最终输出值并

替换原xml相关信息,删除初析阶段构建的冗余信息,生成最终脚

本文件。

标签管理:标签管理分为临时标签与最终标签。临时标签是解

析xml文件时创建的,每一个node都会有其对应的标签;最终标

签是指输出至最终脚本文件。解析器对xml的解析是以node为单

位进行的,在对node解析过程中无法判别此node节点是否被其它

node 节点所调用,所以需要通过创建临时标签作为标注。由于xml

文件中所有输入解析器的node节点都会创建临时标签,其中必有

无用标签。因此,需对标签表进行遍历,删除冗余标签。

变量管理:xml文件中定义的变量对应到最终可执行脚本中时,

变量名由某个存储空间表述。考虑到实际可使用的存储空间有限,

因此需对各变量进行管理。根据变量的使用,指定以下规则:

(1)只作用于执行单次的流程且不隶属于循环分支的节点中定

义变量视为局部变量;其余节点中定义的变量则视为全局变量。

(2)储存回包状态的变量与循环计数器在未特别指明时为全局

变量,并为其指定默认存储空间。

xml文件中的所有变量都通过一个变量表管理,其中该表的key

id为变量名。在xml文件的初析阶段,根据规则1,首先筛选出全

局变量与局部变量;其次,为全局变量分配存储空间并更新变量表

中的对应信息。精析阶段,根据当前剩余存储空间并结合规则2,

为局部变量动态分配存储空间。考虑到每个脚本都皆为单进程、顺

序执行,故对局部变量的存储空间进行复用,即每个存储空间可与

多个局部变量对应。当某局部变量的生命周期到达后,需对之前动

态分配的存储空间进行释放,同时更新动态变量分配状态表。

表达式解析:表达的解析通过堆栈解析。解析时首先将取得的

表达式(中缀表达式)翻译成后缀表达式,翻译流程如下:

中缀表达式翻译成后缀表达式的方法:

stp1: 从左向右依次从输入字串中取得字符ch

stp2: 若ch是操作数,直接输出

stp3: 若ch是运算符(含左右括号),则:

a:若ch = ‘(’,将ch放入栈

b:若ch = ‘)’,依次输出栈中的运算符,直到遇到’(’

为止

c:若ch既不为’)’也不为’(’,那么就和堆栈中顶点位

置的运算符top做优先级比较

1:若ch优先级比top高,则将ch压入栈

2:若ch优先级低于或者等于top,则输出top,然后将ch压

入栈

stp4: 若表达式已读取完,而栈中仍有运算符时,则将栈中运

算符依次由顶端输出

其次,根据翻译后的后缀表达式求解最终结果,其求解流程如

下:

后缀表达式计算方法:

stp1:从左向右扫描后缀表达式数组,依次取出一个数组元素

ch;

stp2:若ch是表达式,就压入栈;

stp3: 若ch是运算符,就从栈中弹出此运算符需要用到的表

达式的个数(二元运算符需要2个),创建一个新二元表达式,然

后把二元表达式压入栈。

stp4:若数组处理完毕,栈中最后剩余的表达式就是最终结果。

2.3 测试文件构建

通过机器实现测试文件的自动构建,可以减少开发人员的工作

量,提高工作效率。当然,若是通过机器生成的测试文件不够准确、

全面,则开发人员仍需手动检查、修改测试文件,从而使工作效率

更低。

此处的脚本测试,是指通过软件模拟实车与汽车诊断仪的通信

数据包,验证脚本逻辑流程的正确性。测试过程中,用户需先指定

需加载的测试文件;测试文件加载完成后,模拟软件根据测试文件

中所罗列的指令数据项,模拟实车与诊断仪通信时的指令数据。测

试文件中需涵盖的指令集中,既会有reset这种前后动作逻辑无关

指令,又会有读取特定故障码后再清除读出的故障码此类前后动作

逻辑相关指令;同时通过直接解析xml文件,可完整提取各出各指

令间的逻辑关系。因此,在解析xml文件的同时,需收集数据收发

指令的信息。鉴于,每一组数据指令都由一条请求指令与一条响应

指令构成,故将命令收发节点作为两个指令组的分割标志。

前后动作逻辑无关指令收发数据包内容是固定的。对应到xml

文件的数据收发节点中,即为只有“cmd[]=0xxx,0xyy……”这一

行命令赋值表达式。由于此类指令的收发包内容与格式都可在协议

中找到明确的定义,因而,根据数据收发节点中的命令这一个条件

即可构建此类指令的测试内容。

前后动作逻辑相关指令中的部分内容由用户定义的,即指令是

部分可变的。对应到xml文件的数据收发节点中,即存在多行

“cmd[]=”此种命令赋值表达式。对于此类指令中的不变部分的获

取方法,可借鉴前后动作逻辑无关指令。指令中的可变部分,可能

是由前驱节点计算获取,也可能需与后继节点中的判断条件匹配。

所以对此类指令,需解析完从本命令节点至下一命令节点间的所有

节点后,才可构建测试文件。考虑到指令中的可变部分与前驱节点

的关联可由一组混有变量名的数学运算式表述;且本程序在对xml

解析的过程中,会对所有变量创建对应的信息表,包括该变量的类

型,缺省值,字节序,取值范围,被赋值情况等。因此,结合变量

信息表对数学运算式进行语法分析,即可提取出有效数据,并构建

请求指令。同样的,对于响应指令包内容需与后继节点判断条件匹

配的情况,结合后继判断节点中的判断条件及变量信息表,即可构

建响应指令包。

3 结论

本工具现已投入到脚本开发的工作中,根据开发人员的实际使

用后的反馈情况,在开发脚本的过程中,通过使用本工具后,现脚

本开发所需时间大约为原来脚本开发时间的70%。同时,由于目前

所开发的工具支持的脚本语言有限,给使用带来一定的局限性。日

后的工作将侧重兼容更多的脚本语言,扩展本工具适用范围,提高

工具的实用性。

【参考文献】

[1]何云东,黄昶.复杂表达式解析和计算的研究实现[j].中国

科技信息,2009(8):35-36.

[2]彭四伟,朱群雄.基干源代码分析的逆向建模[j].计算机应

用研究,2006.

[3]冯进,丁博,史殿习,等.xml解析技术研究[j].计算机工程

与科学,2009,31(2):120-124.

[4]徐爱春,章坚民.基于 xml/xslt 代码自动生成技术研究[j].

杭州电子工业学院学报,2004,24(4):64-68.

[5]王茹,宋瀚涛.xml文档结构定义规范:xml schema[j].计算

机应用研究,2002,19(1):127-129.

[责任编辑:周娜]


本文标签: 文件 脚本 节点 变量 指令