目录

什么是诊断

CAPL诊断发送

CAPL接收

完整示例


什么是诊断

诊断,就是通过问和听的方式,也即发送和接收信号的方式,发送一条指定ID的CAN报文,ECU接收到后回应另一条指定ID的报文来确认当前ECU的相关信息,诊断的本质也是CAN上面的一条报文。在汽车测试中,诊断是非常重要的功能。与ECU相关的信息大部份是通过诊断的方式获取的,比如说,当前ECU软件版本号,ECU工作状态等等。在CAPL中,操作ECU的方式,就是发送一条CAN报文,再接收指定的报文实现诊断功能。CANoe软件中有诊断功能,但是当需要批量测试诊断功能就需要CAPL语言来做了。同时也可通过诊断功能实现自动化测试,如清除ECU中的配置信息,更改VIN码之类的功能。

CAPL诊断发送

CAPL中实现发送诊断请求的功能一般情况以下有两种方式:

  • 通过发送message的方式实现
  • 通过调cdd文件中已定义好的诊断功能实现发送诊断

这里主要以第二种方法为示例讲解。示例代码如下:

/*@!Encoding:936*/
includes
{
}variables
{// GAC.ReadVIN 表示名为GAC的cdd文件中名为ReadVIN的诊断方法diagRequest GAC.ReadVIN ReadVin; //发送的did结构体
}//发送did
on key 'd'
{diagSendRequest(ReadVin); //发送诊断请求write("已发送诊断请求....");
}

由上面的示例可以知道,发送诊断请求,只需定义diagRequest对象和调用diagSendRequest()函数即可以。上面的示例代码是通过键盘事件触发的,实际使用时,也可以通过其他的事件触发。需要强调说明的是所有定义的diagRequest对象都需要在cdd文件中提前定义好。

CAPL接收

CAPL中,诊断接收可以通过on diagResponse *事件进行接收,也可以通过具体诊断报文进行接收,如 on diagResponse GAC.ReadVIN,其中 GAC.ReadVIN就是cdd库文件定文的诊断方法。这两种方式本质上是同一种,只不过一种是无差别接收,另一种是精准接收。代码示例如下:

on diagResponse *
{byte data[20]; //响应数据接收数组int size;  //响应数据长度变量diagResponse * resp; // 声明无具体解释的回应(即操作句柄)size=this.GetPrimitiveSize(); // 获取响应数据的长度this.GetPrimitiveData(data,elcount(data)); // 将实际响应复制到数组中//通过遍历的方式打印数据for(k=0;k<size;k++){  write("data[%d] = %x",k,data[k]);}
}

上面就是最简单的诊断接收示例,需要注意的是,接收到的数据类型为byte[],需要将其转换为对应的类型才能进行下一步操作。

完整示例

实现功能:通过CAPL发送一个诊断,读取ECU中的vin码,再将响应的vin码写入到txt文件中。

/*@!Encoding:936*/
includes
{}variables
{diagRequest GAC.ReadVIN ReadVin; //发送的did结构体char out_char_array[60];  //诊断响应接收变量int k;dword glbHandle= 0; //文件操作句柄long glbValue;
}//发送did
on key 'd'
{diagSendRequest(ReadVin);//发送诊断请求write("d");
}//诊断结果响应
on diagResponse *
{long ret;  //字符串写入结果接收变量byte data[20];int size;double param_value1=0xFF;double param_value2=0xFF;diagResponse * resp; // 声明无具体解释的回应size=this.GetPrimitiveSize(); // 获取响应数据的长度this.GetPrimitiveData(data,elcount(data)); // 将实际响应从“on diagResponse*”复制到数据阵列中for(k=0;k<20;k++){  //通过遍历的方式打印数据write("data[%d] = %x",k,data[k]);}write("%d",size);GBF_Convert_ByteArrToHexStr(data,size,out_char_array);    write("outr=%s",out_char_array);//设置文件目录,2表明可以对这个目录下的文件可读可写setFilePath(".//TestModule", 2);//模式为2,表示追加模式,发生错误则返回0否则文件打开成功glbHandle = openFileWrite ("out.txt",2); if ( glbHandle!=0 ){//写入字符串,发生错误则返回0,徜则返回1ret = filePutString(out_char_array, strlen(out_char_array), glbHandle);    if(ret){write ("write ok.");  //在Wirte窗口打印成功提示fileClose (glbHandle); //关闭文件}else{write ("write error.");//在Wirte窗口打印失败提示fileClose(glbHandle);//关闭文件}   }
}//byte[]转char[]函数
byte GBF_Convert_ByteArrToHexStr(byte rawData[], int datalen,char outHexStr[])
{int gcOk = 0;int gcNok = 0;int i;int hexLength;int byteIndex;byte tmpVal;byte retVal;char tmpStr[60];char tmpErrStr[60];byte dataType = 2;// Init to failedretVal = gcNok;   // Reset output arrayfor (i = 0; i < elcount(outHexStr); i++){outHexStr[i] = 0;}// get the hex lengthhexLength = datalen * dataType;//check that the supplied output array can hold the hex string if ( elcount(outHexStr) <  hexLength ){snprintf(tmpErrStr, elcount(tmpErrStr), "GBF_ConvertIntArrToHexStr: ERROR: char array to small, Hex Data is %d but outHexStr only contains %d elements!", hexLength, elcount(outHexStr));}else {  write("hexLength == %d",hexLength);//All checks went fine, convert datafor (i = 0; i < hexLength; i++){byteIndex = i / dataType;tmpVal = ((byte)(rawData[byteIndex] >> (4 * (dataType -1 - (i % dataType))))) & 0x0F;snprintf(tmpStr,elcount(tmpStr),"%X",tmpVal);strncat(outHexStr,tmpStr,elcount(outHexStr));if(i % dataType == dataType-1){write("outHexStr = %d",strlen(outHexStr));strncat(outHexStr,"",elcount(outHexStr));}}retVal = gcOk;}return retVal;
}

