QEC — EtherCAT 主站基準

QEC — EtherCAT 主站基準

EtherCAT 主站軟體性能

在決定是否要將 EtherCAT 系統用於現場總線時,良好的性能是決定性因素(大約 1kHz 或更快),而其性能主要與較短的周期時間有關聯。由於 EtherCAT 網路性能可以可歸因於 EtherCAT 主站,因此其軟件應能支持較短的循環時間 (cycle times)、可處理大量循環過程數據、以及可控制多台 EtherCAT 從站設備。

EtherCAT 主站軟體的要求:

  • 高性能和實時乙太網路驅動 (link layer)
  • 獨立於操作系統外的循環處理 (Cyclic processing)
  • 支持不間斷運行(無內部任務)
  • 支持在 CPU 任務中對處理時間進行切分

一個 EtherCAT 主站軟件必須管理和提供參數設置,為實際應用和總線上的指定時間保留足夠的計算能力,以減少這種峰值負載。

EtherCAT 網路的關鍵影響變量

基於應用差異,以下因素是影響 EtherCAT 網路的關鍵領域:

  • 從站設備編號
  • 從站設備類型
  • 循環週期數據大小
  • 週期時間
  • EtherCAT 主站特性或功能(分佈式時鐘、電纜冗餘等)
  • 必要的計算時間

正如即將展示的內容,QEC 的軟體 86Duino IDE 將所有變量都考慮在內,並僅使用 10-20% 的可用 CPU 時間來管理眾多系統。

測量

為了計算 EtherCAT 主站軟體 86Duino IDE 上所有循環處理的時間消耗,我們對 QEC-M 系統進行了性能測量。為了保證實時性測試的正確性與精確度,我們測試了多個不同的週期時間。

為了得到可靠的測量值,測量是需要通過實際的 EtherCAT 網路配置來進行現場演示。這些測量可以使用86Duino IDE EtherCAT 函式庫示例進行,無需額外的操作或設備。在這些演示應用程序中,各個主站工作功能的執行時間(最小、最大和平均)以及被計算出來週期時間,將會保存到日誌文件中(或打印到控制台)。

範例中的測量函數

在 86Duino IDE 中,EtherCAT 網路循環部分是高度集成的,由某些具有特定任務的功能組成,由於其嚴格的劃分,不會與其他功能發生交互。基於這一特點,我們可以測量這些主幀 (Frames)的時間消耗,進一步確保循環過程的準確性。

这些任务包括:

ecatLib_tasks

在前一個 EtherCAT 幀中的接收數據(輸入),首先在 "Process Inputs" 任務中被更新。"User Application" 任務將獲取其新接收的數據,計算數據(輸出),並通過 "Write Outputs" 任務將其發送至網絡。

EtherCAT 幀可以直接透過內存訪問(DMA)通過網路總線。這意味著數據可以在不加載 CPU 的情況下進行傳輸,也可以在返回主站時不間斷地自動接收,或者在使用物理網絡時發送出去。

在 "State Management and Acyclic Send (SMAS)" 任務中,主狀態機和每個從屬設備狀態機都被執行。在初始啟動過程中,所有從屬設備的狀態都從 INIT 轉移到 OPERATIONAL。 非週期性 (Acyclic) 郵箱通信需要另一個帶有從站設備特定命令的框架,用於對從站設備進行讀和寫。此外,為了處理這些非週期性郵箱通信,如CoE,在常規操作中就會需要狀態機。

ecatLib_tasksCycle

範例

測量結果將在 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  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() {}

測量結果

下面的結果是利用5個不同的 QEC Digital IO 從站模組設備進行的,測試了不同的週期時間,分別是125、250、500和1000微秒。 而 SDO 命令是在 SMAS 任務中處理的,本次也有進行測試,將會通過週期時間的最大吞吐量來衡量。

ecatLib_measurementStandard1
ecatLib_measurementStandard2

使用 SDO 命令:

ecatLib_measurementSDO1
ecatLib_measurementSDO2

影片


請繼續關注 QEC 的更多項目!

如果您有任何疑問/疑問,請隨時發表評論!

在〈QEC — EtherCAT Master’s Benchmark〉中有 1 則留言

  1. 自動引用通知: Arduino-programmable EtherCAT master runs FreeDOS on Vortex86EX2 x86 processor - CNX Software

發表評論

上部へスクロール