Microsoft Visual 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:送信ログ |
| 3 | ID | CAN IDとIDフォーマットを表示します。CAN IDは16進数で、IDフォーマットは以下でそれぞれ表示します。 Std:標準ID Ext:拡張ID |
| 4 | DLC | データ長(0~64)を表示します。 |
| 5 | Data | データ(D1~D64)を16進数で表示します。データの区切り文字はスペースです。 |
プリセットフレーム
各プリセットフレームの内容は以下の通りです。
| フレーム種別 | Slot | プロトコル | ID | DL | Data(16進数) | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| フォーマット | CAN ID | D1 | D2 | … | D8 | … | D64 | ||||
| 定期送信プリセットフレーム(※1) | 1 | CAN FD | 標準ID | 100H | 64 | 00 | 01 | … | 07 | … | 3F |
| イベント送信プリセットフレーム | 2 | CAN | 標準ID | 200H | 8 | 20 | 21 | … | 27 | ||
| ダイレクト送信プリセットフレーム | - | CAN FD | 拡張ID | 01234567H | 8 | 80 | 81 | … | 87 | ||
※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;
}