上海交通大学 上海 200030
摘要:利用VBA编程实现数组转换,快速生成C#语言所需使用的字符常数组、利用visual 2013开发环境, C#语言,调用USB-CAN的二次开发函数库,实现USB-CAN设备与下位机(嵌入式产品)的通信,利用C#的List<>是泛型集合实现排序及查找。最终实现DTC的读取与解析。
关键词:VBA数组转换、DTC读取与解析、UDS诊断
随着汽车电子的发展,CAN总线技术几乎成了所有主机厂的标配,而CAN总线的开发,需要借助USB-CAN工具及软件的支持,这类工具以德国Vector公司开发的CANoe最为常用,并为大多数主机厂所采用,但是其高昂的价格决定了他并非能成为工程师人手必备的工具。与此同时,市场上也不断涌现了大量的价格低廉的USB-CAN的工具,并且厂家提供给了丰富的二次开发函数库,但软件开发不足,大多都只能实现简单的通信功能,并不具备CANoe强大的数据分析及处理功能。
另外在项目开发阶段,由于排查问题的需求,工程师需要经常用到DTC(故障)的诊断以快速判断问题来源。
下面将分步骤介绍其实现方法(正文)
1 使用VBA将Excel格式的诊断调查表,转换为C语言格式的一维数组
诊断调查表的内容,一般会以excel表格格式编写。如下图表1,由诊断调查表生成用于查询的字符型数组;可以应用excel的开发工具Visual Basic,编写一个宏,快速生成C#编程语言使用的一维字符型数组; 方法如下:
数组转换示例:
DtcData[i / 4] = DtcBuffer + Datatempory[i + 1].ToString("X2") + Datatempory[i + 2].ToString("X2");
故障码状态转换示例:
if (Datatempory[i + 3] == 0x09)
DtcState[i / 4] = "CurrentandOldDTC";
else if (Datatempory[i + 3] == 0x01)
DtcState[i / 4] = "CurrentDTC";
else if (Datatempory[i + 3] == 0x08)
DtcState[i / 4] = "OldDTC";
else
DtcState[i / 4] = "Error";
4、解析与显示
readonly string[] DtcNum //定义常数数组,拷贝步骤1中生成的数组
{
故障码1,
故障码2,
故障码3,
…
故障码n
}
readonly string[] DtcExplain =
{
故障描述1,
故障描述2,
故障描述3,
…
故障描述n
}
List<string> DTCList = DtcNum.ToList(); //使用list方法,排序
Try
{ //查找并显示对应故障码序号的故障码数组值及状态值
DtcIndex = (byte)DTCList.IndexOf(DtcData[i]); //获取故障码对应位置序号
listBox1.Items.Add(DtcExplain[DtcIndex] + "" + DtcState[i]); //将结果显示在列表框中
listBox1.SelectedIndex = listBox1.Items.Count - 1;
}
Catch //如果接收到未定义的故障代码,提示用户未查到对应的故障码
{
listBox1.Items.Add("未查到" + DtcData[i] + "对应的DTC");
listBox1.SelectedIndex = listBox1.Items.Count - 1;
}
5、界面设计
界面由两个button和一个Listbox控件组成,点击“读DTC”button时,触发发送报文的事件,“清屏”button,用于清理屏幕显示结果。Listbox用于显示解析后的故障描述。这个可由编程者自由灵活设计。
参考文献
[1]创芯科技. 接口函数库(二次开发库)使用说明书 V2.02. 2017
论文作者:徐亮
论文发表刊物:《基层建设》2018年第7期
论文发表时间:2018/5/22
标签:故障论文; 数组论文; 调查表论文; 工具论文; 字符论文; 语言论文; 快速论文; 《基层建设》2018年第7期论文;