第4章 リファレンス
8. CanMultiCyclicSendMessage
●Visual C# .NET(x86 専用)
[DllImport(“IFCan.dll”)]
public static extern uint CanMultiCyclicSendMessage(
uint DeviceHandle, uint Route, ref CAN_MESSAGE CanMessage );
●Visual Basic .NET(x86、x64 共用)
Declare Function CanMultiCyclicSendMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As IntPtr, _
ByVal Route As Integer, _ ByRef CanMessage As CAN_MESSAGE _ ) As Integer
●Visual Basic .NET(x86 専用)
Declare Function CanMultiCyclicSendMessage Lib "IFCan.DLL"( _ ByVal DeviceHandle As Integer, _
ByVal Route As Integer, _ ByRef CanMessage As CAN_MESSAGE _ ) As Integer
【パラメータ】
hDeviceHandle
CanOpenPort 関数で取得したデバイスハンドルを指定してください。
dwRoute
周期送信するメッセージの番号を 1~12 の範囲で指定します。
pCanMessage
送信するメッセージを格納した構造体のポインタを指定してください。
送信周期は CanSetTransmissionCycle 関数にて設定します。
CAN_MESSAGE構造体の説明については、『4.3 構造体説明』をご参照ください。
【戻り値】
正常終了した場合は、IFCAN_ERROR_SUCCESSが返されます。
IFCAN_ERROR_SUCCESS以外の値が返された場合については、『4.4 戻り値一覧』をご参照くださ い。
【備考】
1.本関数を実行する前に必ず CanSetTransmissionCycle 関数で周期を設定してください。
2. データの送信時間よりも、周期時間を短く設定した場合、指定された時間に送信ができず、周 期実行は停止します。例えば、データの送信に 80msかかるのに、周期時間を 50msに設定した場 合、50ms経過したときに、まだデータが送信中なので、周期実行が停止します。
周期実行の停止は、CanSetEvent関数、CanSetEventMask関数での設定を行っている場合、イベ ントにより通知されます。
また、アービトレーションロストにより、指定した周期にデータを送信できない場合もありま す。アービトレーションロストが発生し、データを再送しているときに、次の周期時間が来る と、上記と同じように、周期実行が停止します。
例)周期を 50ms に設定した場合
データ送信中
時間 データ送信中
50ms 50ms
・・・
周期送信開始
例)周期を 50ms に設定したが、その周期よりもデータ送信時間が長い場合
データ送信中
時間 50ms
周期送信開始
前回のデータが、まだ送信完了して いないため、次のデータが送れずに 周期送信は停止します。
周期送信実行中でも、周期送信を行いたいデータの更新、周期の更新を行えます。更新したデ ータは、次の周期から反映されます。
例)周期送信を行うデータや周期を更新したい場合
データ A 送信中
時間 50ms
・・・
周期送信開始
データ B 送信中
80ms
データ、周期の更新はいつでも可能です。
ただし、反映されるのは次の周期からになります。
例えば、この時点で、周期送信を行うデータを B に、周期を 80ms に更 新したとすると、前回の設定周期の 50ms が経過してから、データ B が 80ms 周期で送信されるようになります。
優先順位の高いメッセージを短い周期で送信していると、アービトレーションにより、それよ り優先順位の低いメッセージが送信されにくくなりますので、ご注意ください。
3. 本関数は、PCI-485420P、CPZ-485420P、PEX-485420、CSI-485420、PEX-H485940P で使用できま す。
【使用例】
●C 言語 INT nRet;
CAN_MESSAGE CanMessage;
HANDLE hDeviceHandle;
hDeviceHandle = CanOpenPort(“IFCAN1”);
: :
// 送信周期を 100ms に設定
nRet = CanSetTransmissionCycle(hDeviceHandle, CAN_ROUTE_4_6, 100*1000);
// 送信メッセージのセット CanMessage.ulLength = 4;
CanMessage.ulID = 0x01;
CanMessage.ulFlag = 0;
CanMessage.ulTime = 0;
CanMessage[0].bData = 0x11;
CanMessage[1].bData = 0x22;
CanMessage[2].bData = 0x33;
CanMessage[3].bData = 0x44;
nRet = CanActivate(hDeviceHandle);
// メッセージ番号 4 の周期送信開始
nRet = CanMultiCyclicSendMessage(hDeviceHandle, 4, CanMessage);