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

S810-MP-SDK3N からの移行ガイド(LIN)

本ページは、旧ライブラリ S810-MP-SDK3N(LIN専用)で作成したアプリケーションを、S810-MX-ADL2N に移行するための実装ガイドです。
既存コードを置き換える視点で、API仕様レベルの差分を整理します。

関連リンク

移行の全体像

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

  1. MPLINCtrl*.DLLMPXCtrlFree*.DLL に変更する
  2. MPLINOpenMPXOpen に置き換え、Serial 管理を実装する
  3. MPLINSetParamMPXLINSetParamStMPXLINParam)へ置換する
  4. LIN_FRM_*(0-3)を MPX_LIN_FRAME_TYPE_*(3-6)に置換する
  5. StMPLINFrame / StMPLINMasterSimItem / StMPLINLog の構造体差分を反映する
  6. ログ取得を MPXSetGetLogMode + MPXLINGetLogEx に変更する
  7. MPXSetGetLogModeInnerCh には MPX_INNERCH_LIN(1)を指定する
  8. SetMasterItem / SetSlaveItem の実装を SetChange に分割する
  9. 旧ERコード(E_MODE, E_STS など)前提の分岐を新ERコードに更新する
  10. マスターシミュレーション開始時は SetMasterSim 後に SetMasterSchedule を実行する

先に確認する移行前提

  • 旧DLL: MPLINCtrl.DLL / MPLINCtrl_x64.DLL
  • 新DLL: MPXCtrlFree.DLL / MPXCtrlFree_x64.DLL
  • MPXLINSetParam(Serial, Param) の2引数
  • MPXSetGetLogModeInnerChMPX_INNERCH_LIN(1)を指定

API仕様差分(旧→新)

基本制御・共通

SDK3NADL2N変更内容
MPLINGetVersion(StMPLINVersion*)MPXGetAPIVersion(StMPXAPIVersion*)API名/構造体名変更
MPLINOpen(long* Serial)MPXOpen(StMPXDeviceInfo* Devices, unsigned char Num, unsigned char* Count)単体Openから列挙方式へ変更
MPLINClose()MPXClose()API名変更
MPLINSetLED(Red, Green, GreenBlink)MPXSetLED(Serial, LEDRed, LEDGreen, LEDGreenBlink, LEDYellow, LEDYellowBlink)Serial指定追加、引数拡張
MPLINGetStatus(unsigned short* Status)MPXGetStatus(Serial, unsigned short* StatusCh1, unsigned short* StatusCh2)CH別取得へ変更
MPLINMonitorStart()MPXMonitorStart(Serial, SyncMode)Serial/SyncMode追加
MPLINMonitorStop(unsigned long* mSec, unsigned short* uSec)MPXMonitorStop(Serial, unsigned long* mSec, unsigned short* uSec)Serial追加
MPLINGetTimeStamp(unsigned long* mSec, unsigned short* uSec)MPXGetTimeStamp(Serial, unsigned long* mSec, unsigned short* uSec)Serial追加

ログ取得

SDK3NADL2N変更内容
MPLINGetLog(StMPLINLog** LogPointer, unsigned long* Count, unsigned char* BufferOver)MPXGetLog(Serial, InnerCh, StMPXLog** Log, unsigned short* Count, unsigned char* BufferOver)共通ログ化、Serial/InnerCh追加、Count型変更
MPLINGetLogEx(StMPLINLog* Log, unsigned long* Num, unsigned long* Count, unsigned char* BufferOver)MPXLINGetLogEx(Serial, StMPXLINLog* Log, unsigned short Num, unsigned short* Count, unsigned char* BufferOver)Serial追加、Num/Count型変更
なしMPXSetGetLogMode(Serial, InnerCh, Mode)ログ取得方式設定が必須化

LIN設定・シミュレーション

