Microsoft Visual C++版 CANシミュレーションプログラム
画面構成
| 項目 | 説明 |
|---|---|
| Startボタン | クリックすると、モニタリングと定期送信プリセットフレームの送信を開始します。 |
| Stopボタン | クリックすると、モニタリングと定期送信プリセットフレームの送信を停止します。 |
| ログ表示部 (①枠部分) | 送受信したログ情報を表示します。 最大で100件のログ情報が保持され、それを超える場合は古いログ情報から順にクリアされます。 ただし、モニタリングを停止した後に再度開始すると、それまでのログ情報は全てクリアされます。 表示内容については「ログ表示部詳細」を参照してください。 |
| ChangeDataボタン | クリックすると、定期送信プリセットフレームのデータ(D1~D64)をインクリメント(+1)します。 |
| SlotSendボタン | クリックすると、イベント送信プリセットフレームを送信します。 |
| DirectSendボタン | クリックすると、ダイレクト送信プリセットフレームを送信します。 |
ログ表示部詳細
| 項目 | 説明 |
|---|---|
| msec | タイムスタンプ(ミリ秒)を表示します。 |
| usec | タイムスタンプ(マイクロ秒)を表示します。 |
| Dir | ログ方向を表示します。 Rx:受信ログ Tx:送信ログ |
| Format | IDフォーマットを表示します。 Std:標準ID Ext:拡張ID |
| ID | CAN IDを16進数で表示します。 |
| DL | データ長(0~64)を表示します。 |
| Data | データ(D1~D64)を16進数で表示します。データの区切り文字はカンマです。 |
プリセットフレーム
各プリセットフレームの内容は以下の通りです。
| フレーム種別 | Slot | ID | DL | Data(16進数) | |||||
|---|---|---|---|---|---|---|---|---|---|
| フォーマット | CAN ID | D1 | D2 | D3 | … | D64 | |||
| 定期送信プリセットフレーム(※1) | 0 | 標準ID | 100H | 64 | 10H | 10H | 10H | … | 10H |
| イベント送信プリセットフレーム(※1) | 1 | 標準ID | 200H | 64 | 20H | 20H | 20H | … | 20H |
| ダイレクト送信プリセットフレーム | - | 拡張ID | 01234567H | 64 | 00H | 04H | 08H | … | FCH |
※1:D1~D64で全て同じ値となります。
エラー処理
以下の場合はエラーとし、エラーダイアログを表示してプログラムを終了します。
- プログラムの起動時にMicroPeckerXが認識できなかった場合
- モニタリングの開始/終了時やモニタリング中にAPIの呼び出しが失敗した場合
実装例(コメント付きソースコード)
対応元: MPXCtrl_CANFD_CPP_SimSample/MPXCtrl_CANFD_CPP_SimSample/Form1.h
StMPXCANSlot slots[2] = {};
// 1) Open
StMPXDeviceInfo devices[1] = {};
unsigned char count = 0;
ER ret = MPXOpen(devices, 1, &count);
if (ret != E_OK || count == 0) return;
unsigned long serial = devices[0].Serial;
// 2) CH1をSIM、CH2をNONEで設定
StMPXCANParam p = {};
p.Mode = MPX_CAN_MODE_SIM;
p.ArbitrationBaudrate = MPX_CAN_PARAM_ABR_500K;
p.ArbitrationSamplepoint = MPX_CAN_PARAM_SP_80P;
p.DataBaudrate = MPX_CAN_PARAM_DBR_2M;
p.DataSamplepoint = MPX_CAN_PARAM_SP_80P;
p.EnableTerminate = MPX_CAN_TERMINATE_ENABLE;
ret = MPXCANSetParam(serial, 1, &p);
if (ret != E_OK) return;
p.Mode = MPX_CAN_MODE_NONE;
ret = MPXCANSetParam(serial, 2, &p);
if (ret != E_OK) return;
// 3) スロット定義(定期送信+イベント送信)
for (int i = 0; i < 2; i++) {
slots[i].SlotNo = i + 1;
slots[i].FrameType.Enabled = MPX_CAN_SLOT_ENABLE;
slots[i].FrameType.Option.Protocol = MPX_CAN_PROTOCOL_CANFD;
slots[i].FrameType.Option.BRS = MPX_CAN_BRS_ENABLE;
slots[i].Frame.ID.IDE = MPX_CAN_IDE_STD;
slots[i].Frame.ID.RTR = MPX_CAN_RTR_DATA;
slots[i].Frame.DL = 64;
for (int j = 0; j < 64; j++) slots[i].Frame.Data[j] = (i + 1) * 0x10;
}
slots[0].Frame.ID.ID = 0x100;
slots[0].FrameType.FrameType = MPX_CAN_FRAME_TYPE_PERIODIC;
slots[1].Frame.ID.ID = 0x200;
slots[1].FrameType.FrameType = MPX_CAN_FRAME_TYPE_EVENT;
ret = MPXCANSetSlot(serial, 1, slots, 2);
if (ret != E_OK) return;
// 4) ログ設定と開始
MPXSetGetLogMode(serial, 1, MPX_GETLOGMODE_GETLOGAPI);
ret = MPXMonitorStart(serial, MPX_SYNC_MASTER);
if (ret != E_OK) return;
// 5) ボタン動作
// ChangeData: slot1データを書き換えて再設定
for (int i = 0; i < 64; i++) slots[0].Frame.Data[i] += 1;
MPXCANChangeSlot(serial, 1, 1, MPX_CAN_SLOT_ENABLE, MPX_CAN_SLOT_REQ_DATA, &slots[0].Frame);
// SlotSend: イベント送信スロットを即時送信
MPXCANSendSlot(serial, 1, 2);
// DirectSend: PC主導で1フレーム即時送信
StMPXCANDirect direct = {};
direct.FrameType.Option.Protocol = MPX_CAN_PROTOCOL_CANFD;
direct.Frame.ID.IDE = MPX_CAN_IDE_EXT;
direct.Frame.ID.ID = 0x01234567;
direct.Frame.DL = 8;
ret = MPXCANDirectSend(serial, 1, &direct);