Avance.Lab

技術紹介

第1回 Vector CAN ライブラリを用いたCAN通信

公開日:2023.08.10 更新日:2023.08.10

tag: ToolCANWindows

こんにちは、OTと申します。
本記事では、CAN通信アプリの作成方法について複数回で紹介させていただきます。
今回は、CAN通信開始までを説明させていただきます。

CAN通信するためのハードウェア/ライブラリは複数存在しています。
例として、Vector社から提供されているCANインターフェースを使用する場合、
同社から提供されているライブラリ「XL Driver Library」を用いて、制御可能です。

今回は、上記ライブラリ「XL Driver Library」を用いて、CAN通信してみます。
通信方法としては、Virtual CAN Bus(PC内でシミュレーションする仮想のCAN BUS)を使用します。

事前準備

Vector社の公式HPより、以下をダウンロードし、インストールします。
・Vector Driver Setup
・XL Driver Library

インストール完了後、コントロールパネル(表示方法:大きいアイコン or 小さいアイコン)に「Vector Hardware」が追加されます。
「Vector Hardware」の設定画面では、Virtual CAN Bus 使用可能であることを確認できます。

C++を用いてアプリを作成する場合、以下ライブラリのファイルを使用します。
・vxlapi.dll
・vxlapi.lib
・vxlapi.h

サンプルコード(C++)

以下、CAN通信開始するまでのサンプルコードを記載させていただきます。
※エラー時の処理は省略。

#include <iostream>
#include <windows.h>
#include "vxlapi.h"

XLaccess		m_xlChannelMask[2];			// CANチャンネルマスク
XLaccess		m_xlChannelMask_all;		// CANチャンネルマスク(全ポート)
XLportHandle	m_xlPortHandle;				// ポートハンドル
						
void CanDriverOpen(void);					// ドライバオープン

// ---------------------------------------------------
// 機能:メインルーチン
// ---------------------------------------------------
int main()
{
	CanDriverOpen();						// ドライバオープン
}

// ---------------------------------------------------
// 機能:ドライバオープン
// ---------------------------------------------------
void CanDriverOpen(void)
{
	unsigned char		i;					// ループ変数
	unsigned char		ch_No;				// チャンネル番号
	XLdriverConfig		xlDriverConfig;		// CANドライバ設定
	XLaccess			xlPermissionMask;	// CANチャンネル許可

	// ドライバオープン
	xlOpenDriver();

	// ドライバ設定取得
	xlGetDriverConfig(&xlDriverConfig);

	// 使用可能な仮想チャンネルを検索
	ch_No = 0;
	for(i = 0; i < xlDriverConfig.channelCount; i++)	// チャンネル数ループ
	{
		// ハードウェアの種類が仮想チャンネル、かつ使用可能なバスがCAN通信の場合
		if((xlDriverConfig.channel[i].hwType == XL_HWTYPE_VIRTUAL) &&
		   ((xlDriverConfig.channel[i].channelBusCapabilities & XL_BUS_ACTIVE_CAP_CAN) == XL_BUS_ACTIVE_CAP_CAN))
		{
			// チャンネルマスクを取得
			// 対象チャンネルはビットフィールドで管理されています(例:仮想Ch1の場合 0x01、Ch2の場合 0x02)
			m_xlChannelMask[ch_No] = xlDriverConfig.channel[i].channelMask;
			ch_No++;
		}
	}

	// ポートオープン
	m_xlChannelMask_all = m_xlChannelMask[0] + m_xlChannelMask[1];
	xlPermissionMask = m_xlChannelMask_all;
	xlOpenPort(&m_xlPortHandle,							// ポートハンドル
			   "CANtest",								// アプリ名(任意)
			   m_xlChannelMask_all,						// アクセスするチャンネル
			   &xlPermissionMask,						// アクセス可能なチャンネルのマスク
			   256,										// 受信キューのサイズ
			   XL_INTERFACE_VERSION,					// XLインターフェースのバージョン
			   XL_BUS_TYPE_CAN);						// バスタイプ:CAN

	// 通信速度設定
	xlCanSetChannelBitrate(m_xlPortHandle,				// ポートハンドル
						   m_xlChannelMask_all,			// アクセスするチャンネル
						   500000);						// 通信速度:500kbps

	// CAN通信開始
	xlActivateChannel(m_xlPortHandle,					// ポートハンドル
					  m_xlChannelMask_all,				// アクセスするチャンネル
					  XL_BUS_TYPE_CAN,					// バスタイプ:CAN
					  XL_ACTIVATE_RESET_CLOCK);			// 動作フラグ:チャンネルをアクティブにした後、内部クロックをリセット
}

各ライブラリ関数(概要)

xlOpenDriver「XL Driver Library」の各APIを使用するため、最初に実行する必要があります。
xlGetDriverConfigハードウェア構成に関する情報を取得します。
取得結果は引数に格納されます。取得結果は引数に格納されます。
上記サンプルコードでは、本情報を元に使用可能な仮想チャンネルを検索しています。
xlOpenPortCAN通信するため、ポートを開きます。
xlCanSetChannelBitrate通信速度を設定します。
上記サンプルコードでは、500kbpsを設定しています。
xlActivateChannelCAN通信を開始します。
引数で指定したチャンネルがCANバスに接続されます。

※エラー時の処理を実装する場合、各ライブラリ関数の戻り値を元にエラー判定可能です。
※サンプルコードでは使用しませんでしたが、上記以外のライブラリ関数を使用して追加設定(アクセプタンスフィルタ、サイレントモード設定等)も可能です。

後がき

CAN通信開始までの初期設定は以上となります。
次回の記事ではCANメッセージの送信/受信について記載したいと思います。

OT

組み込み開発をメインに担当しています

関連記事