技术博客

12/04/2018 作者 Lars-Göran Fredriksson

怎样使用 Kvaser 虚拟设备与通道和总线

这篇文章解释怎样使用Kvaser Drivers驱动生成的虚拟设备。

我们将介绍虚拟设备,虚拟通道和虚拟总线。

我们主要关注WINDOWS驱动, 但其中一些信息也能应用到本文末尾附录A中的LINUX系统上。

本文的介绍包括怎样安装,修改和使用它们。

关键词:
虚拟设备模拟一个Kvaser CAN适配器
虚拟通道模拟一个Kvaser CAN 通道
虚拟总线提供一个虚拟导线连接到虚拟通道上


Kvaser CAN 设备的驱动, v5.22或v5.22以上的版本

本介绍手册使用Kvaser驱动。

  • 下载和安装v 5.22 版本或更新的版本。

你可以在这里找到驱动:https://www.kvaser.com/downloads-kvaser/


Kvaser CANlib SDK

这里需要CANlib软件开发包 (Kvaser CANLib SDK)。

  • 下载和安装v 5.22 版本或更新的版本。

你可以在这里找到SDK: https://www.kvaser.com/downloads-kvaser/


硬件(设备)

  • 本介绍手册不需要硬件(Kvaser Can 适配器)。

在Windows上安装Kvaser CAN驱动

在安装CAN驱动的同时, 一个虚拟设备就自动被装上了。


Kvaser 产品说明

使用 “Kvaser Device Guide(产品说明)”来看已被安装的设备。

预设置是一个有两个通道的设备。这两个通道借助一个虚拟回路导线(虚拟总线)彼此相联。

最多可以加到16 个虚拟设备,对此我们将在下一节介绍。


在Windows里加虚拟设备

在我们加更多虚拟设备之前,我们必须修改在注册部分修改两个值。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\KVASER AB\CANDriver
1.0\Drivers\kcanv]
"MaxCards"=dword:00000002
[HKEY_LOCAL_MACHINE\SOFTWARE\KVASER AB\CANDriver 1.0\Drivers\kcanv]
"MaxCards"=dword:00000002

预设值(2018年2月8日) 是 2 个虚拟设备, 请将它改为16个虚拟设备或你需要的任何数量。 Windows最多允许16个硬件。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\KVASER AB\CANDriver
1.0\Drivers\kcanv]
"MaxCards"=dword:00000010
[HKEY_LOCAL_MACHINE\SOFTWARE\KVASER AB\CANDriver 1.0\Drivers\kcanv]
"MaxCards"=dword:00000010

数值是16进制的!

拷贝上面的文字到一个文档文件, 将它命名为 “Allow16KvaserVirtualDevices.REG”, 然后双击 “run” 来运行。你也可以用Regedit.EXE来直接修改注册。

这时要点击‘Yes’!

点击Ok, 检查在RegEdit的值:

完成了!


加虚拟设备

按下 “WinButton + R”,键入‘HDWWIZ’并点击OK,启用硬件助手“HardwareWizard”。

(在你开始生成另外15 个设备之前, 请阅读后面的“Change number of channels修改通道数量”部分!)

你也可以通过一个命令提示符开始。

点击‘Next’。

选择‘Select Manual Install (Advanced) ’(选择手动安装)并点击‘Next’。

选择 “CAN Hardware (Kvaser)”, 并点击‘Next’。

下拉到“Kvaser Virtual CAN Driver(虚拟CAN驱动)”, 点击‘Next’。

点击‘Next’!

你可以加16 个Kvaser 虚拟 CAN 设备的驱动, 但是如果你想再加一个, Windows 会显示下面的信息:

而且在Device Manager框里你会看到:

但是在本文中,我们假设16 个有两个虚拟总线的虚拟设备就足够了。


检查设置

我们现在应该能看到我们选择安装的设备数量,和CANLib 通道数量。在此例中,一共有16个虚拟设备和32 个虚拟通道。


改变通道数量

你可以修改虚拟设备上的通道数。每个虚拟设备的预设通道数是两个。

要想修改通道数,你需要更改注册里的一个设置,然后重启电脑。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kcanv\Parameters]
"ChannelCount"=dword:00000005

在一个虚拟设备上最多可以生成8个虚拟通道。

改变通道数值时需要重启电脑。

我现在要生成两个各有5个虚拟通道的虚拟设备。我需要它们来在下一节里进行测试。


虚拟总线

