自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter

文章目录

  • 前言
  • 一、关于Checksum的组成形式
  • 二、自定义的Checksum方法一
    • 1、实现的主要流程图如下:
    • 2、方法一的主要算法参考
  • 三、自定义的Checksum方法二
    • 1、软件及插件下载;
    • 2、Custom device的使用;
    • 4、Veristand调用Custom Device;
    • 5、Veristand发送信号值;
    • 6、部署到实时机;


前言

1、现在很多的车厂对于车辆的安全机制非常重视,车厂通过对发送的CAN数据进行加密而形成一种保护机制,而Checksum和Counter是其中的一种保护介质,当CAN报文数据的Checksum和Counter正确,才能正常发送与接收。

一、关于Checksum的组成形式

1、车载行业上CAN报文应该有两种携带Checksum的方式,一种是一条报文一个Checksum;另外一种是一个信号组对应一个Checksum,即一条报文多个Checksum,像上汽、吉利、华人运通等都有这种Checksum机制,或者不戴~~;

二、自定义的Checksum方法一

注:我已经成功使用过两种方法发送Checksum,但软件都是通过Veristand去发送;

方法一:通过Veristand自带的AFP(Automatic Frame Processing)功能添加自定义算法文件,这个方法我是参考师子一号文章实现的(仅限于一条报文一个Checksum):
参考文献:点击跳转文章

这种方法有局限性,原因:支持的算法文件容量太小,感觉是分配给AFP功能的算力太小了,我大概写了120行算法,无法部署到实时机,但是如果是一个报文一个Checksum还是可以拿来用的,毕竟代码量不会大。

1、实现的主要流程图如下:

自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第1张图片

2、方法一的主要算法参考

注意:(最后一句代码是最关键)
a_pDataFrame->Payload[31] = CRCLowByte,这是将算好的Chcksum填入对应的Playload
②*a_pDataFrame->Payload[31]表示获取当前报文的第31个字节数据;

                char buf[11];
				unsigned int byte;
				unsigned char k;
				unsigned short ACC,TOPBIT;
				unsigned short remainder = 0x00;
				unsigned short CRCLowByte;
				int len=10;
				
				//根据dbc自己解析
				//通过a_pDataFrame->Payload[0] 获取当前报文第一个字节数据,获取第二个字节数据类似。
				buf[0] = 0x74;
				buf[1] = 0x00;
				buf[2] = a_pContextData[2]-1;
				buf[3] = (a_pDataFrame->Payload[35] >> 5)& 0x07;
				buf[4] = (a_pDataFrame->Payload[35] >> 2)& 0x03;
				buf[5] = a_pDataFrame->Payload[32] & 0x0F;
				buf[6] = (a_pDataFrame->Payload[33] >> 4) & 0x0F;;
				buf[7] = a_pDataFrame->Payload[35] & 0x01;
				buf[8] = a_pDataFrame->Payload[33] & 0x0F;
				buf[9] = (a_pDataFrame->Payload[34] >> 4) & 0x0F;
				buf[10] = a_pDataFrame->Payload[34] & 0x0F;
				
				//CRC算法
				TOPBIT = 0x80;
				for (byte = 0; byte <= len; ++byte)
				{
					ACC = buf[byte];
					remainder ^= ACC;
					for (k = 8; k > 0; --k)
					{
						if (remainder & TOPBIT)
						{
							remainder = (remainder << 1) ^0x1D;
						}
						else
						{
							remainder = (remainder << 1);
						}
					}
				}
				remainder=remainder^0x00;
				CRCLowByte=remainder & 0x00FF;
				
			    //将算好的Checksum放在对应的playload,我这里的Checksum在第31个字节;
				a_pDataFrame->Payload[31] = CRCLowByte;

三、自定义的Checksum方法二

方法二:我目前在用的就是方法二,相当于重新创建一个Custom Device,这个CD支持报文的完全处理,是一个完整的CAN处理模块,不过这个方法需要下载的东西比较多,请耐心下载,不要被劝退了,这个方法很有用,自定义程度很高,更改里面的逻辑需要Labview基础

1、软件及插件下载;

1、通过制作Veristand的Custom device重定义CAN模块,请逐条下载;
1) NI Package Manager----NI官网下载
2)Labview 2020 ----NI官网 or NI Package Manager下载
3)Veristand 2020 R5 ----NI官网 or NI Package Manager下载
4)NI XNET 19 or later ----NI官网 or NI Package Manager下载
安装完成Labview会有这个VI Package Manager下载工具 自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第2张图片
5)NI Simple Messaging Library 3.1.0.9 —VI Package Manager下载
6)NI Asynchronous Messaging Communication Library 3.3.1.22—VI Package Manager下载
7)NI Veristand Custom Device Development Tools,如下图逐个下载安装;
https://github.com/ni/niveristand-custom-device-development-tools/releases
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第3张图片
以上7个是插件和软件,下载安装完成才能代开下面的Custom device工程;

8)Custom device代码(Labview),这块代码可以私聊我,因为上传要审核好久;

2、Custom device的使用;

1、打开Custom device 工程;
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第4张图片
2、打开工程之后的界面,打开CAN报文处理VI(如果有错误就是插件没下载够)
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第5张图片
3、CAN报文处理VI介绍;
以下3个VI分别处理Counter、Checksum、playload(报文字节);
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第6张图片
3.1 双击Checksum处理VI(Update Protection Signals.vi),再双击进入Checksum算法;
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第7张图片
3.2 进入Checksum算法VI(Calculate Protection Value.vi),添加算法的名称,到时候在Veristand会有体现;
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第8张图片
3.3 添加算法分支与模块(前提是先添加上一步骤的算法名称);
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第9张图片
综上是Checksum算法的添加方法,算法自己写呗,因为每个项目的算法基本都不一样;

4、添加完算法之后,就是编译Custom Device工程了;
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第10张图片

4、Veristand调用Custom Device;

4.1 新建一个工程,右键项目,进入系统配置;

自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第11张图片

4.2 新建一个CD
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第12张图片
4.2.1选择数据库
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第13张图片
4.3 导入帧到Outgoing中的Cyclic(周期发送帧);
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第14张图片

4.4 配置报文的Counter;
4.4.1 右键某个信号 Make Counter Signal
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第15张图片
4.4.2 填写Counter的最大值(发送报文时会自动计算0~最大值)
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第16张图片

4.5 配置报文Checksum–这里以信号组情况实列;
4.5.1 添加Checksum
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第17张图片
4.5.2 配置Checksum页面的参数;
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第18张图片
4.5.3 选择需要参与计算的信号(哪些信号值要参与Checksum的运算,选择后在Labview算法处可以调用相关的参数);
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第19张图片
4.5.4 导入之后,当发送这帧报文时,会传入上面添加的Select Channels中选择的数据库数据,在下图中Labview模块调用,所以做算法的时候要合理运用;
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第20张图片

5、Veristand发送信号值;

自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第21张图片

6、部署到实时机;

部署到实时机之后就可以发送报文啦
自动驾驶仿真基础:使用Veristand自定义CAN报文的Checksum和Counter_第22张图片
综上,完成Veristand发送自定义Checksum的方法,整体的思路都在这里;

你可能感兴趣的:(Veristand,Checksum,自动驾驶)