怎么用Canoe CAPL发送诊断
前言
以UDS诊断为例,GMLAN会有些许差异,大同小异。
一般Canoe工程加载CDD以后,可以直接通过canoe工程的诊断界面,点击需要的诊断命令就可以发送诊断了。

那为什么还需要通过CAPL来发送诊断呢,
1.诊断界面的数据长度和有的参数范围是有限制(最大值最小值)的,但是如果你需要验证发送错误的长度或者超出范围的参数数据时ECU的响应是否符合要求的时候,没有办法通过诊断面板发送。
2.时间,可能你需要两个连续的诊断在间隔多长时间内发送,手动点击太慢。
或者你的ECU修复了某个bug软件升级之后,仅仅测试你修复的那个bug是不够的,最好把所有的诊断都测一下,一个一个点太慢,脚本测试才够快够准确。
1、直接调用CDD里的诊断发送
在CAPL里,诊断你也可以理解为一种类似于int这种的特殊数据类型。
关键字是diagRequest,前提是你的Canoe工程里有加载CDD.
在CAPL里编辑diagRequest,然后按空格,编译器会自动匹配你的canoe工程里加载的CDD名称。

选中CDD名字后,按‘.’,编译器会自动匹配出这个CDD支持的诊断列表,然后选中你要发送的诊断。

以要发送进入扩展层的诊断请求 10 03 为例,给这个诊断请求取个名字Diag_Tx_10_03,这样一个诊断请求的数据类型就定义好了。

定义完成以后,发送诊断请求的函数是diagSendRequest(diagRequest obj),括号里的参数就是我们定义的诊断请求。
那就是:
on key 't'
{
diagSendRequest(Diag_Tx_10_03);
}
保存,编译,运行工程,点击按键t,

其他服务也是一样的,比如0x22服务的读SN的诊断
diagRequest Door.SerialNumber_Read Diag_Tx_ReadSN;
on key 's'
{
diagSendRequest(Diag_Tx_ReadSN);
}

细心的同学可能会问,为什么Trace两个都是Tx,没有Rx,因为我手边暂时没有真实的ECU模块,是用的虚拟ECU,响应的数据是用另外一个节点模拟的,不过这不影响我们的测试验证,没有真实ECU的时候,想用验证就需要设置为模拟总线。

2、用报文的形式发送诊断
调用CDD里的诊断进行发送,最终体现在数据流里,还是以报文的形式发送出来的,所以也可以用发送报文的形式来发送诊断,只不过定义报文的请求ID要是诊断的请求id,而且诊断里的前2个byte决定了是单帧还是多帧
1179




被折叠的 条评论
为什么被折叠?



