工业通讯协议(二)- EtherCAT

一. 概述

EtherCAT(Ethernet for Control Automation Technology)是一种在工业自动化中广泛使用的高性能以太网通信协议。它由德国的Beckhoff Automation公司在2003年开发,目的是用于控制系统中实现更快的数据交换。EtherCAT符合IEEE 802.3标准,并且是国际电工委员会(IEC)的公开标准,即IEC 61158和IEC 61784。

EtherCAT的主要特点包括:

  • 高性能:EtherCAT协议设计用于高速数据交换,具有很低的通信延迟和高数据吞吐量。它允许在很短的周期时间内(通常是微秒级别)传输大量的数据。
  • 实时性:EtherCAT非常适合实时应用,因为它可以保证数据包的及时传输和处理,这对于同步动作和过程控制至关重要。
  • 高效的数据处理:EtherCAT使用了一种特殊的“在通过”(on-the-fly)处理技术,数据包可以在流经每个节点时被即时读取和响应,而不需要中断和等待,极大地减少了数据传输时间。
  • 灵活性和可扩展性:EtherCAT网络可以很容易地扩展,只需要添加更多的节点。网络可以是线性的、树状的或者是一个更复杂的拓扑结构。这使得它可以在各种规模和复杂性的自动化项目中使用。
  • 简化的硬件需求:与其他工业以太网解决方案相比,EtherCAT不需要昂贵的通信芯片或专用硬件。它可以在普通的以太网硬件上运行,因为数据处理主要是在软件中完成的。
  • 兼容性和标准化:EtherCAT支持与其他工业通信协议的互操作性,并且遵循国际标准,这意味着不同制造商的设备可以相互通信。
  • 诊断和监测功能:EtherCAT提供了强大的诊断工具和功能,可以帮助检测和解决网络中的问题,例如断线、节点故障等。

EtherCAT的应用范围非常广泛,包括机器人、包装机、塑料成型机、数控机床、组装系统以及过程控制等领域。它的高性能和灵活性使得它成为工业自动化和控制系统中的首选通信协议之一。

二. 工作原理

OSI网络模型

EtherCAT仅使用了物理层、链路层、应用层三层协议,与多数传统的现场总线相同,但相比于其它实时以太网协议,如PROFINET、EtherNet/IP等,其协议栈更加精简。

RJ45网口、PHY物理层芯片用于实现物理层协议;ESC用于实现链路层协议,通常使用倍福官方的ET1100芯片实现;MCU则用于实现应用层协议,需要厂商自行根据相应的协议编写程序代码,或是直接使用协议栈代码实现。

image

主从架构

EtherCAT网络采用主从架构,网络组态于PC主机上进行配置,需要使用到相应的EMI(EtherCAT Master Information Files)、ESI(EtherCAT Slave Information Files)文件,经专用配置软件(通常于主站配置软件中集成)进行配置后生成ENI(EtherCAT Network Information Files)文件下载至主站中,主站便依据该文件进行整个网络的识别。

主站通常是一个工业PC或者是一个带有EtherCAT主站功能的控制器。主站负责初始化通信,发送和接收数据,并且管理整个EtherCAT网络。它周期性的发送一个或多个以太网数据包,这些数据包通过网络中的每个从站并最终返回到主站。主站在数据包传递过程中处理所有必要的数据交换和同步任务。

从站通常是执行实际控制任务的设备,比如\(I/O\)模块、伺服驱动器、传感器或执行器等。每个从站有一个EtherCAT从站控制器(ESC),它读取经过的数据包并按需要插入或提取数据。从站不需要有复杂的处理能力,因为实际的数据处理是由主站完成的。

EtherCAT技术突破了其他以太网解决方案的系统限制:通过该项技术,无需接收以太网数据,将其解码,之后再将过程数据复制到各个设备。EtherCAT是一种实时以太网技术,由一个主站设备和多个从站设备构成。主站可以使用标准网卡实现,从站选用特定的EtherCAT从站控制器ESC(EtherCAT Slave Controller)或者FPGA实现。EtherCAT报文(标准的ISO/IEC 8802-3以太网帧)由主站设备发出,途经各个从站设备,从站设备在报文经过时进行提取或插入数据。当报文到达网段内最后一个从站设备时再反方向传输,最后由第一个从站设备把收集到的信息返回到主站设备。

image

拓扑结构

