通过 Spreadsheet 和 Kvaser CanKing 分析 CAN 信号 SAE J1939 范例

前4年 作者:Dynamic

在过去几年与一些用户的合作中,他们表示需要分析 SAE J1939 数据流中比较有限的一些 CAN 信号。尽 管 Kvaser 有许多技术合作伙伴公司的 CAN 分析软件提供很多强大的功能,但有时我们还是需要通过现 有工具来表述一个信号。对于仅一次性需要此类工具的学生,或是一个小公司的工程师,他们仅需要了 解 CAN 总线上的一个信号,这种方法是有意义的。在本文中,我将介绍一种方法,通过 Microsoft Excel, Notepad,和 Kvaser 的免费 CanKing 软件,来捕捉和分析 CAN 框架内的一个 CAN 信号。这些是大多数人 都有的工具,以及可以从 Kvaser 网站免费下载 CanKing。

通过使用这种方法初步分析信号,工程师能更多了解 CAN 和 J1939 的内部工作原理,更好地理解.dbc 文 件,以及其他应用程序如何使用.dbc 文件。虽然我在本文中以 J1939 信号为例,但这里使用的方法适用 于任何基于信号的 CAN 协议,包括 CANOpen、RVC、NMEA-2000 等等。虽然这里使用的是 Excel 和 Notepad,但其他 Spreadsheet 和文本编辑器程序可以同样完成此类任务。

本文的目的并不是避免使用我们的合作伙伴网提供的众多强大的CAN分析工具。许多这些工具都支持高级协议,如J1939和CANOpen,具备先进的图像和信号分析功能,包括分析巨大数据量(“大数据”)的能力。这里介绍的方法能展示,仅通过一些简单的工具和有限的分析,工程师就可以使用桌面上现有的工具来获得他们想要的东西。

这种方法有很大的局限性,远不及Kvaser合作伙伴销售的专用软件。在变长诊断报文、Transport P rotocol帧和多路复用数据帧的情况下,这些限制将阻止或至少让信号分析极为复杂化。在这些情况下,用户都需要一个专用的CAN分析包,或最好通过此类专用软件,以便正确地分析数据流中的信号。应用此方法的必要条件:

应用此方法的必要条件:

  • 能够以十六进制或十进制格式获取原始CAN数据,或者能够访问需要分析的原始CAN数据,并能够将该数据转换到.txt文件中。这将通过Kvaser的CanKing软件显示,可在此链接处免费下载该软件https://www.kvaser.com/download/。
  • 具备Microsoft Excel或类似软件,对如何在spread sheet软件中使用筛选功能有基本了解。
  • 了解你要查看什么数据,或者有一个.dbc文件或一个限定说明,显示在CAN帧中何处查找你需要的信号,并知道该信号在报文中是如何格式化的。

我们将按以下步骤操作:

  1. 通过CanKing获取数据,并用Notepad保存到一个文本文件中
  2. 打开Excel,从上述文本文件导入数据
  3. 将数据格式化为分别的列
  4. 筛选数据以找到你需要的CAN帧
  5. 分离要分析的数据字节
  6. 将数据转换为图形格式
  7. 创建一个图表来显示你需要的信号

1. 通过CanKing获取和保存数据

如果你尚未在你的电脑上安装和运行Kvaser的CanKing,可在 www.kvaser.com的下载页面,下载它和Kvaser for Windows驱动程序。你可以使用任何Kvaser适配器,如Kvaser Leaf Light HS v2,一个Kvaser USBcan,或一个Kvaser Memorator来获取数据以进行分析。通过CanKing,有很多方法可以做到这一点。如果要采集J1939数据,你需要去 Select Formatters(选择格式程序)对话框,并选择 J1939 Formatter,方法是将此格式化程序放在对话框的 Active Formatters (活跃格式程序)部分,并勾选它旁边的小方框。这会让你的数据格式化,如图2所示。当你连接到你的CAN总线,能看到数据时,可以通过 Log To Text File (记录到文本文件)窗口,来启动和停止数据记录,然后将文件保存到项目工作目录中。

图 1. 保存到文本文件 – Log to Text File – Kvaser CanKing中的一个对话框。

