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)的時間消耗,進一步確保循環過程的準確性。
这些任务包括:
在前一個 EtherCAT 幀中的接收數據(輸入),首先在 "Process Inputs" 任務中被更新。"User Application" 任務將獲取其新接收的數據,計算數據(輸出),並通過 "Write Outputs" 任務將其發送至網絡。
EtherCAT 幀可以直接透過內存訪問(DMA)通過網路總線。這意味著數據可以在不加載 CPU 的情況下進行傳輸,也可以在返回主站時不間斷地自動接收,或者在使用物理網絡時發送出去。
在 "State Management and Acyclic Send (SMAS)" 任務中,主狀態機和每個從屬設備狀態機都被執行。在初始啟動過程中,所有從屬設備的狀態都從 INIT 轉移到 OPERATIONAL。 非週期性 (Acyclic) 郵箱通信需要另一個帶有從站設備特定命令的框架,用於對從站設備進行讀和寫。此外,為了處理這些非週期性郵箱通信,如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 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 任務中處理的,本次也有進行測試,將會通過週期時間的最大吞吐量來衡量。
使用 SDO 命令:
影片
請繼續關注 QEC 的更多項目!
如果您有任何疑問/疑問,請隨時發表評論!
在〈QEC — EtherCAT Master’s Benchmark〉中有 1 則留言
自動引用通知: Arduino-programmable EtherCAT master runs FreeDOS on Vortex86EX2 x86 processor - CNX Software