织梦宠物网站模板,游戏网页界面设计,免费傻瓜室内装修设计软件,wordpress略缩图压缩在上一篇文章《【睿擎派】CANOpen总线之IO模块读写(DS401协议)》我写了关于睿擎派上CANOpen的IO模块通信#xff0c;为什么先写CANOpen#xff1f;说来也有挺意思#xff0c;是因为在睿擎派上对接EtherCAT的IO模块#xff0c;花费了很久时间#xff0c;也没有多少进展为什么先写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通过 EDSElectronic Data Sheet文件描述设备的对象字典、PDO 映射等配置主站通过 EDS 识别设备EtherCAT通过 ESIEtherCAT Slave Information文件扩展 EDS 规范新增了 Sync Manager、DC 同步、FMMU 等 EtherCAT 专属配置同时兼容 EDS 的核心内容此外比较关键的差异就是CAN总线最大速率1Mbpsms级抖动而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//21配置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同样我们查阅第22页5.2.3小结如下图对应IO模块的16路开关量输出所以对应的pdo定义代码如下staticec_pdo_entry_info_teio_output_pdo_entries[] {{ 0x7000, 0x01, 16 },};0x7000是索引地址0x01是子索引地址16表示16bitec_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的索引地址为0x1A00RxPDO0的索引地址为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. Thismust 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-E4EM32DX-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