モジュールオブジェクト間の

通信手段

概要

・タスクは各コアで実行

・モジュール(オブジェクト)はメモリに展開

解決すべき課題の例:

・処理中のデータを別タスクから

 書き換えられたら?

・別タスクが書き込み中のデータを

 読み取ってしまったら?

・取得したデータは

 最新のデータなのか?

グローバル変数

- (同一C++プロジェクト内限定)

3.4.2 メソッド呼び出し

-インタフェイスポインタを介したメソッド呼び出しによる通信

3.4.3 データエリアポインタ (共有メモリ)

-特定データエリアを介した通信

3.4.4 入出力変数のマッピング

-TwinCATの入出力変数を介した通信

3.4.5 ADS

-TwinCATのサーバ-クライアント型通信


メソッド呼び出し

・即時データアクセスが可能です

・メソッド完了まで呼び出し側はブロックされます

異なる複数のタスクから同じインタフェイスが呼び出される場合、

 データの整合性に注意が必要です

 (必要に応じSemaphoreやCritical sectionによる割り込み防止方策を実装)


・3.3までの実習は、この方式を用いています

・参考サンプル: https://infosys.beckhoff.com/content/1033/tc3_c/112607883.html

Sample11a: Module communication: C module calls a method of another C module

クラスのメンバ変数にCriticalSectionInstanceを追加(ヘッダファイルを編集)

PS遷移時にCreateCriticalSection(), SP遷移時にDeleteCriticalSection()

割り込みを防止したい区間をEnterCriticalSection()とLeaveCriticalSection()で挟む

→区間内の処理実行中は他のタスクからの割り込みが防止され、データの整合性が保たれます

注意. CriticalSectionは、優先度が高いタスクの動作を止めてしまう可能性があります。

  区間内の処理は、短時間で完了するものに限定してください。

  (例. 時間がかかるデータ処理は区間外に、処理後のデータ複写のみ区間内に実装する、など)


データエリアポインタ

・即時データアクセスが可能です

異なる複数のタスクから同じインタフェイスが呼び出される場合、

 データの整合性に注意が必要です

 (必要に応じSemaphoreやCritical sectionによる割り込み防止方策を実装)

・参考サンプル: https://infosys.beckhoff.com/content/1033/tc3_c/112602891.html

Sample10: module communication: Using data pointer

入出力変数のマッピング

・通信はタスク周期毎に実行されます

・データ整合性は維持されます

 (同期の仕組みを実装する必要はありません)

・参考サンプル: https://infosys.beckhoff.com/content/1033/tc3_c/112608907.html

Sample12: module communication: Using IO mapping


ADS通信( Automation Device Specification )

・非周期/イベント駆動型の通信です

・クライアント-サーバ型通信です

・複数CPU間通信も可能です

・ユーザモード(非リアルタイム)アプリ

 との通信も可能です

・通信データの整合性は保たれます




・参考サンプル:

https://infosys.beckhoff.com/content/1033/tc3_c/112597771.html

Sample03: C++ as ADS server

https://infosys.beckhoff.com/content/1033/tc3_c/112601867.html

Sample06: UI-C#-ADS client uploading the symbolic from module


モジュールオブジェクト間通信手段のまとめ