EtherCAT主站协议栈
1、KPA EtherCAT主站协议栈简介优势:1、最小周期时间;2、高性能;3、最小成本投入KPA EtherCAT主站协议栈的模块化结构使得该代码可完全兼容地移植到不同的操作系统中,如INtime,Linux Posix rt-preempt,QNX,RTX,VxWorks,Xenomai,Windows,WinCE等;也可以扩展至不同的功能版本,如Basic(Class B),Standard(Class A),Feature/Extension等;当然该协议栈也可以移植到各种各样不同的硬件平台上,如ARM,X86,Zynq,ppc等。

3、功能版本的选择:根据ETG协会的EtherCAT规范,EtherCAT主站可分为两个版本,基础版本(ClassB)和标准版本(Class A)。其中基础版本包括PDO,CoE,FoE,S2S等功能,而标准版本在基础版本的基础上又增加了EoE,SoE,AoE,VoE和最主要的DC功能。所以一般情况下用得最多的是标准版本(Class A)。除此之外,KPA EtherCAT主站协议栈还带有进阶版本和拓展版本,有线缆冗余,热链接,TCP/UDP邮箱,数据记录,帧记录,外部同步,DBC-CAN,事件处理,多主站机制等功能。这些功能都是KPA公司在结合客户的真实需求之后开发出来的,实用性和可操作性都是非常强的。

5、EtherCAT主站协议栈架构详解1、主站进旯皱镢涛程(Master threads)——共三个处理循环,用于初始化EtherCAT帧并传送给帧调度(frame scheduler),其中包括夸臾蓠鬏过程通信更新(HI),邮箱通信(NR),诊断和自恢复(LO)。 ◆所有要求硬实时的任务都必须在HI(PI update cycle)中完成。HI在这三个主站进程中拥有最高的优先级。 ◆NR用于邮箱数据处理。NR的优先级比HI低,但比LO要高。 ◆LO用于改变从站状态,监控,自恢复和诊断。LO并不像HI和NR那样对时序要求非常严格,所以它的优先级是最低的。2、应用程序(Application)——这是一个独立的进程,调用主站API函数实现功能。通过调用API函数,几乎可以完全控制EtherCAT主站:启动/停止主站,配置主站,更新过程数据(PI)等。3、Process task(external task)——实现各种控制逻辑的回调函数。每一次更新PI时(即HI进程)都会调用这个回调函数。4、过程映像(Process Image)——由隐藏缓冲区(Shadow buffer)和活跃缓冲区(Active buffer)构成。隐藏缓冲区:接收或发送给EtherCAT网络的数据。活跃缓冲区:与用户交互的数据,如发送数据的准备。5、帧调度(Frame scheduler)——收集EtherCAT帧并根据帧的优先级转发给EtherCAT网络驱动。6、EtherCAT网络驱动(EtherCAT network driver)——从底层网络中抽象出EtherCAT Master Stack core。7、NIC1,NIC2——物理网卡接口,用于发送报文或从EtherCAT网络接收报文。8、网卡驱动(NIC drivers)——物理网卡接口的驱动。9、Threads, mutexes, timers, etc.——封装了一些依赖于操作系统的功能,处理进程,互斥,定时等。10、RPC服务器(RPC-server)——主站协议栈的一部分。用于连接RPC远程客户端(如KPA EtherCAT Studio软件)并转发请求给EtherCAT Master Stack core。它支持user-to-user和user-to-kernel(通过代码调用)两种模式。11、远程客户端(Remote Client)——KPAEtherCAT Studio或其它兼容的软件。
6、写在移植之前:在移植之前,强烈建议只使用动态链接库(dll)去实现各种功能,以避免库的初始化问题。换局话说,用户的应用程序在使用任何Master API和EcatMkpaDestroy()之前必须先调用EcatMkpaInit(NULL)。此时,在使用Master API之前加载Master Library是非常必要的,如Windows下的ecatmkpa.dll,INtime中的ecatmkpa.rsl,RTX下的RTXEcatKPAMaster.rtdll等。如下图,Windows下通过调用LoadLibrary函数加载动态连接库ecatmkpa.dll。换句话说,使用封装库的方法可以让您的应用更独立于硬件平台,且更容易适应到其它的操作系统中。