SDK3NADL2N変更内容
MPLINSetParam(Mode, Baudrate, SyncBreak, Delimiter, HeaderSpace, ResponseSpace, ByteSpace, WakeupWidth, SleepTime, LINIDSetting, LINRev)MPXLINSetParam(Serial, StMPXLINParam* Param)多数引数から構造体1本へ統合
MPLINSetLINStatus(Status)MPXLINSetStatus(Serial, Status)Serial追加
MPLINSetMasterSim(SchNo, Ena, OneTime, MasterSim, Num)MPXLINSetMasterSim(Serial, SchNo, MasterSim, Num)Ena/OneTimeの責務が別APIへ分離
MPLINSetSchedule(SchNo, Ena, OneTime)MPXLINSetMasterSchedule(Serial, SchNo, Ena, OneTime)API名/引数変更
MPLINChangeSchedule(SchNo)MPXLINChangeMasterSchedule(Serial, SchNo)API名/引数変更
なしMPXLINPauseMasterSchedule(Serial, Ena)スケジュール停止/再開APIを新設
MPLINSetMasterItem(SchNo, ItemNo, MasterSimItem)MPXLINSetMasterItem(Serial, SchNo, ItemNo, Ena) + MPXLINChangeMasterItem(Serial, SchNo, ItemNo, MasterSimItem)有効/無効と内容変更を分離
MPLINSetSlaveSim(SlaveSim)MPXLINSetSlaveSim(Serial, SlaveSim)Serial追加
MPLINSetSlaveItem(SlaveSimItem)MPXLINSetSlaveItem(Serial, ResponseID, Ena) + MPXLINChangeSlaveItem(Serial, ResponseID, SlaveSimItem)対象ID明示 + 有効/無効と内容変更を分離
MPLINSendMasterInterrupt(MasterSimItem)MPXLINMasterInterrupt(Serial, MasterSimItem)API名/引数変更
MPLINSendSlaveWakeup()MPXLINSlaveWakeup(Serial)API名/引数変更

構造体・定数の移行ポイント

MPLINOpen から MPXOpen への変更

  • 旧SDK3N: MPLINOpen(long* Serial)
  • ADL2N: MPXOpen(StMPXDeviceInfo* Devices, unsigned char Num, unsigned char* Count)

ADL2Nではデバイス列挙後、呼び出し側が対象 Serial を選択して各APIに渡します。

MPLINSetParam の引数モデル変更

旧SDK3Nはパラメータを個別引数で設定しますが、ADL2Nは StMPXLINParam 構造体で一括設定します。

  • Mode -> Param.Mode
  • LINRev -> Param.Revision
  • Baudrate(列挙)-> Param.Baudrate(実bps)
  • SyncBreak/Delimiter/HeaderSpace/ResponseSpace/ByteSpace -> 同名メンバへ
  • WakeupWidth/SleepTime -> 同名メンバへ
  • 追加: WakeupWait
  • LINIDSetting -> Param.IDSetting[64]

ボーレート変換(列挙 -> 実bps)

SDK3N定数ADL2N Param.Baudrate
LIN_PARAM_BR_500500
LIN_PARAM_BR_1K1000
LIN_PARAM_BR_5K5000
LIN_PARAM_BR_10K10000
LIN_PARAM_BR_15K15000
LIN_PARAM_BR_20K20000
LIN_PARAM_BR_25K25000
LIN_PARAM_BR_600600
LIN_PARAM_BR_12001200
LIN_PARAM_BR_24002400
LIN_PARAM_BR_48004800
LIN_PARAM_BR_96009600
LIN_PARAM_BR_1041710417
LIN_PARAM_BR_1440014400
LIN_PARAM_BR_1920019200

LIN Revision

  • SDK3N: LIN_PARAM_REV_13 / LIN_PARAM_REV_20 / LIN_PARAM_REV_21
  • ADL2N: MPX_LIN_REV_13 / MPX_LIN_REV_20 / MPX_LIN_REV_21 / MPX_LIN_REV_22

MPX_LIN_REV_22(LIN 2.2)が新規追加です。

StMPLINIDSettingItem -> StMPXLINIDSetting

SDK3N (StMPLINIDSettingItem)ADL2N (StMPXLINIDSetting)備考
IdなしADL2Nは配列インデックスがID
DlcDL名称変更
CheckSumTypeCheckSumType同等
Reservedなし不要化

StMPLINIDSettingItem は4バイト、StMPXLINIDSetting は2バイトです。

フレーム種別定数の値変更(重要)

SDK3NADL2N
LIN_FRM_WAKEUP0MPX_LIN_FRAME_TYPE_WAKEUP3
LIN_FRM_SLEEP1MPX_LIN_FRAME_TYPE_SLEEP4
LIN_FRM_TX2MPX_LIN_FRAME_TYPE_TX5
LIN_FRM_RX3MPX_LIN_FRAME_TYPE_RX6

