こんにちは、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
以下、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 | ハードウェア構成に関する情報を取得します。 取得結果は引数に格納されます。取得結果は引数に格納されます。 上記サンプルコードでは、本情報を元に使用可能な仮想チャンネルを検索しています。 |
xlOpenPort | CAN通信するため、ポートを開きます。 |
xlCanSetChannelBitrate | 通信速度を設定します。 上記サンプルコードでは、500kbpsを設定しています。 |
xlActivateChannel | CAN通信を開始します。 引数で指定したチャンネルがCANバスに接続されます。 |
※エラー時の処理を実装する場合、各ライブラリ関数の戻り値を元にエラー判定可能です。
※サンプルコードでは使用しませんでしたが、上記以外のライブラリ関数を使用して追加設定(アクセプタンスフィルタ、サイレントモード設定等)も可能です。
CAN通信開始までの初期設定は以上となります。
次回の記事ではCANメッセージの送信/受信について記載したいと思います。
関連記事
-
第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~
こんにちは、GTです。よろしくお願いします。 最近業務でラズパイのBluetooth機能を使...
公開日:2021.12.24 更新日:2021.12.24
tag : Bluetooth Raspberry Pi
-
-
-
第1回 Visual C++で作成したDLL内のクラスをC#で利用する方法
こんにちは、ILCです。 Visual C++ (以下 VC++)で作成されたDynamic...
公開日:2024.01.19 更新日:2024.01.19
tag : Windows
-
こんにちは、TMIHです。 今回から組み込み系のソフトウェア設計標準規格である、MISRA-...
公開日:2022.02.25 更新日:2022.02.25
-
第3回 ラズパイを使用したBLE通信 ~ A/D変換・D/A変換を用いた入出力編 ~
こんにちは、GTです。よろしくお願いします。 第3回の今回は、ラズパイの入出力についてご紹介...
公開日:2023.02.24 更新日:2023.02.24
tag : Bluetooth BLE Raspberry Pi