文章目录

软PLC的EtherCAT主站配置

发布于 2026-03-25 20:35:32 · 浏览 9 次 · 评论 0 条

软PLC的EtherCAT主站配置

本指南旨在通过纯文字步骤,指导完成在软PLC系统中搭建EtherCAT主站的全过程,涵盖硬件准备、软件安装、从站扫描及PDO映射配置。


一、 硬件与网络环境准备

在开始配置前,必须确保物理连接正确且操作系统已识别网卡。

  1. 检查网口兼容性。
    确认工控机或软PLC控制器上的网卡芯片支持EtherCAT。绝大多数Intel Realtek千兆网卡均可通用,但某些板载Realtek网卡可能需要特定驱动。

  2. 连接硬件线路。
    使用EtherCAT专用网线,将主站网口(Port)连接到从站设备的In口。若为多设备串联,请依次连接从站的Out口至下一台设备的In口,末端从站的Out口通常需要接入终端电阻或不接。

  3. 记录物理拓扑。
    在纸上简单画出连接顺序,标记每台从站的物理站号(通常设备外壳上有拨码开关或默认站号显示),配置时需核对顺序是否一致。


二、 安装EtherCAT主站软件

以下步骤以常用的Linux环境下的IGH EtherCAT Master为例,Windows环境下的CODESYS或TwinCAT逻辑类似,但操作界面不同。

  1. 获取主站源码。
    打开终端,使用Git命令克隆官方源码库。

    git clone https://gitlab.com/etherlab.org/ethercat.git
  2. 编译并安装主站。
    进入源码目录,执行配置、编译和安装命令。--with-modules 参数表示构建内核模块。

    cd ethercat
    ./configure --with-modules --prefix=/opt/ethercat
    make
    sudo make install
  3. 加载内核模块。
    使用 modprobe 命令加载主站模块。此时,绑定了EtherCAT驱动的网口将不再拥有IP地址。

    sudo modprobe ec_master
  4. 配置网卡绑定。
    创建或编辑 /etc/sysconfig/ethercat 文件,将 MASTER0_DEVICE 变量设置为主网卡的MAC地址。使用 ifconfig 命令查看MAC地址。

    # 示例配置文件内容
    MASTER0_DEVICE="00:0c:29:12:34:56"

三、 扫描网络并识别从站

系统启动主站后,首要任务是扫描总线上的所有从站设备。

  1. 启动主站服务。
    执行以下命令启动EtherCAT主站。

    sudo /etc/init.d/ethercat start
  2. 查询从站列表。
    使用命令行工具查看总线上的设备状态。如果硬件连接正确,你将看到所有从站的列表。

    sudo /opt/ethercat/bin/ethercat slaves

    输出结果应显示从站的序号(Position)、厂商名称和产品名称。如果输出为空,请检查网线连接或网卡驱动。

  3. 生成ESI描述文件。
    若从站设备未提供XML格式的ESI(EtherCAT Slave Information)文件,需使用工具读取从站内部信息并生成。通常使用 ethercat xml 命令。

    sudo /opt/ethercat/bin/ethercat xml > my_slave.xml

    将生成的 my_slave.xml 文件放置到主站的配置目录中(通常为 /etc/ethercat/)。


四、 配置过程数据对象(PDO)映射