7、主站初始化在用户应用程序开始之前,主站至少必须被初始化一次。主站初始化包含以下几个步骤:1、调用EcatGetAdapterList()函数获取可用的网络接口列表。2、调用EcatCreateMaster()函数为后面用到的主站创建一个唯一的标识。3、调用EcatConnectMaster()函数把步骤1选择的网口连接到已创建的主站,并预先指定期望的操作模式。4、调用EcatLoadConfigFromString()加载ENI文件。ENI文件包含了主站周期的一些参数描述,如周期时间等。5、调用EcatStartCyclicOperation()初始化周期数据交换。6、调用EcatSetAutoRecoveryTimeout()设置辅助任务的时间,辅助任务可扫描EtherCAT网络中的从站数量,也可实现其它功能。至此,主站初始化进程完成。



8、过程映像(Process Image)之前介绍协议栈架构已经提到,过程映像分为活跃区和隐藏区两部分。之所以分为两部分是为了避免主站和用户程序同时调用数据时造成的各种各样的冲突。隐藏缓冲区的速度要比活跃缓冲区的快一点。但它只能工作在主站同步操作模式下(只有用户程序有接触Process Image的权限)此时,只有极少的client可以同时请求Process Image的数据。当使用不同的HMI(如SCADA,PLC配置器,或是KPA EtherCAT Studio等)作为用户应用的附加组件时,HMI对PI数据的请求是不会被实行的,否则将会引起各种不确定性。例如,当控制程序直接调用隐藏缓冲区时,HMI调用了活跃缓冲区,此时隐藏缓冲区会被重写,我们并不能确定隐藏区的数据导致是什么,也不能确定通过隐藏区发送至EtherCAT网络的数据是什么。一般情况下,强烈推荐使用活跃缓冲区。下图是Active buffer与Input Process Image的工作机制。在t1时刻,Master更新Input数据,并从Shadow buffer把数据(输入数据的最后一次更新)复制到Active buffer。在t2时刻,client2调用EcatStartReadInputs()启动PI输入数据获取操作,而t2与主站更新时刻(t1)并不是同一时刻,那么应用程序只能获取到t1时刻更新的数据缓存,此时PI输入数据是"锁定的",再到t5时刻,client2调用EcatDoneReadInputs()完成PI输入数据获取操作,"释放"PI输入数据,此时,用户程序再真正获取到真实的PI输入数据。如果另一个client1在t3时刻请求PI输入数据,那么也只能取到与t2相同的数据缓存。而当client1在t7时刻请求PI输入数据时,获取到的是t6时刻主站更新的PI输入数据。另外一个图是work with Input PI的流程图。1、调用EcatStartReadInputs()初始化当前输入数据块读操作;2、调用EcatGetVariable()从PI中获取必要的数据;3、调用EcatDoneReadInputs()确认已从PI中读到输入数据。而Output Process Image的工作机制和流程图与Input类似,只是传输方向相反而已。如第三图和第四图。


9、主站工作模式KPA EtherCAT主站协议栈支持以下三种操作模式。1、异步模式(Asynchronous mod髫潋啜缅e)指的是用户的应用程序(控制逻辑)与主站的循环(PI数据更新)这两部分是相互独立运行的。换句话说,用户的控制逻辑与主站循环是不同步的。主站循环根据初始化时的频率去更新过程数据,而控制逻辑也是按着自己的频率在运行。2、同步模式1(Synchronous 1 mode)指的是用户的控制逻辑是由Process Task callback function完成的,在每一次主站循环周期内HI都会调用Process Task callback。换句话说,用户的应用程序中并没有控制逻辑,而是Process Task callback function带有。此时,主站循环依然按照初始化频率更新数据,控制逻辑也跟着主站循环以同样的频率运行。3、同步模式2(Synchronous 2 mode)用户应用程序直接启动与EtherCAT从站进行数据交换,而主站的循环中已不带有PI数据更新部分。 ◆Synchronous 2a mode:调用EcatUpdateProcessImage()同时更新输入输出数据。 ◆Synchronous 2b mode:调用EcatUpdateProcessImageInputs()更新输入数据,调用EcatUpdateProcessImageOutputs()更新输出数据。更新输入与输出是在不同的EtherCAT帧完成的,也就是说两者是相互独立的。





13、停止主站在KPA EtherCAT主站协议栈中,按以下步骤完成主站的关闭。1、调用EcatStopCyclicOperation()停止周期数据更新;2、调用EcatDisconnectMaster()释放被占用的网卡接口;3、调用EcatFreeMaster()释放主站资源;4、释放主站函数库(used Master's libraries)


