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

S810-MP-SDK2N からの移行ガイド(CAN/CAN FD)

本ページは、S810-MP-SDK2N で作成した既存アプリケーションを、S810-MX-ADL2N へ置き換えるための移行ガイドです。
対象は CAN/CAN FD のみです(LIN機能は対象外)。

関連リンク

移行の全体像

SDK2N から ADL2N への移行で、実装に影響するポイントは次の5点です。

  1. API命名体系の変更(MPCAN* -> MPX* / MPXCAN*
  2. デバイス指定方式の変更(MPCANOpen 単体 -> MPXOpen 列挙 + Serial 指定)
  3. CANパラメータ設定方式の統合(Simple/Detail -> StMPXCANParam
  4. データ構造の拡張(8byte CAN前提 -> 64byte CAN FD対応)
  5. ログ取得方式の再設計(MPXSetGetLogMode + MPXGetLog/MPXCANGetLogEx

先に確認する移行前提

  • 旧DLL: MPCANCtrl.DLL / MPCANCtrl_x64.DLL
  • 新DLL: MPXCtrlFree.DLL / MPXCtrlFree_x64.DLL
  • 戻り値 ER の数値が一部変更されているため、数値比較コードは要修正

API仕様差分(旧→新)

共通API(旧CAN専用APIからの置換)

旧SDK2N(シグネチャ)新ADL2N(シグネチャ)互換性影響
ER MPCANGetVersion(StMPCANVersion* Version)ER MPXGetAPIVersion(StMPXAPIVersion* Version)構造体名変更
ER MPCANOpen(long* Serial)ER MPXOpen(StMPXDeviceInfo* Devices, unsigned char Num, unsigned char* Count)引数仕様が大きく変更(列挙化)
ER MPCANClose(void)ER MPXClose(void)名称変更
ER MPCANSetLED(unsigned char Red, unsigned char Green, unsigned char GreenBlink)ER MPXSetLED(unsigned long Serial, unsigned char LEDRed, unsigned char LEDGreen, unsigned char LEDGreenBlink, unsigned char LEDYellow, unsigned char LEDYellowBlink)Serial指定追加、引数増加
ER MPCANGetStatus(unsigned short* Status)ER MPXGetStatus(unsigned long Serial, unsigned short* StatusCh1, unsigned short* StatusCh2)Serial指定追加、CH別取得
ER MPCANMonitorStart(void)ER MPXMonitorStart(unsigned long Serial, unsigned char SyncMode)Serial指定 + SyncMode追加
ER MPCANMonitorStop(unsigned long* mSec, unsigned short* uSec)ER MPXMonitorStop(unsigned long Serial, unsigned long* mSec, unsigned short* uSec)Serial指定追加
ER MPCANGetTimeStamp(unsigned long* mSec, unsigned short* uSec)ER MPXGetTimeStamp(unsigned long Serial, unsigned long* mSec, unsigned short* uSec)Serial指定追加
ER MPCANGetLog(StMPCANLog** LogPointer, unsigned long* Count, unsigned char* BufferOver)ER MPXGetLog(unsigned long Serial, unsigned char InnerCh, StMPXLog** Log, unsigned short* Count, unsigned char* BufferOver)Serial/InnerCh追加、Count型変更
-ER MPXSetGetLogMode(unsigned long Serial, unsigned char InnerCh, unsigned char Mode)移行時に新規追加必須
-ER MPXSetLogCallBack(...)コールバック運用時に使用

CAN/CAN FD API

旧SDK2N(シグネチャ)新ADL2N(シグネチャ)仕様差分
ER MPCANSetParamSimple(unsigned char Mode, unsigned char RecvRemote, unsigned char Baudrate, unsigned char SamplePoint)ER MPXCANSetParam(unsigned long Serial, unsigned char InnerCh, StMPXCANParam* Param)Simple廃止、構造体へ統合
ER MPCANSetParamDetail(unsigned char Mode, unsigned char RecvRemote, unsigned short Brg, unsigned char TSeg1, unsigned char TSeg2, unsigned char Sjw, unsigned char Clock)ER MPXCANSetParam(unsigned long Serial, unsigned char InnerCh, StMPXCANParam* Param)Detail廃止、構造体へ統合
ER MPCANGetLogEx(StMPCANLog* Log, unsigned long* Num, unsigned long* Count, unsigned char* BufferOver)ER MPXCANGetLogEx(unsigned long Serial, unsigned char InnerCh, StMPXCANLog* Log, unsigned short Num, unsigned short* Count, unsigned char* BufferOver)Serial/InnerCh追加、Num/Count型変更
ER MPCANSetSlot(StMPCANSlot* Slot, unsigned char Num)ER MPXCANSetSlot(unsigned long Serial, unsigned char InnerCh, StMPXCANSlot* Slots, unsigned char SlotCount)スロット構造体が拡張
ER MPCANChangeSlotData(unsigned char SlotNo, unsigned char Ena, unsigned char* Data)ER MPXCANChangeSlot(unsigned long Serial, unsigned char InnerCh, unsigned char SlotNo, unsigned char SlotEnabled, unsigned char ReqInfo, StMPXCANFrame* Frame)変更対象がデータのみから「要求種別 + フレーム全体」へ
ER MPCANSendSlot(unsigned char SlotNo)ER MPXCANSendSlot(unsigned long Serial, unsigned char InnerCh, unsigned char SlotNo)Serial/InnerCh追加
ER MPCANSendDirect(StMPCANFrame Frame) / ER MPCANSendDirectEx(StMPCANFrame* Frame)ER MPXCANDirectSend(unsigned long Serial, unsigned char InnerCh, StMPXCANDirect* Frame)Protocol/BRSを含む送信情報へ変更

構造体レベルの移行ポイント

フレーム構造体

  • 旧: StMPCANFrame
    • Id, IdFormat, Rtr, Dlc, Data[8]
  • 新: StMPXCANFrame + StMPXCANFrameType
    • IDStMPXCANID
    • DL(0..8,12,16,20,24,32,48,64)
    • Data[64]
    • FrameType.Option.Protocol(CAN/CAN FD)
    • FrameType.Option.BRS(CAN FD時)

パラメータ構造体

SDK2Nの SetParamSimple/Detail の設定は、ADL2Nでは StMPXCANParam に集約します。

旧設定新設定先
ModeStMPXCANParam.Mode
BaudrateStMPXCANParam.ArbitrationBaudrate
SamplePointStMPXCANParam.ArbitrationSamplepoint
RecvRemote直接対応なし(受信制御は新仕様に合わせて運用見直し)
Brg/TSeg1/TSeg2/Sjw/Clock直接値指定は不可。定義済みパラメータへ再設計
-EnableTerminate(終端抵抗)
-DataBaudrate/DataSamplepoint(CAN FD)

MPCANSetParamDetail を使っていた場合は、まず SetParamSimple 相当の運用(定義済みの通信速度/サンプルポイント)へ寄せるのが安全です。
Brg/TSeg1/TSeg2/Sjw/Clock の完全な直接移植はできないため、以下の方針で対応してください。

  1. 旧設定の実効ボーレートに最も近い MPX_CAN_PARAM_ABR_* を選択する
  2. 旧設定のサンプルポイントに近い MPX_CAN_PARAM_SP_* を選択する
  3. 実機評価で許容誤差内か確認する

ビットタイミングを厳密に一致させる必要がある場合は、サポート窓口への確認を推奨します。

スロット構造体(StMPCANSlot -> StMPXCANSlot)

旧 StMPCANSlot新 StMPXCANSlot備考
EnabledFrameType.Enabled階層化
EventKindFrameType.FrameType階層化
Delay (unsigned short)msSendDelay (unsigned long)型拡張
Cycle (unsigned short)msSendCycle (unsigned long)型拡張
Offset (unsigned short)msSendOffset (unsigned long)型拡張
Count (unsigned short)SendCounter (unsigned short)名称変更
Increment (unsigned char)Increment[64]8bitフラグから配列へ変更
-SlotNo新設(1~28)
-TriggerType / TriggerID新設(受信トリガ)
-msMinTransInterval / usMinTransInterval新設(最小送信間隔)
-usSendDelay / usSendOffset / usSendCycle新設(us指定)

ADL2Nではスロット上限が 24 -> 28 に拡張されています。

EventKind(フレーム種別)値の変更

SDK2NADL2N
CAN_EVENT_PERIODIC0MPX_CAN_FRAME_TYPE_PERIODIC0
--MPX_CAN_FRAME_TYPE_PERIODIC_TRIGGER1
CAN_EVENT_EVENT1MPX_CAN_FRAME_TYPE_EVENT2
CAN_EVENT_EVENTPERIODIC2MPX_CAN_FRAME_TYPE_EVENTPERIODIC3

EVENT=1EVENTPERIODIC=2 を数値直書きしている既存コードは、必ず定数置換してください。
旧値のままでは ADL2N で別のフレーム種別として扱われます。

StMPXCANFrameType / StMPXCANFrame の設定要点

SDK2N では Enabled / EventKind / Frame をフラットに設定しましたが、ADL2N では階層化されています。

// SDK2N
slot.Enabled = CAN_SLOT_ENA;
slot.EventKind = CAN_EVENT_PERIODIC;
slot.Frame.Id = 0x100;
slot.Frame.IdFormat = CAN_ID_STD;
slot.Frame.Rtr = CAN_RTR_DATA;
slot.Frame.Dlc = 8;

// ADL2N
slot.FrameType.Enabled = MPX_CAN_SLOT_ENABLE;
slot.FrameType.FrameType = MPX_CAN_FRAME_TYPE_PERIODIC;
slot.FrameType.Option.Protocol = MPX_CAN_PROTOCOL_CAN; // CAN FD時は MPX_CAN_PROTOCOL_CANFD
slot.FrameType.Option.BRS = MPX_CAN_BRS_DISABLE; // CAN FD時のみ有効
slot.FrameType.Option.ErrorAction = MPX_CAN_ERR_BEHAVIOR_ACTIVE;

slot.Frame.ID.ID = 0x100;
slot.Frame.ID.IDE = MPX_CAN_IDE_STD;
slot.Frame.ID.RTR = MPX_CAN_RTR_DATA;
slot.Frame.DL = 8;

Increment フィールド移行

旧SDK2Nは 8bit のビットフラグ方式でしたが、ADL2Nは Increment[64] の配列方式です。

// SDK2N: ビットフラグ形式(例: Data1, Data3 をインクリメント)
// slot.Increment = 0x05;

// ADL2N: 配列形式
for (int i = 0; i < 64; i++) {
slot.Increment[i] = MPX_CAN_SIM_INC_FALSE;
}
slot.Increment[0] = MPX_CAN_SIM_INC_TRUE; // D1
slot.Increment[2] = MPX_CAN_SIM_INC_TRUE; // D3

ログ構造体(StMPCANLog -> StMPXCANLog)

旧 StMPCANLog新 StMPXCANLog備考
mSecmSec同等
uSecuSec同等
DirDir同等
ErrError + ErrorInfo詳細化
Frame.IdIDフラット化
Frame.IdFormatIDE名称変更
Frame.RtrRTRフラット化
Frame.DlcDLCAN FD対応
Frame.Data[8]Data[64]サイズ拡張
-Protocol新設(CAN/CAN FD識別)

バッファ設計は旧8byte前提から見直してください。

戻り値(ER)差分

旧SDK2N新ADL2N備考
E_OK=0E_OK=0同じ
E_PARAM=1E_PARAM=1同じ
E_DEVICE=2E_DEVICE=2同じ
E_COMM=3E_COMM=3同じ
E_TGT=4E_TGT=4同じ
E_SLT_BUSY=5-廃止
-E_TRG_BUSY=11新設
E_DCT_FULL=6E_DCT_FULL=12値変更
E_STS=7E_STATUS=105値変更
E_OTHER=8E_OTHER=255値変更
-E_TIMEOUT=202新設

実装手順(既存アプリ置換フロー)

  1. DLL参照名を更新(MPCANCtrl* -> MPXCtrlFree*
  2. MPCANOpenMPXOpen に置換し、Serial 管理ロジックを導入
  3. MPCANSetParamSimple/Detail 呼び出しを MPXCANSetParam へ統合
  4. フレーム/スロット構造体を StMPXCAN* 系へ置換
  5. MPCANGetLogExMPXCANGetLogEx へ置換し、Num/Count の型を見直し
  6. MPCANChangeSlotData の呼び出し意図を MPXCANChangeSlotReqInfo へ反映
  7. ER の分岐値を新定義へ更新

言語別 置換例

C/C++ 置換例

// SDK2N
long serial = 0;
ER er = MPCANOpen(&serial);
er = MPCANSetParamSimple(CAN_MODE_MONITOR, CAN_REMOTE_DIS, CAN_PARAM_BR_500K, CAN_PARAM_SP_80P);

// ADL2N
StMPXDeviceInfo devices[8] = {};
unsigned char count = 0;
ER er = MPXOpen(devices, 8, &count);
unsigned long serial = (count > 0) ? devices[0].Serial : 0;

StMPXCANParam param = {};
param.EnableTerminate = MPX_CAN_TERMINATE_ENABLE;
param.Mode = MPX_CAN_MODE_MONITOR;
param.ArbitrationBaudrate = MPX_CAN_PARAM_ABR_500K;
param.ArbitrationSamplepoint = MPX_CAN_PARAM_SP_80P;
param.DataBaudrate = MPX_CAN_PARAM_DBR_2M; // CAN FDを使わない場合は適切な値に設定
param.DataSamplepoint = MPX_CAN_PARAM_SP_80P;

unsigned char innerCh = 1; // 対象CH(製品仕様に合わせて設定)
er = MPXCANSetParam(serial, innerCh, &param);
er = MPXSetGetLogMode(serial, innerCh, MPX_GETLOGMODE_GETLOGAPI); // 移行時に新規追加

C/C++ CANシミュレーション置換例(SetSlot〜開始)

// SDK2N(例)
StMPCANSlot oldSlots[2] = {};
oldSlots[0].Enabled = CAN_SLOT_ENA;
oldSlots[0].EventKind = CAN_EVENT_PERIODIC;
oldSlots[0].Frame.Id = 0x100;
oldSlots[0].Frame.IdFormat = CAN_ID_STD;
oldSlots[0].Frame.Rtr = CAN_RTR_DATA;
oldSlots[0].Frame.Dlc = 8;
oldSlots[0].Cycle = 100;
MPCANSetSlot(oldSlots, 2);
MPCANMonitorStart();

// ADL2N(例)
StMPXCANParam simParam = {};
simParam.EnableTerminate = MPX_CAN_TERMINATE_ENABLE;
simParam.Mode = MPX_CAN_MODE_SIM;
simParam.ArbitrationBaudrate = MPX_CAN_PARAM_ABR_500K;
simParam.ArbitrationSamplepoint = MPX_CAN_PARAM_SP_80P;
simParam.DataBaudrate = MPX_CAN_PARAM_DBR_2M;
simParam.DataSamplepoint = MPX_CAN_PARAM_SP_80P;
MPXCANSetParam(serial, innerCh, &simParam);

StMPXCANSlot slots[2] = {};
slots[0].FrameType.Enabled = MPX_CAN_SLOT_ENABLE;
slots[0].FrameType.FrameType = MPX_CAN_FRAME_TYPE_PERIODIC;
slots[0].FrameType.Option.Protocol = MPX_CAN_PROTOCOL_CAN;
slots[0].FrameType.Option.BRS = MPX_CAN_BRS_DISABLE;
slots[0].FrameType.Option.ErrorAction = MPX_CAN_ERR_BEHAVIOR_ACTIVE;
slots[0].msSendCycle = 100;
slots[0].SendCounter = 0; // 無制限
slots[0].Frame.ID.ID = 0x100;
slots[0].Frame.ID.IDE = MPX_CAN_IDE_STD;
slots[0].Frame.ID.RTR = MPX_CAN_RTR_DATA;
slots[0].Frame.DL = 8;
slots[0].Frame.Data[0] = 0x01;
for (int i = 0; i < 64; i++) {
slots[0].Increment[i] = MPX_CAN_SIM_INC_FALSE;
}
slots[0].Increment[0] = MPX_CAN_SIM_INC_TRUE; // D1のみインクリメント

slots[1].FrameType.Enabled = MPX_CAN_SLOT_ENABLE;
slots[1].FrameType.FrameType = MPX_CAN_FRAME_TYPE_EVENT;
slots[1].FrameType.Option.Protocol = MPX_CAN_PROTOCOL_CAN;
slots[1].FrameType.Option.BRS = MPX_CAN_BRS_DISABLE;
slots[1].FrameType.Option.ErrorAction = MPX_CAN_ERR_BEHAVIOR_ACTIVE;
slots[1].Frame.ID.ID = 0x200;
slots[1].Frame.ID.IDE = MPX_CAN_IDE_STD;
slots[1].Frame.ID.RTR = MPX_CAN_RTR_DATA;
slots[1].Frame.DL = 8;

MPXCANSetSlot(serial, innerCh, slots, 2);
MPXMonitorStart(serial, MPX_SYNC_MASTER);

C#(P/Invoke)置換例

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct StMPXDeviceInfo
{
public uint Serial;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] Model;
}

[DllImport("MPXCtrlFree.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MPXOpen(
[In, Out] StMPXDeviceInfo[] devices,
byte num,
ref byte count);

[DllImport("MPXCtrlFree.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MPXCANSetParam(
uint serial,
byte innerCh,
ref StMPXCANParam param);

[DllImport("MPXCtrlFree.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MPXSetGetLogMode(
uint serial,
byte innerCh,
byte mode);

// SDK2NのMPCANOpen/MPCANSetParamSimpleの置換イメージ
var devices = new StMPXDeviceInfo[8];
byte count = 0;
int er = MPXOpen(devices, (byte)devices.Length, ref count);
uint serial = count > 0 ? devices[0].Serial : 0;
byte innerCh = 1;
er = MPXSetGetLogMode(serial, innerCh, 1); // MPX_GETLOGMODE_GETLOGAPI

C#(P/Invoke)CANシミュレーション置換の要点

// 1) SIMモードで Param 設定
param.Mode = MPX_CAN_MODE_SIM;
er = MPXCANSetParam(serial, innerCh, ref param);

// 2) Slot 設定(FrameType と Frame.ID のネストを設定)
slots[0].FrameType.Enabled = MPX_CAN_SLOT_ENABLE;
slots[0].FrameType.FrameType = MPX_CAN_FRAME_TYPE_PERIODIC;
slots[0].FrameType.Option.Protocol = MPX_CAN_PROTOCOL_CAN;
slots[0].Frame.ID.ID = 0x100;
slots[0].Frame.ID.IDE = MPX_CAN_IDE_STD;
slots[0].Frame.ID.RTR = MPX_CAN_RTR_DATA;
slots[0].Frame.DL = 8;
slots[0].Increment[0] = MPX_CAN_SIM_INC_TRUE;

er = MPXCANSetSlot(serial, innerCh, slots, (byte)slots.Length);

// 3) モニタ開始(スロット送信開始)
er = MPXMonitorStart(serial, MPX_SYNC_MASTER);

.NETラッパDLL(MPXCtrldotNET40Free*.dll)を使用する場合も、置換対象APIの考え方は同じです。

Excel VBA 置換例

' SDK2N
Declare PtrSafe Function MPCANOpen Lib "MPCANCtrl_x64.DLL" (ByRef Serial As Long) As Long
Declare PtrSafe Function MPCANSetParamSimple Lib "MPCANCtrl_x64.DLL" (ByVal Mode As Byte, ByVal RcvRemote As Byte, ByVal Baudrate As Byte, ByVal SamplePoint As Byte) As Long

' ADL2N
Declare PtrSafe Function MPXOpen Lib "MPXCtrlFree_x64.DLL" (ByRef Devices As StMPXDeviceInfo, ByVal Num As Byte, ByRef Count As Byte) As Long
Declare PtrSafe Function MPXCANSetParam Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByVal InnerCh As Byte, ByRef Param As StMPXCANParam) As Long
Declare PtrSafe Function MPXSetGetLogMode Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByVal InnerCh As Byte, ByVal Mode As Byte) As Long

VBAでは旧版と同様に、MPXGetLog / MPXSetLogCallBack は直接利用しない構成が前提です。
ログ取得は MPXCANGetLogEx を使用してください。

Excel VBA CANシミュレーション置換の要点

' 1) SIMモード設定
Param.Mode = MPX_CAN_MODE_SIM
Ret = MPXCANSetParam(Serial, InnerCh, Param)

' 2) スロット設定
Slots(0).FrameType.Enabled = MPX_CAN_SLOT_ENABLE
Slots(0).FrameType.FrameType = MPX_CAN_FRAME_TYPE_PERIODIC
Slots(0).FrameType.Option.Protocol = MPX_CAN_PROTOCOL_CAN
Slots(0).Frame.ID.ID = &H100
Slots(0).Frame.ID.IDE = MPX_CAN_IDE_STD
Slots(0).Frame.ID.RTR = MPX_CAN_RTR_DATA
Slots(0).Frame.DL = 8
Slots(0).Increment(0) = MPX_CAN_SIM_INC_TRUE

Ret = MPXCANSetSlot(Serial, InnerCh, Slots(0), 2)

' 3) 開始
Ret = MPXMonitorStart(Serial, MPX_SYNC_MASTER)

差分の大きいAPIの置換指針

MPCANChangeSlotData -> MPXCANChangeSlot

旧APIは「指定スロットのData更新」が中心でした。
新APIは ReqInfo で「データ更新のみ」「トリガ要求のみ」「両方」を明示します。

  • MPX_CAN_SLOT_REQ_NONE
  • MPX_CAN_SLOT_REQ_DATA
  • MPX_CAN_SLOT_REQ_TRG
  • MPX_CAN_SLOT_REQ_DATA_TRG

既存処理の意図に応じて ReqInfo を選択してください。

MPCANSendDirect/Ex -> MPXCANDirectSend

新APIでは、送信フレームに対して StMPXCANDirect を使い、以下を明示します。

  • Protocol(CAN / CAN FD)
  • BRS(CAN FD時)
  • DL(0..8,12..64)

StMPCANFrame をそのまま流用せず、StMPXCANFrameTypeStMPXCANFrame を組み立ててください。

移行チェックリスト

  • DLL名を MPCANCtrl* から MPXCtrlFree* に変更した
  • MPCANOpenMPXOpenDevices/Num/Count)へ置換した
  • すべての新API呼び出しで SerialInnerCh を正しく指定した
  • MPCANSetParamSimple/DetailMPXCANSetParam に統合した
  • StMPCANFrame/Slot/LogStMPXCAN* 系へ置換した
  • EventKind の値依存実装(1/2の直書き)を MPX_CAN_FRAME_TYPE_* に置換した
  • CANシミュレーション開始フローを SetParam(SIM) -> SetSlot -> MonitorStart へ置換した
  • MPCANGetLogExMPXCANGetLogEx へ置換し、unsigned short サイズでバッファ設計した
  • MPCANChangeSlotDataMPXCANChangeSlot に置換し、ReqInfo を設計した
  • 旧ERコードの数値判定ロジックを新定義に更新した
  • CAN FD利用時の Protocol / BRS / DL / Data[64] を確認した

関連ページ