• 検索結果がありません。

CanMultiCyclicSendMessage

ドキュメント内 GPC-4851 (ページ 195-200)

第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);

ドキュメント内 GPC-4851 (ページ 195-200)