EtherCAT总线之IO模块读写

一、EtherCATCANOpen的异同

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的传输原理)。

 

ecat(1)

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文件(文后附相关文件下载链接)。

image

 我们以BSP 1.7.2版本的示例工程06_bus_ethercat_master_2motor_1io为基础进行开发调试。

image

  本代码的官方说明的链接如下:

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模块(如下图)。 

image

 所以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小结(如下图) 

image

 对应IO模块16路开关量输入,所以对应的pdo定义的代码如下:

static ec_pdo_entry_info_t eio_input_pdo_entries[] =

{

    { 0x6000, 0x01, 16 },

};

0x6000是索引地址

0x01 是子索引地址

16表示16bit

 同样,我们查阅第22页5.2.3小结(如下图)

 

image

 对应IO模块的16路开关量输出,所以对应的pdo定义代码如下:

static ec_pdo_entry_info_t eio_output_pdo_entries[] =

{

    { 0x7000, 0x01, 16 },

};

0x7000是索引地址

0x01 是子索引地址

16表示16bit

 ec_pdo_entry_info_t是定义单个PDO条目的核心属性类型,其结构体的定义如下:

typedef struct

{

    uint16_t index;     /**< PDO entry index. */

    uint8_t subindex;   /**< PDO entry subindex. */

    uint8_t bit_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 ,原型如下:

typedef struct

{

uint16_t index;       

uint32_t n_entries;

    ec_pdo_entry_info_t const *entries;

} ec_pdo_info_t;

index – PDO索引,本身也是对象字典的一部分,TxPDO是 从站à主站(数据上传),RxPDO是主站à从站(指令下发)。

n_entries – 对应条目的数量

entries 条目数组指针。

所以eio_pdos 对象数组的定义代码如下:

ec_pdo_info_t eio_pdos[] = {

    { 0x1600, 1, eio_output_pdo_entries },

    { 0x1a00, 1, eio_input_pdo_entries },

};

接下来我们定义同步管理器相关内容。我们先看ec_sync_info_t 结构体定义。

typedef struct

{

    uint8_t    index;          /**< Sync manager index. */

    ec_direction_t dir         /**< Sync manager direction. */

    uint32_t n_pdos;           /**< Number of PDOs in \a pdos. */

ec_pdo_info_t const *pdos; /**< Array with PDOs to assign. This

 must 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_t eio_syncs[] =

{

    { 2, EC_DIR_OUTPUT, 1, &eio_pdos[0], EC_WD_DISABLE },

    { 3, EC_DIR_INPUT, 1, &eio_pdos[1], EC_WD_DISABLE },

};

也就是官方代码(右边)被左边的代码代替。 

image

 (2)配置DC

这部分相关的内容需要查询ESI文件,也就是因为DC配置有误,设备总进入不到OP模式的主要原因。

EM32DX-E4.xml文件里,支持两种产品型号,一种是EM32DX-E4-V30,一种是EM32DX-E4,

EM32DX-E4是支持DC同步的,配置如下图所示: 

image

 而EM32DX-E4-V30对应的ESI描述如下: 

image

 通过读取设备数据字典的信息,我们知道当前这款EM32DX-E4模块其实是EM32DX-E4-V30。它是不支持DC的。 

image

 相关DC配置必须为0才可以。另外查手册或者回读数据字典,我们都可以知道厂商ID为0x00004321,这个地方需要替换一下。

此外进入OP模式后,电机操作的代码注释掉就可以了,这里不做详述了。

三、运行调试

编译代码,然后部署。最后在远程操作终端,我们输入ect_csp_io,进行EtherCAT总线初始化及相关的配置。然后再输入motor_run命令,就可以看到开关量输出灯像走马灯一样运转了。 

image

 

lv_0_20251216104854

附1:内置调试命令 

image

### 3.1 项目背景 基于EtherCATIO伺服系统是当前工业自动化领域中实现高性能运动控制的重要技术手段,广泛应用于机器人、数控机床及高精度制造设备等场景。相比传统总线协议,EtherCAT具备低延迟、高带宽和分布式时钟同步能力,能够有效提升多轴协同控制的实时性与精度[^2]。随着智能制造对柔性化生产的需求增加,开发具备标准化接口、模块化架构和可扩展通信能力的EtherCAT IO伺服系统成为行业趋势。 现有方案中,SOEM(Simple Open EtherCAT Master)库提供了开源的主站实现,支持从站配置、状态监控与数据交互功能。通过Qt集成开发环境,可构建可视化界面用于IO采集与控制操作,进一步降低调试门槛并提升用户交互体验[^1]。 ### 3.2 需求规格说明 #### 功能需求 - **EtherCAT通信支持**:系统应支持标准EtherCAT协议栈,包括PDO映射、SDO访问、状态机切换(如Pre-Operational到Operational)等功能[^2]。 - **IO数据采集与显示**:提供可视化界面展示从站IO输入状态,并支持周期性刷新与异常状态提示。 - **远程控制指令下发**:允许通过界面按钮或API接口设置从站IO输出值,实现对执行机构的控制逻辑[^2]。 - **错误诊断机制**:系统需具备从站断开检测、通信超时报警、PDO配置错误提示等基本故障诊断能力。 - **日志记录与调试支持**:支持运行时日志输出、通信报文抓取与分析功能,便于问题追踪与优化。 #### 性能需求 - **响应时间**:IO状态更新延迟应低于5ms,确保控制系统的实时性要求。 - **同步精度**:采用DC(Distributed Clocks)机制实现多轴同步误差小于±1μs。 - **通信稳定性**:在100Mbps网络环境下,连续运行72小时无丢包或连接中断现象。 #### 可靠性需求 - **容错机制**:支持从站热插拔恢复、主站自动重连策略,提升系统可用性。 - **安全防护**:通信链路应具备CRC校验、访问权限控制等机制,防止非法访问与数据篡改。 #### 扩展性需求 - **模块化设计**:软件架构应采用分层结构,便于未来扩展CANopen、PROFINET等其他协议。 - **接口开放性**:提供C/C++ API、Python绑定及Qt组件封装,支持第三方平台集成与二次开发。 ### 3.3 系统架构设计 #### 硬件架构 - 主控单元采用ARM Cortex-M7或X86嵌入式平台,集成双网口支持EtherCAT环网拓扑。 - 从站设备兼容EL系列数字量/模拟量模块、伺服驱动器等标准EtherCAT节点。 #### 软件架构 - 基于SOEM库实现EtherCAT主站核心功能,结合Qt开发图形化控制界面。 - 控制逻辑层采用状态机模型管理从站生命周期,包括初始化、配置、运行等阶段。 - 数据管理层负责缓存IO输入输出数据,并通过信号槽机制通知界面更新。 ```cpp // 示例:使用SOEM进行从站初始化 ec_init(0, NULL); ec_config_init(FALSE); ec_config_map(&IOmap); ec_state_check(0, EC_STATE_OPERATIONAL, EC_TIMEOUTSTATE * 4); ``` ### 3.4 开发与测试规范 #### 开发流程 - 使用Git进行版本控制,遵循语义化提交规范。 - 持续集成流程包含静态代码检查、单元测试与自动化部署脚本。 - UI部分采用MVC模式设计,确保视图与业务逻辑解耦。 #### 测试策略 - **功能测试**:验证PDO映射正确性、SDO读写响应、IO输出控制准确性。 - **性能测试**:测量IO刷新周期、通信吞吐量、同步抖动指标。 - **压力测试**:模拟100个从站并发通信,评估系统在高负载下的稳定性。 - **兼容性测试**:验证与倍福、松下、汇川等主流厂商伺服驱动器的互操作性[^3]。 ### 3.5 文档交付要求 - 用户手册应包含硬件接线图、通信参数配置说明、API调用示例。 - 技术文档需涵盖系统架构图、模块依赖关系、关键算法实现原理。 - SDK包应附带完整头文件、动态库、示例工程及编译指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

meslog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值