EtherCAT Mデバイス ソフトウェアパフォーマンス
フィールドバスにEtherCATネットワークを使用する場合、優れたパフォーマンスは決定的な要素であり、主に短いサイクルタイム(約1kHz以上)と相関します。EtherCATネットワークのパフォーマンスはEtherCAT Mデバイスに帰属するため、そのソフトウェアは短いサイクルタイム、大量の周期的プロセスデータ、そして多数のEtherCATデバイスを処理できる必要があります。
EtherCAT Mデバイス ソフトウェアの要件:
- 高性能かつリアルタイム対応のイーサネット ドライバー (リンク層)
- OSに依存しない循環処理コンポーネント
- 中断なく運用をサポートする(内部タスクがない)
- CPUタスクのプロセスのタイムスライスをサポート
EtherCAT Mデバイス ソフトウェアは、実際のアプリケーションに十分な計算能力と、バス上の指定されたタイミングを予約してこのピーク負荷を軽減するためのパラメータ設定を管理および提供する必要があります。
EtherCATネットワークの主要な影響変数
アプリケーションの違いに基づいて、EtherCAT ネットワークで影響を受ける重要な領域には次のような要因があります。
- Subデバイス番号
- Subデバイスの種類
- 周期的プロセスデータサイズ
- サイクルタイム
- EtherCAT Mデバイス の機能 (分散クロック、ケーブル冗長性など)
- 必要な計算時間
これから示すように、QEC のソフトウェア 86Duino IDE は、すべての変数を考慮し、利用可能な CPU 時間の 10 ~ 20% のみを使用して多数のシステムを管理します。
測定
EtherCAT Mデバイスソフトウェア(86Duino IDE)上の全プロセスパスの消費時間を計算するため、QEC-Mシステムでパフォーマンス測定を実施しました。リアルタイム性能が正しく正確に測定されていることを確認するため、様々なサイクルタイムオプションをテストしました。
最も信頼性の高い値は、実際のEtherCATネットワーク構成を持つ実機でのライブ測定によって得られます。これらの測定は、86Duino IDE EthCATライブラリのサンプルプログラムを使用することで、追加の操作や機器を必要とせずに実行できます。これらのデモアプリケーションでは、個々のマスタージョブ関数の実行時間(最小値、最大値、平均値)とサイクルタイムが計算され、ログファイルに保存(またはコンソールに出力)されます。
例の測定関数
86Duino IDEでは、EtherCATネットワークの周期的処理部分は高度に統合されており、特定のタスクを持つ特定の機能で構成されており、厳密に分割されているため、他のタスクと干渉することはありません。この機能により、これらのマスターフレームの消費時間を測定し、周期処理の精度をさらに向上させることができます。
タスクには次のものが含まれます。

前回のEtherCATフレームで受信したデータ(入力)は、まず「入力処理」タスクで更新されます。「ユーザーアプリケーション」タスクは、新たに受信したデータを受け取り、データ(出力)を計算し、「出力書き込み」タスクを呼び出してネットワークに送信します。
EtherCATフレームは、ダイレクトメモリアクセス(DMA)を介してネットワークを通過できます。つまり、CPUに負荷をかけずにデータを転送できるだけでなく、マスターに自動的に戻る際に中断なく受信したり、物理ネットワークを使用する場合にデータを送信したりすることも可能です。
「状態管理および非周期的送信(SMAS)」タスクでは、Mデバイスステートマシンと各スレーブステートマシンが実行されます。すべてのサブデバイス状態は、初期起動プロセス中にINITからOPERATIONALに遷移します。非周期的メールボックス通信には、スレーブへの読み取りおよび書き込みのためのスレーブ固有のコマンドを含む別のフレームが必要です。さらに、CoEなどのこれらの非周期的メールボックス通信を処理するには、ステートマシンが通常動作時に必要です。

例
測定結果は、setup() 関数でシリアル端末に出力されます。
[benchmark.ino]
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic slave;
#define WAIT_TIME_MS (10000)
void setup()
{
EthercatPerfMeasurement perf;
unsigned long pretime;
unsigned long sdoValue, sdoCount = 0;
Serial.begin(115200);
master.configPerfMeasurement(true);
master.begin();
slave.attach(0, master);
master.start(1000000);
pretime = millis();
while (millis() - pretime < WAIT_TIME_MS) {
if (slave.sdoUpload(0x1000, 0x00, &sdoValue, sizeof(sdoValue)) > 0)
sdoCount++;
}
master.getPerfMeasurement(&perf);
Serial.print("[C] Cycle Time (min/avg/max) [usec]: ");
Serial.print(perf.CycleTime.MinimumNs / 1000.0);
Serial.print(" / ");
Serial.print(perf.CycleTime.AverageNs / 1000.0);
Serial.print(" / ");
Serial.println(perf.CycleTime.MaximumNs / 1000.0);
Serial.print("[P] Process Inputs (min/avg/max) [usec]: ");
Serial.print(perf.ReceiveCyclicFrame.MinimumNs / 1000.0);
Serial.print(" / ");
Serial.print(perf.ReceiveCyclicFrame.AverageNs / 1000.0);
Serial.print(" / ");
Serial.println(perf.ReceiveCyclicFrame.MaximumNs / 1000.0);
Serial.print("[S] Write Outputs (min/avg/max) [usec]: ");
Serial.print(perf.SendCyclicFrame.MinimumNs / 1000.0);
Serial.print(" / ");
Serial.print(perf.SendCyclicFrame.AverageNs / 1000.0);
Serial.print(" / ");
Serial.println(perf.SendCyclicFrame.MaximumNs / 1000.0);
Serial.print("[SMAS] State Management and Acyclic Send (min/avg/max) [usec]: ");
Serial.print(perf.ProcessAcyclicFrame.MinimumNs / 1000.0);
Serial.print(" / ");
Serial.print(perf.ProcessAcyclicFrame.AverageNs / 1000.0);
Serial.print(" / ");
Serial.println(perf.ProcessAcyclicFrame.MaximumNs / 1000.0);
Serial.print("The throughput of SDO commands. [SDO/sec]: ");
Serial.println((double)(sdoCount * 1000) / WAIT_TIME_MS);
master.stop();
master.end();
}
void loop() {}測定結果
以下の結果は、QECデジタルI/Oサブデバイスの5種類のデバイスを用いて、サイクルタイム(125、250、500、1000µsec)の異なる条件で実行されたものです。SDOコマンドはSMASタスクで処理され、サイクルタイムにおける最大スループットも測定されました。


SDOコマンドの場合:


ビデオ
QEC の今後の企画にご期待ください。
ご質問等があれば、気軽にコメントください。