上一篇文章 《【睿擎派】CANOpen总线之IO模块读写(DS401协议)》 ,我在瑞清上写过关于CANOpen的IO模块通信的文章。为什么我首先写CANOpen?说起来挺有意思的,在瑞清皮上连接EtherCAT IO模块花了很长时间,没有太大进展,于是我转头研究了一下基于CANOpen的IO模块的连接,因为两者关系非常密切。
一、EtherCAT和CANOpen的异同CAN总线诞生于1980年代,CANOpen协议于1996年发布,EtherCAT技术于2003年发布。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版本,最后在RTT郭老师的帮助下成功调试了SDK1.7.2版本。 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。
定义MOTOR_NUM 0 //2
(1)配置PDO最关键的部分是修改IO模块的PDO定义。由于官方示例中使用的IO模块(SG-ELC)与我们的型号规格不同,因此这部分配置需要修改。
检查《EM32DX-E4 模块用户手册 V3.1》 第20页5.2.1 小结(如下图)
对应IO模块的16路开关量输入,因此对应的pdo定义代码如下:
静态ec_pdo_entry_info_t eio_input_pdo_entries[]=
{
{0x6000,0x01, 16 },
};
0x6000是索引地址
0x01是子索引地址
16表示16位
同样,我们参考22页5.2.3的总结(如下图)
对应IO模块的16路开关量输出,因此对应的pdo定义代码如下:
staticec_pdo_entry_info_teio_output_pdo_entries[]={{0x7000,0x01,16},};
0x7000是索引地址
0x01是子索引地址
16表示16位
ec_pdo_entry_info_t 是定义单个PDO 条目的核心属性类型。其结构定义如下:
typedefstruct {uint16_tindex; /PDO 条目索引。 */uint8_tsubindex; /PDO 条目子索引。 /uint8_tbit_length;/** PDO 条目的大小(以位为单位)。 /} ec_pdo_entry_info_t;
index DO主索引(对象字典中对应条目的主索引地址)
子索引- 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_tcontentries;}ec_pdo_info_t;
index PDO 索引,也是对象字典的一部分。 TxPDO是从站主站(数据上传),RxPDO是主站从站(指令下发)。
n_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;/** 同步管理器索引。 /ec_direction_t dir/同步管理器方向。 */uint32_tn_pdos;/pdo 中的PDO 数量。 /ec_pdo_info_tconstpdos;看门狗模式。 */}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支持直流同步,配置如下图:
EM32DX-E4-V30对应的ESI描述如下:
通过读取设备数据字典中的信息,我们知道当前的EM32DX-E4模块实际上是EM32DX-E4-V30。它不支持直流电。
相关DC配置必须为0。另外,通过查看手册或者读回数据字典,我们可以知道厂家ID为0x00004321,需要更换。
另外,进入OP模式后,注释掉电机操作代码即可,这里不再详细介绍。
三、运行调试编译代码然后部署。最后,在远程操作终端中,我们输入ect_csp_io来初始化EtherCAT总线及相关配置。然后输入motor_run命令,可以看到开关输出灯像走马灯一样运行。
附1:内置调试命令
附2:雷赛EM32DX-E4说明书和ESI文件https://download.csdn.net/download/yefanqiu/92462286
标题:EtherCAT总线之IO模块读写
链接:https://yqqlyw.com/news/sypc/67333.html
版权:文章转载自网络,如有侵权,请联系删除!