图 1 显示 Kvaser CanKing的 Log To Text File 对话框,可让用户获取所需要分析的数据。确认你已连接到CAN总线,通过选择Kvaser CanKing主窗口中的 Start Run 键,在CanKing中查看数据。需要获取的数据是你在CanKing的 Output Window 中所看到的。

当你通过一个文本编辑器查看数据,如 NotePad,该数据将如下所示:

WinNo P   PGN SA  DA Flg   Len  D0...1...2...3...4...5...6..D7      Time   Dir
CAN 1 6 0F009 0B->*         8   7D  7A  60  83  7D  4F  7D  7D     217.088350 R

CAN 1 3 0F004 00->*         8   60  7D  84  50  14  00  F0  84     217.093810 R

CAN 1 6 0F009 0B->*         8   7D  7A  60  83  7D  4F  7D  7D     217.097340 R

CAN 1 3 0F004 00->*         8   60  7D  84  50  14  00  F0  84     217.104820 R

CAN 1 6 0F009 0B->*         8   7D  7A  60  83  7D  4F  7D  7D     217.107600 R

CAN 1 6 0FEF1 31->*         8   F7  FF  FF  CF  FF  FF  FF  FF     217.111110 R

CAN 1 7 0FF05 8A->*         8   00  FF  FF  FF  FF  FF  FF  FF     217.113450 R

CAN 1 3 0F004 00->*         8   60  7D  84  54  14  00  F0  84     217.114870 R

CAN 1 6 0FEE0 27->*         8   FF  FF  FF  FF  AC  A8  06  00     217.115440 R

CAN 1 7 0FEC3 27->*         8   FF  FC  FF  FF  FF  FF  FF  FF     217.116020 R

CAN 1 6 0FF6F 8A->*         8   E2  14  E0  15  A0  12  FF  5E     217.116570 R

CAN 1 6 0F009 0B->*         8   7D  7A  60  83  7D  47  7D  7D     217.117580 R

CAN 1 3 0F004 00->*         8   60  7D  84  54  14  00  F0  84     217.126930 R

CAN 1 6 0F009 0B->*         8   7D  7A  60  83  7D  47  7D  7D     217.127770 R

CAN 1 6 0FF60 4D->*         8   00  00  00  FF  FF  FF  FF  FF     217.131710 R

图 2. 通过CanKing获取的范例 J1939 数据

在这个简单的例子中,所有的CAN帧都有8个数据字节。我要分析的信号是一个10毫秒的周期性信号,我将用图表绘制几秒钟时长的数据。此时,你应该将要分析的数据流保存在你的电脑工作目录中的一个.txt文件中。

2. 打开Excel,从上述文本文件导入数据

这一步的目标是把你的数据加入Excel,这样我们就可以用筛选功能来处理它们,并分离出我们要分析的数据。如果其他电子表格程序具有类似于Excel的筛选器、函数和绘图能力,也可以用于此任务。你可以自己决定选用其他的应用程序是否对你最合适,并找到类似的功能来完成此转换。

以一个空白工作表打开Microsoft Excel,然后选择 File, OpenBrowse。在导航框的右下角,你必须选择 All Files (*.*)(所有文件),以打开.txt文件。搜索你的工作目录,找到并选择你在上面的步骤1中创建的.txt文件。你的显示屏将基本如下图所示:

图 3. 选择一个.txt 文件以在Excel内打开

选择你在步骤1中创建的那个.txt文件并打开。

3. Format the data to be in separate columns将数据格式化为分别的列:

当你选择了你的.txt文件并尝试在Excel里打开它,你将看到图4所示的 Text Import Wizard (文本导入向导)。使用此文本导入向导,有多种方法将CAN数据导入Excel,其中许多方法在一定程度上都能起作用。无论采取哪种方法,你很有可能需要编辑你的数据和/或标题,以让它们正确图形化。

图 4. 文本导入向导

这个向导帮助你快速容易地把.txt数据转为Excel格式。跟随这些步骤来转换你的数据:

  1. g) 在 Choose the file type that best describes your data 选择最适合你的数据的文件类型)一行下面:选择 Delimited(已定界限)。
  2. Start import at row (开始导入行)一行旁边: 选择包含你的CAN数据的第一行;在我的这个范例中是第二行。有些数据监测器加上了眉头,你仅需滤掉这些眉头。晚些时候你可以通过Excel再恢复眉头。
  3. 点击 Next >.
  4. Delimiters 下面的第二个方框内选择 SSpace.
  5. 点击 Next >.
  6. 点击 Finish.