数値ハードコードをしている場合は必ず修正してください。
定数名ベースで実装していても、独自設定ファイルに数値保持している場合は再マッピングが必要です。

StMPLINFrame -> StMPXLINFrame

SDK3N (StMPLINFrame)ADL2N (StMPXLINFrame)備考
IdID名称変更
DlcDL名称変更
Data[8]Data[8]位置変更
CheckSumなし削除
ErrorCodeErrorCode位置変更
なしReserved追加

旧: Id, Dlc, Data[8], CheckSum, ErrorCode
新: ID, DL, ErrorCode, Reserved, Data[8]

置換え例:

// SDK3N
item.Frame.Id = 0x12;
item.Frame.Dlc = 8;
item.Frame.Data[0] = 0x55;

// ADL2N
item.Frame.ID = 0x12;
item.Frame.DL = 8;
item.Frame.Data[0] = 0x55;
// CheckSum は設定不要

StMPLINMasterSimItem -> StMPXLINMasterSimItem

SDK3NADL2N備考
EnabledEnabled同等
OneTimeOneTime同等
Delay (unsigned short)Delay (unsigned long)型拡張 + 位置変更
FrameKindFrameType名称変更 + 値体系変更
Reserved[3]Reservedサイズ変更
Frame (StMPLINFrame)Frame (StMPXLINFrame)内部レイアウト変更

Delay の型拡張により、unsigned short 前提の変数・キャストは見直してください。

置換え例:

// SDK3N
unsigned short delay = 1000;
item.Delay = delay;

// ADL2N
unsigned long delay = 1000;
item.Delay = delay;

シミュレーション更新APIの責務分離

SDK3Nの SetMasterItem / SetSlaveItem は、設定変更を1 APIで行う形でした。
ADL2Nでは次のように分離されています。

  • 有効/無効のみ変更: MPXLINSetMasterItem / MPXLINSetSlaveItem
  • アイテム内容変更: MPXLINChangeMasterItem / MPXLINChangeSlaveItem