EtherCAT支持多种拓扑结构,这使得它非常灵活,可以适应各种安装和系统设计的要求。以下是EtherCAT网络中常见的几种拓扑结构:

线性拓扑(Line)

线性拓扑是最常见的EtherCAT网络结构。每个从站都通过双向链路连接到下一个从站。数据包从主站开始,依次流经每个从站,直到最后一个从站,然后再沿相同的路径返回主站。这种拓扑结构的好处是简单且容易扩展,只需在链的末端添加更多的从站即可。

树形拓扑(Tree)

树形拓扑允许从一个从站分支出多个下级从站。这对于分布在不同物理位置或需要组织成逻辑组的设备来说非常有用。树形拓扑可以通过使用交换器或特定的分支延长器来实现,从而允许更灵活的布线和更好的带宽利用。

星形拓扑(Star)

星形拓扑中,每个从站直接通过单独的连接回到主站或者连接到集线器。尽管这种拓扑在物理上不是纯粹的以太网星形网络,但它通过使用以太网交换器实现了类似的效果。这种拓扑对于距离主站很远或者需要高带宽连接的单个设备来说非常适用。

环形拓扑(Ring)

在环形拓扑中,从站形成一个闭环,数据包在环中传递,并从任一方向返回到主站。这种拓扑提供了冗余的路径,如果环中的一个连接断开,数据包可以通过另一个方向绕行,从而增加了系统的可靠性。

混合拓扑(Hybrid)

混合拓扑结合了以上几种拓扑结构的特点。例如,主分支可能是线性的,而从这个主分支出来的分支可能采用树形或星形结构。这种拓扑灵活性高,可以根据实际的安装需求和设备布局来设计网络。

EtherCAT的一个重要特点是不管采用哪种拓扑结构,它都能高效地处理数据。即使在混合拓扑中,数据仍然能够快速地在通过处理,并保持同步和确定性的传输。拓扑的选择通常取决于系统的具体要求,包括安装空间、可靠性需求、扩展性和成本效益等因素。

image

同步时钟

EtherCAT具有一个精确的时钟同步机制,称为分布式时钟(Distributed Clocks, DC)。这个机制用于确保网络中所有从站的本地时钟与主站时钟同步,从而允许在整个EtherCAT网络中进行高精度的时间同步操作。时钟同步对于需要严格协调的应用,比如多轴运动控制、同步采样或者确保在确定的时间点同时触发事件,都是非常关键的。

以下是EtherCAT时钟同步的主要步骤和组成部分:

  1. 启动分布式时钟同步:主站会启动同步过程,这通常发生在系统启动时。主站会检测所有支持分布式时钟的从站,并启动它们的时钟。

  2. 主站时钟广播:主站定期发送一个广播消息,这个消息包含主站的精确时间戳。这个广播消息被称为引导时间同步电报(Reference Time Sync Telegram)。

  3. 从站时钟校准:当引用时间同步电报通过网络传递时,每个支持分布式时钟的从站会捕获这个时间戳并将其与本地时钟进行比较。根据比较结果,从站会调整自己的时钟,以减少与主站时钟的偏差。

  4. 补偿信号传播延迟:由于信号在电缆中传播需要时间,EtherCAT协议计算并补偿这个延迟,确保从站时钟的精度。补偿值可以通过测量或预先计算得出。

  5. 时钟同步周期:分布式时钟同步是一个周期性发生的过程。每一个同步周期内,所有从站的时钟都会被重新同步,以便保持高精度的时间一致性。

image

三. 协议格式

EtherCAT报文帧只能由主站进行发送,在一个通讯周期内,主站发送以太网数据帧给各个从站,数据帧到达从站后,每个从站根据寻址从数据帧内提取相应的数据,并把它反馈的数据写入数据帧。当数据帧发送到最后一个从站后返回,并通过第一个从站返回至主站。这种传输方式能够在一个周期内实现数据通讯,还改善了带宽利用率,最大有效数据利用率达90%以上。(这种传输方式有点类似于现实生活中的环型地铁,列车上的人到达自己的目的站点后下车,每个站点的人也会相应上车。)

EtherCAT报文遵循一种特定的协议格式,它通过在以太网帧内封装其数据来实现高效的通信。EtherCAT使用以太网帧结构,但通过其特定的工作方式来优化实时性能。这里是EtherCAT报文的基本格式:

  1. 目的地MAC地址:以太网帧的标准字段,用于标识目的地网络接口的硬件地址。

  2. 源MAC地址:同样是以太网帧的标准字段,表示发送者的硬件地址。

  3. EtherType字段:EtherCAT使用了特定的EtherType值(0x88A4),这告诉接收端该帧是一个EtherCAT数据包。

  4. EtherCAT报头:包含了用于EtherCAT操作的控制信息,比如命令类型(例如PDO,SDO,等)、长度等信息。

