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

複数台制御スタートガイド

本ページは、MicroPeckerX を複数台(2台以上)同時に制御するための実装ガイドです。
ポイントは、MPXOpen で取得した Serial を各APIに正しく渡し、開始/停止順序をそろえることです。

対象と前提

  • 本体認識は MPXOpen(Devices, Num, Count) を使用
  • 各APIは Serial 指定で個別本体を操作
  • ログ取得は MPXSetGetLogMode + MPXGetLog / MPXCANGetLogEx / MPXLINGetLogEx
  • MPXOpen で同時認識できる本体数は最大4台

実装フロー(共通)

  1. MPXOpen で本体一覧を取得
  2. Devices[i].Serial から役割を決定(例: Master/Slave)
  3. 各本体に通信パラメータを設定
  4. 各本体にログ取得モードを設定
  5. MPXMonitorStartスレーブ側 -> マスター側 の順で実行
  6. ログ取得ループを本体ごとに実行
  7. MPXMonitorStopマスター側 -> スレーブ側 の順で実行
  8. MPXClose で終了

重要ルール(複数台時)

  • 開始順序: スレーブ側を先に開始し、最後にマスター側を開始
  • 停止順序: マスター側を先に停止し、最後にスレーブ側を停止
  • 役割管理: 配列インデックスではなく Serial を識別子として管理

CAN/LIN 差分早見表

  • 通信パラメータ設定:
    • CAN/CAN FD: MPXCANSetParam + StMPXCANParam
    • LIN: MPXLINSetParam + StMPXLINParam
  • チャンネル指定:
    • CAN/CAN FD: InnerCh=1/2
    • LIN: MPXLINSetParam では InnerCh 指定なし
  • ログ取得:
    • CAN/CAN FD: MPXCANGetLogEx + StMPXCANLog
    • LIN: MPXLINGetLogEx + StMPXLINLog

通信パラメータ設定例

// CAN/CAN FD: CH1/CH2の両方に設定を行う
StMPXCANParam p1 = {};
StMPXCANParam p2 = {};
p1.EnableTerminate = MPX_CAN_TERMINATE_ENABLE;
p1.Mode = MPX_CAN_MODE_MONITOR; // CH1はモニタモードで動作
p1.ArbitrationBaudrate = MPX_CAN_PARAM_ABR_500K;
p1.ArbitrationSamplepoint = MPX_CAN_PARAM_SP_80P;
p1.DataBaudrate = MPX_CAN_PARAM_DBR_2M;
p1.DataSamplepoint = MPX_CAN_PARAM_SP_80P;
p2 = p1;
p2.Mode = MPX_CAN_MODE_NONE; // CH2は動作なし

MPXCANSetParam(serialSlave, 1, &p1);
MPXCANSetParam(serialSlave, 2, &p2);
MPXCANSetParam(serialMaster, 1, &p1);
MPXCANSetParam(serialMaster, 2, &p2);

MPXSetGetLogMode(serialSlave, 1, MPX_GETLOGMODE_GETLOGAPI);
MPXSetGetLogMode(serialMaster, 1, MPX_GETLOGMODE_GETLOGAPI);

C/C++ 完全実装例(要点)

MPXMonitorStart(serialSlave, MPX_SYNC_SLAVE);
MPXMonitorStart(serialMaster, MPX_SYNC_MASTER);

StMPXCANLog logMaster[256] = {};
StMPXCANLog logSlave[256] = {};
unsigned short cntMaster = 0;
unsigned short cntSlave = 0;
unsigned char ovMaster = 0;
unsigned char ovSlave = 0;

for (;;) {
MPXCANGetLogEx(serialMaster, 1, logMaster, 256, &cntMaster, &ovMaster);
MPXCANGetLogEx(serialSlave, 1, logSlave, 256, &cntSlave, &ovSlave);
Sleep(1);
}

unsigned long ms = 0;
unsigned short us = 0;
MPXMonitorStop(serialMaster, &ms, &us);
MPXMonitorStop(serialSlave, &ms, &us);
MPXClose();

C#(P/Invoke)実装例(要点)

var p1 = new StMPXCANParam();
var p2 = new StMPXCANParam();

MPXCANSetParam(serialSlave, 1, ref p1);
MPXCANSetParam(serialSlave, 2, ref p2);
MPXCANSetParam(serialMaster, 1, ref p1);
MPXCANSetParam(serialMaster, 2, ref p2);

Excel VBA 実装例(要点)

Ret = MPXCANSetParam(SerialSlave, 1, Param1)
Ret = MPXCANSetParam(SerialSlave, 2, Param2)
Ret = MPXCANSetParam(SerialMaster, 1, Param1)
Ret = MPXCANSetParam(SerialMaster, 2, Param2)

よくある失敗

  • devices[0] を固定でMaster扱いしてしまう(認識順は不定)
  • MPXOpenNum に配列サイズを渡していない
  • Count 未確認のまま devices[1] へアクセスしている
  • 複数台時の開始順序/停止順序が逆
  • CANで InnerCh=1/2 の両方を設定していない
  • LINで MPXLINSetParam を3引数で呼び出している

関連ページ