news 2025/12/29 8:51:02

【睿擎派】EtherCAT总线之IO模块读写

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【睿擎派】EtherCAT总线之IO模块读写

在上一篇文章《【睿擎派】CANOpen总线之IO模块读写(DS401协议)》我写了关于睿擎派上CANOpen的IO模块通信,为什么先写CANOpen?说来也有挺意思,是因为在睿擎派上对接EtherCAT的IO模块,花费了很久时间,也没有多少进展,所以转头去研究了基于CANOpen对接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的传输原理)。

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。

#defineMOTOR_NUM 0//2

(1)配置PDO

最关键的部分是修改IO模块的PDO定义,由于官方示例中所用的IO模块(SG-ELC)和我们的型号规格不同,所以需要修改这部分配置。

查阅《EM32DX-E4 模块用户手册 V3.1》 第20页 5.2.1小结(如下图)

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

staticec_pdo_entry_info_teio_input_pdo_entries[] =

{

{ 0x6000, 0x01, 16 },

};

0x6000是索引地址

0x01是子索引地址

16表示16bit

同样,我们查阅第225.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 entrysubindex. */

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_tconst*entries;

}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_tdir/**< Sync manager direction. */

uint32_tn_pdos;/**< Number of PDOs in\apdos. */

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

must contain at least\an_pdos PDOs. */

ec_watchdog_mode_twatchdog_mode;/**<Watchdogmode. */

}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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/17 21:57:45

Jetson Nano配置PaddlePaddle并实现OCR测试

Jetson Nano 上从零部署 PaddlePaddle 与中文 OCR 实践 在嵌入式 AI 应用日益普及的今天&#xff0c;如何在资源受限的边缘设备上实现高效、稳定的深度学习推理&#xff0c;成为开发者面临的核心挑战之一。NVIDIA Jetson Nano 凭借其小巧体积、低功耗和 GPU 加速能力&#xff…

作者头像 李华
网站建设 2025/12/25 6:39:11

42、Perl引用的使用与嵌套数据结构构建

Perl引用的使用与嵌套数据结构构建 1. 引用基础与子程序参数传递 在Perl中,引用是一个强大的工具。当修改 @array2 时,它不会影响 @array1 ,因为它们是内容独立的不同数组。而 $arrayref 中对 @array1 的引用,会和 @array1 的当前内容相同,因为引用指向的是和 …

作者头像 李华
网站建设 2025/12/16 13:36:51

Wan2.2-T2V-5B预训练权重开放,支持本地部署

Wan2.2-T2V-5B预训练权重开放&#xff0c;支持本地部署 你有没有过这样的经历&#xff1f; 灵感突然闪现&#xff0c;想做个短视频验证想法&#xff0c;结果刚写完脚本就卡在了渲染上——等了半小时&#xff0c;视频还没跑完&#xff0c;热情早已冷却。 但现在不一样了。 最…

作者头像 李华
网站建设 2025/12/16 13:36:48

47、Perl编程的进阶知识与实用技巧

Perl编程的进阶知识与实用技巧 1. XML数据处理 在Perl中处理XML数据时,可将XML文档映射到变量 $computers ,它是一个哈希引用。这个哈希有一个元素,键为 computer ,其值是另一个哈希的引用,该哈希的键由XML文件中 computer 元素的属性名表示。每个这样的哈希成员的…

作者头像 李华
网站建设 2025/12/16 13:36:35

全网热议!2025年最佳单北斗GNSS变形监测系统推荐榜单

在2025年&#xff0c;市场上的单北斗GNSS变形监测系统种类繁多&#xff0c;各具特色。许多系统不仅能够实时监测地震、滑坡等地质灾害&#xff0c;还能为桥梁等基础设施提供稳定的变形监测服务。这些设备通常依托先进的GNSS技术&#xff0c;结合高精度传感器&#xff0c;确保数…

作者头像 李华
网站建设 2025/12/16 13:36:31

黄金高位AI动能骤减,“非农”与“恐怖数据”AI冲击波蓄势待发

摘要&#xff1a;本文通过构建基于机器学习与深度学习的多维度数据分析模型&#xff0c;结合自然语言处理&#xff08;NLP&#xff09;对非农数据进行语义解析&#xff0c;运用强化学习算法对市场情绪进行动态捕捉&#xff0c;分析现货黄金价格关键就业数据发布背景下的波动逻辑…

作者头像 李华