你现在应该有一个Excel工作表打开,并以多列显示你的CAN帧,分别显示标识符、Flag、DLC和数据字节。你还有时间列和方向列。如果你让每列的标题位于数据上方,请确保列标题与数据正确对应。有时在转换过程中,列标题会错位1-2列。如果你没有保持列标题在数据上方,现在应该把它们加上。我使用的列标题是 Type, Ch, Pri, PGN, SA/DA, DLC, D1, D2, D3, D4, D5, D6, D7, D8, Time, 和 Dir。下面是添加列标题后,我的工作表的前几行:

图 5. 到目前为止,我的工作表。

我的数据仅包含8个字节的帧,因此所有数据都在我填写的第一行标题下排列有序。如果你的数据中有一些帧带有不同的DLC数据链路连接器,那么你的数据就不会显示得这么整齐。不用担心,因为你一次只绘制一个PGN,在这个水平上,一个给定的PGN有一个固定的DLC,几乎总是8个字节。

4. 筛选数据以查找有意义的CAN帧

在这里,你有必要知道你需要查找的数据,以及这些数据在CAN帧中的位置。在J1939以及其他基于CAN的协议中,CAN帧的数据部分通常用于传输多个信号。不同的协议以不同的方式命名报文和信号。我将尽可能使用J1939术语,并尽量保持一致。在J1939通讯中,信号是对SP或可疑参数的非正式称呼。要识别一个信号,可使用Suspect Parameter Number(可疑参数号),即 SPN。一组信号构成一个Parameter Group(参数组),即PG,而一个PG由一个Parameter Group Number(参数组号) 标识,即PGN。在我们将要使用的示例中,一个PG将被放进一个CAN帧中。CAN帧并不总是如此,有时通过使用传输协议,一个PG在多个CAN帧之间传输,但这是稍后一篇博客的主题。

在我的示例中,我们将分析一个名称为 Engine Speed 发动机转速)的信号。此信号的详细信息可在SAE J1939DA 的数字附件(即Digital Annex)中看到。 Engine Speed 标识为SPN 190,下面图表显示数字附件中的一些详细信息:

图表 1. 从 SAE J1939DA 说明里获取的信息

在我们收集的数据中,有关绘制 Engine Speed 图所需的所有信息都显示在图1中,但首先我们必须筛选数据,查找对我们有用的数据。这里的关键是PGN,61444。它以十进制数显示,因此转换为十六进制得到0x0F004。这是我们要提取的PGN,这样我们就可以绘制SPN 190,因为这是包含SPN 190的PGN。格式为十六进制的,如图6列D所示。图6还显示我已经选择了筛选功能。我现在可以筛选D列中绘图所需的数据。

图6. Excel 工作表,已选择数据筛选,并显示所有数据

如果你以前未在Excel中使用过 Filters (筛选),请单击Excel顶部的Data tap,然后找到Filter。突出显示数据的第一行(标题行),然后选择筛选功能,你将看到工作表每一列的第一行都有小方框,每个方框里都有一个向下的箭头。选择PGN列上的箭头,你将看到一个方框,如图7所示。

不选(Select All) 全选)框,然后只选择你要筛选的报文,在本例中为0F004 。选择OK,你将对你要查看的数据进行筛选。现在你的工作表仅显示你绘制图表所需CAN帧 – 它们包含SPN 190,发动机转速信息的报文。

图 7. Excel 工作表,已选筛选功能,仅显示 Engine Speed PGN

5. 剥离出需要分析的数据字节

我们的工作表仅显示包含我们所需数据的CAN帧,所以现在我们该剥离出我们需要的信号。

图 8.

返回到图表1,我们可以看到 Engine Speed 是在位置4和位置5的双字节信号,或者以标题名表述,即D4列和D5列。由于这是双字节信号,在对此数据进行任何运算之前,我们必须考虑字节顺序。图8显示了我们筛选出的数据的一个截面,D4和D5以黄色突出显示。只要看一下这些数据,就很容易看出字节顺序。我们可以看到,最低有效字节在D4中,并且被首先传输。我们之所以知道这一点,是因为它是变化最大的字节,而且我们可以看到,当它变化时,它将D5推高了1。