每个虚拟设备的所有虚拟通道都被预设为连接到一个私用虚拟总线上 (通常为虚拟总线#0)。当我们生成两个有5个通道的设备 , 每个设备的所有5个通道都被连接到虚拟总线#0。然而,这两个虚拟设备之间没有连接,尽管它们被连接到同一个编号的虚拟总线上! 虚拟通道只能和接在同一个虚拟设备上的其他通道联系。

每个虚拟设备可以生成一套数量为32个的私用虚拟总线。


私用虚拟总线

上面所示例子中有一些错误。通道2(Channel 2)不能和通道5(channel 5)联系, 通道 3不能和通道4联系, (通道0可以和通道1联系).

虚拟适配器不能共享虚拟总线!


用CANLib操作虚拟设备

你可以在CANLib里打开虚拟通道, 同样使用你在操作物理CAN适配器时的用的命令。唯一不同之处是我们必须加一个旗标FLAG。

MyHnd[ChNo] := canOpenChannel(ChNo, flags OR canOPEN_ACCEPT_VIRTUAL);

在使用命令canOpenChannel()时,我们必须加旗标canOPEN_ACCEPT_VIRTUAL。你可以把旗标保留在你的软件里,因为它不妨碍你打开普通总线。

 

每个虚拟设备有32 个虚拟总线, 在同一个虚拟设备上,你可以将任何一个虚拟通道跟任何虚拟总线相联接。


将一个虚拟通道和一个虚拟总线断开

我们可以用命令canIoCtl()来断开一个通道的联接。

Var
BusNo:INT32;
Begin
BusNo := 0;
canBusOff(MyHnd);
canIoCtl(MyHnd,canIOCTL_DISCONNECT_FROM_VIRTUAL_BUS,@BusNo,4);
End;

这里看上去不需要BusOff() 和 BusOn(), 但是我认为,如果我们在修改它们之前使用它们,会更好一些,尽管它们是虚拟的。

我们必须知道虚拟总线数量! 如果你忘记了总线数量,可以使用下面操作(断开所有连接):

// This routine disconnects the channel from ALL virtual buses!
Var
BusNo:INT32;
Begin
BusNo := 0;
canBusOff(MyHnd);
For BusNo := 0 to 31 do
begin
canIoCtl(MyHnd,canIOCTL_DISCONNECT_FROM_VIRTUAL_BUS, @BusNo,4);
end;
End;

现在我们可以很确定虚拟通道已和虚拟总线断开。


将一个虚拟通道和一个虚拟总线联接起来

我们可以用命令canIoCtl()来联接一个通道。

(总是要先断开通道, 有时可能会联接到多个总线。)

Var
BusNo:INT32;
Begin
BusNo := 7;
canIoCtl(MyHnd,canIOCTL_CONNECT_TO_VIRTUAL_BUS,@BusNo, 4);
canBusOn(MyHnd);
End;

现在我们联接到了虚拟总线 no 7.

非常重要! 你必须断开一个通道!

当联接到一个‘新’虚拟总线时,通道并没有与‘旧’总线断开。所有联接和断开都是由你的软件发起控制。

举例, 有五个虚拟通道的两个虚拟设备

让我们建立各有五个通道的两个设备(这里列出的编码不是完整版)。

Begin
BusNo0 := 1; BusNo1 := 1;
BusNo2 := 3; BusNo3 := 3; BusNo4 := 3;
BusNo5 := 1; BusNo6 := 1; BusNo7 := 1; BusNo8 := 1; BusNo9 :=
1;

canIoCtl(MyHnd0, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo0, 4);
canIoCtl(MyHnd1, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo1, 4);
canIoCtl(MyHnd2, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo2, 4);
canIoCtl(MyHnd3, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo3, 4);
canIoCtl(MyHnd4, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo4, 4);
canIoCtl(MyHnd5, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo5, 4);
canIoCtl(MyHnd6, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo6, 4);
canIoCtl(MyHnd7, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo7, 4);
canIoCtl(MyHnd8, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo8, 4);
canIoCtl(MyHnd9, canIOCTL_CONNECT_TO_VIRTUAL_BUS, @BusNo9, 4);
End;

虚拟设备 0
通道CH0 和 通道CH1可以在 VB1 (虚拟总线 1)上联系。
通道CH2, CH3 和 CH4 可以在VB3 (虚拟总线3) 上联系。

虚拟设备1/b>
通道CH5-Ch9 可以在虚拟总线VB1上联系。

但是CH0 和 CH1不能和 CH5-CH9联系, 尽管它们似乎在同一个总线上, 因为它们在不同的虚拟设备上。每个虚拟设备生成一套私用虚拟总线。

附录 A, LINUX

我能用LINUX操作虚拟设备吗?

是的, 在Linux里你要在源代码上做一个修改(virtualcan.h):

#define NR_CHANNELS 2
#define MAX_CHANNELS NR_CHANNELS
#define NR_VIRTUAL_DEV 1
#define VIRTUAL_MAX_DEV NR_VIRTUAL_DEV

并且以下面的命令打开该设备:
/usr/sbin/virtualcan.sh start

很有可能在你打开一个虚拟设备之前,你需要建立些什么,但是我对此不了解!

如果你是一个Linux用户,需要这方面的帮助, 请联系我们的技术支持。

Author Image

Lars-Göran Fredriksson