在上一篇文章《【睿擎派】CANOpen總線之IO模塊讀寫(DS401協議)》我寫了關于睿擎派上CANOpen的IO模塊通信,為什么先寫CANOpen?說來也有挺意思,是因為在睿擎派上對接EtherCAT的IO模塊,花費了很久時間,也沒有多少進展,所以轉頭去研究了基于CANOpen對接IO模塊,因為二者是有非常大的淵源的。
一、EtherCAT和CANOpen的異同
1980年代CAN總線誕生,1996年CANOpen協議發布,2003年EtherCAT技術發布。EtherCAT 和 CANopen 的核心關系是:CANopen 是協議規范(側重應用層),EtherCAT 是總線技術(側重物理層 / 傳輸層)—— 兩者均源于 CAN 總線生態,EtherCAT 復用了 CANopen 的核心應用層規范,同時在底層傳輸上實現了質的突破,最終形成 “上層兼容、底層獨立” 的技術互補格局。
EtherCAT完全復用 CANopen 的對象字典結構(索引范圍、尋址方式),僅在 0x1C00~0x1C3F 等區間擴展了 Sync Manager、DC 同步等專屬索引。完全保留 PDO/SDO 的功能定義,僅改變了底層傳輸方式。
CANopen 的 PDO 通過 COB-ID 映射到 CAN 幀,EtherCAT 的 PDO 通過 Sync Manager(同步管理器)綁定到以太網幀;CANopen 的 SDO 通過 CAN 幀分片傳輸,EtherCAT 的 SDO 通過郵箱通道(SM0/SM1)實現低延遲傳輸;
CANopen通過 EDS(Electronic Data Sheet)文件描述設備的對象字典、PDO 映射等配置,主站通過 EDS 識別設備;
EtherCAT通過 ESI(EtherCAT Slave Information)文件擴展 EDS 規范,新增了 Sync Manager、DC 同步、FMMU 等 EtherCAT 專屬配置,同時兼容 EDS 的核心內容;
此外比較關鍵的差異就是CAN總線最大速率1Mbps,ms級抖動,而EtherCAT最大可以1Gbps速率,us級抖動。這其中的原因除了速率上的差異外,傳輸機制上有很大的差別,CANOpen是幀逐節點轉發,需等待節點處理后再傳遞,而幀 “并行處理”,所有節點同時讀取幀中自身數據(如下面的動圖比較形象的展現了EtherCAT的傳輸原理)。

CANOpen主要運用在低速設備(傳感器、執行器)、低成本場景,而EtherCAT多用在高速 IO、多軸伺服、實時控制場景,比如機器臂,具身智能等設備上。
二、睿擎派對接雷賽EM32DX-E4-V30模塊
我從RC-Pi-3506的SDK1.5.0版本開始進行IO模塊對接,經過SDK1.7.0版本,最后在SDK1.7.2版本上在RTT郭老師的協助下調試成功,SDK1.7.2和SDK1.7.0關于EtherCAT的接口調用差異還是蠻大的,所以本篇內容以SDK1.7.2版本為準。
在真正對接之前,除了硬件模塊外,還需要硬件手冊和ESI文件(文后附相關文件下載鏈接)。

我們以BSP 1.7.2版本的示例工程06_bus_ethercat_master_2motor_1io為基礎進行開發調試。

本代碼的官方說明的鏈接如下:
https://www.rt-thread.com/ruiching/document/site/rc3506/q7dq3ksb/#%E7%A4%BA%E4%BE%8B%E8%BF%90%E8%A1%8C
原示例支持2個伺服器+1個IO模塊,為了簡化,我們睿擎派只連接一個IO模塊(如下圖)。

所以ethercat_2motor_1io.c文件的第16行代碼我們把電機的數量調整為0。
define MOTOR_NUM 0 //2
(1)配置PDO
最關鍵的部分是修改IO模塊的PDO定義,由于官方示例中所用的IO模塊(SG-ELC)和我們的型號規格不同,所以需要修改這部分配置。
查閱《EM32DX-E4 模塊用戶手冊 V3.1》 第20頁 5.2.1小結(如下圖)

對應IO模塊16路開關量輸入,所以對應的pdo定義的代碼如下:
static ec_pdo_entry_info_t eio_input_pdo_entries[] =
{
{ 0x6000, 0x01, 16 },
};
0x6000是索引地址
0x01 是子索引地址
16表示16bit
同樣,我們查閱第22頁5.2.3小結(如下圖)