CANOE入门:CAPL语言实现诊断发送和接收相关推荐

  1. CANOE入门:CAPL语言(1)

    CANoe项目中添加一个CAPL节点 添加CAPl节点有以下两种方法. 操作方法一 Simulation ->Measurement Setup ->选中要添加节点的地方右键->In ...

  2. C语言浮点数的发送和接收

    //发送float数据.共用体里的参数长度应该一致.否则内存无法对齐 //用于类型转换 union result2 {float lightnum;unsigned char data[4]; }Se ...

  3. 【CANoe之CAPL基础学习_如何正常在总线上中发送CAN消息】

    前言 本文适合于新手使用CANoe进行基础CAPL编程.基于CANoe的VN1640在CAN网络上进行发送CAN报文,实现CAN总线报文的控制.本文主要通过使用CANoe模拟发送一条周期型报文.文章内 ...

  4. CANoe中用CAPL脚本按特定格式发送报文

    CANoe中用CAPL脚本按特定格式发送报文 需求 实验设备 实验环境 最近学习用CANoe软件测试CAN总线,纯新手,把最近的学习心得分享一下,欢迎大佬指正. 需求 1)仿真开始报文默认以100ms ...

  5. CANoe 入门 _CAPL编程

    转自:https://www.cnblogs.com/dongdonghuihui/archive/2012/09/26/2704619.html CANOE入门(二) CAPL就是Communica ...

  6. CANoe 之 CAPL编程

    文章目录 CANoe 之 CAPL编程 CAPL 编程语言介绍及操作步骤 CAPL介绍 操作步骤 CAPL语法 CAPL程序的结构 数据结构 事件类型概述 常见函数 CANoe 之 CAPL编程 CA ...

  7. CANOE入门(三)

    转自:https://www.cnblogs.com/fengliu-/p/7844085.html CANOE入门(三) 最好的学习方式是什么?模仿.有人会问,那不是山寨么?但是我认为,那是模仿的初 ...

  8. CANoe之CAPL编程(CANoe系列其三)

    CANoe之CAPL编程(CANoe系列其三) 1.CAPL概述 1.1.CAPL语言特性 1.2.CAPL的程序结构 1.3.CAPL的数据类型 1.4.CAPL事件类型概述 2.CAPL事件类型 ...

  9. C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据)

    C# SuperSocket 手把手教你入门 傻瓜教程系列教程 C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据) C# SuperSocket 手把手教你 ...

最新文章

  1. Entropy Broker 2.0 发布,加密安全随机数
  2. jzoj6801-NOIP2020.9.19模拟patrick【树状数组】
  3. 推荐系统经典论文学习
  4. python中for用法_python中for的用法探索
  5. PAT题目中用到的一些C++便捷函数记录
  6. j2sdk_5_0.exe的使用
  7. 进程原语和线程原语是啥意思_转换中介原语
  8. 2022: LAVT: Language-Aware Vision Transformer for Referring Image Segmentation
  9. Electron环境搭建-Mac以及URL Schemes启动
  10. 然后查看服务器运行情况,netstat命令查看服务器运行情况
  11. Latex-TiKZ绘制数学平面几何图教程
  12. 基于 OE、Yocto、Arago 构建 TI 板卡的定制文件系统
  13. 吾爱破解python就业班_“吾”字是什么意思?
  14. 优化产品交互逻辑来提升产品性能
  15. python数据库-2
  16. 超实用总结,一文通吃所有整流滤波电路
  17. vue el-form表单验证,多表单验证及动态数据项表单验证
  18. 【上海有很多小区形成了居民互助模式】
  19. 现货黄金入门与技巧:必须具备的心理素质
  20. java 定时执行方法_Java定时执行任务 方法总结

热门文章

  1. php mssql 字符串截断,SQLServer 自动截断字符串
  2. 微信小程序设置git提交、代码管理
  3. 当P4遇见NAT64,UCloud如何快速从IPv4向IPv6演进?
  4. 追赶法(Thomas) 雅克比迭代(Jacobi) 高斯迭代(Gauss) 的C++实现
  5. IBL 漫反射辐照度
  6. 机器学习 (一) 基础概念
  7. 如何遍历java对象属性
  8. pg高可用之repmgr(一)
  9. 【Vim】Vim使用笔记之四——Vim使用技巧
  10. android 麻将布局,android麻将小项目1:第一天的一些收获