如果我们查看图8中的第一行数据,并看到 Engine Speed 作为单位数,则可以将发动机转速的十六进制值写为0x1466。我们现在已经从我们在CAN总线上采集的数据中剥离出PN 190。这已经显示在D4和D5列中,即PGN 0x0F004或PGN 61444。

有些SPN小于一个字节,在某些情况下,它们与同一字节中的其他SPN组合在一起。如果这是我们需要的SPN,这将需要更多的Excel功能,如屏蔽和移位。工作表提供了许多数学函数,可通过许多个性化的方法应用到数据处理上。你需要找到适合你的应用方法,来通过这些数学函数来获取你绘图需要的具体数据。

6. 将数据转换为图表模式

在绘制图表之前,有关这个信号我们还要考虑的只剩下分辨率和偏移量。Resolution (分辨率)是SAE J1939DA中使用的术语,是指要用于一个信号表述的比例因素,以可理解的方式显示。如果你使用的是 Kvaser Database Editor 3 软件 – 可免费从kvaser.com/download/下载,要从一个.dbc文件中提取此信息,使用的术语是 Factor 。图表1显示分辨率等于0.125rpm/位,偏移量等于零。按以下步骤,用传输的初始数据以RPM计算发动机转速:

  1. d) 将两个字节的SPN 190转换为一个十进制数,如 0x1466 = 5,222。
  2. e) 这个数字乘以分辨率 – 或者我称之为缩放比例: (5,222 bits) x (0.125 rpm/bit) = 652.75 rpm
  3. f) 加上偏移量,这里偏移量为零,所以结果值为652.75 rpm

利用工作表的强大功能,我们可以很容易地统计我们要绘制的所有信号样本。首先要做的是在D5列的右侧添加一个空白列。有了此列,我们就可以通过上述步骤,用它来计算RPM。如果不清楚这一点,你需要了解Excel的函数功能,方法是去一个空白单元格并键入“=”,然后单击菜单栏的fx。我的数据在J和K列中,所以我要在标题行下新列的第一个小方框中输入函数:

=HEX2DEC(CONCAT(K3,J3))*0.125

这一行将以正确的顺序连接两个字节的数据(首先是K3,然后是J3),从十六进制转换为十进制,然后乘以我们的缩放值,所有这些都在一个简单的等式中。

通过使用Excel中的 auto fill f(自动填充)功能,把我们制作图表所需要的所有数据填充到新列里,来执行此计算。如果之前没有使用自动填充,则可去Excel的“帮助”菜单,了解如何使用。当通过自动填充填满所有需要绘制的单元格后,你在工作表中会有一个可绘制的 Engine Speed数字 – 工作表中的一列,供绘制使用。

7. 创建一个图表显示我们感兴趣的数据

从这个意义上说,我们只需要使用Excel的绘图函数来绘制一列数据。要绘制图形的列是你使用concatenate(CONCAT)函数和十六进制到十进制(HEX2DEC)转换函数创建的列。你可以选择在上面步骤6中创建的整个列,也可以只选择其中的一部分。接下来,从菜单栏中选择 Insert (插入),以 Insert Line or Area Chart (插入折线图或面积图),这将为你感兴趣的信号提供绘图。以我的一部分数据生成的图表如图9所示。

图 9. 我的数据所显示的发动机转速

我称此图为SPN 190,在我通过 Insert Line or Area Cart 创建此图之后,没有做任何其他事情。此工作表应提供许多极为有效的函数和方法创建图形,以多种不同的方式显示不同的信号,这些步骤帮助工程师或技师,通过这些函数,分析CAN总线上的大多数数据,前提是他们有一个具体特性或.dbc文件,显示数据的位置和格式。

本文旨在展示一种使用非专门软件工具,来辅助理解CAN数据流中信号的方法。每一步骤都需要本文在此有限篇幅内所能说明内容以外的知识,但有意义的并不是各个步骤。我的希望是,通用方法,无论是在此范例应用中介绍的方法,还是使用其他软件,对于希望更深入了解CAN,以及信号如何通过CAN传输的读者来说,都有意义。

Bryan Hennessy

技术合作经理, Kvaser

联系我们