IgH EtherCAT 从入门到精通:第 3 章 第一次运行 Hello EtherCAT

张开发
2026/4/15 0:12:12 15 分钟阅读

分享文章

IgH EtherCAT 从入门到精通:第 3 章 第一次运行 Hello EtherCAT
第 3 章 第一次运行 Hello EtherCAT导读摘要完成编译安装后接下来要让 EtherCAT Master 真正跑起来。本章将带你从配置文件开始逐步加载内核模块、启动 Master、用命令行工具探索总线最后分别运行内核态和用户态示例程序。读完本章你将完成从装好了到跑通了的关键一步。3.1 配置文件 ethercat.conf 详解EtherCAT Master 的运行参数集中在一个配置文件中/etc/ethercat.conf。启动脚本ethercatctl会在启动时 source 这个文件把其中的 Shell 变量读入内存。核心配置项配置文件中最重要的变量有三组1) MASTER0_DEVICE —— 指定主网卡# 方式一使用 MAC 地址MASTER0_DEVICE00:00:08:44:ab:66# 方式二使用网卡接口名脚本会自动解析为 MACMASTER0_DEVICEeth0# 方式三广播地址表示接受任意网卡仅用于快速测试MASTER0_DEVICEff:ff:ff:ff:ff:ff如果需要多个 Master 实例依次设置MASTER1_DEVICE、MASTER2_DEVICE即可。脚本会从MASTER0开始循环遇到空值即停止变量个数决定了 Master 实例数量。2) MASTER0_BACKUP —— 冗余备份网卡可选#MASTER0_BACKUP冗余模式Cable Redundancy下使用。如果你只有一块网卡可以忽略此项。3) DEVICE_MODULES —— 网卡驱动模块# 可选值: 8139too, e100, e1000, e1000e, r8169, generic, igb, igc 等DEVICE_MODULESgeneric这个变量告诉启动脚本加载哪个 EtherCAT 专用网卡驱动。generic是通用驱动兼容性最好适合入门。专用驱动如e1000e、igb性能更优但需要在编译时用--enable-driver开启。4) UPDOWN_INTERFACES —— 自动启停的网络接口UPDOWN_INTERFACESeth0使用generic驱动时网卡必须在 Master 启动前处于 UP 状态否则所有帧都会超时。将接口名填入此变量脚本会在 start 时自动执行ip link set dev eth0 up。最小可运行配置对于只有一块 Intel 网卡的测试环境最小配置如下MASTER0_DEVICEeth0DEVICE_MODULESgenericUPDOWN_INTERFACESeth03.2 加载内核模块与启动 MasterIgH EtherCAT Master 的启动由 systemd 服务 控制脚本协同完成。下面是它们的协作流程┌──────────────────────────────────────────────────────┐ │ systemd: ethercat.service │ │ │ │ ExecStart /usr/sbin/ethercatctl start │ │ ExecStop /usr/sbin/ethercatctl stop │ └─────────────────────┬────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────┐ │ ethercatctl start 流程 │ │ │ │ 1. source /etc/ethercat.conf │ │ 2. ip link set dev UPDOWN_INTERFACES up │ │ 3. 解析 MASTER*_DEVICE → MAC 地址列表 │ │ 4. modprobe ec_master main_devicesMAC │ │ 5. rmmod 原生驱动 (如 e1000e) │ │ 6. modprobe ec_DEVICE_MODULES │ └──────────────────────────────────────────────────────┘使用 systemd 启动# 启动 Mastersudosystemctl start ethercat# 查看状态sudosystemctl status ethercat# 设置开机自启sudosystemctlenableethercat手动启动调试用有时候我们需要绕过 systemd 直接操作便于观察错误输出# 手动加载主模块指定网卡 MACsudomodprobe ec_mastermain_devices00:00:08:44:ab:66# 加载网卡驱动模块以 generic 为例sudomodprobe ec_generic# 验证模块加载lsmod|grepec_成功加载后ec_master模块会在内核日志中打印版本信息。我们可以通过dmesg确认dmesg|grep-iethercat# 预期输出类似# EtherCAT: Master driver 1.6.x# EtherCAT: 1 master waiting for devices.# EtherCAT: Accepting eth0 as main device for master 0.当ec_master加载后它会进入 Idle 阶段Phase等待网卡驱动通过ecdev_offer()接口提供网络设备。一旦驱动加载并完成匹配Master 即进入正常工作状态。停止 Master# 通过 systemdsudosystemctl stop ethercat# 或手动卸载sudormmod ec_genericsudormmod ec_master停止顺序与启动相反先卸载网卡驱动模块再卸载主模块。脚本还会重新加载原生网卡驱动恢复普通网络功能。3.3 使用 ethercat 命令行工具探索总线Master 启动后我们可以用ethercat命令行工具与之交互。这是日常调试最常用的工具。查看 Master 状态ethercat master输出示例Master0 Phase: Idle Active: no Slaves: 3 ...扫描从站# 列出总线上所有从站ethercat slaves# 输出示例# 0 0:0 PREOP EK1100 EtherCAT Coupler# 1 0:1 PREOP EL2004 4Ch. Dig. Output 24V# 2 0:2 PREOP EL3152 2Ch. Ana. Input 4-20mA每行含义依次为从站绝对位置Absolute Position、别名:位置、当前 AL 状态Application Layer State、连接标志、设备描述。常用子命令速查命令说明ethercat master查看 Master 概要信息ethercat slaves列出所有从站及其状态ethercat pdos查看从站 PDOProcess Data Object映射ethercat sdos查看从站 SDOService Data Object字典ethercat upload -p0 --type uint16 0x1018 1读取从站 SDO 条目ethercat xml导出从站信息为 XML 格式ethercat graph输出拓扑结构Graphviz DOT 格式这些命令通过/dev/EtherCAT0字符设备与内核 Master 通信。如果遇到权限问题请确保当前用户在正确的用户组中或使用sudo。3.4 运行 mini 内核示例程序examples/mini/mini.c是一个内核模块Kernel Module形式的示例演示了在内核态使用 EtherCAT 实时接口的完整流程。核心流程示例代码的init_mini_module()函数展示了标准的初始化步骤// 1. 请求 Master 实例masterecrt_request_master(0);// 2. 创建过程数据域Domaindomain1ecrt_master_create_domain(master);// 3. 获取从站配置sc_ana_inecrt_master_slave_config(master,AnaInSlavePos,Beckhoff_EL3152);// 4. 配置 PDO 映射ecrt_slave_config_pdos(sc_ana_in,EC_END,el3152_syncs);// 5. 注册 PDO 条目ecrt_domain_reg_pdo_entry_list(domain1,domain1_regs);// 6. 激活 Masterecrt_master_activate(master);// 7. 启动周期性任务100 Hz 定时器timer_setup(timer,cyclic_task,0);周期性任务cyclic_task()中的数据交换循环是 EtherCAT 通信的核心// 接收数据ecrt_master_receive(master);ecrt_domain_process(domain1);// 写过程数据EC_WRITE_U8(domain1_pdoff_dig_out,blink?0x06:0x09);// 发送数据ecrt_domain_queue(domain1);ecrt_master_send(master);编译与运行# 进入示例目录cdexamples/mini# 编译需要已安装的内核头文件和 EtherCAT 头文件make# 加载模块确保 Master 已启动sudoinsmod ec_mini.ko# 观察内核日志dmesg|tail-20# 卸载模块sudormmod ec_mini加载成功后dmesg中会看到类似输出ec_mini: Starting... ec_mini: Registering domain... ec_mini: Configuring PDOs... ec_mini: Activating master... ec_mini: Started. ec_mini: 3 slave(s). ec_mini: AL states: 0x08. ec_mini: Link is up.注意mini 示例使用内核定时器Timer周期为 10ms100Hz精度有限。生产环境中通常使用 RTAI、Xenomai 或 PREEMPT_RT 内核配合更高精度的定时机制。3.5 运行 user 用户空间示例程序examples/user/main.c演示了在用户空间User Space使用 EtherCAT 的方法。与内核态相比用户态程序更容易开发和调试是大多数应用的推荐起点。与内核态的关键差异用户态示例使用了 POSIX 实时调度机制代替内核定时器// 设置 FIFO 实时调度策略structsched_paramparam{};param.sched_prioritysched_get_priority_max(SCHED_FIFO);sched_setscheduler(0,SCHED_FIFO,param);// 锁定内存防止页面换出mlockall(MCL_CURRENT|MCL_FUTURE);// 使用 clock_nanosleep 实现 1ms 周期#definePERIOD_NS(1000000)// 1msclock_nanosleep(CLOCK_MONOTONIC,TIMER_ABSTIME,wakeup_time,NULL);EtherCAT API 调用方式与内核态完全一致——ecrt_request_master()、ecrt_master_create_domain()、ecrt_master_activate()等函数签名和语义不变。这是 IgH Master 设计的一大优点同一套 API内核态和用户态通用。编译与运行# 编译安装时已生成 Makefilecdexamples/usermake# 运行需要 root 权限因为要访问 /dev/EtherCAT0 和设置实时优先级sudo./ec_user_example预期输出Configuring PDOs... Activating master... Using priority 99. Starting RT task with dt1000000 ns. 3 slave(s). AL states: 0x08. Link is up. Domain1: WC 3.按CtrlC终止程序。用户态程序退出时会自动释放 MasterMaster 回到 Idle 阶段。用户态 vs 内核态选择建议维度内核态 (mini)用户态 (user)开发难度高需内核编程经验低标准 C 编程调试手段printk / dmesgprintf / gdb实时性极高配合 RT 内核高PREEMPT_RT 内核下稳定性风险bug 可能导致内核崩溃bug 只影响用户进程推荐场景极端实时要求绝大多数工业应用3.6 常见启动问题排查初次运行时以下问题出现频率最高。我们逐一解析。问题 1No network cards for EtherCAT specified原因ethercat.conf中MASTER0_DEVICE为空。解决填写正确的网卡 MAC 地址或接口名。# 查看可用网卡iplinkshow问题 2Master 一直卡在waiting for devices原因ec_master已加载但没有网卡驱动向它注册设备。排查步骤检查DEVICE_MODULES是否设置且模块已编译确认ec_generic或对应驱动已加载lsmod | grep ec_使用 generic 驱动时确认网卡接口已 UP问题 3Master already in use!原因已有程序如 mini 模块占用了 Master。每个 Master 实例同一时间只能被一个应用请求。解决先卸载或终止占用程序再运行新程序。问题 4Failed to enter OPERATION phase原因网卡驱动未正确绑定或网线未连接。排查# 检查内核日志dmesg|grep-iethercat# 确认物理连接ethtooleth0|grepLink detected问题 5权限不足无法访问/dev/EtherCAT0原因用户态程序需要对字符设备的读写权限。解决# 临时方案sudochmod666/dev/EtherCAT0# 永久方案添加 udev 规则echoKERNELEtherCAT[0-9]*, MODE0666|\sudotee/etc/udev/rules.d/99-ethercat.rules问题 6所有帧超时Timeout原因使用 generic 驱动时网卡接口未激活。解决在ethercat.conf中设置UPDOWN_INTERFACES或手动执行ip link set dev eth0 up。3.7 小结本章我们完成了 EtherCAT Master 的首次运行全流程配置ethercat.conf中的三个核心变量MASTER0_DEVICE、DEVICE_MODULES、UPDOWN_INTERFACES决定了 Master 的基本行为启动通过 systemd 服务或手动 modprobe 加载ec_master和网卡驱动模块探索ethercat命令行工具可以查看 Master 状态、扫描从站、读写 SDO内核态示例mini 模块展示了ecrt_request_master()→ecrt_master_activate()→ 周期任务的标准流程用户态示例user 程序使用相同的 API配合 POSIX 实时调度实现毫秒级周期控制排查大多数启动问题源于配置遗漏或驱动未正确加载如果你能看到ethercat slaves输出从站列表并且示例程序正常打印状态信息恭喜你——EtherCAT 总线已经跑通了。下一章预告第 4 章将深入讲解网络设备驱动的选型与配置帮助你在 Generic 通用驱动和各种 Native 原生驱动之间做出正确选择并掌握驱动的配置方法。

更多文章