在CAN上便捷实现XCP协议信号读取

遇到的项目需求

在日常开发,测试的过程中,你是否遇到这样的需求:
1.我要通过XCP协议在CAN上读取并记录ECU内部的一些变量,或者修改一些变量,我手边又没有CANape这样的神器,我该怎么办?
2. 我想把XCP协议信号同步到我的采集系统中,比如CANalyzer, TSMaster等,我不想用两套工具分开采集,我该怎么办?

信号读取过程如何实现

网上可以搜索到无数XCP协议的一些介绍,在此不多说,本文主要从实战的角度,给大家介绍,我如何利用当前的工具读取到信号值,并尽量对我所用的报文内容进行解释。
一般情况下,我们想读取XCP协议的信息,都有专业的工具支持,比如Vector工具链中的CANape,这是一款强大的在线标定、读取工具,如果你是专业的标定工程师、系统工程师,那CANape是你的不二选择。对于我之前提到的两个“小”需求,使用CANape真的是”杀鸡用牛刀“了(CANape的License是真的贵啊!)
XCP协议有几种工作模式,我们可以采用其中的标准模式,即问答模式,Master发出需求指令,Slave进行响应,如下图所示是XCP协议标准模式的基本原理:
XCP协议标准模式那只要找到合适的工具,发送Request报文,那Slave就会将对应的信号值发出来,可以利用手头现有的工具,简单的开发一下脚本,实现问答机制,也可以满足使用需求,经济实惠。
我这边使用的工具是Vector的CANalyzer,使用CAPL编程,可以轮询读取多个内部信号的数值。
简单描述一下步骤:

  1. MASTER命令Slave建立连接
  2. MASTER命令Slave上报某一地址上的值
  3. MASTER命令断开ECU连接
    标准的XCP功能码(PID)清单如下:
    XCP协议标准功能码整个过程中,我们会用到0xFF, 0xF4, 0xFE三个PID。接下来,我们将每一步过程细分,描述如何达到我们的目标。

MASTER命令Slave建立连接

从表中得知,建立连接的PID码为0xFF
这一步比较简单,只要发送一帧报文即可建立连接,如下:
Byte0~Byte7: 0xFF,0x00
ECU在收到上位机发送的建立连接要求后,会应答:
Byte0~Byte7: 0xFF,0x0C,0x00,0x08,0x08,0x00,0x01,0x01
XCP建立通讯Slave的应答报文,每一字节含义如下:
XCP 0xFF应答报文解析针对每一个字节,在XCP协议标准中都有规定,有兴趣的同学可以查阅《ASAM XCP Part 2 Protocol Layer Specification》,例如RESOURCE字节中,每一位的定义如下:
XCP 0xFF-RESOURCE掩码含义只关心最终信号值的同学,可以忽略这些字节的特殊含义,不影响使用。

MASTER命令Slave返回某一地址上的值

从表中得知,请求某一地址的值的PID是0xF4
使用该PID,报文结构为:
Byte0:指定为PID“0xF4”
Byte1:指定为取出字节数。最大为MAX_CTO-1字节
Byte2:保留字段
Byte3:指定为要读出的8位扩展地址
Byte4~Byte7:指定为要读出的32位地址
要想获得信号的数值,首先要知道该信号在软件中的地址。我一般通过两种方法获取地址:1是查软件包里的.map文件,2是预先用CANape读信号的属性信息。这两种方法都能拿到信号地址。例如,我有一个温度信号AirTemp_DEGC变量,该信号地址0x6000ee3c,数据长度为4个字节。
那么我想读取该信号值的话,就要发送报文:
Byte0~Byte7: 0xF4,0x04,0x00,0x00,0x3C,0xEE,0x00,0x60
注意地址的高低字节顺序。
ECU在收到上位机发来的该指令后,会根据要求将对应地址段的数值发送出来,报文结构为:
Byte0:指定为PID“0xFF”
Byte1~Byte7:指定为取出的数据。
这样,我们通过一问一答,就获取了我们想要知道的信号的数值。
XCP 0xF4范例报文获得的数据为:0x41D0D3F0,可用工具网站转换为浮点数值为26.2285。
数值转换网站:https://gregstoll.com/~gregstoll/floattohex/

MASTER命令Slave断开连接

从表中可查,断开连接的PID码为0xFE,只要发送一帧报文即可断开连接,如下:
Byte0~Byte7: 0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00

以上就是用我们手边没有CANape,用其他工具利用XCP协议在CAN上读取信号值的过程。
如果只是临时性的读取一个信号地址,我们没必要花时间去制作一个DBC,用上位机的一些手动模式(比如CANalyzer的IG模块)就可以实现快速的信号读取。如果需要周期性的读取多个信号,并及时显示出物理值,那最好还是制作一个DBC,这样在编程环境中(例如CAPL)可以快速进行报文定义、收发、值解析。

  • 10
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值