對應IO模塊的16路開關量輸出,所以對應的pdo定義代碼如下:
staticec_pdo_entry_info_teio_output_pdo_entries[] ={{0x7000,0x01,16},};
0x7000是索引地址
0x01 是子索引地址
16表示16bit
ec_pdo_entry_info_t是定義單個PDO條目的核心屬性類型,其結構體的定義如下:
typedefstruct{uint16_tindex; / PDO entry index. */uint8_tsubindex; / PDO entry subindex. /uint8_tbit_length;/** Size of the PDO entry in bit. /} ec_pdo_entry_info_t;
index – DO主索引 (對象字典對應條目主索引地址)
subindex- DO子索引
bit_length – 對應的位數
我們再看5.2.1和5.2.3的說明,TxPDO0的索引地址為0x1A00,RxPDO0的索引地址為0x1600。
我們需要配置eio_pdos 對象數組,其結構體定義為ec_pdo_info_t ,原型如下:
typedefstruct{uint16_tindex;uint32_tn_entries;ec_pdo_entry_info_tconstentries;}ec_pdo_info_t;
index – PDO索引,本身也是對象字典的一部分,TxPDO是 從站à主站(數據上傳),RxPDO是主站à從站(指令下發)。
n_entries – 對應條目的數量
entries 條目數組指針。
所以eio_pdos 對象數組的定義代碼如下:
ec_pdo_info_teio_pdos[] = {{0x1600,1, eio_output_pdo_entries },{0x1a00,1, eio_input_pdo_entries },};
接下來我們定義同步管理器相關內容。我們先看ec_sync_info_t 結構體定義。
typedefstruct{uint8_tindex;/** Sync manager index. /ec_direction_t dir / Sync manager direction. */uint32_tn_pdos; / Number of PDOs in a pdos. /ec_pdo_info_tconstpdos; /< Array with PDOs to assign. Thismust contain at least \a n_pdos PDOs. */ec_watchdog_mode_t?watchdog_mode; / Watchdog mode. */}?ec_sync_info_t;
index – 同步管理器的硬件索引 0 – 15,常見的是SM0-SM3
對應SDO非實時操作
SM0(索引 0)- 主站→IO 模塊(系統配置入),發送SDO報文,配置對象字典,接受CoE管理指令、
SM1(索引 1)- IO 模塊→主站(系統響應出),SDO響應報文,回傳診斷信息,發送從站狀態切換碼。
對應PDO實時操作:
SM2(索引 2)- 主站→IO 模塊(輸出)
SM3(索引 3)- IO 模塊→主站(輸入)
dir – SM的傳輸方向 EC_DIR_OUTPUT:主站輸出→從站輸入(RxPDO,如 DO 控制),EC_DIR_INPUT:從站輸出→主站輸入(TxPDO,如 DI 采集)。
n_pdos – SM要綁定的PDO數量(pdos數組中的PDO個數)
watchdog_mode — 看門狗模式(枚舉類型):
EC_WD_DISABLE:禁用看門狗
EC_WD_ON:啟用看門狗(主站心跳超時后,從站進入安全狀態,如 DO 歸零)
綜上,所以eio_syncs的數組定義如下:
ec_sync_info_teio_syncs[] ={{2, EC_DIR_OUTPUT,1, &eio_pdos[0], EC_WD_DISABLE },{3, EC_DIR_INPUT,1, &eio_pdos[1], EC_WD_DISABLE },};
也就是官方代碼(右邊)被左邊的代碼代替。

(2)配置DC
這部分相關的內容需要查詢ESI文件,也就是因為DC配置有誤,設備總進入不到OP模式的主要原因。
EM32DX-E4.xml文件里,支持兩種產品型號,一種是EM32DX-E4-V30,一種是EM32DX-E4,
EM32DX-E4是支持DC同步的,配置如下圖所示:

而EM32DX-E4-V30對應的ESI描述如下:

通過讀取設備數據字典的信息,我們知道當前這款EM32DX-E4模塊其實是EM32DX-E4-V30。它是不支持DC的。

相關DC配置必須為0才可以。另外查手冊或者回讀數據字典,我們都可以知道廠商ID為0x00004321,這個地方需要替換一下。
此外進入OP模式后,電機操作的代碼注釋掉就可以了,這里不做詳述了。
三、運行調試
編譯代碼,然后部署。最后在遠程操作終端,我們輸入ect_csp_io,進行EtherCAT總線初始化及相關的配置。然后再輸入motor_run命令,就可以看到開關量輸出燈像走馬燈一樣運轉了。


附1:內置調試命令

附2:雷賽EM32DX-E4說明書和ESI文件
https://download.csdn.net/download/yefanqiu/92462286
-
CAN
+關注
關注
59文章
3066瀏覽量
472730 -
總線
+關注
關注
10文章
3040瀏覽量
91656 -
ethercat
+關注
關注
19文章
1507瀏覽量
45158 -
IO模塊
+關注
關注
0文章
177瀏覽量
14432
發布評論請先 登錄
基于睿擎派輕松玩轉CANopen電機控制
睿擎EtherCAT多軸控制技術:如何實現低抖動高精度運動控制 | 深度解析
睿擎派文件系統指南:從開發到發布全流程實踐 | 技術解析
【睿擎派】CANOpen總線之IO模塊讀寫(DS401協議)
睿擎派3562快速上手體驗
經濟型EtherCAT運動控制器:EtherCAT總線快速入門
睿擎平臺極簡開發重要實踐—— PinMux 配置工具 | 睿擎派試用名單公示
睿擎派RK3506J開發板開箱記錄、初步調試
【MCU體驗、MPU性能】睿擎派 RC3506 套件今日10點淘寶獨家開售!首批200套,搶完即止!| 產品動態
【睿擎派】EtherCAT總線之IO模塊讀寫
評論