以下是EtherCAT报头的一些关键组成部分:

  • 命令:指示报文类型,例如PDO(过程数据对象)传输、SDO(服务数据对象)传输、错误指示等。

  • 索引:指示目标从站的位置或者是在整个EtherCAT帧中的位置。

  • 数据长度:报文中数据部分的长度。

  • 地址:从站地址或者是内存映射的地址,依据命令类型不同而定。

  1. 工作计数器(Working Counter):提供了一种错误检测机制,通过计算处理了报文的从站数量来确保通信的完整性。

  2. 数据:这是EtherCAT报文的主体部分,包含了实际的有效负载,比如过程数据、参数或其它控制信息。

  3. 填充:因为以太网的最小帧长度是64字节,所以如果数据部分不足,需要用填充字节来补足。

  4. 帧校验序列(Frame Check Sequence, FCS):这是以太网帧的标准结尾字段,用于检测帧在传输过程中是否出现错误。

image

EtherCAT协议的关键在于它的"在过程中处理"(processing on the fly)能力。从站设备在数据包通过时读取并相应地处理它们的相关部分数据,并且可以立即将响应数据插入到报文中,而不需要将整个报文读入内存然后再处理。这大大减少了通信延迟,使EtherCAT成为一个高效的实时以太网解决方案。

C++代码编写

SOEM(Simple Open EtherCAT Master)和SOES(Simple Open EtherCAT Slave)都是由Open Source Automation Development Lab (OSADL) eG支持开发的开源库。这些库是为了简化EtherCAT通信的开发而设计的。
SOEM作为一个开源的EtherCAT主站协议栈,是为了在各种平台上实现EtherCAT主站功能。它针对实时应用进行了优化,并且可以在多种操作系统上运行,包括实时Linux(通过PREEMPT_RT补丁)。
SOES是一个开源的EtherCAT从站协议栈,它旨在在嵌入式系统中实现EtherCAT从站功能。与SOEM类似,SOES也是为实时性能进行优化,能够在不同的硬件平台和操作系统上运行。
两者都是基于C语言编写,使它们可以在性能有限的嵌入式设备上运行,同时提供足够的灵活性来适应不同的应用需求。
这些库被广泛用于工业自动化和控制系统中,它们的开放源码特性使得用户可以下载、使用、修改并分发代码,而无需支付许可费用,这对于推动EtherCAT技术的广泛采用和社区支持非常重要。

下面给出C++调用SOEM和SOES作EtherCAT主从站的代码示例:

主站


#include <iostream>
#include "ethercat.h"

int main() {
    // 初始化网络接口
    if (ec_init("eth0")) {
        std::cout << "EtherCAT 初始化成功,网络接口 eth0" << std::endl;

        // 将所有从站置于PRE-OP状态
        if (ec_config_init(FALSE) > 0) {
            std::cout << "找到并配置了 " << ec_slavecount << " 个从站" << std::endl;

            // 配置和启动主站
            ec_config_map(&IOmap);
            ec_configdc();

            // 检查所有从站的状态
            ec_readstate();
            for (int i = 1; i <= ec_slavecount; i++) {
                std::cout << "从站 " << i << " 状态: " << ec_slave[i].state << std::endl;
            }

            // 交换过程数据
            while (true) {
                ec_send_processdata();
                ec_receive_processdata(EC_TIMEOUTRET);
                // 处理数据...
            }
        } else {
            std::cerr << "没有从站被找到!" << std::endl;
        }
    } else {
        std::cerr << "无法初始化网络接口!" << std::endl;
    }

    std::cout << "请求结束 EtherCAT 通信..." << std::endl;
    ec_close();

    return 0;
}

从站

#include <iostream>
// #include "soes.h" // 假设你有一个类似的从站库

void process_ethercat_data() {
    // 从站逻辑处理
    // 读取输入数据,处理逻辑,设置输出数据等
}

int main() {
    // 初始化从站栈
    // soes_init();

    // 从站主循环
    while (true) {
        // 维护EtherCAT状态机
        // soes_loop();

        // 处理EtherCAT数据
        process_ethercat_data();
    }

    return 0;
}

