当前位置: 首页 > news >正文

【原创】IgH EtherCAT主站详解(十三)--EtherCAT 线缆冗余与双网卡故障切换机制

冗余切换

4.4 — EtherCAT 线缆冗余与双网卡故障切换机制


概览

什么是 EtherCAT 冗余?

EtherCAT 支持两种冗余方式:线缆冗余(环形拓扑)和设备冗余(双网卡)。IgH EtherCAT Master 通过 devices[EC_DEVICE_MAIN]devices[EC_DEVICE_BACKUP] 两个网卡设备实现冗余通信。当主线缆发生故障时,主站自动通过备用线缆继续通信,实现零停机切换。

冗余拓扑结构

冗余模式对比

环形冗余: 末尾从站将数据帧通过反向路径返回主站,只需一个网卡。断线后数据帧自动绕行
双网卡冗余: 主站使用两个独立网卡(主/备),分别连接总线两端。主线缆故障时切换到备用网卡


技术详情

双设备架构

IgH 主站支持最多两个网卡设备。当加载模块时指定备用 MAC 地址,主站自动启用冗余模式:

加载冗余模式

# 加载主站模块,指定主网卡和备用网卡 MAC
insmod ec_master.ko \main_devices=00:11:22:33:44:55 \backup_devices=00:11:22:33:44:56
设备索引 常量 角色
devices[0] EC_DEVICE_MAIN 主网卡 — 正常时用于收发 EtherCAT 帧
devices[1] EC_DEVICE_BACKUP 备用网卡 — 仅在冗余模式下使用

冗余切换时序

sequenceDiagramparticipant APP as 应用程序participant MST as ec_masterparticipant MAIN as Main Deviceparticipant BACKUP as Backup Deviceparticipant BUS as EtherCAT 总线Note over MST,BUS: 正常通信 (通过主网卡)loop 每个周期APP->>MST: ecrt_master_send()MST->>MAIN: ec_device_send()MAIN->>BUS: 发送 EtherCAT 帧BUS-->>MAIN: 返回帧MAIN-->>MST: ec_master_receive_datagrams()MST->>MST: 校验 WKC 和 link_stateMST-->>APP: ecrt_master_receive()endNote over BUS: ❌ 主线缆断开!APP->>MST: ecrt_master_send()MST->>MAIN: ec_device_send()MAIN--xMST: link_state = DOWN / 无响应MST->>MST: 检测到 link_state 变化MST->>BACKUP: 切换到备用网卡MST->>BACKUP: ec_device_send()BACKUP->>BUS: 通过备用路径发送BUS-->>BACKUP: 返回帧BACKUP-->>MST: 接收成功MST-->>APP: 数据恢复Note over MST,BUS: 冗余切换完成,继续通信

链路状态监控

Master FSM 在每次循环中监控两个网卡设备的 link_state

  1. ec_device_poll_link(): 轮询网卡链路状态
  2. devices[MAIN].link_state: 主网卡链路状态(0=down, 1=up)
  3. devices[BACKUP].link_state: 备用网卡链路状态
  4. 当主线缆断开时,link_state 变为 0,触发切换

⚠ 注意

IgH 1.5.2 的冗余功能需要硬件支持:末尾从站必须具有 4 端口 ESC(或两个 2 端口 ESC),且备用网卡必须连接到从站的返回端口。当冗余拓扑中发生断线时,数据帧会自动绕行通过备用路径,但切换过程中可能有 1-2 个周期的数据丢失。


深入源码

双设备初始化

位置: master/master.c:ec_master_init() (约行 140–165)

初始化时检查是否指定了备用 MAC 地址:

  1. master->macs[EC_DEVICE_BACKUP] = backup_mac
  2. master->num_devices = 1 + !ec_mac_is_zero(backup_mac)
  3. 如果备用 MAC 不为零,则 num_devices = 2
  4. 分别初始化 devices[0]devices[1]

发送路径中的设备选择

位置: master/master.c:ecrt_master_send() (约行 3057–3100)

发送时遍历所有设备(主/备):

  1. 检查 devices[dev_idx].link_state
  2. 如果链路正常,调用 ec_master_send_datagrams(master, dev_idx)
  3. 如果链路异常,跳过该设备

接收路径中的设备处理

位置: master/master.c:ecrt_master_receive() (约行 3106–3160)

  1. 对每个设备的接收缓冲区调用 ec_master_receive_datagrams()
  2. 两个设备的数据报可能包含相同从站的响应(冗余场景)
  3. 接收处理会自动去重

ec_device 结构体关键字段

源文件: master/device.h

字段 类型 说明
master ec_master_t * 所属主站指针
index ec_device_index_t 设备索引 (MAIN=0, BACKUP=1)
dev struct net_device * Linux 网络设备
link_state uint8_t 链路状态 (0=down, 1=up)
tx_skb struct sk_buff * 发送 SKB
tx_frame_data uint8_t * 发送帧数据指针
poll void (*)(void *) EtherCAT 轮询回调
cycles_poll cycles_t 上次轮询的 CPU 周期
jiffies_poll unsigned long 上次轮询的 jiffies
http://www.jsqmd.com/news/641494/

相关文章:

  • 兰亭妙微大厂产品细节白皮书:8个高频复用的设计思路与典型应用案例 - ui设计公司兰亭妙微
  • 【CANN训练营】自定义算子开发实战指南
  • 3分钟掌握抖音批量下载神器:无水印视频一键搞定
  • 终极指南:如何优化Meridian营销组合模型性能
  • 终极Authlogic社区生态指南:探索活跃开源项目与实战最佳实践
  • 终极指南:如何免费下载Steam创意工坊模组,无需Steam账号!
  • 如何将3D模型转换为Minecraft建筑:ObjToSchematic完整指南
  • 如何快速搭建App Privacy Policy Generator:从项目结构到技术选型全解析
  • ExtractorSharp:5步掌握专业游戏资源编辑工具的高效使用
  • 虚拟机与主机高效共享文件的配置指南
  • 如何5分钟上手franc:初学者完整安装与使用指南
  • 肺结核基因数据分析实战:WGCNA从入门到模块筛选(附完整R代码)
  • TOGAF认证通关指南:从理论到实战的架构师进阶之路
  • 在Ubuntu 20.04上,用RTX 3080从零部署逐际动力TRON1机器人(保姆级避坑指南)
  • 终极Meridian广告归因延迟优化指南:5个关键增量处理策略
  • conda/neo4j常用命令
  • 图文理解准确率提升23.6%的关键操作,深度复现SITS2026官方未公开的微调Checklist
  • SanAndreasUnity角色AI系统:NPC行为树与路径规划技术剖析
  • golang如何使用go-redis客户端_golang go-redis客户端使用教程
  • 动手学深度学习——束搜索
  • 如何自定义Apache Thrift代码模板:掌握高效代码生成的终极指南
  • 别再死记硬背SOP表了!手把手教你用Python模拟BMS的查表功率估算(附代码)
  • CPU-X核心功能详解:从CPU到显卡的全面硬件信息收集
  • uview-plus Picker组件实战:动态加载省市区数据的联动技巧
  • 10分钟掌握 Angular Schema Form:JSON Schema 到表单的完整转换教程
  • 2024年软考架构设计师通关秘籍:从八大架构到实战解析
  • DevOps自动化与持续交付:从理论到实践
  • 基于VS+Qt的工业相机SDK集成与多线程图像处理实战
  • 【原创】IgH EtherCAT主站详解(7)--Device网卡、EEPROM(SII)和EoE模块介绍
  • 利用 iptables 构建精细化 SSH 访问控制策略:从基础规则到高级防护