スケジュール番号範囲

  • SDK3N実装: SchNo 上限15(DDLL_LIN_SCHNO_MAX
  • ADL2Nドキュメント: SchNo 0~31

既存アプリで上限を固定している場合は見直してください。

ログ取得フローとログ構造体変更

ADL2Nではログ取得前に MPXSetGetLogMode を設定する運用が必要です。

  • APIモード: MPXLINGetLogEx で取得
  • コールバックモード: MPXSetLogCallBack を利用
  • InnerChMPX_INNERCH_LIN(1)を指定

StMPLINLog -> StMPXLINLog

SDK3N (StMPLINLog)ADL2N (StMPXLINLog)備考
mSecmSec同等
uSecuSec同等
DirDir位置変更
LogKindType名称変更
Frame.IdIDフラット化
Frame.DlcDL名称変更
Frame.Data[8]Data[64]サイズ拡張
Frame.CheckSumなし削除
Frame.ErrorCodeErrorCodeフラット化
なしProtocol, SBLen, WakeupWidth追加

概算サイズは 20 バイト -> 84 バイトに増加します。
固定長バッファ、ファイル出力フォーマット、IPC共有メモリ定義を見直してください。

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

  1. DLL参照を MPLINCtrl* から MPXCtrlFree* に変更する
  2. MPLINOpenMPXOpen に置換し、Serial 管理を導入する
  3. MPLINSetParamMPXLINSetParam に置換し、構造体設定へ移行する
  4. ログ取得を MPXSetGetLogMode + MPXLINGetLogEx に統一する
  5. LINシミュレーション関連APIを Set/Change 分離に合わせて更新する
  6. ERコードの数値比較を新定義へ置換する

言語別 置換例

LINマスターシミュレーション移行シーケンス

SDK3N では MPLINSetMasterSim で「内容設定 + スケジュール有効化(Ena/OneTime)」を同時に指定できました。
ADL2N では責務が分かれているため、初期開始時は次の2段階が必要です。

  1. MPXLINSetMasterSim でスケジュール内容を設定
  2. MPXLINSetMasterSchedule でスケジュールを有効化/OneTime設定
// SDK3N(1回で設定+有効化)
MPLINSetMasterSim(schNo, LIN_SIM_ENA, oneTime, &masterSim, num);

// ADL2N(2段階)
MPXLINSetMasterSim(serial, schNo, &masterSim, num); // 内容設定
MPXLINSetMasterSchedule(serial, schNo, MPX_LIN_SIM_ENA, oneTime); // 有効化

SetMasterSchedule を省略すると、内容設定済みでもスケジュールが開始されません。

マスターシミュレーション更新APIの使い分け

  • 内容変更のみ: MPXLINChangeMasterItem
  • 有効/無効のみ: MPXLINSetMasterItem
  • 内容と有効状態を両方変更: MPXLINChangeMasterItem -> MPXLINSetMasterItem の順
  • スケジュール切り替え: MPXLINChangeMasterSchedule
  • 一時停止/再開: MPXLINPauseMasterSchedule

実装置換例

C/C++

// SDK3N
long serial = 0;
ER er = MPLINOpen(&serial);
er = MPLINSetParam(LIN_MODE_MONITOR, LIN_PARAM_BR_20K, 13, 1, 0, 0, 1, 250, 1000, &idSetting, LIN_PARAM_REV_21);

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

StMPXLINParam param = {};
param.Mode = MPX_LIN_MODE_MONITOR;
param.Revision = MPX_LIN_REV_21;
param.Baudrate = 20000;
param.SyncBreak = 13;
param.Delimiter = 1;
param.HeaderSpace = 0;
param.ResponseSpace = 0;
param.ByteSpace = 1;
param.WakeupWidth = 250;
param.WakeupWait = 10;
param.SleepTime = 1000;
// param.IDSetting[...] へID別設定を反映

er = MPXLINSetParam(serial, &param);
er = MPXSetGetLogMode(serial, MPX_INNERCH_LIN, MPX_GETLOGMODE_GETLOGAPI);

StMPXLINLog logs[128] = {};
unsigned short got = 0;
unsigned char over = 0;
er = MPXLINGetLogEx(serial, logs, 128, &got, &over);

C/C++: LINマスターシミュレーション置換え例(初期化〜実行〜更新)

// SDK3N
// 1) マスターシム登録 + 2) 有効化を1APIで実行
ER er = MPLINSetMasterSim(0, LIN_SIM_ENA, LIN_SIM_DIS, &masterSim, 2);
// 3) スケジュール切替
er = MPLINChangeSchedule(0);
// 4) Item更新(内容 + 有効/無効)
er = MPLINSetMasterItem(0, 0, &item);

// ADL2N
ER er = MPXLINSetMasterSim(serial, 0, &masterSim, 2); // 1) 内容設定
er = MPXLINSetMasterSchedule(serial, 0, MPX_LIN_SIM_ENA, MPX_LIN_SIM_DIS); // 2) 有効化
er = MPXLINChangeMasterSchedule(serial, 0); // 3) スケジュール切替
er = MPXLINChangeMasterItem(serial, 0, 0, &item); // 4-1) 内容更新
er = MPXLINSetMasterItem(serial, 0, 0, MPX_LIN_SIM_ENA); // 4-2) 有効化更新

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 MPXLINSetParam(
uint serial,
ref StMPXLINParam param);

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

[DllImport("MPXCtrlFree.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MPXLINGetLogEx(
uint serial,
[In, Out] StMPXLINLog[] log,
ushort num,
ref ushort count,
ref byte bufferOver);

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;
er = MPXSetGetLogMode(serial, MPX_INNERCH_LIN, MPX_GETLOGMODE_GETLOGAPI);

C#(P/Invoke): LINマスターシミュレーション置換え例

[DllImport("MPXCtrlFree.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MPXLINSetMasterSim(uint serial, byte schNo, ref StMPXLINMasterSim sim, byte num);

[DllImport("MPXCtrlFree.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MPXLINSetMasterSchedule(uint serial, byte schNo, byte ena, byte oneTime);

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

[DllImport("MPXCtrlFree.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MPXLINChangeMasterItem(uint serial, byte schNo, byte itemNo, ref StMPXLINMasterSimItem item);

[DllImport("MPXCtrlFree.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MPXLINSetMasterItem(uint serial, byte schNo, byte itemNo, byte ena);

int er = MPXLINSetMasterSim(serial, 0, ref sim, 2);
er = MPXLINSetMasterSchedule(serial, 0, MPX_LIN_SIM_ENA, MPX_LIN_SIM_DIS);
er = MPXLINChangeMasterSchedule(serial, 0);
er = MPXLINChangeMasterItem(serial, 0, 0, ref item);
er = MPXLINSetMasterItem(serial, 0, 0, MPX_LIN_SIM_ENA);

Excel VBA

' SDK3N
Declare PtrSafe Function MPLINOpen Lib "MPLINCtrl_x64.DLL" (ByRef Serial As Long) As Long
Declare PtrSafe Function MPLINSetParam Lib "MPLINCtrl_x64.DLL" (...) 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 MPXLINSetParam Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByRef Param As StMPXLINParam) As Long
Declare PtrSafe Function MPXSetGetLogMode Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByVal InnerCh As Byte, ByVal Mode As Byte) As Long
Declare PtrSafe Function MPXLINGetLogEx Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByRef Log As StMPXLINLog, ByVal Num As Integer, ByRef Count As Integer, ByRef BufferOver As Byte) As Long
Declare PtrSafe Function MPXLINSetMasterSim Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByVal SchNo As Byte, ByRef MasterSim As StMPXLINMasterSim, ByVal Num As Byte) As Long
Declare PtrSafe Function MPXLINSetMasterSchedule Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByVal SchNo As Byte, ByVal Ena As Byte, ByVal OneTime As Byte) As Long
Declare PtrSafe Function MPXLINChangeMasterSchedule Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByVal SchNo As Byte) As Long
Declare PtrSafe Function MPXLINChangeMasterItem Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByVal SchNo As Byte, ByVal ItemNo As Byte, ByRef MasterSimItem As StMPXLINMasterSimItem) As Long
Declare PtrSafe Function MPXLINSetMasterItem Lib "MPXCtrlFree_x64.DLL" (ByVal Serial As Long, ByVal SchNo As Byte, ByVal ItemNo As Byte, ByVal Ena As Byte) As Long

VBAではADL2Nでも MPXLINGetLogEx 中心でログ取得する構成が実用的です。

Excel VBA: LINマスターシミュレーション置換え例

' SDK3N(1回で設定+有効化)
Ret = MPLINSetMasterSim(SchNo, LIN_SIM_ENA, LIN_SIM_DIS, MasterSim, Num)

' ADL2N(2段階)
Ret = MPXLINSetMasterSim(Serial, SchNo, MasterSim, Num)
Ret = MPXLINSetMasterSchedule(Serial, SchNo, MPX_LIN_SIM_ENA, MPX_LIN_SIM_DIS)
Ret = MPXLINChangeMasterSchedule(Serial, SchNo)
Ret = MPXLINChangeMasterItem(Serial, SchNo, 0, MasterSimItem)
Ret = MPXLINSetMasterItem(Serial, SchNo, 0, MPX_LIN_SIM_ENA)

戻り値(ER)差分

SDK3NADL2N備考
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_TRG_BUSY=5E_TRG_BUSY=11値変更
E_MODE=6(該当なし)分岐見直し
E_STS=7E_STATUS=105値/名称変更
E_OTHER=8E_OTHER=255値変更
(該当なし)E_TIMEOUT=202新規

数値で比較している実装は、必ず新定義へ置換してください。

移行チェックリスト

  • DLL参照を MPLINCtrl* から MPXCtrlFree* へ変更した
  • MPLINOpenMPXOpen へ置換し、Serial 管理を導入した
  • LINパラメータ設定を StMPXLINParam へ移行した
  • LIN_FRM_*MPX_LIN_FRAME_TYPE_* に置換した(数値直書き含む)
  • StMPLINFrame / StMPLINMasterSimItem / StMPLINIDSettingItem / StMPLINLog の差分を反映した
  • マスターシム初期開始を SetMasterSim -> SetMasterSchedule の2段階へ変更した
  • InnerCh=MPX_INNERCH_LINMPXSetGetLogMode を追加し、MPXLINGetLogEx を呼び出すようにした
  • SetMasterItem/SetSlaveItem の処理を SetChange の2段に分割した
  • スケジュール番号上限チェック(15固定)を見直した
  • ERコードの数値依存分岐を更新した

関連ページ