四. ENI文件

EtherCAT 网络中的 ENI 文件 (EtherCAT Network Information) 是一种 XML 格式文件,用于描述和配置 EtherCAT 网络的拓扑和参数设置。ENI 文件由 EtherCAT 主站使用,包含从站设备的配置信息,它的生成通常通过配置工具(例如 Beckhoff 的 TwinCAT 或其他 EtherCAT 配置软件)完成。

ENI 文件的作用

  1. 网络拓扑描述:ENI 文件详细描述了 EtherCAT 网络的结构,包括主站和所有从站的连接关系。
  2. 设备配置:它包含每个从站设备的配置信息,如设备类型、同步方式、PDO (Process Data Object) 映射、SDO (Service Data Object) 配置等。
  3. 通信参数:ENI 文件定义了通信参数,如周期时间、同步管理、传输模式等。

示例 ENI 文件

以下是一个简单的 ENI 文件示例,展示了 EtherCAT 网络中包含两个从站的基本配置。

<?xml version="1.0" encoding="UTF-8"?>
<EtherCATInfo>
    <Config>
        <Master>
            <Info>
                <Name>EtherCAT Master</Name>
                <Type>Generic Master</Type>
            </Info>
            <Vendor>00000000</Vendor>
            <ProductCode>00000000</ProductCode>
            <RevisionNo>00000000</RevisionNo>
            <BootStrap>1</BootStrap>
            <Mailbox>1</Mailbox>
        </Master>
        <Slaves>
            <Slave>
                <Info>
                    <Name>Slave 1</Name>
                    <Type>IO Device</Type>
                </Info>
                <Vendor>00000001</Vendor>
                <ProductCode>00000001</ProductCode>
                <RevisionNo>00000001</RevisionNo>
                <AutoIncAddr>1001</AutoIncAddr>
                <FixedAddr>0x1000</FixedAddr>
                <SyncManager>
                    <Index>0</Index>
                    <Direction>Write</Direction>
                    <PDO>
                        <Index>0x1600</Index>
                        <Name>Outputs</Name>
                        <Entry>
                            <Index>0x7000</Index>
                            <SubIndex>0x01</SubIndex>
                            <BitLength>8</BitLength>
                        </Entry>
                    </PDO>
                </SyncManager>
            </Slave>
            <Slave>
                <Info>
                    <Name>Slave 2</Name>
                    <Type>IO Device</Type>
                </Info>
                <Vendor>00000002</Vendor>
                <ProductCode>00000002</ProductCode>
                <RevisionNo>00000002</RevisionNo>
                <AutoIncAddr>1002</AutoIncAddr>
                <FixedAddr>0x1001</FixedAddr>
                <SyncManager>
                    <Index>1</Index>
                    <Direction>Read</Direction>
                    <PDO>
                        <Index>0x1A00</Index>
                        <Name>Inputs</Name>
                        <Entry>
                            <Index>0x6000</Index>
                            <SubIndex>0x01</SubIndex>
                            <BitLength>8</BitLength>
                        </Entry>
                    </PDO>
                </SyncManager>
            </Slave>
        </Slaves>
    </Config>
</EtherCATInfo>

解释示例中的关键部分

  1. Master:

    • 描述 EtherCAT 主站的信息,包括名称、类型、供应商 ID、产品代码等。
  2. Slaves:

    • 描述从站设备的信息。每个从站设备包含以下主要信息:
      • Info: 从站设备的基本信息,如名称和类型。
      • Vendor: 供应商 ID。
      • ProductCode: 产品代码。
      • RevisionNo: 修订号。
      • AutoIncAddr: 自动递增地址。
      • FixedAddr: 固定地址。
  3. SyncManager:

    • 配置同步管理器 (SyncManager),包括方向(读取或写入)和 PDO 映射。
    • PDO: 映射实际的过程数据对象 (Process Data Object),每个 PDO 包含一个或多个条目(Entry),每个条目包含索引、子索引和位长度等信息。

ENI文件中的DataTypeObject

在 EtherCAT 网络中的 ENI 文件中,DataTypeObject 是非常重要的元素,它们用于定义和描述从站的过程数据和对象字典。它们通常与设备的通信相关,特别是在定义过程数据对象 (PDO) 和服务数据对象 (SDO) 时。

1. DataType

