EtherCAT (学习笔记)
文章目录
前言
德国BECKHOFF自动化公司于2003年开发出的EtherCAT实时以太网技术突破了其他以太网解决方案的系统限制:通过该项技术,无需接受以太网数据包,将之解码,然后再将过程数据复制到各个设备。
一、EtherCAT原理介绍
EtherCAT作为一种工业以太网总线,充分利用了以太网的全双工特性。使用主从通信模式,主站发送报文给从站,从站从中读取数据或将数据插入至从站。
主站可使用标准网卡实现,
从站选用特定的EtherCAT从站控制器ESC(EtherCAT Slave Controller)或者FPGA实现,主要完成通信和控制应用两部分功能,EtherCAT物理层选用标准以太网物理层器件。
从站能将收到的报文直接处理,并读取或插入有关的数据,再将报文发送给下一个EtherCAT从站。最末尾的EtherCAT从站返回处理完全的报文,然后由第一个从站发送给主站。整个通信过程充运行于全双工模式下,TX线发出的报文又通过RX线返回给主站。
EtherCat 特点
- 实时性: us级别
- 端口管理:一个从站控制器最多可以有4个端口,此端口可以称逻辑端口或者虚拟端口,用于确保数据流的正确发送接收。
- EtherCAT网络拓扑:所有数据帧在网络中以一种“逻辑闭环”的方式传播,与网络的硬件拓朴无关,无论它是链式、菊花链、星形还是树形拓朴。master发出经过所有从站再返回。
二、EtherCAT其他未深入了解
EtherCAT网络协议栈
EtherCAT数据帧格式
EtherCAT设备寻址方式
在EtherCAT的每个子报文中,有32位空间用于对EtherCAT设备进行寻址。寻址方式有四种,分别为:
分布式时钟(Distribute Clock)
三、 应用层(Application Layer)
EtherCAT 应用层为各种服务协议与应用程序之间定义了接口, 使其能够满足应用层所要求的各种协议共同工作的需求。支持CAN open 协议中的CiA402,以及 SERCOS 协议的应用层( 即 CoE 和SoE)等多种符合行规的设备和协议。
主站设计
EtherCAT主站每周期仅需要一个或两个帧即可完成所有节点的全部通讯,而且映射不是在主站产生,而是在从站产生(外围设备将数据插入所经以太网帧的相应位置),因此,此时过程映像已经完成排序。该特性进一步减轻了主机CPU的负担。EtherCAT主站完全在主机CPU中采用软件方式实现。
- 系统配置工具(通过生产商获取)可提供包括相应的标准 XML 格式启动顺序在内的网络和设备参数。
- 或者直接使用样本代码,花费不高。软件以源代码形式提供,包括所有的EtherCAT主站功能,甚至还包括EoE(EtherCAT实现以太网)功能。开发人员只要把这些应用于Windows环境的代码与目标硬件及所使用的RTOS加以匹配就可以了。
从站设计
-
从站EtherCAT Processing Unit 总是位于 Port 0 之后其它端口之前,并在数据帧传输的过程中提取和插入数据:
-
SyncManagers 阻止主站和从站微处理器(uC)同时访问 ESC存储区,确保数据的一致性
- 含周期性数据 (Process Data) 和非周期性数据 (Mailbox)
-
FMMUs 为Lxx数据报文完成逻辑地址到物理地址的转换
- 仅对于周期性数据 (Process Data)
从站的SyncManagers 和 FMMU 是由主站在初始化阶段自动配置的,该配置基于每个从站的XML文件和整个网络的设置。
-
EtherCAT从站设备可以通过I/O接口实现。(ESC和其下的PHY,变压器和RJ45接头)。
-
复杂的可配置从站有使用一个CPU,这个CPU和ESC之间使用8位或16位并行接口或串行SPI接口。要求的CPU性能取决于从站的应用,EtherCAT协议软件在其上运行。EtherCAT协议栈管理EtherCAT状态机和应用层协议,可以实现CoE协议和支持固件下载的FoE协议。EoE协议也可以实施。
四、应用实例
控制系统设计采用“PC+运动控制器”的方案,构建多轴运动控制系统,采用PC机为主站、ARM+MCX314为从站处理器的架构。其核心插补与控制算法都放在工业PC中完成,运动控制器要求大为降低,其主要完成数字给定量到实际脉冲信号的转变。该控制系统方案的优势在于简化硬件设计工作,主要以标准化的硬件为主:上位机可以采用工业PC机、下位机使用开发的通用运动控制器,方便日后升级维护。工业PC机与运动控制器直接采用EtherCAT实时工业以太网进行通信连接。
4.1 主站操作系统(RTAI)
PC机部分软件以LinuxCNC为基础,往下LinuxCNC通过HAL(硬件抽象层)与EtherCAT主站驱动之间进行通信连接,然后EtherCAT主站通过以太网线给从站运动控制器发控制命令;往上利用LinuxCNC提供的Python调用接口和人机界面通信,数控系统人机界面采用PyQt开发;由于LinuxCNC需要运行实时任务,需要将普通操作系统进行改造。因此,目前的主要工作是对Linux系统进行实时性改造、安装EtherCAT主站、编写HAL模块、编写人机界面。
虽然EtherCAT主站程序能够安装在非实时操作系统上,但一般情况下会对主站进行实时性改造。Linux系统本质上是一个分时操作系统,不是一个实时操作系统,对标准Linux实时性的改造存在多种方法,较为合理的两大类方法为:直接修改Linux内核源代码和双内核法。
- 1.直接修改Linux内核源代码:对Linux内核代码进行细微修改并不对内核作大规模的变动,在遵循GPL协议的情况下,直接修改内核源代码将Linux改造成一个完全可抢占的实时系统。核心修改面向局部,不会从根本上改变Linux内核,并且一些改动还可以通过Linux的模块加载来完成,即系统需要处理实时任务时加载该功能模块,不需要时动态卸载该模块。这种方法存在的问题是:很难百分之百保证,在任何情况下,GPOS(通用操作系统)程序代码绝不会阻碍RTOS的实时行为。也就是说,通过修改Linux内核,难以保证实时进程的执行不会遭到非实时进程所进行的不可预测活动的干扰。
- 2.双内核法:双内核法是在同一硬件平台上采用两个相互配合,共同工作的系统核心,通过在Linux系统的最底层增加一层实时核心来实现。其中的一个核心提供精确的实时多任务处理,另一个核心提供复杂的非实时通用功能。其优点是可以做到硬实时,并且能很方便地实现一种新的调度策略。目前采用这种方案的主要有RTAT,RT-Linux和Xenomai。
4.2 主站EtherCAT程序(IGH)
Linux下的EtherCAT主站架构如图所示:
Linux操作系统可分为内核态和用户态。内核态是操作系统的核心,负责进程管理、内存管理、进程间通信和设备管理和驱动等,实时性要求高。用户态主要运行人机交互、数据监控等实时性要求不高的程序。
EtherCAT主站模块运行在内核态,可支持一个或多个EtherCAT主站,且同时提供应用接口和设备接口。用户通过应用接口访问主站,通过设备接口连接设备到指定主站。EtherCAT的以太网设备驱动模块通过主站设备接口与主站连接,EtherCAT设备协议可直接由以太网帧传送,因而主站能同时并行处理EtherCAT数据帧和通用以太网通信。
4.3 主站应用开发(LinuxCNC)
LinuxCNC是一款运行在Linux平台下的实时开源数控软件。起源于美国国家标准与技术研究院的增强型运动控制器EMC (Enhanced Machine Controller)研究项目,用于机床的数控系统。经过十几年的发展,LinuxCNC系统广泛用于冲床、车床、3D打印机、激光切割机、等离子切割机、机器人手臂等领域。其主要优点有:提供多个标准化的用户界面、用户也可以采用自主开发的GUI、自带G代码解析器、支持伺服电机控制步进电机开环控制、运动控制器功能强大、支持非笛卡尔坐标运动系统、采用2.4或2.6的Linux内核支持RT-Linux或RTAI实时补丁。LinuxCNC源代码可以免费下载,安装在Linux系统上。LinuxCNC软件架构如图所示。
LinuxCNC是一个模块化设计的软件,大致可以分为以下四个主要模块:运动控制器(EmcMot)、数字I/O控制器(EmcIO )、任务控制器(EmcTask )、图形用户界面(GUI)。
4.4 从站程序设计
运动控制器软件设计包括ARM主控制程序及外围电路驱动程序。
ARM主控制程序是运动控制器的核心,需要完成各个函数初始化、参数配置、数据处理、逻辑流程控制及控制算法运算等,图为支持查询模式(自由运行模式)的流程图。
ARM芯片在上电后不久进入main()函数,在main()函数中最先完成一系列系统正常运行相关函数的初始化,如延时初始化函数、LED初始化函数、串口初始化函数、中断向量表配置初始化函数,然后完成SPI初始化函数、定时器初始化函数、EtherCAT初始化函数以及FSMC总线初始化函数等。
接着完成通信初始化工作,查询主站的状态控制寄存器,读取事件请求寄存器0x220、相关配置寄存器,启动或关断相关通讯服务。
在完成以上工作后就进入主循环while(1),进行应用层任务处理和周期性数据处理,周期性数据处理和应用层任务处理有查询模式(自由运行模式)或同步模式(中断模式)这两种,本程序采用同步运行模式,所以在主循环中主要处理非周期性的任务。同步运行模式下周期性数据在中断服务程序中处理。
void main(void)
{
//--一执行一系列初始化函数--一
Delay_Init(168); //初始化延时函数
Led_Init(); //初始化LED端口
Uart_Init(9600); //初始化串口
AD7606_Init(); //初始化AD采样芯片
NVIC_Config(); //初始化STM32时钟及外设
SPI_Config(); //ET 1200用SPI总线初始化配置
Timer2_Init_ Config(); //Timer2初始化配置
ET 1200_GPIO_Config(); //ET 1200 GPIO初始化配置
ECAT_Init(); //初始化通信变量和ESC寄存器
FSMC_Init(); //FSMC并行总线初始化
//--一初始化完成,进入主循环--一
while(1)
{
ET1200_AlEvent=pEsc->AlEvent; //读应用层事件请求寄存器,
// ET1200_AlEvent为全局变量,在头文件中定义
if(!ET1200_IntEnabled) //处于自由运行模式(ET 1200_ IntEnabled -=0
//处于同步模式(ET1200 IntEnabled==1)
free_ run(); //处于自由运行模式时,进行周期性数据查询
el_event(); //应用层任务处理,包括状态机和非周期性数据等
}
}
从站设备可以运行于同步模式或自由运行模式,在自由运行模式中使用查询方式处理周期性过程数据,在同步模式使用中断服务程序处理性数据。
工具
5.1 TwinCAT
EtherCAT主站方案实现一般都采用倍福公司的TwinCAT, TwinCAT实现了强大的EtherCAT主站功能,从站XML表配置、EEPROM配置文件操作、扫描EtherCAT从站等,因为TwinCAT是基于Windows风格,拥有较好的人机交互界面,功能强大,非常适合上位机控制窗口的开发,但TwinCAT运行于Windows环境下,实时性很差,而且TwinCAT和Windows系统需要付费才能商业化应用,价格较高。
5.2 LinuxCNC
PC机部分软件以LinuxCNC为基础,往下LinuxCNC通过HAL(硬件抽象层)与EtherCAT主站驱动之间进行通信连接,然后EtherCAT主站通过以太网线给从站运动控制器发控制命令;往上利用LinuxCNC提供的Python调用接口和人机界面通信,数控系统人机界面采用PyQt开发;由于LinuxCNC需要运行实时任务,需要将普通操作系统进行改造。
5.3 开源的EtherCAT Master
EtherCAT的主站开发是基于EtherCAT机器人控制系统的开发中非常重要的环节。目前常见开源的主站代码为的RT-LAB开发的SOEM (Simple OpenSource EtherCAT Master)和EtherLab的the IgH EtherCAT® Master。使用起来SOEM的简单一些,而the IgH EtherCAT® Master更复杂一些,但对EtherCAT的实现更为完整。
参考资料:https://blog.youkuaiyun.com/pwl999/article/details/109397700