モジュールオブジェクト間の
通信手段
概要
・タスクは各コアで実行
・モジュール(オブジェクト)はメモリに展開
解決すべき課題の例:
・処理中のデータを別タスクから
書き換えられたら?
・別タスクが書き込み中のデータを
読み取ってしまったら?
・取得したデータは
最新のデータなのか?
グローバル変数
- (同一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
モジュールオブジェクト間通信手段のまとめ