DataType 定义了数据的类型,例如整数、浮点数、布尔值等。EtherCAT 从站的过程数据和服务数据对象通常包含多个数据类型。DataType 的定义有助于主站正确解析和解释从站发送或接收的数据。

常见的 DataType 包括:

  • BOOLEAN (布尔类型)
  • INT8 (8位有符号整数)
  • UINT8 (8位无符号整数)
  • INT16 (16位有符号整数)
  • UINT16 (16位无符号整数)
  • INT32 (32位有符号整数)
  • UINT32 (32位无符号整数)
  • FLOAT (浮点数)

2. Object

Object 通常用于描述 EtherCAT 从站中的对象字典 (Object Dictionary) 中的条目。对象字典是一种结构化的数据集合,它存储了从站的参数、状态信息和通信配置等。每个对象都由一个索引 (Index) 和一个子索引 (SubIndex) 组成,主站可以通过这些索引来访问相应的对象数据。

Object 元素通常包括以下信息:

  • Index: 对象的索引号,通常以十六进制表示,例如 0x6000
  • Name: 对象的名称,描述对象的功能或用途。
  • DataType: 对象的数据类型,如 UINT8INT16 等。
  • BitLength: 数据的位长度。
  • Access: 定义该对象的访问权限(例如:只读、读写)。

示例 ENI 文件中的 DataTypeObject

<?xml version="1.0" encoding="UTF-8"?>
<EtherCATInfo>
    <DataTypes>
        <DataType Index="0x0001" Name="BOOLEAN" BitSize="1"/>
        <DataType Index="0x0002" Name="INT8" BitSize="8"/>
        <DataType Index="0x0005" Name="UINT16" BitSize="16"/>
        <DataType Index="0x000B" Name="FLOAT" BitSize="32"/>
    </DataTypes>

    <Config>
        <Slaves>
            <Slave>
                <Info>
                    <Name>Temperature Sensor</Name>
                    <Type>IO Device</Type>
                </Info>
                <Vendor>00000002</Vendor>
                <ProductCode>00000002</ProductCode>
                <RevisionNo>00000002</RevisionNo>
                <Objects>
                    <!-- 过程数据对象 -->
                    <Object>
                        <Index>0x6000</Index>
                        <Name>Temperature Value</Name>
                        <DataType>UINT16</DataType>
                        <BitLength>16</BitLength>
                        <Access>Read</Access>
                    </Object>
                    <!-- 配置对象 -->
                    <Object>
                        <Index>0x2000</Index>
                        <Name>Alarm Threshold</Name>
                        <DataType>FLOAT</DataType>
                        <BitLength>32</BitLength>
                        <Access>ReadWrite</Access>
                    </Object>
                </Objects>
            </Slave>
        </Slaves>
    </Config>
</EtherCATInfo>

示例解析

DataType 部分:

  • 定义了 EtherCAT 网络中可能使用的数据类型。例如:
    • 0x0001 表示布尔类型 (BOOLEAN),大小为 1 位。
    • 0x0002 表示 8 位有符号整数 (INT8),大小为 8 位。
    • 0x0005 表示 16 位无符号整数 (UINT16),大小为 16 位。
    • 0x000B 表示 32 位浮点数 (FLOAT),大小为 32 位。

这些数据类型可以在后面的对象中引用,用于定义过程数据和服务数据的类型。

Object 部分:

Slaves 部分中,定义了两个对象:

  1. Temperature Value (0x6000):

    • 这个对象的索引为 0x6000,表示温度传感器的温度值。
    • 数据类型是 UINT16,即 16 位无符号整数。
    • 数据长度是 16 位。
    • 访问权限为 Read,表示主站只能读取该对象的数据。
  2. Alarm Threshold (0x2000):

    • 这个对象的索引为 0x2000,表示温度传感器的报警阈值。
    • 数据类型是 FLOAT,即 32 位浮点数。
    • 数据长度是 32 位。
    • 访问权限为 ReadWrite,表示主站可以读取和写入该对象的数据。

使用场景

  1. 过程数据传输 (PDO)
    Object 通常用于定义从站设备的过程数据对象(例如输入或输出数据),主站可以通过 PDO 映射来高效传输这些数据。

  2. 配置参数 (SDO)
    一些对象被定义为服务数据对象 (SDO),用于设置从站设备的参数(例如报警阈值、操作模式等)。主站可以通过 SDO 通信来访问或修改这些配置参数。

posted @ 2024-05-07 19:40  Asp1rant  阅读(1763)  评论(0编辑  收藏  举报