在本文中,我将测试和比较四种不同类型的CAN。
技术博客
比较CAN接口传输延迟
-
安装在主板上的PCIe 接口
-
USB 连接的外部接口
-
以太网连接的接口
-
WLAN (WiFi) 连接的接口
本文的主要目的是比较传输延迟。
此CAN总线由四个Kvaser T-Cannector v2s组成,每一端都加了终端。在测试过程中,我通过7个接口共连接了13路通道。
所有接口都连接到同一台电脑。我使用一个路由器,以保证将以太网接口与不需要的通信隔离开。路由器也是Wi-Fi接入点。
其中的一个PCIE接口作为接收器。(PCIE接口是最快的接口类型,不同PCIE卡之间的差异极小)。
测试目标是比较传输延迟时间(Transfer Delay Time)。我将这种延迟时间定义为:从软件有一个需要传输的数据帧到软件(在另一路通道上)接收到它所需的时间。
1比较测试 – 传输延迟时间
发送一个标准CAN报文 – 11位ID和8字节数据有效负荷。
当比特率为1MBit/s比特率,此报文在CAN总线上传输大约需要110微秒(用示波器测量)。请注意,我实际上发送了很多报文,并计算了平均传输延迟时间。
1.1检查内部接口延迟
使用一个 Kvaser PCIEcan 4xHS发送和接收, 我监测到的总延迟是225微秒。(从按下发送键TX ,直到软件使用了 CANRead命令)。
此CAN报文在CAN总线上花费了约110微秒。CANWrite(书写) 命令用了约25微秒。
225减110再减25是90微秒。
所以我们需要知道在这0.090毫秒内发生了什么。信息存储在电子设备的某个地方。在45微秒之后,它最大可能是在发送队列中待了45微秒,然后在接收队列里待了45微秒。(如果不在卡上进行一些高级测量,我无法验证这一点,因此我假设这两个过程花费的时间相同)。
根据此分析,PCIE接口延迟为45微秒。
1.2比较接口类型
我使用在[1.1. 检查内部接口延迟]中的数值和监测到的延迟,计算各种类型的接口上的TX队列时间。
PCIE连接的接口
如上表所示,此延迟值非常小,这很可能是连接CAN接口最快的方法。
USB 连接的接口:
我使用了我们最畅销的产品,Kvaser Leaf Light HS v2。这不是我们最快的USB CAN接口,但它是一个典型的USB接口范例。如上表所示,与PCIE接口相比,它带来了100微秒的额外延迟。
LAN 连接的接口
我使用了两种LAN 连接的设备, Kvaser DIN Rail SE400S-X10和Kvaser Ethercan HS。
两者的结果几乎相同。与PCIe卡相比,这两个设备比PCIe接口增加了225微秒的额外延迟。
WLAN (WiFi) 连接的接口
我使用Kvaser BlackBird v2测试WLAN接口。我以两种不同的方式连接:标准基础结构模式和Windows托管模式。与PCIE接口相比,我监测到的总延迟为1毫秒和2毫秒。
结论
如果你需要非常短的响应时间,应选择PCIe或USB连接接口。它们能为你的CAN总线提供稳定和安全的连接。LAN连接的接口也是一个不错的选择,但必须了解,它带来的较长传输延迟可能会让某些应用程序出现问题。使用WLAN接口时,请务必注意,WiFi环境能导致较长的传输延迟。
1.3较慢波特率的传输比较
如果我们使用250kBit/s和29位ID会怎么样?
一个有29位ID的8字节CAN报文传输需要大约520微秒。我调整 [1.2. 比较接口类型]的列表:
当比较总计延迟时间,PCIE、USB和LAN接口得出的结果几乎相同。因此,这时选择哪种接口更多取决于你希望如何连接到CAN总线。
PCIE接口需要固定的硬件,USB接口让你有更多灵活性,LAN接口可延长CAN总线和客户端之间的距离。WLAN接口也是一个不错的选择,尤其是当你需要“监测”一个设备的时候。
2.附录A
2.1我自己的软件
为了能够检测到发送和接收数据之间的延迟,我写了一个非常简单的程序来检测发送数据帧和收到数据帧的时间点。
我用DELPHI(Pascal)编写了此基本测试程序,它使用Kvaser CANLib,并不是超级优化的程序。
计时器分辨率
我使用的是Windows操作系统和CPU提供的Performance Counter(性能计数器)。在我的硬件上,这个计数器的频率是10兆赫兹。它的分辨率是0.1微秒。
结果精度
请注意,本测试结果的方差可能很高,±50%并不少见,因此在此结果时需要谨慎。这些数字更多的是指出了一个方向。
程序步骤的文字表述:
- 一个事件触发了TX序列。在大多数情况下,这是我点击了一个键。
- 以最快速度读取performance counter(性能计数器)。此数值是T0 (时间0)。
- 给一个CAN报文加上T0, 并通过你需要的接口(通道)把它发送出去。
- 现在此软件必须等CANlib发送一个事件, “已获取CAN数据”。
- 以最快速度读取performance counter(性能计数器)。此数值是T1(时间1)。
- 从CANlib缓冲器读取CAN报文。
- 现在我们已得到: 一个CAN 报文 – 其ID显示发送者, 其负载包含T0。
- 我们现在可以用T1减去T0,从而得到传输延迟, dT=T1-T0。
现在我们知道了发送者ID和传输延迟。
2.2 使用的CAN帧
当我们发送一个CAN 帧, 或一个 “数据包”, 我使用11位标识符和8个数据位。
波特率为1MBit 时, 这样的一个数据包大约耗时110微秒。
(当添加的数据位不同,耗时也会略有不同)。
此ID 将包含该传输接口的句柄。
此8个数据字节将保持Performance counter的值(UINT64)。
这让接受过程能够确定是谁发送了此报文,以及更重要的,此报文是何时发送的。
2.3 使用的硬件
2.3.1 使用的CAN 接口
- Kvaser PCIEcan HS v2 (0866-3)
- Kvaser PCIEcan 4xHS (0693-6)
- Kvaser Mini PCI Express HS v2 (1038-3)
- Kvaser Leaf Light HS v2 (0685-0)
- Kvaser BlackBird v2 (0671-3)
- Kvaser DIN Rail SE400S-X10 (1059-8)
- Kvaser Ethercan HS (0976-9)
2.3.2 使用的CAN 测试设备
- Kvaser T-Cannector v2 (0776-5)
2.3.3电脑
此电脑是标准Windows 10配置。
处理器: Intel Core i7 4770 3.4GHz
主板: Gigabyte Z87X-UD5H-CF