メインコンテンツまでスキップ

Microsoft Visual C#版 CANシミュレーションプログラム

画面構成

C#版 CANシミュレーションプログラム
項目説明
Connectボタンクリックすると、PCに接続しているMicroPeckerXが認識されます。
Serial認識したMicroPeckerXのシリアル番号を表示します。
Startボタンクリックすると、モニタリングと定期送信プリセットフレームの送信を開始します。
Stopボタンクリックすると、モニタリングと定期送信プリセットフレームの送信を停止します。
Statusモニタリングと定期送信プリセットフレーム送信の状態を表示します。
Start:動作中 Stop:停止中
Send Slotボタンクリックすると、イベント送信プリセットフレームを送信します。
Change Dataボタンクリックすると、定期送信プリセットフレームのD1を00Hに変更します。
Send Directボタンクリックすると、ダイレクト送信プリセットフレームを送信します。
ログ表示部
(①枠部分)
送受信したログ情報を表示します。
本サンプルでは、1回のログ取得API呼び出しで最大1024件を取得します。
表示リストの保持件数上限は実装していないため、長時間動作させる場合はアプリ側で行数制限や古い行の削除処理を追加してください。
表示内容については「ログ表示部詳細」を参照してください。

ログ表示部詳細

表示内容は以下の通りで、項目の区切り文字はカンマです。

#項目説明
1(項目名なし)タイムスタンプを「sssss.mmmuuu」形式で表示します。
2(項目名なし)ログ方向を表示します。
Rx:受信ログ Tx:送信ログ
3IDCAN IDとIDフォーマットを表示します。CAN IDは16進数で、IDフォーマットは以下でそれぞれ表示します。
Std:標準ID Ext:拡張ID
4DLCデータ長(0~64)を表示します。
5Dataデータ(D1~D64)を16進数で表示します。データの区切り文字はスペースです。

プリセットフレーム

各プリセットフレームの内容は以下の通りです。

フレーム種別SlotプロトコルIDDLData(16進数)
フォーマットCAN IDD1D2D8D64
定期送信プリセットフレーム(※1)1CAN FD標準ID100H640001073F
イベント送信プリセットフレーム2CAN標準ID200H8202127
ダイレクト送信プリセットフレーム-CAN FD拡張ID01234567H8808187

※1:D1のみ、送信ごとにインクリメント(+1)します。

実装例(コメント付きソースコード)

対応元: MPXCtrl_CANFD_CSharp_Sample/MPXCtrl_CANFD_CSharp_Sample/Form1.cs

// 起動時に、配列メンバーも含めて明示初期化する
private void Form1_Load(object sender, EventArgs e)
{
Slots = new StMPXCANSlot[28];
for (int i = 0; i < 28; i++)
{
Slots[i].Increment = new byte[64];
Slots[i].Frame.Data = new byte[64];
}

Logs = new StMPXCANLog[1024];
for (int i = 0; i < 1024; i++) Logs[i].Data = new byte[64];
}

private void StartButton_Click(object sender, EventArgs e)
{
// 1) 本体認識
var info = new StMPXDeviceInfo[1];
byte count = 0;
int ret = MPXCtrl.Open(ref info, 1, ref count);
if (ret != MPXConst.E_OK || count == 0) return;
Serial = info[0].Serial;

// 2) CANパラメータ設定(CH1=SIM、CH2=NONE)
var param = new StMPXCANParam();
param.Mode = MPXConst.MPX_CAN_MODE_SIM;
param.EnableTerminate = MPXConst.MPX_CAN_TERMINATE_ENABLE;
param.ArbitrationBaudrate = MPXConst.MPX_CAN_PARAM_ABR_500K;
param.ArbitrationSamplepoint = MPXConst.MPX_CAN_PARAM_SP_80P;
param.DataBaudrate = MPXConst.MPX_CAN_PARAM_DBR_2M;
param.DataSamplepoint = MPXConst.MPX_CAN_PARAM_SP_80P;
ret = MPXCtrl.CANSetParam(Serial, 1, ref param);
if (ret != MPXConst.E_OK) return;
param.Mode = MPXConst.MPX_CAN_MODE_NONE;
ret = MPXCtrl.CANSetParam(Serial, 2, ref param);
if (ret != MPXConst.E_OK) return;

// 3) ログ取得方式設定
ret = MPXCtrl.SetGetLogMode(Serial, 1, MPXConst.MPX_GETLOGMODE_GETLOGAPI);
if (ret != MPXConst.E_OK) return;

// 4) スロット登録後、モニタ開始
ret = MPXCtrl.CANSetSlot(Serial, 1, Slots, 2);
if (ret != MPXConst.E_OK) return;
ret = MPXCtrl.MonitorStart(Serial, MPXConst.MPX_SYNC_MASTER);
}

private void timer1_Tick(object sender, EventArgs e)
{
// 5) 周期的にログを引き上げて画面表示
ushort count = 0, num = 1024;
byte over = 0;
int ret = MPXCtrl.CANGetLogEx(Serial, 1, ref Logs, num, ref count, ref over);
if (ret != MPXConst.E_OK) timer1.Enabled = false;
}