这是配置的核心环节,决定了主站与从站交换哪些数据(如控制字、状态字、位置值、速度值等)。

  1. 查看默认PDO配置。
    使用 ethercat pdos 命令查看当前从站支持的所有PDO条目。

    sudo /opt/ethercat/bin/ethercat pdos
  2. 分析通信需求。
    确定你的应用需要的数据。例如,控制一个伺服驱动器通常需要:

    • 输出(RX PDO):控制字、模式、目标位置。
    • 输入(TX PDO):状态字、实际位置、实际电流。
  3. 编写配置脚本。
    通常需要编写一个C文件或主站配置文件来定义映射。以下展示一个配置逻辑的伪代码结构,用于设置PDO映射。

    // 配置输出PDO (RX PDO)
    ecrt_slave_config_pdos(slave_config, EC_DIR_OUTPUT, 0x1600);
    
    // 添加控制字
    ecrt_slave_config_pdo_mapping_add(slave_config, EC_DIR_OUTPUT, 0x1600,
        0x6040, 0x00, 16); // 索引0x6040,子索引0x00,位宽16bit
    
    // 配置输入PDO (TX PDO)
    ecrt_slave_config_pdos(slave_config, EC_DIR_INPUT, 0x1A00);
    
    // 添加状态字
    ecrt_slave_config_pdo_mapping_add(slave_config, EC_DIR_INPUT, 0x1A00,
        0x6041, 0x00, 16); // 索引0x6041,子索引0x00,位宽16bit
  4. 注册PDO域。
    为了统一管理数据,需将所有从站的PDO条目注册到一个或多个“域”中。建议将所有输入数据注册到一个域,所有输出数据注册到另一个域。

    // 注册输入域
    domain_in = ecrt_master_create_domain(master);
    
    // 注册输出域
    domain_out = ecrt_master_create_domain(master);
    
    // 将具体的PDO条目注册到域中
    ecrt_domain_reg_pdo_entry_list(domain_in, domain_in_regs);
    ecrt_domain_reg_pdo_entry_list(domain_out, domain_out_regs);

五、 数据周期交换配置

在软PLC的应用层代码中,需要建立周期性任务来处理数据交换。以下为 EtherCAT 运行的标准数据流逻辑。

为了确保代码逻辑清晰,使用流程图描述主站运行时的数据交换状态机:

graph TD A["应用启动"] --> B["请求主站状态"] B --> C{状态是否为\nOperational?} C -- 否 --> D["等待从站初始化\n配置分布式时钟"] D --> B C -- 是 --> E["发送过程数据\n(循环开始)"] E --> F["接收过程数据"] F --> G["应用层逻辑处理"] G --> E
  1. 创建周期性任务。
    在主程序中创建一个高优先级线程,例如使用 pthread 并设置调度策略为 SCHED_FIFO

    pthread_create(&thread, NULL, cyclic_task, NULL);
  2. 设置循环周期。
    在线程循环中,计算唤醒时间。EtherCAT的标准周期通常为 $1ms$(即 $1000 \mu s$)。

    // 计算下一个唤醒时间点
    ret = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &wakeup_time, NULL);
  3. 执行数据接收与发送。
    在每个周期内,必须严格按照“先接收,后发送,再应用”的顺序处理。

    • 接收数据:ecrt_master_receive(master);ecrt_domain_process(domain_in);
    • 处理数据:将原始数据帧转换为实际物理量。
    • 发送数据:ecrt_domain_queue(domain_out);ecrt_master_send(master);
  4. 检查工作计数器。
    为了确保数据真正到达从站,必须检查工作计数器。若 WKC 与预期不符,说明通信丢包或从站掉线。

    if (ecrt_domain_process(domain_in)) {
        // 错误处理
    }

六、 常见参数配置表

在配置伺服驱动器或IO模块时,以下表格列出了常用的 EtherCAT 状态机控制字(Control Word)位定义,供调试参考。

位 (Bit) 名称 功能描述 常用值 (16进制)
0 Switch On 接通主电路电源 0x0006 (准备就绪) <br> 0x0007 (使能开启)
1 Enable Voltage 激活电压 0x0007
2 Quick Stop 快速停止位 (1为正常) 0x0007
3 Enable Operation 使能操作 (运行) 0x000F
7 Fault Reset 故障复位 (脉冲置0) 0x0000 -> 0x000F

在配置从站状态机切换时,通常遵循以下状态顺序:Init -> PreOp -> SafeOp -> Op。在软PLC代码中,需通过配置 ecrt_slave_config_state() 函数或在系统启动脚本中自动切换这些状态。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文