比特派app官方下载链接安装|ethercat主站开发教程
比特派app官方下载链接安装|ethercat主站开发教程
[工业互联-17]:常见EtherCAT主站与实现方法_ethercat主站开发-CSDN博客
>[工业互联-17]:常见EtherCAT主站与实现方法_ethercat主站开发-CSDN博客
[工业互联-17]:常见EtherCAT主站与实现方法
文火冰糖的硅基工坊
已于 2023-07-08 17:15:54 修改
阅读量4.5k
收藏
51
点赞数
8
分类专栏:
工业互联
文章标签:
EtherCAT主站
工业以太网
于 2023-07-08 11:31:16 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HiWangWenBing/article/details/131608032
版权
工业互联
专栏收录该内容
22 篇文章
33 订阅
订阅专栏
目录
第1章 EtherCAT入门
1.1 简介
1.2 EtherCAT通信架构
第2章 EtherCAT主站方案
2.1 方案概述
2.2 主站配置步骤
2.3 EtherCAT主站软件
第3章 Windows操作系统支持EtherCAT的基本步骤
第4章 常见主站软件介绍:TwinCAT
4.1 简介
4.2 软件架构
4.3 应用程序架构
第5章 SOEM
5.1 简介
5.2 SOEM创建EtherCAT主站
5.3 QT添加SOEM主站
第1章 EtherCAT入门
1.1 简介
EtherCAT(Ethernet for Control Automation Technology)是一种实时以太网通信协议,用于工业自动化和控制系统中实现高性能、实时数据传输和控制。它是由EtherCAT技术组织(ETG)开发和标准化的。
EtherCAT基于以太网物理层和数据链路层,但使用了一种特殊的通信方法,称为"Processing on the Fly"。这种方法使得数据帧能够在通过从站设备时进行实时处理,而不需要完全接收整个数据帧。这样,数据传输和控制可以实现高效率和低延迟。
EtherCAT通信采用主从架构,其中一个主站设备负责整个EtherCAT网络的管理和控制,而从站设备则负责在数据环网上传递数据。
主站设备可以是计算机、工控机、PLC等,
而从站设备可以是传感器、执行器、驱动器等。
EtherCAT具有以下特点:
实时性能:EtherCAT通过在数据环网上逐站处理数据,实现了高速和低延迟的数据传输。这使得它非常适用于对实时性要求较高的应用,如运动控制、机器视觉等。 灵活性:EtherCAT网络可以支持从几个节点到数千个节点的连接,同时支持多种网络拓扑结构,如星型、总线型、环形等。这使得它能够适应不同规模和复杂度的工业系统。 高带宽利用率:EtherCAT可以利用以太网的高带宽特性,同时在同一物理介质上传输控制数据和其他应用数据,从而提高带宽利用效率。 易于集成:EtherCAT基于以太网标准,使用标准的以太网物理层和数据链路层。这使得它能够与其他以太网设备和网络互操作,并且易于与现有以太网基础设施集成。
EtherCAT已经在工业自动化和控制领域得到广泛应用,包括机械设备、工厂自动化、过程控制等各种应用场景。它提供高效的实时通信和控制能力,帮助提升工业系统的性能、灵活性和可扩展性。
(300条消息) [工业互联-12]:主流的工业以太网技术简介(PROFINET、POWERLINK、ETHERNET/IP、ETHERCAT、SERCOSIII、MODBUS TCP、CC-LINK IE)_文火冰糖的硅基工坊的博客-CSDN博客
1.2 EtherCAT通信架构
EtherCAT通信架构基于主从架构,其中一个主站设备控制整个EtherCAT网络,而多个从站设备负责在数据环网上传递数据。以下是EtherCAT通信架构的主要组成部分:
主站(Master):主站是EtherCAT网络的控制中心,负责协调整个网络的数据传输和控制。主站可以是计算机、工控机、PLC等设备,它通过EtherCAT接口连接到EtherCAT网络。主站发送和接收数据帧,并处理从站设备的数据。 从站(Slave):从站是在EtherCAT网络中扮演被动角色的设备。从站可以是各种不同类型的设备,如传感器、执行器、驱动器等。每个从站设备都有一个唯一的设备地址,通过EtherCAT通信以实时方式与主站交换数据。 数据环网(Data Ring):数据环网是连接主站和从站的物理通信介质,通常是双绞线、光纤或其他以太网标准支持的物理介质。这个环网形成了一个环形或星型网络拓扑结构,可以支持多个从站设备连接到同一个环网上。 EtherCAT Slave Controller(ESC):每个从站设备上都有一个EtherCAT Slave Controller,负责实时处理和转发从站数据。它的作用是解析EtherCAT数据帧、执行数据处理和控制算法,并将数据传递到下一个从站或主站。 EtherCAT数据帧(Frame):EtherCAT数据帧是在数据环网上传输的通信单位,它包含控制指令、数据和状态信息。在一个周期内,主站从流经数据环网的每个从站设备上读取和写入数据。
EtherCAT的通信过程非常快速和高效。主站发送一个带有特殊控制字段的数据帧,该数据帧在数据环网上循环传输。每个从站设备通过处理数据帧中的控制指令,并在帧传输周期内完成数据读取和写入操作。数据帧的循环传输确保了实时性和低延迟的数据传输。
通过这种主从架构和实时数据传输方式,EtherCAT能够实现高性能的工业控制和自动化应用,适用于需要实时性、快速响应和高带宽的工业环境。
第2章 EtherCAT主站方案
2.1 方案概述
实现EtherCAT主站(Master)功能的方案有多种选择,取决于具体需求和系统架构。
以下是一些常见的EtherCAT主站方案:
PC-based软件主站:使用一台PC或工控机作为EtherCAT主站,通过安装适当的EtherCAT主站软件,如Beckhoff的TwinCAT或KINGSTAR的EtherCAT Master等,来实现EtherCAT通信和控制功能。这种方案适用于需要灵活性和可编程性的应用,适用于实时数据采集与处理。 PLC作为主站:许多主流PLC供应商提供了集成EtherCAT主站功能的PLC设备。这些PLC设备具有专用的EtherCAT接口,可以直接与EtherCAT网络连接。PLC作为主站具有实时性、可靠性和易于集成的特点,适用于以实时控制为主目标的工业控制和自动化系统,用于PLC控制从站设备。 封装主站模块:一些厂商提供了专用的EtherCAT主站模块,可以作为独立的硬件设备,通过串行通信接口(如串口、以太网接口等)连接到主控设备(如PC、PLC等)。这些模块通常提供了高性能的EtherCAT通信功能,可以方便地集成到现有的系统中。
无论选择哪种方案,实现EtherCAT主站功能的关键是:使用相应的EtherCAT主站软件或硬件模块,并遵循EtherCAT通信协议。该主站软件或硬件模块将提供EtherCAT数据交换和协议处理的功能,使主站能够与从站设备进行通信和控制。
2.2 主站配置步骤
在配置EtherCAT主站时,需要进行以下步骤:
设置通信参数:配置主站与EtherCAT网络连接的物理接口和通信参数,如波特率、网络拓扑结构等。 扫描并识别从站:通过主站软件或配置工具,进行EtherCAT网络的扫描和从站设备的识别。通过识别从站设备,为每个从站分配唯一的设备地址。 配置从站通信和数据:为每个从站配置通信参数和数据映射。这包括定义数据对象、数据类型、数据采样频率等。 开发应用程序:使用主站软件或编程环境,编写应用程序以实现与从站设备的数据交换、数据处理和控制操作。
需要注意的是,实现EtherCAT主站功能需要遵循EtherCAT通信协议规范,并使用与从站设备兼容的主站软件或硬件模块。在选择和配置EtherCAT主站方案时,应根据具体需求、开发平台和供应商支持来进行评估和选择。
2.3 EtherCAT主站软件
有多个供应商提供了EtherCAT主站软件,以下是几个常用的EtherCAT主站软件:
TwinCAT(Beckhoff):TwinCAT是Beckhoff提供的一款强大的EtherCAT主站软件。它是一个全面的自动化控制软件的开发平台,集成了PLC、运动控制、HMI和数据采集等功能。TwinCAT具有丰富的开发工具和库,可用于开发复杂的EtherCAT控制系统。 KINGSTAR EtherCAT Master(IntervalZero):KINGSTAR EtherCAT Master是IntervalZero公司提供的一种软件EtherCAT主站解决方案。它提供了实时以太网通信和控制功能,可与多个EtherCAT从站设备进行通信。KINGSTAR EtherCAT Master可以与Windows上的实时软件配合使用。 SoftMotion for EtherCAT(National Instruments):National Instruments提供了SoftMotion for EtherCAT软件,它是NI实时控制平台LabVIEW和CompactRIO的一部分。SoftMotion for EtherCAT具有强大的运动控制能力,可用于快速开发和部署EtherCAT控制系统。 CODESYS EtherCAT Master:CODESYS是一款广泛使用的可编程控制器开发环境,CODESYS EtherCAT Master是其提供的EtherCAT主站功能模块。它允许开发人员使用CODESYS进行EtherCAT通信和控制应用的开发,同时具备很好的可扩展性和灵活性。 SOEM(Simple Open EtherCAT Master)是一个开源的EtherCAT主站实现,由EtherLab项目开发并维护。它提供了一个简单、灵活和可移植的EtherCAT主站解决方案,适用于嵌入式系统和实时控制应用。
这些EtherCAT主站软件提供了丰富的功能和开发工具,可以满足各种复杂控制系统的需求。选择合适的软件取决于具体应用需求、开发平台和供应商支持。在选择软件之前,建议评估软件功能、易用性、性能和支持等因素,并根据实际案例进行验证。
第3章 Windows操作系统支持EtherCAT的基本步骤
Windows操作系统可以通过相应的驱动程序和软件支持EtherCAT(Ethernet for Control Automation Technology)。
EtherCAT是一种实时以太网通信协议,广泛用于工业自动化领域。
它使用基于以太网的通信方式,通过传输以太网数据帧的方式来实现实时数据传输和控制。
要在Windows上实现EtherCAT支持,可以采取以下步骤:
安装EtherCAT从设备驱动程序:首先,需要安装适用于Windows的EtherCAT驱动程序。这些驱动程序通常由EtherCAT硬件供应商提供,可用于与硬件EtherCAT从设备进行通信,实现etherCAT通信协议。 使用EtherCAT主站软件:在Windows上安装和配置EtherCAT主站软件,例如TwinCAT、EtherCAT Master等。这些软件允许用户配置和管理EtherCAT网络、从设备和通信参数。EtherCAT主站软件通过EtherCAT从设备驱动程序与从设备进行通信!!! EtherCAT从设备配置:通过EtherCAT主站软件,用户可以进行EtherCAT设备的配置。这包括添加设备、定义设备通信地址和参数等。 开发应用程序:使用Windows下的编程语言和工具(如C/C++、C#等),开发应用程序以与EtherCAT设备进行通信。通常,EtherCAT的开发包和API可以提供给开发人员,以简化EtherCAT通信的编程。 数据传输和控制:通过编写应用程序,可以使用EtherCAT协议进行数据传输和控制。应用程序可以使用EtherCAT主站软件提供的API或驱动程序所提供的API,与EtherCAT设备进行实时通信。
需要注意的是,EtherCAT的支持和集成可能因硬件、操作系统版本和软件工具等因素而有所差异。在进行EtherCAT的集成和开发时,建议参考相关硬件和软件供应商提供的文档和指南,以确保正确配置和操作EtherCAT网络和设备。
关注博主即可阅读全文
优惠劵
文火冰糖的硅基工坊
关注
关注
8
点赞
踩
51
收藏
觉得还不错?
一键收藏
打赏
知道了
0
评论
[工业互联-17]:常见EtherCAT主站与实现方法
EtherCAT(Ethernet for Control Automation Technology)是一种实时以太网通信协议,用于工业自动化和控制系统中实现高性能、实时数据传输和控制。它是由EtherCAT技术组织(ETG)开发和标准化的。EtherCAT基于以太网物理层和数据链路层,但使用了一种特殊的通信方法,称为"Processing on the Fly"。这种方法使得数据帧能够在通过从站设备时进行实时处理,而不需要完全接收整个数据帧。这样,数据传输和控制可以实现高效率和低延迟。
复制链接
扫一扫
专栏目录
基于stm32构建EtherCAT主站,采用了开源的soem方案
12-05
基于stm32构建EtherCAT主站,将soem方案移植到了stm32上。基本功能测试正常,可以驱动一部分的伺服电机,但也存在一些bug。整体移植方式应该是正确的,具体移植方式将写于CSDN博客中。
SOEM:简单的开源EtherCAT主站
01-30
SOEM:简单的开源EtherCAT主站
参与评论
您还未登录,请先
登录
后发表或查看评论
ethercat通讯协议的详细说明及编程提示
12-13
详细讲述了ethercat通讯协议及其编程
Windows上开发运行EtherCAT主站的几种方案
MotroEngineer的博客
08-08
1320
本文介绍了几种可以在windows上开发EtherCAT的方案,因为EtherCAT网络的高实时要求与windows本身匹配度不高,所以如何在windows上开发运行EtherCAT就成为开发者的明显需求,希望本文介绍的几种方法能帮助开发人员更好使用EtherCAT。
[工业互联-20]:常见EtherCAT主站方案:TwinCAT的Windows 解决方案
文火冰糖(王文兵)的博客
07-09
2216
TwinCAT是由德国Beckhoff公司开发的一套功能强大的自动化软件平台。它是一个集成的开发环境,用于实现实时控制、PLC编程、运动控制、HMI(人机界面)设计和数据采集等应用。TwinCAT广泛应用于工业自动化、机械控制、过程控制和实时系统等领域。
EtherCat主站与从站简介
JXES智能生态系统
03-29
3717
ETG.1000 系列文件是在 EtherCAT Technology group 范围内对 EtherCAT Technology 详细说明。
自建极简Ethercat主站-底层驱动编写
西澳峰的博客
06-05
2059
MECM(Mini Ethercat Master),名字随便起的。已经学习了一段时间的Ethercat总线了,目前的想法就是自己简单实现一个Ethercat主站,没有太多的冗余功能,暂时不考虑太多的容错机制,仅实现目前用到的FOE、COE、过程数据通信这三个功能,仅用于学习和加深理解。主站的硬件是GD32F450Z_EVAL开发板,板载的以太网芯片是DP83848VV。基本接口已经写好,接下来就是按照Ethercat的数据包对数据进行打包,然后将发送出去。名称说明长度。
EtherCat--主站开源的C语言库SOEM-环境搭建
qq_41931610的博客
03-03
3960
由于开发winpcap项目的目的在于为win32应用程序提供访问网络底层的能力,因此开发包里面有大量的WIN32的标识符,直接使用会出现“未定以标识符”错误。运行simple_test.exe \Device\NPF_{XXXX},其中\Device\NPF_{XXXX}是电脑的网络设备符。3.新建一个空项目。以管理员的权限打开VS2017,新建一个VC++的Win32控制台应用程序,设置为空项目。生成全部测试文件(生成exe等文件)simple_test.exe文件,至此完成了SOEM源码的编译。
C#以太网简介
cfqq1989的博客
09-02
2341
这个0表示8个bit,就是说前面24bit表示网段,后面8bit才表示电脑ip(相当于 24bit手机区号, 8bit才是手机号码)这样的好处是类似拖线板。全0地址系统保留,全1地址是广播地址,所以8bit是256减去2地址是254个可用地址。这个也算以太网的一部分,他用于扫描当前网段下所有的电脑ip地址(就相当于,当前手机区号下,有多少个手机号码是在 占线状态),在占线的ip下,可以查到电脑的名字。(总长是32bit,用刀砍一下,前面的是网段,后面的是电脑ip)用刀砍的过程叫子网掩码。
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
weixin_48501028的博客
04-16
7552
本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。
TI EtherCAT主站实现方案
10-22
TI官方的Tether CAT主站实现方案,详细的可以到其官网上了解。EtherCAT(以太网控制自动化技术)是一个开放架构,以以太网为基础的现场总线系统,其名称的CAT为控制自动化技术(Control Automation Technology)字首的缩写。EtherCAT是确定性的工业以太网,最早是由德国的Beckhoff公司研发。
soem-w5500-rpi:Raspberry pi的开源实时EtherCAT主站
02-05
soem-w5500-rpi:Raspberry pi的开源实时EtherCAT主站
ethercat-1.5.2.rar_Ethercat主站_ethercat 1.5.2_igh_igh Windows_mas
07-14
主要是关于igh开源主站的介绍以及使用。这个可以作为参考文档。
Soem-1个电机转圈圈PV模式-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码
01-09
EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 16 --Qt-Soem通过界面按键控制电机转圈圈PV模式,这一篇博客的源代码,博客链接( 正在编写,2024.1.14发布, ...
Soem-跟从站通讯到OP状态-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码
01-09
EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 9 -- SOEM之基于QT搭建自己的EtherCAT主站,这一篇博客的源代码,博客链接( https://blog.csdn.net/qq_50808730/article/details/134361490 )。 注意: 该...
【尺寸检测】基于matlab机器视觉图像目标尺寸测量【含Matlab源码 4087期】.mp4
03-12
Matlab研究室上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白;
1、代码压缩包内容
主函数:main.m;
调用函数:其他m文件;无需运行
运行结果效果图;
2、代码运行版本
Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主;
3、运行操作步骤
步骤一:将所有文件放到Matlab的当前文件夹中;
步骤二:双击打开main.m文件;
步骤三:点击运行,等程序运行完得到结果;
4、仿真咨询
如需其他服务,可私信博主或扫描视频QQ名片;
4.1 博客或资源的完整代码提供
4.2 期刊或参考文献复现
4.3 Matlab程序定制
4.4 科研合作
HTML文件,一个网页特效
03-12
如果带到学校,一定会秀翻全学校。别不信,试试[偷笑]
STM32单片机FPGA毕设电路原理论文报告基于AT89C52单片机CAN总线节点的设计
最新发布
03-12
STM32单片机FPGA毕设电路原理论文报告基于AT89C52单片机CAN总线节点的设计本资源系百度网盘分享地址
基于ssm+jsp的高校专业信息管理系统源码数据库.doc
03-12
基于ssm+jsp的高校专业信息管理系统源码数据库.doc
ethercat 主站stm32
09-05
EtherCAT是一种高性能的实时以太网通信协议,而STM32是意法半导体(STMicroelectronics)公司推出的一种32位微控制器。二者结合起来可以实现EtherCAT主站的功能。
EtherCAT主站是一个控制硬件设备的节点,负责与EtherCAT从站进行通信。在EtherCAT网络中,主站负责发送控制指令和接收从站返回的数据。STM32作为一个强大的微控制器芯片,具有丰富的外设和高性能的计算能力,非常适合用来实现EtherCAT主站的功能。
为了实现EtherCAT主站,使用STM32芯片需要进行以下步骤:
第一步是在STM32芯片上运行EtherCAT主站的软件。可以使用ST公司提供的HAL库或者第三方开发环境,例如Code Composer Studio或IAR Embedded Workbench等。这些工具可以帮助我们开发出适用于EtherCAT主站的软件。
第二步是配置STM32的GPIO引脚和时钟,以使其能够与EtherCAT通信。根据EtherCAT的要求,我们需要将一些引脚分配为发送和接收数据、时钟同步和硬件中断等功能。
第三步是设置STM32的网络接口,以便与EtherCAT网络连接。这可能包括引入一些PHY芯片或其他外设来支持以太网通信。
第四步是开发EtherCAT主站的功能代码。这包括处理接收到的从站数据、发送控制指令、处理同步时钟等。通过合理设计代码,我们可以实现实时性和可靠性要求。
第五步是进行调试和测试。我们需要验证EtherCAT主站的功能是否正常工作,是否能够与其他从站进行通信。
总之,使用STM32芯片作为EtherCAT主站的控制器可以用来实现高性能和实时性控制的需求。通过合适的软件开发和硬件配置,我们可以充分发挥STM32芯片的优势,实现一个可靠和高效的EtherCAT主站。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
文火冰糖的硅基工坊
CSDN认证博客专家
CSDN认证企业博客
码龄4年
人工智能领域优质创作者
2065
原创
233
周排名
134
总排名
1524万+
访问
等级
4万+
积分
15万+
粉丝
7556
获赞
1302
评论
3万+
收藏
私信
关注
热门文章
[4G&5G专题-118]:5G培训应用篇-3-5G新的业务与应用-智能电网、车联网、智能制造、无人机等
118720
[从零开始学习FPGA编程-6]:快速入门篇 - 操作步骤1 - 国内外FPGA主要厂家及其主要产品系列、开发工具
107187
[从零开始学习FPGA编程-8]:快速入门篇 - 总体 - FPGA功能开发详细流程与关键步骤解读
106831
[4G&5G专题-119]:5G培训应用篇-4-5G典型行业应用的解决方案(车联网、智慧医疗、智能教育、智能电网)
95879
[深入研究4G/5G/6G专题-28]: 5G NR开机流程4.6 - MSG5 (RRCSetupComplete)消息的调度
72678
分类专栏
深入研究4G/5G/6G专题
付费
61篇
从零开始学FPGA编程
付费
58篇
人工智能-YOLO专题
付费
39篇
人工智能-从零开始学DeepFaceLab
付费
22篇
工业自动化
26篇
管理与领导
141篇
情商
12篇
计算机-数据结构
1篇
数据
计算机-算法
机器人
3篇
操作系统
人工智能-大语言模型与生成式AI
5篇
编程系列-QT
44篇
激光原理与应用
75篇
随缘参悟
161篇
工业互联
22篇
人工智能-ChatGPT
架构之路
277篇
创业之路
102篇
OAI (Open Air Interface)
29篇
4G+5G FAPI
8篇
人工智能-综述
14篇
Linux用户空间编程
7篇
嵌入式系统
40篇
需求管理
11篇
项目管理
37篇
人工智能-深度学习
206篇
人工智能-PyTorch
119篇
技术发展
29篇
用python辅助学生中考与高考
4篇
无线通信基础培训
15篇
硅基生命-漫谈
3篇
电动智能汽车
12篇
物联网-方案
3篇
通信-图解通信原理与案例分析
35篇
心理学-解构心之理
机器学习与scikit-learn
58篇
量化人生
概率论与数理统计
5篇
云原生专题
65篇
问题与解决
UML专题
2篇
计算机基础
1篇
人工智能-Python基础
15篇
人工智能-TensorFlow
63篇
数值计算
19篇
人工智能-数学基础
30篇
人工智能-图像处理
1篇
数学建模
人工智能-自然语言处理NLP
人工智能-自动驾驶
DSP处理器快速入门
8篇
信息论与编码理论
6篇
智能电网
4篇
智能制造
3篇
生命科学-人体组织与坯胎学
生命科学-人体科学
软件工程
1篇
硅基生命-认知神经科学
通信-4G/5G/6G基础
162篇
赚钱-数字化时代
28篇
赚钱-量化投资学习
41篇
杂谈-杂谈随感
15篇
赚钱-技术人员的赚钱之道
10篇
技术至简
16篇
专利与论文
20篇
通信-ORAN专题系列
61篇
通信-星星之火
60篇
生活-人生百味
10篇
生活-生活中的小技巧
2篇
碳基生命-心理咨询
碳基生命-心理学与生活
技术-灵星之光
1篇
赚钱-手把手搭建Python量化平台
3篇
通信-DSP数字信号
测试-jenkins专题
3篇
编程-开发工具
8篇
编程-Python系列
26篇
心理学-思维模式
19篇
通信-《信号与系统》解读
15篇
编程-C++系列
编程-程序人生
通信-物联网LoRa系列
33篇
Linux内核空间编程
硅基生命-神经工程
最新评论
[架构之路-109]-《软考-系统架构设计师》-软件架构设计-2-软件架构概述:架构风格
sunray97:
2.6章节的习题,麻烦老师给一下答题可以不。想验证一下学习效果。辛苦啦。
[4G&5G专题-31]:物理层-物理信道、信号、映射概述
。:
写的太好了,谢谢大佬分享
[4G&5G专题-37]:5G NR物理层-物理广播信道PBCH与主信息块MIB
weixin_51737027:
大佬,请问一下PBCH的更新周期怎么理解啊,这里的更新指的是更新什么内容呢?
[4G&5G专题-108]:部署 - LTE无线网络室内覆盖规划、设计与室内分布式系统
非洲大佬:
有5G双路室分案例没
[激光器原理与应用-5]:激光二极管LD (Laser Diode)与激光二极管驱动器(LD驱动器)
@枭白:
2.1讲错了。LD是发光器件,PD是光电转换器件。三个引脚中,一个是公共地,一个是LD正极,输入电流控制LD发光,还有一个是PD负极,PD在合适的工作条件下,PD输出电流反应LD发光强度,因此PD是用来检测LD工作状态的,即是一个反馈器件。LD开始的时候还是电子空穴复合发光,但是LD内有谐振腔,内部介质载流子相对反转分布,一开始发出的微弱光在谐振腔中来回反射的时候,由于载流子反转分布,使得受激辐射大量发生使增益大于损耗,因此微弱光不断放大,最终产生激光。
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
[创业之路-101] :光学工程师的角色划分与光学设计的流程
[创业之路-100] :结构工程师的角色划分与结构设计的流程
[创业之路-99/管理者与领导者-141] :绩效管理-1-绩效管理是一把手工程、是系统工程、是化繁为简工程
2024
03月
24篇
02月
55篇
01月
37篇
2023年487篇
2022年652篇
2021年545篇
2020年268篇
目录
目录
分类专栏
深入研究4G/5G/6G专题
付费
61篇
从零开始学FPGA编程
付费
58篇
人工智能-YOLO专题
付费
39篇
人工智能-从零开始学DeepFaceLab
付费
22篇
工业自动化
26篇
管理与领导
141篇
情商
12篇
计算机-数据结构
1篇
数据
计算机-算法
机器人
3篇
操作系统
人工智能-大语言模型与生成式AI
5篇
编程系列-QT
44篇
激光原理与应用
75篇
随缘参悟
161篇
工业互联
22篇
人工智能-ChatGPT
架构之路
277篇
创业之路
102篇
OAI (Open Air Interface)
29篇
4G+5G FAPI
8篇
人工智能-综述
14篇
Linux用户空间编程
7篇
嵌入式系统
40篇
需求管理
11篇
项目管理
37篇
人工智能-深度学习
206篇
人工智能-PyTorch
119篇
技术发展
29篇
用python辅助学生中考与高考
4篇
无线通信基础培训
15篇
硅基生命-漫谈
3篇
电动智能汽车
12篇
物联网-方案
3篇
通信-图解通信原理与案例分析
35篇
心理学-解构心之理
机器学习与scikit-learn
58篇
量化人生
概率论与数理统计
5篇
云原生专题
65篇
问题与解决
UML专题
2篇
计算机基础
1篇
人工智能-Python基础
15篇
人工智能-TensorFlow
63篇
数值计算
19篇
人工智能-数学基础
30篇
人工智能-图像处理
1篇
数学建模
人工智能-自然语言处理NLP
人工智能-自动驾驶
DSP处理器快速入门
8篇
信息论与编码理论
6篇
智能电网
4篇
智能制造
3篇
生命科学-人体组织与坯胎学
生命科学-人体科学
软件工程
1篇
硅基生命-认知神经科学
通信-4G/5G/6G基础
162篇
赚钱-数字化时代
28篇
赚钱-量化投资学习
41篇
杂谈-杂谈随感
15篇
赚钱-技术人员的赚钱之道
10篇
技术至简
16篇
专利与论文
20篇
通信-ORAN专题系列
61篇
通信-星星之火
60篇
生活-人生百味
10篇
生活-生活中的小技巧
2篇
碳基生命-心理咨询
碳基生命-心理学与生活
技术-灵星之光
1篇
赚钱-手把手搭建Python量化平台
3篇
通信-DSP数字信号
测试-jenkins专题
3篇
编程-开发工具
8篇
编程-Python系列
26篇
心理学-思维模式
19篇
通信-《信号与系统》解读
15篇
编程-C++系列
编程-程序人生
通信-物联网LoRa系列
33篇
Linux内核空间编程
硅基生命-神经工程
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
文火冰糖的硅基工坊
你的鼓励是我前进的动力
¥1
¥2
¥4
¥6
¥10
¥20
扫码支付:¥1
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
自建极简Ethercat主站-底层驱动编写-CSDN博客
>自建极简Ethercat主站-底层驱动编写-CSDN博客
自建极简Ethercat主站-底层驱动编写
最美的愿望一定最疯狂
已于 2023-06-05 23:23:02 修改
阅读量2k
收藏
26
点赞数
5
分类专栏:
Ethercat
文章标签:
学习
于 2023-06-05 23:16:51 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/g360250466/article/details/131057954
版权
Ethercat
专栏收录该内容
9 篇文章
28 订阅
订阅专栏
1、简介
MECM(Mini Ethercat Master),名字随便起的。已经学习了一段时间的Ethercat总线了,目前的想法就是自己简单实现一个Ethercat主站,没有太多的冗余功能,暂时不考虑太多的容错机制,仅实现目前用到的FOE、COE、过程数据通信这三个功能,仅用于学习和加深理解。主站的硬件是GD32F450Z_EVAL开发板,板载的以太网芯片是DP83848VV。
2、底层编写
从根本来讲,Ethercat主站就是用来读写从站的。因此驱动的最核心功能有三个:网卡初始化、写入据到从站、读取从站数据。还有一个非必要功能,就是系统时钟,用来超时计数,也算是个简单的容错。当然,如果你不做超时也可以,选择发送和接收时一直死等也可以。
1、网卡初始化
关于GD32的以太网理解和初始化流程,请看文章Ethercat学习-GD32以太网学习 下面是部分代码,代码的初始化流程也是按照文章中的流程来的。
/* 初始化代码片段 */
int enet_system_init(void)
{
ErrStatus reval_state = ERROR;
/* 初始化以太网模块时钟 */
enet_clock_init();
/* 初始化以太网引脚 RMII接口*/
enet_gpio_init();
/* 初始化以太网MAC和DMA */
reval_state = enet_mac_dma_config();
return reval_state;
}
/* MAC 和 DMA 的初始化 */
static int enet_mac_dma_config(void)
{
int i;
ErrStatus reval_state = ERROR;
/* 复位,并等待完成 */
enet_deinit();
reval_state = enet_software_reset();
if(ERROR == reval_state) {
return ERROR;
}
/* 以太网初始化 配置网卡自协商模式、使能接收端校验和检测功能、接收所有的广播帧*/
reval_state = enet_init(ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS);
if(ERROR == reval_state) {
return ERROR;
}
/* 设置MAC地址 */
enet_mac_address_set(ENET_MAC_ADDRESS0, mac);
/* 初始化收发的描述符,常规描述符,链结构*/
enet_descriptors_chain_init(ENET_DMA_TX);
enet_descriptors_chain_init(ENET_DMA_RX);
/* 设置接收描述符 RDES1的31位为0,接收完成后会立马产生中断*/
for(i=0; i enet_rx_desc_immediate_receive_complete_interrupt(&rxdesc_tab[i]); } /* 使能硬件IP包头和数据域的校验和计算和插入 */ for(i=0; i < ENET_TXBUF_NUM; i++){ enet_transmit_checksum_config(&txdesc_tab[i], ENET_CHECKSUM_TCPUDPICMP_FULL); } // /* 正常中断汇总使能 接收中断属于正常中断 */ // enet_interrupt_enable(ENET_DMA_INT_NIE); // /* 使能接收中断 */ // enet_interrupt_enable(ENET_DMA_INT_RIE); /* 使能以太网 */ enet_enable(); return reval_state; } 2、数据读写 数据的读写很简单,读数据采用的时轮询的方式,不是中断的方式。 /** * @******************************************************************************: * @func: [enet_buf_send] * @description: 以太网数据发送 * @note: * @author: * @param [uint8_t] *buf 待发送数据的地址 * @param [uint32_t] length 待发送数据的长度 * @return [*] * @==============================================================================: */ int enet_buf_send(uint8_t *buf,uint32_t length) { ErrStatus reval_state = ERROR; reval_state = enet_frame_transmit(buf,length); return reval_state; } /** * @******************************************************************************: * @func: [enet_buf_send] * @description: 以太网数据接收 * @note: * @author: * @param [uint8_t] *buf 接收数据的地址 * @param [uint32_t] length 接收数据缓存的最大长度 * @return [*] * @==============================================================================: */ int enet_buf_recv(uint8_t *buf,uint32_t length) { ErrStatus reval_state; if(enet_rxframe_size_get()){ reval_state = enet_frame_receive(buf,length); }else{ reval_state = 0; } return reval_state; } 3、系统时钟 系统时钟的思路就是用滴答定时器,每1us记一次数,这个数就时我们的系统时钟,这个数我们只用来做超时检测。 /** * @******************************************************************************: * @func: [osal_current_time] * @description: 返回系统时钟计数,单位us * @note: * @author: * @return [*] * @==============================================================================: */ uint64_t osal_current_time_us(void) { return timercount; } 3、数据打包 1、Ethercat报文简介 基本接口已经写好,接下来就是按照Ethercat的数据包对数据进行打包,然后将发送出去。 如图所示,一个标准的ethercat包括了6部分: 名称说明长度Destination目的MAC地址,这个可以暂时忽略,在简单的连接中,这个是真的无关紧要6byteSource本机MAC地址,这个可以暂时忽略,在简单的连接中,这个是也无关紧要6byteEthercatType0x88A42byteEthercatHeader有11bit的length、1bit的预留、4bit的type组成2byteDatagrams数据包46~1500byteFCS帧校验序列,这个不需要我们去填写,自动生成4byte 这里我们关注两个部分EthercatHeader和Datagrams,其他的要么是固定的,要么是自动生成的,只有这两个需要我们字节计算。另外可以看到图中所示,ethercat报文最大长度写的是1522,这是因为它算上了VLAN的4byte,我们用的Ethercat总长度是1518。ethercat报文的最小长度为64,而Datagrams的最小长度就是64-6-6-2-4 = 46。如果我们的Datagrams小于44个长度,MAC子系统会自动将剩余的补齐。如下图所示,图中的pad bytes就是系统补齐的。 EthercatHeader中有一个length,这个长度就是Datagrams的长度,但是它不包含补齐的长度,也不包含FCS的长度,例如我们自己的数据是10个字节,然后系统又给我们填充了34个自己凑够了64字节,那么这个length的值依然是10。EthercatHeader中的type只能为0x01。 2、Datagrams报文简介 Datagrams可以只包含一个Datagram,也可以是好多个Datagram拼接起来的。如下图所示: 在一包Datagram中又分为了三部分,DatagramHeader、data、WKC。DatagramHeader固定长度为10,说明如下: 名称说明长度CmdEthercat命令,用来表明该数据包的作用:LWR、BRD、FPRW、APRW等1byteidx索引,我们字节生成的,不会被从机修改,可以判断数据是否重复或者丢失1byteAddress地址。除了逻辑地址是站四个字节外,其他地址都是一个从机地址(2byte)+内存地址(2byte)4byteLen数据包中的数据长度,也就是data的长度11bitR预留,01bitC帧循环,由从机的处理单元自动置位,用来识别该帧是否已经循环了,例如从机下次又收到了相同的帧,但是帧循环这里已经置1了,说明该帧已经处理过一次了,由于某种原因在重复循环。1bitM该数据包是否是最后一包,1表示后续还有数据包1bitIRQ所有从站ethercat事件请求寄存器的OR,主机发送时写0就好了。值是在从站读取出来的。2byte 3、数据组包 int mecm_BRD_test() { int i = 0; mecm_fram_t fram; mecm_datagram_header_t dg_header; /* 填充Destination、Source、EthercatType */ for(i = 0;i { memcpy( fram.en_header.dst,dstMAC,6); memcpy( fram.en_header.src,srcMAC,6); fram.en_header.etype = 0x88A4; } /* 填充Ethercat header */ fram.ec_header.clehgth = 13; fram.ec_header.reserve = 0; fram.ec_header.ctype = 0x01; /* 填充数据包的datagram header */ dg_header.cmd = CMD_BRD; dg_header.idx = 1; dg_header.addr.np.adp = 0x0001; dg_header.addr.np.ado = 0x0508; /* 数据长度为 1 */ dg_header.dlength = 1; dg_header.irq = 0x0000; memcpy((uint8_t *)fram.datagram,(uint8_t *)&dg_header,10); /* 填充数据包 data */ fram.datagram[10] = 0x01; /* 填充WCK 发送时置 0*/ uint16_t wck = 0; memcpy((uint8_t *)&fram.datagram[11],(uint8_t *)&wck,2); mecm_data_send((uint8_t *)&fram,29); } 上电测试,开发板于电脑网口连接,用wireshark抓包,结果如下: 可以看到,虽然数据发出来了,但是wireshark识别的并不时Ethercat包,0x88A4 变成了0xA488。这里要把上面的0x88A4改为0xA488,主要是因为本地是小端存储,而网络字节序中在前的被认为是高字节,改完之后可以看到,ethercat包被正确识别出来了,结果如下: 4、其他 关于网络字节序的理解。我们用的单片机时小端存储,低字节的放在低地址处,数据在传输的时候是由低到高。因此我们的0x88A4,首先传输的时0xA4。但是到了对方网卡那里,它是按照网络字节序来识别的,而网络字节序统一是高字节在前,因此网卡在识别协议的时候先到达的0xA4被认为是高字节,所以就被识别为了0xA488。因此我们在传输前可以将网络协议部分的报文转换为网络字节序,例如MAC地址,以太网类型等报文,这样网卡在识别网络协议的时候可以识别出来。至于数据部分,我们可以不需要管,因为主机和从机都是小端存储,不会出错。当然,如果接收方是大端的话,数据部分需要转换为大端再传输,或者让接收方自己收到数据后自己转换。 优惠劵 最美的愿望一定最疯狂 关注 关注 5 点赞 踩 26 收藏 觉得还不错? 一键收藏 知道了 0 评论 自建极简Ethercat主站-底层驱动编写 MECM(Mini Ethercat Master),名字随便起的。已经学习了一段时间的Ethercat总线了,目前的想法就是自己简单实现一个Ethercat主站,没有太多的冗余功能,暂时不考虑太多的容错机制,仅实现目前用到的FOE、COE、过程数据通信这三个功能,仅用于学习和加深理解。主站的硬件是GD32F450Z_EVAL开发板,板载的以太网芯片是DP83848VV。基本接口已经写好,接下来就是按照Ethercat的数据包对数据进行打包,然后将发送出去。名称说明长度。 复制链接 扫一扫 专栏目录 EtherCAT从站开发指南.zip_ETHERCAT_EtherCAT Master_EtherCAT 站_EtherCAT中 07-14 EtherCAT从站开发指南中文文档,含软件和硬件选型介绍 EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 wsg1100 02-22 6999 文章目录1 启动脚本1.1 start1.2 stop2 主站实例创建2.1 Master Phases2.2 数据报与状态机数据报状态机2.3 master状态机及数据报初始化2.4 初始化EtherCAT device2.5 设置IDLE 线程的发送间隔:2.6 初始化字符设备3 网卡4 IDLE阶段内核线程 版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/ 1 启动脚本 igh通过脚本来启动,可以是sys 参与评论 您还未登录,请先 登录 后发表或查看评论 EtherCAT从站开发 caixf的博客 01-02 490 开发一个EtherCAT从站,并将从站连接到EtherCAT主站 Windows上开发运行EtherCAT主站的几种方案 MotroEngineer的博客 08-08 1320 本文介绍了几种可以在windows上开发EtherCAT的方案,因为EtherCAT网络的高实时要求与windows本身匹配度不高,所以如何在windows上开发运行EtherCAT就成为开发者的明显需求,希望本文介绍的几种方法能帮助开发人员更好使用EtherCAT。 基于STM32的伺服总线EtherCAT主站设计——SOEM方案 weixin_48501028的博客 04-16 7552 本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。 基于STM32构建EtherCAT主站(SOEM方案)5 cln512的博客 12-22 2366 基于stm32构建ethercat主站 【Ethercat机器人控制系统开发】倍福Twincat入门教程 ljcyyx的博客 11-05 6287 低成本上手Twincat教程,适合初学者。 ethercat帧格式的详细解析 思泽之思 09-09 3277 一张图片带你了解EtherCAT的帧格式 使用C语言通过EtherCat与伺服通讯 weixin_35753291的博客 12-17 1452 在 C 语言中使用 EtherCat 进行伺服通信的方法如下: 首先,需要安装 EtherCat 库,比如可以使用 SOEM (Simple Open EtherCAT Master) 库。这个库提供了 EtherCat 通信所需的头文件和库文件。 然后,在程序中包含头文件,并链接库文件。 接下来,可以使用 SOEM 库提供的 API 函数进行 EtherCat 通信。例如,可以使用 ec_... FPGA设计EtherCAT主站的方法和常见问题 ic2121的博客 04-10 1016 作者从事EtherCAT等实时工业网络及运控产品的开发多年。基于FPGA的EtherCAT主站,是不少公司的明智选择。无论是实时性,灵活性,还是性价比均可有很好的保证。 一、基于FPGA的EtherCAT主站的设计方法 FPGA模块主要分为五部分:初始化、状态机、PDO、SDO、同步。 1)初始化模块 初始化主要工作是搜集网络拓扑结构、搜集各个节点的信息内容、初始化各个节点的时间系统与初始同步。 2)状态机模块 该模块主要实现各个节点的状态机转化。 INIT->预运行->安全 [工业互联-17]:常见EtherCAT主站与实现方法 文火冰糖(王文兵)的博客 07-08 4543 EtherCAT(Ethernet for Control Automation Technology)是一种实时以太网通信协议,用于工业自动化和控制系统中实现高性能、实时数据传输和控制。它是由EtherCAT技术组织(ETG)开发和标准化的。EtherCAT基于以太网物理层和数据链路层,但使用了一种特殊的通信方法,称为"Processing on the Fly"。这种方法使得数据帧能够在通过从站设备时进行实时处理,而不需要完全接收整个数据帧。这样,数据传输和控制可以实现高效率和低延迟。 EtherCAT 应用层协议的部分理解(一) 热门推荐 王三三 06-22 2万+ 不对EtherCAT进行介绍,只谈谈对EtherCAT应用层协议的简单理解1、COE (CANopen over EtherCAT) 一种基于且完全遵循CANopen协议的通信协议 用途: 1、用于驱动PDO对象,实现PDO对象间数据通信 2、用于驱动SDO对象,实现SDO对象间的数据传输 分类: 1、周期性过程数据通信 – 驱动PDO Soem-1个电机转圈圈PV模式-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 最新发布 01-09 Soem-1个电机转圈圈PV模式-添加代码注释-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 16 --Qt-Soem通过界面按键控制电机转圈圈PV模式,这一篇博客的源代码,博客链接( 正在编写,2024.1.14发布, https://editor.csdn.net/md?articleId=135431287 )。 注意: 该项目源代码提供了 QT-SOEM 配置从站到OP状态,并且对1个EtherCAT从站 电机进行操作,通过 PV模式 让 1个电机转圈圈,正反转及停止。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。 Soem主站识别到 几 个从站。 并且对1个EtherCAT从站 电机进行操作,通过 PV模式 让 1个电机转圈圈,正反转及停止。 Soem-1个IO模块输入IO显示及IO输出控制-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 01-09 Soem-1个IO模块输入IO显示及IO输出控制-添加代码注释-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 13 --Qt-Soem通过界面按键控制 EtherCAT IO模块的io输出 ; EtherCAT主站SOEM -- 14 --Qt-Soem通过界面采集从站IO进行显示 ,这两篇博客的源代码,博客链接( https://blog.csdn.net/qq_50808730/article/details/135429669 ,https://blog.csdn.net/qq_50808730/article/details/134894049 )。 注意: 该项目源代码提供了 QT-SOEM 配置从站到OP状态,并且对1个EtherCAT从站 IO模块进行操作,包括:IO输出控制,IO采集进行显示。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等。 对1个EtherCAT从站 IO模块进行操作,包括:IO输出控制,IO采集显示。 Soem-跟从站通讯到OP状态-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 01-09 Soem-跟从站通讯到OP状态-添加备注-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 9 -- SOEM之基于QT搭建自己的EtherCAT主站,这一篇博客的源代码,博客链接( https://blog.csdn.net/qq_50808730/article/details/134361490 )。 注意: 该项目源代码只是提供了 QT-SOEM 配置从站到OP状态,没有对EtherCAT从站进行操作。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。 Soem主站识别到 几 个从站。 在RT-Thread上移植EtherCAT开源主站SOEM1.4.0 lg28870983的博客 05-08 5350 EtherCAT在运动控制领域非常热门,有SOEM和IGH的开源主机实现。在STM系列处理器上的实现比较多,在RT-Thread上的实现还没有看到。这次就基于RT-Thread移植SEOM,并实现了DC+CSP对汇川伺服IS620N的控制,同步周期为1ms。 EtherCAT主站开发方案-含ZedBoard和X86测试数据 11-04 EtherCAT主站开发方案-含ZedBoard和X86测试数据 EtherCAT主站开发方案-含ZedBoard和X86测试数据 TI EtherCAT主站实现方案 10-22 TI官方的Tether CAT主站实现方案,详细的可以到其官网上了解。EtherCAT(以太网控制自动化技术)是一个开放架构,以以太网为基础的现场总线系统,其名称的CAT为控制自动化技术(Control Automation Technology)字首的缩写。EtherCAT是确定性的工业以太网,最早是由德国的Beckhoff公司研发。 ethercat主站ic: ecm-xf 08-09 EtherCAT主站IC(EtherCAT Master IC)是一种用于EtherCAT网络的集成电路。其中的一款常见的EtherCAT主站IC是ECM-XF。 ECM-XF是一种先进的EtherCAT主站IC,具有高性能和广泛的应用领域。它由一系列强大的处理器和... “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 最美的愿望一定最疯狂 博客等级 码龄8年 47 原创 96 点赞 463 收藏 98 粉丝 关注 私信 热门文章 树莓派蓝牙调试过程 26757 pytorch安装----CPU版的 19037 在嵌入式linux下搭建java运行环境 9981 Ethercat学习-从站源码生成 4774 GD32F407 移植FreeRTOS+Lwip 4743 分类专栏 嵌入式 8篇 Ethercat 9篇 DSP 3篇 linux驱动学习 13篇 python-树莓 6篇 蓝牙学习 1篇 pytorch 1篇 hadoop 3篇 最新评论 Ethercat学习-电机调试问题总结 最美的愿望一定最疯狂: 你这个不是错误码,我也不太清楚 Ethercat学习-电机调试问题总结 weixin_43416365: 大佬,上电复位之后有时候能正常op,有时候就卡在safeop然后转到op失败,报错AL Status '0x0004' read and '0x0008' expected.是什么原因呀 Ethercat学习-电机调试问题总结 嵌入式内核源码: 可以简略的私信里面教我理解一下嘛大佬 Ethercat学习-电机调试问题总结 最美的愿望一定最疯狂: 主站要对从站进行DC的配置。然后他会根据配置的周期一直产生脉冲 Ethercat学习-电机调试问题总结 嵌入式内核源码: 大佬,EtherCAT的sync引脚如何才能发出脉冲数据啊 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 USB通信学习-基础概念理解 HDFS基础 Ethercat学习-从站源码解析(ECAT_Main) 2023年16篇 2022年5篇 2018年2篇 2017年13篇 2016年11篇 目录 目录 分类专栏 嵌入式 8篇 Ethercat 9篇 DSP 3篇 linux驱动学习 13篇 python-树莓 6篇 蓝牙学习 1篇 pytorch 1篇 hadoop 3篇 目录 评论 被折叠的 条评论 为什么被折叠? 到【灌水乐园】发言 查看更多评论 添加红包 祝福语 请填写红包祝福语或标题 红包数量 个 红包个数最小为10个 红包总金额 元 红包金额最低5元 余额支付 当前余额3.43元 前往充值 > 需支付:10.00元 取消 确定 下一步 知道了 成就一亿技术人! 领取后你会自动成为博主和红包主的粉丝 规则 hope_wisdom 发出的红包 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 余额充值 EtherCAT学习之路——概述 - 知乎首发于EtherCAT学习之路切换模式写文章登录/注册EtherCAT学习之路——概述白细胞 最近在做基于EtherCAT的项目,看了一些网上的博客,感觉写的都比较松散。虽然,自己也是才开始学习,希望能把这段时间学到的东西总结一下。这是倍福的官方介绍,有时间的可以看一下。1.EtherCAT简介 EtherCAT是由德国BECKHOFF自动化公司于2003年提出的实时工业以太网技术。它具有高速和高数据有效率的特点,支持多种设备连接拓扑结构。其从站节点使用专用的控制芯片,主站使用标准的以太网控制器。 EtherCAT是一种工业以太网技术,看到的大多数应用场景都是伺服电机。因为是基于以太网的技术,所以EtherCAT相比于CAN总线而言,速率上要快不少。EtherCAT可以达到100M的速率,而CAN只有1M。此外,EtherCAT还具备低延时和精准同步的特点。 在工业总线中,低延时、精准同步是用户的关键需求。试想一下,工厂中某个器件的生产需要A/B/C三个机器协同操作,原本预想的是A先操作期间,然后B把器件传递给C,C再操作。如果,A/B/C不同步,或者操作命令的传达有延时,A还没有操作完器件,B就已经开始进行传递了。这时要么器件损坏,要么就做出来个半成品。而EtherCAT相比于普通的以太网技术就有这两点的优点。2.EtherCAT基本原理 EtherCAT基本原理这一节PLC攻城狮的《浅析EtherCAT 总线》讲的还是比较清楚,推荐大家看一下。下面我就简单说一下自己的理解。 倍福官方对EtherCAT的传递机制的命名叫做:ON The Fly。图 2-1 On The Fly On The Fly技术可以从两方面来解读,第一个方面是以太帧“时分复用”。一般以太帧里都只包含了一个设备发送的消息,5个设备就会发送5条以太帧。而EtherCAT则是多个从站共享一条以太帧。就像图2-1中的火车,EtherCAT主站发出了“火车”(以太帧),各个从站则从这辆火车的不同的“车厢”(子报文)中提取或插入自己的“乘客”(消息)。这样一来就实现了以太帧的“时分复用”,只用一条以太帧(最大1486byte),就可以让各个从站都收发出自己的消息,大大的降低了通信的延时(这一部分《浅析EtherCAT 总线》里面讲的比较清楚,还没理解的同学可以看看)。 On The Fly影响的另一个方面就是总线仲裁了。所谓总线(例如CAN总线),就是大家都共用一条通道来通信,各个设备都挂载在同一条总线上。所以,当一个总线上的多个设备同时想要发消息的时候,就会产生冲突,所以,就有总线仲裁的机制。控制器决定当前时刻,谁来发消息,谁来“占用”这条总线。而EtherCAT玩了一个花样,EtherCAT的各个设备之间是一种P2P(Point to Point)的连接方式,这些设备根本没有连接在“同一条”总线上。下面是EtherCAT的连接结构。图 2-2 EtherCAT连接结构 图2-2中,最左边的是主站,后面的都是从站,各个从站下面还挂载了不同的设备。可以看到主站向从站1发送以太帧,从站1接收、处理完自己的子报文后,再把以太帧发送给从站;从站2接收,处理完自己的子报文后在发送给从站3;如此往返,直到最后一个从站n接收处理完自己的消息,再把这条以太帧返回回去。所以,各个从站之间根本就不会存在总线冲突。EtherCAT只需要预先配置好各个从站占用的子报文位置,也就是On The Fly技术,就可以解决总线总裁这一个老大难的问题,确实是一箭双雕。 当然,这种解决方案也是有它的缺点的。比如,从站数量非常多的时候,最后一个从站就需要等前面的从站一次次转发才能收到消息。当然,我觉得EtherCAT应该也想到了这点,应该也采取了某种机制来避免这种最远设备延迟的缺陷。但是,我还没深挖这个问题,所以,没看到相关的解决机制。如果有了解的同学希望能指教一下。3.EtherCAT系统组成 EtherCAT系统主要就一个主站和若干从站组成。如图3-1所示:图3-1 EtherCAT系统组成 EtherCAT一般使用软件的方式来实现主站,包括倍福的TwinCAT,Igh,KingStar等等都是基于一台实时操作系统的PC,通过以太网卡,来实现主站的功能。因为,主站不是我的项目重点,所以,目前了解的还不多。先挖一个坑,后面有时间了研究一下,再来补上。现在我是用TwinCAT的免费版来学习和调试的。TwinCAT本身是收费的,不过,它有试用版,试用版不具备实时功能,调试一下设备还是足够了。 从站的组成如图3-2所示:图 3-2 从站组成 从站一般是有3部分器件组成的:物理层器件、EtherCAT从站控制器(EtherCAT Slave Control)和微处理器(MCU)。物理层器件就是以太网的PHY芯片和网口,ESC是实现EtherCAT协议栈的专用ASIC,从站控制微处理器主要实现应用层(如CANopen)和用户自定义的程序。 看到这里没有通信基础知识的通信可能就有点懵逼了。物理层,数据链路层,应用层这些是个啥玩意?这里我就简单说一下,想要深入理解还是可以看看OSI模型,大多数的通信技术都脱离不了这个框架。图 3-3 OSI模型 这里偷了个懒,盗用一下PLC攻城狮的图片。OSI中有7层,EtherCAT系统中只用了3层:物理层、数据链路层、应用层。先降维的说一下这几层是啥意思。最基本的通信就是咱们人类说话,我就以我们普通对话来讲解一下这三层的意思。 物理层:人类的语言是通过嘴发声,声波在空气中传播,传递到耳朵,耳朵听音再汇聚到大脑,大脑最终判断出声音中的信息。我们的嘴、耳、声波和空气就是物理层。物理层的重点是信号在介质中的传递表示,不同的字有不同的发音规则,不同的频率和声调,比如“哦”,我们就需要发出“o”这个音,我们听到“o”这个音的时候,才能判断出“哦”这个字。计算机通信的原理和这个也是一样的,信号在光纤、电缆以及空气中传播,计算机需要判断电缆上的电平的高低来判断0,1bit。当然,计算机比人类要傻很多,它不知道“某句话”的“发音”是从什么时候开始的,什么时候结束的,所以,物理层还需要告诉它信号的起始时刻和持续的长度等等。 数据链路层:通过前面的物理层,我们已经具备了基本的发声的手段,通过嘴改变声音的频率、音调、音长等特征(通信系统中,天线或者光模块改变信号的电平高低、信号频率、调制方式等特征),让声音在空气中传播(通信系统中,信号在相应的介质中传播),然后,耳朵识别这些频率、音调、音长等特征(通信系统中,接收端的识别信号的电平高低、频率、调制方式),最终实现口到耳的传播。 但是,光是这样还足够实现通信。试想一下,你和你的几个朋友处在一个嘈杂的环境当中,远处有汽车的轰鸣,旁边还有小孩子在哭闹,你的朋友们每个人在抢着发言,大家七嘴八舌的,根本听不清对方在说什么。所以,你和你的朋友之间想要对话就必须克服两个困难,第一,屏蔽掉耳旁的那些轰鸣声、哭闹声;第二,需要建立一种对话机制,让大家互相可以听清对方的话语。 第一点中描述的那些轰鸣、哭闹声,实际上就是通信系统中的噪声,噪声太大时,我们是无法通信的,因为我们根本听不清旁边的人在说些什么,只能听到轰鸣、哭闹声。最简单克服噪声的办法就是提高信号的发射功率,也就是大声地说话,让自己的声音盖过那些哭闹声,也即是通信系统中的功率控制。还有一种办法就是我们过滤掉一些噪声,虽然,这些声音都会进入我们的耳朵,但是,我们的大脑可以过滤掉一些不关注的声音,专注的去接收那些关注的声音,也即是通信系统中的频率选择。此外,大家七嘴八舌的说话也是一个问题。7,8个人同时在说话,你能听清楚一两个就不错了,其他人在说啥,根本没法听清。所以,我们说话的时候,一般会有一个轮流的机制。每个人说两句,别人说话的时候,别插嘴。或者,两个人说悄悄话,不打扰到别人,自己也听得清。这里的轮流说话机制,就是通信系统中的“时分复用”或者“频分复用”;一个人说7个人听,就是广播;1对1的悄悄话就是单播。数据链路层实际上就是用来解决以上的这些问题。 数据链路层会将待传输的消息组成一个帧,如图3-4所示:图3-4 EtherCAT帧结构 这个帧里就会包含目的地址、源地址、帧数据、帧校验位等。通过目的地址就可以确定帧传递的对象,通过源地址接收方也可以知道是谁发送了这条帧。在数据帧之外的地方,一般还会存在一个控制器(比如EtherCAT主站),这个控制器会决定,其他的从站什么时候传输数据,数据可以占用多少的资源。在其他的一些更复杂的通信系统中,数据链路层还会根据当前的信道条件(噪声情况),来决定各个设备的发射功率,调制方式等。 应用层:说完了数据链路层,我们还需要继续了解一下应用层。首先需要明确的一点,这里的应用层和我们手机、电脑上的应用程序不是一个东西。最为常见的应用层协议就是HTTP。简单来说,应用层是对数据的一种格式约定。这里还是用人类的对话来打个比方。你和一个老外,大家都有口有耳,也都是文明人,知道等对方说完自己再说。但是,你不懂英文,他不懂中文,你们还是无法交流。他说了“double”,你以为是“打包”;他说“You need cry deal”,你以为是“有你的快递”。这实际上就是你们的应用层协议不对等,他安装的是“英语”应用层协议,你安装的是“中文”应用层协议,大家说话牛头不对马嘴,根本无法交流。再夸张一点,我和你都是中国人,我们都听得懂中文,当时我是学通信的,你是学自动化的,我说PRACH信道,信道检查与估计,匹配滤波这些词的时候,你能明白每一个字的意思,但是连着一起是啥就不知道了。这就是因为你确实“通信系统”这个应用层协议。应用层协议最终的目的,就是让消息的收发双方知道这一串“1010101010”代表的是什么意思。本来这一章准备昨天就写完了,谁知道写了这么多无关的内容,后面准备新开一个博客把OSI的7层就讲一下,然后再把这一节删除掉。4.学习书目 其实,前面说了这么多,我觉得只有这一节最重要,介绍一下我的参考书目。网上虽然有各种各样的博客、知乎文字,但是始终是比不上书本上的详细和系统的。网上这些博客可能可以吃个快餐,但绝对不是什么捷径。不系统的学习,只能让你一知半解,能做个Demo出来就不错了。一旦遇到一点bug,根本无从下手。所以,一定要多读书,读好书。 这里有几本书要给大家推荐一下。 首先是北京航空航天大学出版社,郇极、刘艳强编写的《工业以太网现场总线EtherCAT驱动程序设计及应用》。这本书详细的介绍了EtherCAT协议、从站控制芯片以及相关应用层协议。我这里的大多数内容都取自于这本书中,如果能把这本书都看懂、看明白,那EtherCAT从站开发,应该不会有太大的难点。 第二是周立功的《CANopen轻松入门》。EtherCAT是一个数据链路层的协议,所以还需要配合上层的应用层协议才能更好的工作,CANopen即是工业物联网中一个比较常用的应用层协议。事实上,进行从站开发的时候,应用层协议会占到很大的比例。因为,EtherCAT从站一般都会使用一个专用ASIC(如ET1100)来实现EtherCAT协议栈,也即是完成数据链路层的工作。对于数据链路层,我们只需要做一些配置工作,而应用层协议则需要通过软件来实现。 第三是倍福官方的《EtherCAT Slave Information Specification 》和《Application Note ET9300》。前面说了,EtherCAT协议栈的功能都是在ET1100上实现的,开发从站是不涉及这部分数据链路层的代码的。但是,我们还是对从站进行相应的配置,包括PDI控制,SYNC信号脉冲宽度等信息(称为EtherCAT Slave Information,ESI)。这些信息的配置就在《EtherCAT Slave Information Specification》里有详细讲解。此外,从站开发还需要实现CANopen等应用层协议。对于应用层协议的实现,在《Application Note ET9300》里有比较详细的讲解。像ET1100、AX58100、LAN9252这些EtherCAT控制芯片,其芯片厂商都会提供一些Demo程序,这些Demo程序实际上都是基于《Application Note ET9300》里的软件框架来完成的。《Application Note ET9300》只有英文版,我自己也还没有看完,而且比较重要,后面专门拿一章来细讲。 第四是SSC,这是倍福提供的一个软件。前面说了,从站开发的两个关键步骤是EtherCAT控制芯片的配置和应用层协议的实现。倍福提供了SSC这样一个软件,它可以直接根据配置和需求,生成所需的xml描述文件和应用层代码。当然,这个软件生成的代码原生只适配与倍福自己的ET1100或ET1200芯片,其他的LAN9252、AX58100都做一些修改。这个东西看着很美好,也就那么回事。其实,每个芯片厂商都有提供自己的Demo程序,这些Demo程序都简单实现了应用层协议。如果是使用非倍福的芯片,不如直接在芯片厂商的Demo程序上改,这样可以避免一些莫名其妙的bug。不过,如果所需的应用层协议,芯片厂商没有提供Demo程序的话,还是需要用SSC生成一个参考,然后,再基于这个参考来修改。题外话原本以为一个晚上可以搞定的工作,生生花了2个晚上。很多地方写得比较零碎,特别是OSI那一段扯得有点远了,写了不少和主题无关的内容,后面找时间再重新精简一下。第一次写博客,可能有不少不准确或者错误的地方,还请大家见谅。如有不对之处,还请多多指教。编辑于 2020-03-13 16:39工业互联网/物联网平台个人博客以太网(Ethernet)赞同 19716 条评论分享喜欢收藏申请转载文章被以下专栏收录EtherCAT学习之路EtherCAT从站开 【EtherCAT】4.实现一个成熟的从站 - 知乎首发于EtherCAT切换模式写文章登录/注册【EtherCAT】4.实现一个成熟的从站小皎皎一只可爱的小皎皎学习EtherCAT最好从从站开始,因为从站包含了EtherCAT大量原理,例如状态机,PDO映射等。学习从站代码有利于理解过程数据如何传输,XML有什么作用。本文介绍一些从站的基础知识,以及如何设计一个功能完善的从站。从站硬件无论是以ASIC还是FPGA的形式,ESC都是从站的核心,主站通过读写ESC的DPRAM空间实现数据传输。ESC通过PDI接口将数据发送到MCU,在MCU中执行实际的应用层操作。ESC根据倍福公司的IP core设计,目前主流的ESC芯片包括: ASIX公司的AX58100芯片;BeckHoff自己的ET1100芯片;Microchip的LAN9252芯片;FPGA:ET1810(altera)和ET181(xilinx);由于都是基于BeckHoff的IP core设计的,因此这几个芯片在实际功能上差距并不大,区别在于DPRAM的大小,SM的数量,FMMU的数量,PDI的方式等。芯片网口FMMUSMRAM(kBYTE)数字IOSPI slaveLocal BUSAX581002内部PHY,1MII88932Y8/16 asyncLan92522内部PHY,1MII34432Y8/16 sync/asyncET11004EBUS/MII88816Y8/16 sync/async关于芯片的详细参数,可以访问ESC具有各类AL寄存器供主站访问,但实际不执行具体的应用层操作,从站应用层的管理由专门的MCU进行。stm32有强大的性能和完善的生态,因而是应用层使用最为广泛的芯片,也可以采用其他的硬件例如Arduino或者ESP32实现应用层逻辑,但是要支持对应ESC的相关PDI接口。一般来说,从站硬件系统如下图所示:从站最小系统从站软件从站帧的链路层功能都是由ESC完成的。从站软件运行在MCU中,主要执行的是应用层的操作。MCU通过PDI接口读取ESC中的PDO和SDO数据,然后执行应用层的处理,例如状态机,COE,EOE等相关逻辑。MCU需要一套协议栈执行相关的逻辑,目前使用最多的从站协议栈是EtherCAT技术组(EtherCAT Technology Group,ETG)为会员提供的Slave Stack Code(SSC),SSC支持几乎所有应用层协议栈(EOE,COE,FOE)等,同时还提供了对专有协议Cia402等的支持。除此之外,SSC还提供了专门的工具来配置协议栈和PDO。SSC的缺点是,它是针对BeckHoff自己的PIC和ET1100芯片写的,如果使用stm32或者其他通用处理器,需要手工移植代码。ssc的代码框架除了SSC之外,另一个比较有名的EtherCAT开源协议栈是SOES(GitHub - OpenEtherCATsociety/SOES: Simple Open Source EtherCAT Slave),SOES支持EOE和COE这两种较为常用的应用层协议,同时支持静态和动态的PDO映射。SOES的代码相较于SSC精简很多,代码可移植性较好。商用从站协议栈中,比较具有代表性的是KPA协议栈(https://koenig-pa.de/products/ethercat/kpa-ethercat-slave-stack)。作为商用协议栈,KPA协议栈几乎支持所有的EtherCAT特性,包括: 邮箱协议:COE,EOE,FOE,SOE,VOE 分布时钟DC;不同的扫描速率;从可移植性的角度,KPA协议栈实现了一个硬件抽象层,支持不同ESC和主控芯片的数据交互。下图是KPA协议栈的程序结构,从图中可以看出,数据从DPI传输到MCU后,首先通过的是硬件抽象层,主循环轮询AL事件来获取过程数据和邮箱数据的更新,然后基于对象字典更新PDO和SDO。从站功能操作系统层对于实时性和同步要求极高的场合,一般一个系统运行一个从站任务就好了,例如电机驱动从站,此时不建议使用操作系统,直接进行SSC协议栈移植即可。但是实时要求不强的场合,每个任务/接口使用一个从站是很浪费的,毕竟ESC还是有点小贵的,对于任务很多的从站,还是有必要上嵌入式实时系统。下面介绍一下嵌入式操作系统的作用。操作系统层的主要作用是合理对从站任务进行调度。作为现场总线的一部分,一个EtherCAT从站一般至少包含两个任务,一个从主站获取EtherCAT数据,另一个与控制设备(比如电机或CAN总线)交互。在多任务环境下,为了确保EtherCAT通信的实时性、增强任务调度的合理性、有效利用系统资源,从站应当基于实时操作系统进行开发。相较于Linux等操作系统,嵌入式操作系统具有如下特点:小型系统:由于嵌入式设备功能明确,操作系统往往与应用程序编译在一起运行。实时性:嵌入式操作系统往往是实时操作系统。很多嵌入式设备对处理的实时性有严格要求,这种实时性是通过操作系统层面的任务调度机制、任务优先级的设定和应用程序的快速处理来达到的。可移植性:由于嵌入式设备的应用场景多样,复杂程度千差万别,应用程序的大小各不相同,移植的需求是频繁发生的。ucos,vxworks,FreeRTOS和RT-thread是较具代表性的实时操作系统。这里以RT-thread为例介绍嵌入式实时系统的组成,RT-thread不仅是一个实时操作系统,也是一个完善的嵌入式软件生态。它的底层是RT-thread内核,基于内核还提供了网络框架,设备框架,以及各类API。最后在应用层还提供了各类具体应用。RT-thread架构线程管理 RT-thread内核是一个RT-thread程序的核心,RT-thread内核是一个基于优先级的全抢占式多线程调度系统,在该实时系统中,线程是最小的调度单位,系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身。RT-thread的线程调度关系如下。在RT-thread 中,实际上线程并不存在运行状态,就绪状态和运行状态是等同的。RT-thread线程RT-thread最多支持256个线程优先级,0优先级代表最高优先级,最低优先级留给空闲线程使用。同时它也支持创建多个具有相同优先级的线程,相同优先级的线程间采用时间片轮转调度算法进行调度,使每个线程运行相应时间。线程间通信 RT-thread支持线程间的同步和通信。采用信号量、互斥量与事件集实现线程间同步,线程通过对信号量、互斥量的获取与释放进行同步。支持邮箱和消息队列等通信机制。邮箱和消息队列的发送动作可安全用于中断服务例程中。通信机制支持线程按优先级等待或按先进先出方式获取。时钟管理 任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。时钟节拍是特定的周期性中断,中断之间的时间间隔取决于不同的应用,时钟节拍率越快,系统的额外开销就越大,从系统启动开始计数的时钟节拍数称为系统时间。RT-Thread 的时钟管理以时钟节拍为基础,时钟节拍是 RT-Thread 操作系统中最小的时钟单位。RT-Thread 的定时器提供两类定时器机制: 单次触发定时器:这类定时器在启动后只会触发一次定时器事件,然后定时器自动停止。 周期触发定时器:这类定时器会周期性的触发定时器事件,直到用户手动的停止定时器否则将永远持续执行下去。通常使用定时器定时 回调函数(即超时函数),完成定时服务。用户根据自己对定时处理的实时性要求选择合适类型的定时器。内存管理 内存是系统的重要资源,特别是对于资源紧张的嵌入式设备来说。RT-Thread将内存分为动态内存堆和静态内存池,对于动态内存的申请,RT-Thread提供小内存分配算法,slab算法和memheap算法。为了避免内存碎片,提高分配效率,RT-Thread还在.data段提供一个静态的内存池。设备管理 和Linux驱动框架类似,RT-Thread也通过I/O设备模型框架对外设进行管理。I/O 设备管理层实现了对设备驱动程序的封装。应用程序通过 I/O 设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据交互。设备驱动程序的升级、更替不会对上层应用产生影响。这种方式使得设备的硬件操作相关的代码能够独立于应用程序而存在,双方只需关注各自的功能实现,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。硬件抽象层硬件抽象层的主要作用是提升程序的可移植性。与ESC的数据交互,是EtherCAT从站MCU最为重要的功能。MCU通过PDI访问ESC的内存空间,读取寄存器和过程数据,因此,有必要对ESC的数据访问进行封装,封装的目的是保证在MCU应用层能够通过通用的接口实现对不同类型从站ESC,不同接口PDI的访问。关于硬件抽象层的封装,SOES实现了所有硬件访问相关函数:应用层协议EtherCAT从站的目标是能够支持各类应用层协议,这其中最主要的是COE协议和基于COE的各类行规。此外还需要支持FOE,EOE,SOE等协议。COE:CANopen over EtherCAT,EtherCAT协议在应用层支持CANopen协议,并作了相应的扩充,CoE协议完全遵从CANopen协议。COE协议十分核心且复杂,在此不作过多介绍。EOE:EtherNet over EtherCAT,该协议支持EtherCAT能分段传递标准的以太网数据报文,使得EtherCAT协议同样能支持TCP/IP、UDP/IP协议。SOE:Servo Drive over EtherCAT。SERCOS是世界首个应用于伺服控制的协议。EtherCAT协议在应用层接口上兼容了这个协议,简称为SOE。SERCOS应用层协议为主站设计了信息接口,可以通过配置EtherCAT过程数据报文,实现周期性传递伺服驱动器的数据。FOE:File Access over EtherCAT。该协议可以使用EtherCAT总线上传、下载固件,刷新从站的固件。并且可以通过命令行工具加载或存储文件。结合实际需求,COE和基于COE的行规协议CiA402等是必须实现的,FOE、EOE作为程序的扩展功能有必要实现,而SOE不是常用需求。动态PDO映射静态PDO映射是将PDO变量“写死”在从站中,对于实际应用场景是十分不友好的,例如某个机型的电机需要实时传输电机温度,但在另一个机型中不需要温度信息,如果使用静态PDO映射,为了提升传输效率,删除温度PDO,则需要修改代码,烧写固件,更新XML文件。这样会带来巨大的工作量。特别是基于CiA402的驱动器来说,经常要根据上位机软件的需求修改传输变量。动态PDO映射允许定制PDO以满足客户需求,TwinCAT和KPA studio等上位机软件都支持以勾选的形式动态配置PDO。为了使得上位机能够修改PDO assign,需要在xml中配置mandatory为false(SSC在EXCEL)中可以配置。动态PDO映射的基本原理是操作对象字典的0x1C12和0x1C13对象,这两个对象分别管理输出和输入的PDO映射。过程如下:将Ethercat状态机切换到PreOP状态,此状态可以用SDO来配置PDO映射;清除PDO指定对象的PDO映射对象,即设置0x1C12-00,与0x1C13-00为0;PDO映射对象无效,即对0x1600-0x1603/0x1A00-0x1A01的子索引设置为0;重新配置PDO映射内容;0x1600-01开始的是RxPDO内容,0x1A00-01开始的是TxPDO;设置PDO映射对象总数;写有效的PDO映射对象索引到PDO指定对象设置PDO指定对象的总个数,即将映射对象个数写入到1C12-00h和1C13-00h转换Ethercat状态机到安全操作以上,配置的PDO映射将有效。分布时钟EtherCAT各个从站得到帧后会进行处理或者转发,这需要一定的微小时间。但当需要经手的从站多,或者数据量大的时候,积少成多会导致较大的延迟,并且电缆线内信号传输也占有一定的延时时间。分步时钟可以使所有的EtherCAT设备使用相同的系统时间,从而控制各设备的任务的同步执行,支持分布式时钟的从站称为DC从站。为使各个从站的参考时钟达到绝对同步,主站会计算各个从站的偏移时间,这个值会写入对应从站的系统时间偏移寄存器。在从站端,分布时钟由ESC芯片实现,ESC为从站控制微处理器提供同步的中断信号和时钟信息,分布时钟单元可以产生两个同步信号SYNC0和SYNC1,用于给应用层提供中断或直接触发的输出数据更新。MCU可以通过ESC的中断信息和时间漂移寄存器的值更新本地系统时钟。分布时钟是从站的重要功能,SSC和SOES都实现了分布时钟,可以参考这两者的设计实现该功能。SDK目前从站代码开发主要有两种方式: 基于现有的代码进行移植:目前对于成熟的ESC(ET1100、LAN9252、AX58100)都有比较成熟的解决方案。但移植仍然要求对代码较为熟悉,如果添加新功能较为困难,综合来看较为麻烦;基于从站软件生成:SSC,SOES和KPA都提供了对应的从站代码生成器,但是SSC是针对自己的的PIC32芯片的,仍然需要手动移植代码;SOES和KPA的从站软件都属于商用软件需要较高的授权费;因此通过一个SDK简化从站开发流程是有必要的,参考SOES的slave editor,SDK所需的功能如下:从站基本信息:允许通过界面添加XML的必要信息,例如vendor ID,product ID等;数据链路层配置,允许通过界面配置FMMU,SM同步管理器和邮箱;PDI的配置:允许通过界面配置PDI相关寄存器;PDO的配置:这是从站软件的核心,允许通过界面直接添加和管理PDO,由于PDO是从站最重要的功能,此功能将极大简化从站开发过程;代码生成和XML的生成。SOES的上位机软件从站性能从站响应时间从站响应时间是从站的性能指标,指从发送一帧数据,经过每个从站ESC的处理,到主站接收到这帧数据的时间。从站响应时间主要由硬件和网络结构,数据传输量决定,具体地:带宽:传输延时和带宽有关系,对于单个bit,从发送到确认,不考虑线路损耗的时间是(1/BandWidth)。假设EtherCAT网络的带宽是100Mbit/s,则每字节的传输延时是(1/100M)*8 = 80us;主站硬件延时:主站硬件同样存在延时,一般在几us左右;主站软件延时:主站软件一般会带来几微秒的延时,取决于主站的性能;从设备数量:每个MII/PHY接口的ESC会带来1us的延时,而EBUS接口的则只有0.3us;KPA studio的数据界面,在运行状态下可以查看从站响应时间。编辑于 2023-08-29 15:47・IP 属地浙江EtherCAT 总线驱动器赞同 2011 条评论分享喜欢收藏申请转载文章被以下专栏收录EtherCAT介绍工业以太网总线EtherCAT技 【原创】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 - 沐多 - 博客园 会员 周边 新闻 博问 AI培训 云市场 所有博客 当前博客 我的博客 我的园子 账号设置 简洁模式 ... 退出登录 注册 登录 沐多 博客园 首页 新随笔 联系 管理 订阅 【原创】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 目录0 获取源码1 启动脚本1.1 start1.2 stop2 主站实例创建2.1 Master Phases2.2 数据报与状态机数据报状态机2.3 master状态机及数据报初始化2.4 初始化EtherCAT device2.5 设置IDLE 线程的发送间隔:2.6 初始化字符设备3 网卡4 IDLE阶段内核线程4.1 数据报发送4.2 数据报接收 版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/ 0 获取源码 IgH EtherCAT Master现已迁移到gitlab:https://gitlab.com/etherlab.org/ethercat,可以使用以下命令克隆存储库: git clone https://gitlab.com/etherlab.org/ethercat.git git checkout stable-1.5 上面的是igh官方的仓库,下面是其他Ethercat主站: https://github.com/ribalda/ethercat 基于官方,功能更为全面的igh etehrcat主站。 https://github.com/leducp/KickCAT 一个C++写的全新etehrcat主站,目前功能不完善。 https://github.com/ethercrab-rs/ethercrab 一个纯rust语言编写的全新etehrcat主站,目前功能不完善。 本文主要讲igh。 1 启动脚本 igh通过脚本来启动,可以是systemd、init.d或sysconfig。分别位于源码script目录下: 对于systemd方式,编译时由ethercat.service.in文件生成ethercat.service。ethercat.service中指定了执行文件为ethercatctl.ethercatctl文件由``ethercatctl.in`生成。init.d和sysconfig类似,都是生成一个可执行脚本,且脚本完成的工作一致,主要完成加载主站模块、网卡驱动、给主站内核模块传递参数、卸载模块等操作。 ethercat.conf共同的配置文件,配置主站使用的网卡、驱动等信息。下面看脚本start和stop所做的工作。 1.1 start 加载ec_master.ko 模块参数: main_devices :主网卡MAC地址,多个main_devices 表示创建多个主站,MAC参数个数master_count。 backup_devices :备用网卡MAC地址,多个backup_devices 表示创建多个主站,MAC参数个数backup_count。 debug_level :调试level,调试信息输出级别。 eoe_interfaces eoe接口,eoe_count表示eoe_interfaces 的个数。 eoe_autocreate 是否自动创建eoe handler。 pcap_size Pcap buffer size。 遍历配置文件中/etc/sysconfig/ethercat的环境变量DEVICE_MODULES,位于ethercat.conf中。 在每个DEVICE_MODULES前添加前缀ec_替换,如DEVICE_MODULES为igb的话,添加前缀后为ec_igb。 modinfo检查该模块是否存在。 对于非generic和rtdm的驱动,需要先将网卡与当前驱动unbind,unbind后的网卡才能被新驱动接管。 加载该驱动。 start加载了两个内核模块,ec_master.ko和网卡驱动ec_xxx.ko,ec_master先根据内核参数(网卡MAC)来创建主站实例,此时主站处于Orphaned phase。后续加载网卡驱动ec_xxx.ko,执行网卡驱动probe,根据MAC地址将网卡与主站实例匹配,此时主站得到操作的网卡设备,进入Idle phase。详细过程见后文。 1.2 stop 卸载内核模块ec_master.ko和网卡驱动ec_xxx.ko。 遍历配置文件中的环境变量DEVICE_MODULES。 在每个DEVICE_MODULES前添加前缀‘ec_’替换。 lsmod检查该模块是否被加载。 卸载模块。 后文“主站”和”master“均表示主站或主站实例对象,slave和从站表示从站或从站对象,中英混用,不刻意区分。 2 主站实例创建 一个使用IgH的控制器中可以有多个EtherCAT主站,每个主站可以绑定了一个主网卡和一个备用网卡,一般备用网卡不使用,线缆冗余功能时才使用备用网卡(文中假设只有一个主网卡)。 start过程中执行insmod ec_master.ko,这个时候,先调用的就是 module_init 调用的初始化函数ec_init_module()。先根据参数main_devices 的个数master_count,每个master需要一个设备节点来与应用程序交互,所以master_count决定需要创建多少个matser和多少个字符设备; 这里先分配注册master_count个字符设备的主次设备号device_number和名称,这样每个master对应的设备在文件系统中就是/dev/EtherCAT0、/dev/EtherCAT1...(Linux下)。 if (master_count) { if (alloc_chrdev_region(&device_number, 0, master_count, "EtherCAT")) { EC_ERR("Failed to obtain device number(s)!\n"); ... } } class = class_create(THIS_MODULE, "EtherCAT"); 解析模块参数得到MAC地址,保存到数组macs中。 for (i = 0; i < master_count; i++) { ret = ec_mac_parse(macs[i][0], main_devices[i], 0); if (i < backup_count) { ret = ec_mac_parse(macs[i][1], backup_devices[i], 1); } } 分配master_count个主站对象的内存,调用ec_master_init()初始化这些实例。 if (master_count) { if (!(masters = kmalloc(sizeof(ec_master_t) * master_count, GFP_KERNEL))) { ... } } for (i = 0; i < master_count; i++) { ret = ec_master_init(&masters[i], i, macs[i][0], macs[i][1], device_number, class, debug_level); ... } 2.1 Master Phases igh中,状态机是其核心思想,一切操作基于状态机来执行,对创建的每个EtherCAT主站实例都需要经过如下阶段转换(见图2.3),主站各阶段操作如下: Orphaned phase 此时主站实例已经分配初始化,正在等待以太网设备连接,即还没有与网卡驱动联系起来,此时无法使用总线通讯。 Idle phase 当主站与网卡绑定后,Idle线程ec_master_idle_thread开始运行,主站处于IDLE状态,ec_master_idle_thread主要完成从站拓扑扫描、配置站点地址等工作。该阶段命令行工具能够访问总线,但无法进行过程数据交换,因为还缺少总线配置。 Operation phase 应用程序请求主站提供总线配置并激活主站后,主站处于operation状态,ec_master_idle_thread停止运行,内核线程变为ec_master_operation_thread,之后应用可周期交换过程数据。 具体的后面会说到。 2.2 数据报与状态机 继续看master初始化代码ec_master_init前,我们先了解数据报与状态机的关系,这对后续理解很有帮助。 数据报 EtherCAT是以以太网为基础的现场总线系统,EtherCAT使用标准的IEEE802.3以太网帧,在主站一侧使用标准的以太网控制器,不需要额外的硬件。并在以太网帧头使用以太网类型0x88A4来和其他以太网帧相区别(EtherCAT数据还可以通过UDP/IP 来传输,本文已忽略),标准的IEEE802.3以太网帧中数据部分为EtherCAT的数据,标准的IEEE802.3以太网帧与EtherCAT数据帧关系如下: EtherCAT数据位于以太网帧数据区,EtherCAT数据由EtherCAT头和若干EtherCAT数据报文组成。其中EtheRCAT头中记录了EtherCAT数据报的长度、和类型,类型为1表示与从站通讯。EtherCAT数据报文内包含多个子报文,每个子报文又由子报文头、数据和WKC域组成。子报文结构含义如下。 整个EtherCAT网络形成一个环状,主站与从站之间是通过EtherCAT数据报来交互,一个EtherCAT报文从网卡TX发出后,从站ESC芯片EtherCAT报文进行交换数据,最后该报文回到主站。网上有个经典的EtherCAT动态图(刷新后动态图重新播放). 认识EtherCAT数据帧结构后,我们看IgH内是如何表示一个EtherCAT数据报文的?EtherCAT数据报文在igh中用对象ec_datagram_t表示。 typedef struct { struct list_head queue; /**< 发送和接收时插入主站帧队列. */ struct list_head sent; /**< 已发送数据报的主站列表项. */ ec_device_index_t device_index; /**< 发送/接收数据报的设备。 */ ec_datagram_type_t type; /**< 帧类型 (APRD, BWR, etc.). */ uint8_t address[EC_ADDR_LEN]; /**< Recipient address. */ uint8_t *data; /**< 数据. */ ec_origin_t data_origin; /**< 数据保存的地方. */ size_t mem_size; /**< Datagram \a data memory size. */ size_t data_size; /**< Size of the data in \a data. */ uint8_t index; /**< Index (set by master). */ uint16_t working_counter; /**< 工作计数. */ ec_datagram_state_t state; /**数据帧状态 */ #ifdef EC_HAVE_CYCLES cycles_t cycles_sent; /**< Time, 数据报何时发送. */ #endif unsigned long jiffies_sent; /**< Jiffies,数据报何时发送. */ #ifdef EC_HAVE_CYCLES cycles_t cycles_received; /**< Time, 何时被接收. */ #endif unsigned long jiffies_received; /**< Jiffies,何时被接收. */ unsigned int skip_count; /**< 尚未收到的重新排队数. */ unsigned long stats_output_jiffies; /**< Last statistics output. */ char name[EC_DATAGRAM_NAME_SIZE]; /**< Description of the datagram. */ } ec_datagram_t; 可以看到上面子报文中各字段大都在ec_datagram_t中有表示了,不过多介绍,其它几个成员简单介绍下, device_index表示这个数据报是属于哪个网卡设备发送接收的,IgH中一个master实例可以使用多个多个网卡设备来发送/接收EtherCAT数据帧,device_index就是表示master下的网络设备的。 data_origin表示每个master管理着多个空闲的ec_datagram_t,这些ec_datagram_t分成了三类,给不同的状态机使用,具体的后文马上会细说,data_origin就是表示这个ec_datagram_t是属于哪类的。 index表示该数据报是EtherCAT数据区的第index个子报文,在master发送一个完整的EtherCAT数据报时,组装以太网数据帧时使用。 data这个指向子报文的数据内存区,由于每个子报文交换数据不同,其大小不同,所以数据区为动态分配,mem_size表示的就是分配的大小。 data_size表示数据报操作的数据大小,比如该数据报用于读从站的某个寄存器,该值就是这个寄存器的大小。 jiffies_sent、jiffies_received、cycles_sent、cycles_received使用不同时钟方式是记录数据帧发送接收时间的,用于统计。 ec_datagram_state_t表示数据报的状态,每个数据报(ec_datagram_t)也是基于状态来处理,有6种状态: EC_DATAGRAM_INIT :数据报已经初始化 EC_DATAGRAM_QUEUED :插入发送队列准备发送 EC_DATAGRAM_SENT :已经发送(还存在队列中) EC_DATAGRAM_RECEIVED:该数据报已接收,并从发送队列删除 EC_DATAGRAM_TIMED_OUT :该数据报发送后,接收超时,从发送队列删除 EC_DATAGRAM_ERROR :发送和接收过程中出错(从队列删除),校验错误、不匹配等。 M位在master发送时组装EtherCAT数据帧时确定,接收时也根据该位判断后面还有没有子报文。 数据报对象初始化由函数ec_datagram_init()完成: void ec_datagram_init(ec_datagram_t *datagram /**< EtherCAT datagram. */) { INIT_LIST_HEAD(&datagram->queue); // mark as unqueued datagram->device_index = EC_DEVICE_MAIN; /*默认主设备使用*/ datagram->type = EC_DATAGRAM_NONE; /*数据报类型*/ memset(datagram->address, 0x00, EC_ADDR_LEN); /*数据报地址清零*/ datagram->data = NULL; datagram->data_origin = EC_ORIG_INTERNAL; /*默认内部数据*/ datagram->mem_size = 0; datagram->data_size = 0; datagram->index = 0x00; datagram->working_counter = 0x0000; datagram->state = EC_DATAGRAM_INIT; /*初始状态*/ #ifdef EC_HAVE_CYCLES datagram->cycles_sent = 0; #endif datagram->jiffies_sent = 0; #ifdef EC_HAVE_CYCLES datagram->cycles_received = 0; #endif datagram->jiffies_received = 0; datagram->skip_count = 0; datagram->stats_output_jiffies = 0; memset(datagram->name, 0x00, EC_DATAGRAM_NAME_SIZE); } 状态机 说完IgH数据报对象,我们来看有限状态机(fsm),有限状态机(fsm):表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。说起状态机,相信大家大学时候都有用过吧,不管是单片机、FPGA,用它写按键、菜单、协议处理、控制器什么的爽的一塌糊涂。其实我们使用的计算机就是本就是基于状态机作为计算模型的,它对数字系统的设计具有十分重要的作用。另外Linux TCP协议也是由状态机实现。 同样igh主站内部机制使用有限状态机来实现,IgH内状态机的基本表示如下: struct ec_fsm_xxx { ec_datagram_t *datagram; /**< 主站状态机使用的数据报对象 */ void (*state)(ec_fsm_master_t *); /**< 状态函数 */ .... }; IgH EtherCAT协议栈几乎所有功能通过状态机实现,每个状态机管理着某个对象的状态、功能实现的状态装换,而这些状态转换是基于EtherCAT数据报来进行的,如状态机A0状态函数填充datagram,经EtherCAT数据帧发出后,经过slave ESC处理,回到网卡接收端接收后,交给状态机A1状态的下一个状态函数解析处理。所以每个状态机内都包含有指向该状态机操作的数据报对象指针datagram和状态执行的状态函数void (*state)(ec_fsm_master_t *); 总结一句话:状态机是根据数据报的状态来执行,每个状态机都需要操作一个数据报对象。 现在知道了状态机与数据报的关系,下面介绍IgH EtherCAT协议栈中有哪些状态机,及状态机使用的数据报对象是从哪里分配如何管理的。 master状态机 前面说到主站具有的三个阶段,当主站与网卡设备attach后进入Idle phase,处于Idle phase后,开始执行主站状态机。 主站状态机包含1个主状态机和许多子状态机,matser状态机主要目的是: Bus monitoring 监控EtherCAT总线拓扑结构,如果发生改变,则重新扫描。 Slave confguration 监视从站的应用程序层状态。如果从站未处于其应有的状态,则从站将被(重新)配置 Request handling 请求处理(源自应用程序或外部来源),主站任务应该处理异步请求,例如:SII访问,SDO访问或类似。 主状态机ec_fsm_master_t结构如下: struct ec_fsm_master { ec_master_t *master; /**< master the FSM runs on */ ec_datagram_t *datagram; /**< 主站状态机使用的数据报对象 */ unsigned int retries; /**< retries on datagram timeout. */ void (*state)(ec_fsm_master_t *); /**< master state function */ ec_device_index_t dev_idx; /**< Current device index (for scanning etc.). */ int idle; /**< state machine is in idle phase */ unsigned long scan_jiffies; /**< beginning of slave scanning */ uint8_t link_state[EC_MAX_NUM_DEVICES]; /**< Last link state for every device. */ unsigned int slaves_responding[EC_MAX_NUM_DEVICES]; /**<每个设备的响应从站数。*/ unsigned int rescan_required; /**< A bus rescan is required. */ ec_slave_state_t slave_states[EC_MAX_NUM_DEVICES]; /**< AL states of responding slaves for every device. */ ec_slave_t *slave; /**< current slave */ ec_sii_write_request_t *sii_request; /**< SII write request */ off_t sii_index; /**< index to SII write request data */ ec_sdo_request_t *sdo_request; /**< SDO request to process. */ ec_fsm_coe_t fsm_coe; /**< CoE state machine */ ec_fsm_soe_t fsm_soe; /**< SoE state machine */ ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */ ec_fsm_change_t fsm_change; /**< State change state machine */ ec_fsm_slave_config_t fsm_slave_config; /**< slave state machine */ ec_fsm_slave_scan_t fsm_slave_scan; /**< slave state machine */ ec_fsm_sii_t fsm_sii; /**< SII state machine */ }; 可以看到,主站状态机结构下还有很多子状态机,想象一下如果主站的所有功能通过一个状态机来完成,那么这个状态机的状态数量、各状态之间的联系会有多恐怖,复杂性级别将会提高到无法管理的水平。为此,IgH中,将EtherCAT主状态机的某些功能用子状态机完成。这有助于封装相关工作流,并且避免“状态爆炸”现象。这样当主站完成coe功能时,可以由子状态机fsm_coe去完成。具体各功能是如何通过状态机完成的,文章后面会介绍。 slave状态机 slave状态机管理着每个从站的状态,所以位于从站对象(ec_slave_t)内: struct ec_slave { ec_master_t *master; /**< Master owning the slave. */ ..... ec_fsm_slave_t fsm; /**< Slave state machine. */ ..... }; struct ec_fsm_slave { ec_slave_t *slave; /**< slave the FSM runs on */ struct list_head list; /**< Used for execution list. */ ec_dict_request_t int_dict_request; /**< Internal dictionary request. */ void (*state)(ec_fsm_slave_t *, ec_datagram_t *); /**< State function. */ ec_datagram_t *datagram; /**< Previous state datagram. */ ec_sdo_request_t *sdo_request; /**< SDO request to process. */ ec_reg_request_t *reg_request; /**< Register request to process. */ ec_foe_request_t *foe_request; /**< FoE request to process. */ off_t foe_index; /**< Index to FoE write request data. */ ec_soe_request_t *soe_request; /**< SoE request to process. */ ec_eoe_request_t *eoe_request; /**< EoE request to process. */ ec_mbg_request_t *mbg_request; /**< MBox Gateway request to process. */ ec_dict_request_t *dict_request; /**< Dictionary request to process. */ ec_fsm_coe_t fsm_coe; /**< CoE state machine. */ ec_fsm_foe_t fsm_foe; /**< FoE state machine. */ ec_fsm_soe_t fsm_soe; /**< SoE state machine. */ ec_fsm_eoe_t fsm_eoe; /**< EoE state machine. */ ec_fsm_mbg_t fsm_mbg; /**< MBox Gateway state machine. */ ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */ ec_fsm_change_t fsm_change; /**< State change state machine */ ec_fsm_slave_scan_t fsm_slave_scan; /**< slave scan state machine */ ec_fsm_slave_config_t fsm_slave_config; /**< slave config state machine. */ }; slave状态机和master状态机类似,slave状态机内还包含许多子状态机。slave状态机主要目的是: 主站管理从站状态 主站与从站应用层(AL)通讯。比如具有EoE功能的从站,主站通过该从站下的子状态机fsm_eoe来管理主站与从站应用层的EOE通讯。 数据报对象的管理 上面简单介绍了IgH内的状态机,状态机输入输出的对象是datagram,fsm对象内只有数据报对象的指针,那fsm工作过程中的数据报对象从哪里分配? 由于每个循环周期都需要操作数据报对象,IgH为减少datagram的动态分配操作,提高主站性能,在master初始化的时候预分配了主站运行需要的所有datagram对象。在master实例我们可以看到下面的数据报对象: struct ec_master { ... ec_datagram_t fsm_datagram; /**< Datagram used for state machines. */ ... ec_datagram_t ref_sync_datagram; /**< Datagram used for synchronizing the reference clock to the master clock.*/ ec_datagram_t sync_datagram; /**< Datagram used for DC drift compensation. */ ec_datagram_t sync_mon_datagram; /**< Datagram used for DC synchronisation monitoring. */ ... ec_datagram_t ext_datagram_ring[EC_EXT_RING_SIZE]; } 这些数据报对象都是已经分配内存的,但由于报文不同,报文操作的数据大小不同,所以datagram数据区大小随状态机的具体操作而变化,在具体使用时才分配数据区内存。 以上数据报对象给状态机使用,别忘了还有过程数据也需要数据报对象,所以IgH中数据报类型分为以下四类: 分为三类(非常重要): 数据报对象 用途 Datagram_pairs 过程数据报 fsm_datagram[] Fsm_master及子状态机专用的数据报对象。 ext_datagram_ring[] 动态分配给fsm_slave及其子fsm。 ref_sync_datagram sync_datagram sync64_datagram sync_mon_datagram 应用专用数据报用于时钟同步。 其中fsm_datagram为master状态机及master下的子状态机执行过程中操作的对象。 ext_datagram_ring[]是一个环形队列,当fsm_slave从站状态机处于ready状态,可以开始处理与slave相关请求,如配置、扫描、SDO、PDO等,这时会从ext_datagram_ring[]中给该fsm_slave分配一个数据报,并运行fsm_slave状态机检查并处理请求。 应用专用数据报用于时钟同步,与时钟强相关,它们比较特殊,它们的数据区大小是恒定的,所以其数据区在主站初始化时就已分配内存,应用调用时直接填数据发送,避免linux的内存分配带来时钟的偏差。 数据报数据区(data)内存通过ec_datagram_prealloc()来分配. int ec_datagram_prealloc( ec_datagram_t *datagram, /**< EtherCAT datagram. */ size_t size /**< New payload size in bytes. */ ) { if (datagram->data_origin == EC_ORIG_EXTERNAL || size <= datagram->mem_size) return 0; ...... if (!(datagram->data = kmalloc(size, GFP_KERNEL))) { ...... } datagram->mem_size = size; return 0; } 数据区的大小为一个以太网帧中单个Ethercat数据报的最大数据大小EC_MAX_DATA_SIZE。 /** Size of an EtherCAT frame header. */ #define EC_FRAME_HEADER_SIZE 2 /** Size of an EtherCAT datagram header. */ #define EC_DATAGRAM_HEADER_SIZE 10 /** Size of an EtherCAT datagram footer. */ #define EC_DATAGRAM_FOOTER_SIZE 2 /** Size of the EtherCAT address field. */ #define EC_ADDR_LEN 4 /** Resulting maximum data size of a single datagram in a frame. */ #define EC_MAX_DATA_SIZE (ETH_DATA_LEN - EC_FRAME_HEADER_SIZE \ - EC_DATAGRAM_HEADER_SIZE - EC_DATAGRAM_FOOTER_SIZE) 由于以太网帧的大小有限,因此数据报的最大大小受到限制,即以太网帧长度 1500 - ethercat头2byte- ethercat子数据报报头10字节-WKC 2字节,如图: 如果过程数据镜像的大小超过该限制,就必须发送多个帧,并且必须对映像进行分区以使用多个数据报。 Domain自动进行管理。 2.3 master状态机及数据报初始化 对状态机及数据报对象有初步认识后,我们回到ec_master.ko模块入口函数ec_init_module()主站实例初始化ec_master_init(),主要完成主站状态机初始化及数据报: // init state machine datagram ec_datagram_init(&master->fsm_datagram); /*初始化数据报对象*/ snprintf(master->fsm_datagram.name, EC_DATAGRAM_NAME_SIZE, "master-fsm"); ret = ec_datagram_prealloc(&master->fsm_datagram, EC_MAX_DATA_SIZE); // create state machine object ec_fsm_master_init(&master->fsm, master, &master->fsm_datagram); /*初始化master fsm*/ 其中ec_fsm_master_init初始化master fsm和子状态机,并指定了master fsm使用的数据报对象fsm_datagram。 void ec_fsm_master_init( ec_fsm_master_t *fsm, /**< Master state machine. */ ec_master_t *master, /**< EtherCAT master. */ ec_datagram_t *datagram /**< Datagram object to use. */ ) { fsm->master = master; fsm->datagram = datagram; ec_fsm_master_reset(fsm); // init sub-state-machines ec_fsm_coe_init(&fsm->fsm_coe); ec_fsm_soe_init(&fsm->fsm_soe); ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe); ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram, &fsm->fsm_change, &fsm->fsm_coe, &fsm->fsm_soe, &fsm->fsm_pdo); ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram, &fsm->fsm_slave_config, &fsm->fsm_pdo); ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); } 初始化外部数据报队列 外部数据报队列用于从站状态机,每个状态机执行期间使用的数据报从该区域分配,下面是初始化ext_datagram_ring中每个结构: for (i = 0; i < EC_EXT_RING_SIZE; i++) { ec_datagram_t *datagram = &master->ext_datagram_ring[i]; ec_datagram_init(datagram); snprintf(datagram->name, EC_DATAGRAM_NAME_SIZE, "ext-%u", i); } 非应用数据报队列链表,如EOE数据报会插入该队列后发送。 INIT_LIST_HEAD(&master->ext_datagram_queue); 同样初始化几个时钟相关数据报对象,它们功能固定,所以数据区大小固定,就不贴代码了,比如sync_mon_datagram,它的作用是用于同步监控,获取从站系统时间差,所以是一个BRD数据报,在此直接将数据报操作偏移地址初始化,使用时能快速填充发送。 ec_datagram_init(&master->sync_mon_datagram); ...... ret = ec_datagram_brd(&master->sync_mon_datagram, 0x092c, 4); 地址 位 名称 描述 复位值 0x092c~0x092F 0~30 系统时间差 本地系统时间副本与参考时钟系统时间值之差 0 31 符号 0:本地系统时间≥参考时钟时间1:本地系统时间<参考时钟时间 0 另外比较重要的是将使用的网卡MAC地址放到macs[]中,在网卡驱动probe过程中根据MAC来匹配主站使用哪个网卡。 for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_MAX_NUM_DEVICES; dev_idx++) { master->macs[dev_idx] = NULL; } master->macs[EC_DEVICE_MAIN] = main_mac; 2.4 初始化EtherCAT device master协议栈主要完成EtherCAT数据报的解析和组装,然后需要再添加EtherNet报头和FCS组成一个完整的以太网帧,最后通过网卡设备发送出去。为与以太网设备驱动层解耦,igh使用ec_device_t来封装底层以太网设备,一般来说每个master只有一个ec_device_t,这个编译时配置决定,若启用线缆冗余功能,可指定多个网卡设备: struct ec_device { ec_master_t *master; /**< EtherCAT master */ struct net_device *dev; /**< 使用的网络设备 */ ec_pollfunc_t poll; /**< pointer to the device's poll function */ struct module *module; /**< pointer to the device's owning module */ uint8_t open; /**< true, if the net_device has been opened */ uint8_t link_state; /**< device link state */ struct sk_buff *tx_skb[EC_TX_RING_SIZE]; /**< transmit skb ring */ unsigned int tx_ring_index; /**< last ring entry used to transmit */ #ifdef EC_HAVE_CYCLES cycles_t cycles_poll; /**< cycles of last poll */ #endif #ifdef EC_DEBUG_RING struct timeval timeval_poll; #endif unsigned long jiffies_poll; /**< jiffies of last poll */ // Frame statistics u64 tx_count; /**< 发送的帧数 */ u64 last_tx_count; /**<上次统计周期发送的帧数。 */ u64 rx_count; /**< 接收的帧数 */ u64 last_rx_count; /**< 上一个统计周期收到的帧数。 */ u64 tx_bytes; /**< 发送的字节数 */ u64 last_tx_bytes; /**< 上一个统计周期发送的字节数。 */ u64 rx_bytes; /**< Number of bytes received. */ u64 last_rx_bytes; /**< Number of bytes received of last statistics cycle. */ u64 tx_errors; /**< Number of transmit errors. */ s32 tx_frame_rates[EC_RATE_COUNT]; /**< Transmit rates in frames/s for different statistics cycle periods. */ s32 rx_frame_rates[EC_RATE_COUNT]; /**< Receive rates in frames/s for different statistics cycle periods. */ s32 tx_byte_rates[EC_RATE_COUNT]; /**< Transmit rates in byte/s for different statistics cycle periods. */ s32 rx_byte_rates[EC_RATE_COUNT]; /**< Receive rates in byte/s for different statistics cycle periods. */ ...... }; 成员*master表示改对象属于哪个master,*dev指向使用的以太网设备net_device,poll该网络设备poll函数,tx_skb[]以太网帧发送缓冲区队列,需要发送的以太网帧会先放到该队里,tx_ring_index管理tx_skb[],以及一些网络统计变量,下面初始化ec_device_t对象: /*\master\master.c*/ for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master); dev_idx++) { ret = ec_device_init(&master->devices[dev_idx], master); if (ret < 0) { goto out_clear_devices; } } /*\master\device.c*/ int ec_device_init( ec_device_t *device, /**< EtherCAT device */ ec_master_t *master /**< master owning the device */ ) { int ret; unsigned int i; struct ethhdr *eth; .... device->master = master; device->dev = NULL; device->poll = NULL; device->module = NULL; device->open = 0; device->link_state = 0; for (i = 0; i < EC_TX_RING_SIZE; i++) { device->tx_skb[i] = NULL; } ...... ec_device_clear_stats(device); ...... for (i = 0; i < EC_TX_RING_SIZE; i++) { if (!(device->tx_skb[i] = dev_alloc_skb(ETH_FRAME_LEN))) { ...... } // add Ethernet-II-header skb_reserve(device->tx_skb[i], ETH_HLEN); eth = (struct ethhdr *) skb_push(device->tx_skb[i], ETH_HLEN); eth->h_proto = htons(0x88A4); memset(eth->h_dest, 0xFF, ETH_ALEN); } ..... } 主要关注分配以太网帧发送队列内存tx_skb[],并填充Ethernet报头中的以太网类型字段为0x88A4,目标MAC地址0xFFFFFFFF FFFF,对于源MAC地址、sk_buff所属网络设备、ec_device_t对象使用的网络设备net_device,将在网卡驱动初始化与master建立联系过程中设置。 2.5 设置IDLE 线程的发送间隔: ec_master_set_send_interval(master, 1000000 / HZ); 根据网卡速率计算: void ec_master_set_send_interval( ec_master_t *master, /**< EtherCAT master */ unsigned int send_interval /**< Send interval */ ) { master->send_interval = send_interval; //发送间隔 us master->max_queue_size = (send_interval * 1000) / EC_BYTE_TRANSMISSION_TIME_NS; master->max_queue_size -= master->max_queue_size / 10; } 100Mbps网卡发送一字节数据需要的时间EC_BYTE_TRANSMISSION_TIME_NS: 1/(100 MBit/s / 8 bit/byte) = 80 ns/byte. 2.6 初始化字符设备 由于主站位于内核空间,用户空间应用与主站交互通过字符设备来交互; 创建普通字符设备,给普通linux应用和Ethercat tool使用。若使用xenomai或RTAI,则再创建实时字符设备,提供给实时应用使用。 ...... master->class_device = device_create(class, NULL, MKDEV(MAJOR(device_number), master->index), NULL, "EtherCAT%u", master->index); ...... #ifdef EC_RTDM // init RTDM device ret = ec_rtdm_dev_init(&master->rtdm_dev, master); ... #endif 到这里明白了IgH中的状态机与数据报之间的关系,主站对象也创建好了,但是主站还没有网卡设备与之关联,主站也还没有工作,下面简单看一下ecdev_offer流程。 关于网卡驱动代码详细解析推荐这两篇文章: Monitoring and Tuning the Linux Networking Stack: Sending Data Monitoring and Tuning the Linux Networking Stack: Receiving Data 3 网卡 网卡probe static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { ...... adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); if (adapter->ecdev) { /*注册打开ec_net设备*/ err = ecdev_open(adapter->ecdev); ..... adapter->ec_watchdog_jiffies = jiffies; } else { /*注册普通网络设备*/ ...... err = register_netdev(netdev); ...... } ...... } 给主站提供网络设备:ecdev_offer 根据MAC地址找到master下的ec_device_t对象 device->dev = net_dev; device->poll = poll; device->module = module; 上面我们只设置了ec_device_t->tx_skb[]中sk_buff的以太网类型和目的地址,现在继续填充源MAC地址为网卡的MAC地址、sk_buff所属的net_device: for (i = 0; i < EC_TX_RING_SIZE; i++) { device->tx_skb[i]->dev = net_dev; eth = (struct ethhdr *) (device->tx_skb[i]->data); memcpy(eth->h_source, net_dev->dev_addr, ETH_ALEN); } 调用网络设备接口打开网络设备 int ec_device_open( ec_device_t *device /**< EtherCAT device */ ) { int ret; ..... ret = device->dev->open(device->dev); if (!ret) device->open = 1; .... return ret; } 当master下的所有的网络设备都open后,master从ORPHANED转到IDLE阶段 int ec_master_enter_idle_phase( ec_master_t *master /**< EtherCAT master */ ) { int ret; ec_device_index_t dev_idx; ...... master->send_cb = ec_master_internal_send_cb; master->receive_cb = ec_master_internal_receive_cb; master->cb_data = master; master->phase = EC_IDLE; /*更新master状态*/ // reset number of responding slaves to trigger scanning for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master); dev_idx++) { master->fsm.slaves_responding[dev_idx] = 0; } ret = ec_master_nrthread_start(master, ec_master_idle_thread, "EtherCAT-IDLE"); .... return ret; } 其中主要设置master发送和接收回调函数,应用通过发送和接收数据时,将通过这两接口直接发送和接收。创建master idle线程ec_master_idle_thread。 4 IDLE阶段内核线程 综上,状态机操作对象是datagram,datagram发送出去后回到主站交给状态机的下一个状态处理,所以主站需要循环地执行状态机、发送EtherCAT数据帧、接收EtherCAT数据帧、执行状态机、发送EtherCAT数据帧、……来驱动状态机运行,这个循环由内核线程来完成。 当主站与网卡绑定后,应用还没有请求主站,主站处于IDLE状态,这时循环由内核线程ec_master_idle_thread来完成,主要完成从站拓扑扫描、配置站点地址等工作。 static int ec_master_idle_thread(void *priv_data) { ec_master_t *master = (ec_master_t *) priv_data; int fsm_exec; #ifdef EC_USE_HRTIMER size_t sent_bytes; #endif // send interval in IDLE phase ec_master_set_send_interval(master, 250000 / HZ); while (!kthread_should_stop()) { // receive ecrt_master_receive(master); /*接收上个循环发送的数据帧*/ ...... // execute master & slave state machines ...... fsm_exec = ec_fsm_master_exec(&master->fsm); /*执行master状态机*/ ec_master_exec_slave_fsms(master); /*为从站状态机分配datagram,并执行从站状态机*/ ...... if (fsm_exec) { ec_master_queue_datagram(master, &master->fsm_datagram); /*将master状态机处理的datagram插入发送链表*/ } // send ecrt_master_send(master); /*组装以太网帧并调用网卡发送*/ sent_bytes = master->devices[EC_DEVICE_MAIN].tx_skb[ master->devices[EC_DEVICE_MAIN].tx_ring_index]->len; up(&master->io_sem); if (ec_fsm_master_idle(&master->fsm)) { ec_master_nanosleep(master->send_interval * 1000); set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); } else { ec_master_nanosleep(sent_bytes * EC_BYTE_TRANSMISSION_TIME_NS); } } EC_MASTER_DBG(master, 1, "Master IDLE thread exiting...\n"); return 0; } 整个过程简单概述如下。 4.1 数据报发送 下面介绍IgH中状态机处理后数据报的发送流程(ecrt_master_send())。 master使用一个链表datagram_queue来管理要发送的子报文对象datagram,需要发送的子报文对象会先插入该链表中,统一发送时,分配一个sock_buff,从datagram_queue上取出报文对象,设置index(index是发送后接收回来与原报文对应的标识之一),将一个个报文对象按EtherCAT数据帧结构填充到sock_buff中,最后通过网卡设备驱动函数hard_start_xmit,将sock_buff从网卡发送出去。 4.2 数据报接收 接收数据时,通过网卡设备驱动ec_poll函数取出Packet得到以太网数据,然后解析其中的EtherCAT数据帧,解析流程如下: 得到子报文index,遍历发送链表datagram_queue,找到index对应的datagram。 将子报文数据拷贝到datagram数据区。 将以太网帧内子报文中的WKC值复制到datagram中的WKC。 将datagram从链表datagram_queue删除。 根据子报文头M位判断还有没有子报文,有则跳转1继续处理下一个子报文,否则完成接收。 接收完成后,进入下一个循环,内核线程运行状态机或周期应用进行下一个周期,处理接收的Ethercat报文。 先简单介绍到这,敬请关注后续文章。。。。 作者:wsg1100 出处:http://www.cnblogs.com/wsg1100/ 本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 posted @ 2021-02-22 23:39 沐多 阅读(9835) 评论(6) 编辑 收藏 举报 会员力量,点亮园子希望 刷新页面返回顶部 公告 Copyright © 2024 沐多 Powered by .NET 8.0 on Kubernetes EtherCAT主站开发“利器”——EC-Master软件协议栈 - 知乎切换模式写文章登录/注册EtherCAT主站开发“利器”——EC-Master软件协议栈盟通科技已认证账号EtherCAT是一种实时工业以太网技术,其CAT为Control Automation Technology即控制自动化技术的首字母缩写。作为一个基于以太网构筑的现场总线系统,EtherCAT具有高速和低数据丢失率的特点,可以在传输达到100M速率的同时兼具低延时与同步的特点,在要求较高的实时网络通信中是当前流行的重要工业总线。EtherCAT硬件按功能一般可分为主站和从站,相较其他网络通信技术,其从站可以快速接收和发送信息,提高整体通信效率。EtherCAT主站在整个总线网络拓扑的结构和功能中发挥主要作用,操作人员通常在主站设置与发布相应的需求和调度。主站软件程序的平台通用性与能否集成其他通讯协议,也就成为了自动化框架建立者在高标准、易交互与成本可控之间需要仔细衡量的关键指标。传统上出于性能考虑,主站程序运行在RTlinux等非图形化页面的系统上,进而带来了跨系统学习的培养成本。盟通科技在现场总线方案领域拥有近十年的技术沉淀和落地经验,面对国内现场总线需求逐年上升,而专精的网络工程师又确实较少的客观事实,推出了一个全面的EtherCAT主站软件搭建方案——EC-Master。EtherCAT产品开发矩阵示意图01EC-Master协议栈是什么?在介绍EtherCAT协议栈之前,我们需要先了解什么是协议栈。协议栈(Protocol stack),又称协议堆叠,是计算机网络协议套件的一个具体的软件实现。简单来说,协议栈就是计算机网络中各层协议的总和,它形象地反映了一个网络中文件传输的过程。在协议套件中,每个协议通常都是为了一个特定的目的而设计的,这样可以使得设计更容易。因为每个协议模块通常都要和上下两个其他协议模块通信,它们通常可以想象成是协议栈中的层。最低级的协议总是描述与硬件的物理交互,而每个高级的层次则增加更多的特性。用户应用程序只是处理最上层的协议。总的来说,客户可以通过协议栈来减少开发流程提高开发效率。EC-Master是一个旨在帮助有需求的用户降低EtherCAT主站软件开发难度的协议栈,该协议栈由ETG资深会员acontis和盟通科技所开发和代理,能在不同的嵌入式操作系统上运行:包含Linux(带实时和不带实时)、Windows® 7/8/10、VxWorks、QNX、RTX以及其他更多操作系统。为开发人员提供了更多的选择。EC-Master协议栈适配多款处理器,拥有丰富的功能与案例,可以使用多种编程语言来定制化地编辑内核库与需要的功能。为进一步方便开发人员,EC-Master还可以通过对应的可视化模拟软件工具和实时环境搭建工具来降低测试难度和提高可移植性能,可以说,EC-Master是盟通科技发行的一款广受好评的软件产品。EC-Master产品结构图02EC-Master具体功能有哪些?EC-Master完全符合ETG基金会公布的ETG1500 EtherCAT主站规范,它已经可以覆盖许多通用的Ether CAT主站的需求。但是EC-Master还包含了一些其他控制器、机械设备或自动化工厂使用EtherCAT技术时可能需要的其他功能。ETG的1500规范定义了ClassA和ClassB这样两种类型的主站,二者功能EC-Master均可实现:ClassA 标准的EtherCAT主站设备功能◆ 支持EtherCAT网络信息(ENI)配置文件◆ 支持检查在启动过程中对比原始配置和实际网络◆ 支持周期性的过程数据交换◆ 支持CANopen over EtherCAT (CoE)协议:SDO的上传和下载,SDO信息服务(访问CANopen对象字典),紧急情况请求◆ 支持Servo Profile over EtherCAT(SoE)协议◆ 支持Ethernet over EtherCAT(EoE)协议(虚拟交换机)◆ 支持从站与从站之间进行通信◆ 支持Safety over EtherCAT(FSoE)从站◆ 支持对从站的EEPROM和寄存器进行访问◆ 丰富的错误诊断和检测功能◆ 支持分布式时钟(DC)模式同步◆ 支持主站和网络同步(DCM)◆ 支持ADS over EtherCAT(AoE)邮箱协议◆ 支持Transfer over EtherCAT(FoE)邮箱协议◆ 支持Vendor over EtherCAT(VoE)邮箱协议ClassB 最小化的EtherCAT主站设备功能◆ 支持EtherCAT网络信息(ENI)配置文件◆ 支持检查在启动过程中对比原始配置和实际网络◆ 支持周期性的过程数据交换◆ 支持CANopen over EtherCAT (CoE)协议:SDO的上传和下载,SDO信息服务(访问CANopen对象字典),紧急情况请求◆ 支持Servo Profile over EtherCAT(SoE)协议◆ 支持Ethernet over EtherCAT(EoE)协议(虚拟交换机)◆ 支持从站与从站之间进行通信◆ 支持Safety over EtherCAT(FSoE)从站◆ 支持对从站的EEPROM和寄存器进行访问◆ 丰富的错误诊断和检测功能除此之外,EC-Master还有诸如分帧处理、扩展同步、热插拔、线缆冗余、主站冗余、EoE第三方扩展支持工具和UDP Mailbox网关支持等额外功能,这些额外功能进一步扩展了EC-Master的使用场景,更好地帮助了数据传输问题的解决。如有需要,可以与盟通科技联系并进一步地了解更多信息。03EC-Master有什么优势?相较而言,EC-Master对于开源的主站软件开发产品具有更好的稳定性和更多的功能。EC-Master的主要优势如下:◆ 低CPU负载的同时保持高性能进而实现快速的更新速率◆ 适用于多种操作系统◆ 支持的CPU架构有x86(32 位和 64 位)、ARM(32 位和 64 位)和 PowerPC (PPC)◆ 适用于 Intel、德州仪器、ST、Broadcom、Nvidia、Renesas、NXP、Xilinx 和 Infineon 等知名品牌供应商的许多处理器◆ 可靠的售后服务,协助构建完成完整的系统集成方案与基于个性化的自定义控制系统◆ 拥有大量且稳定的落地案例帮助用户参考与使用:例如,EC-Master已部署于KUKA Robot Control以及 Yaskawa、Lenze 和 Omron 等控制器中并实现落地应用。除了主要的优势以外,EC-Master还有更全面的功能、多样化的辅助工具和高性价比的价格等其他客观优势。具体场景与需求各不统一,如需了解更多针对性的方案与相关内容,欢迎大家联系EC-Master的中国指定发行方——盟通科技。专业的技术和商务人员将快速对接各位有需要的朋友,协助EC-Master的落地与应用。04EC-Master的辅助工具有哪些?盟通科技在大中华地区不仅代理发行EC-Master协议栈产品本身,也发行多款配套产品。其中,EC-Win/LxWin是以解决EC-Master实时性需求作为目标的系统级实时解决方案,这个优秀的实时解决方案不仅帮助了对EtherCAT有实时性需求的用户,也帮助了其他用户在Windows系统额外添加实时性功能,通过可视化的管理工具协助客户搭建实施应用环境,并提供了同步测试的功能,显著降低了开发成本。EC-Win实时性解决方案结构图同时,除EC-Win/LxWin解决方案外,在“以人为本,便于人机交互”的指导思想下,EC-Master开发人员同时开发与维护了多款可视化测试应用程序:EC-Engineer——专业的EtherCAT网络配置和诊断工具,EtherCAT从站仅需与运行EC-Engineer的Windows PC或者直接与主站协议栈控制系统相连接,就可以使用EC-Engineer在任何位置“离线”完成EtherCAT的配置工作,或在机器上连接真正的EtherCAT网络实现"在线"操作。该软件存在网页版本——EC-Engineer Web方便用户体验。EC-Engineer应用示意图EC-Simulator——高效的从站模拟仿真工具,EC-Simulator通过仿真EtherCAT从站设备进而实现虚拟化EtherCAT网络,可以做到没有真实的EtherCAT从站硬件的情况下同样可以运行EtherCAT主站应用的效果。EC-Simulator应用示意图EC-Inspector——可靠的EtherCAT通信分析软件,EC-Inspector 是一款从外部分析和监控 EtherCAT 网络数据帧的软件工具。该程序可以独立于主控制器使用,并且可以与任何制造商(Beckhoff,Omron,Bosch-Rexroth,Lenze,acontis等)的EtherCAT主站一起使用。EC-Inspector通过在主站与从站之间插入的TAP设备分析主站和EtherCAT从站之间的完整数据通信。EC-Inspector应用示意图以上软件产品均接受过自动化市场与行业的头部知名企业的严苛挑选,有大量实际应用案例,协助用户更方便、更稳定和更安全地部署EtherCAT服务。EC-Master的更多信息去哪里找?盟通科技作为EC-Master的指定代理发行方,积累了多年的实现项目与解决方案的经验,EC-Master的更多信息,可以在盟通科技的官网找到,客户朋友也可以通过邮箱与电话与专业的技术人员直接高效地交流,来获取更多本地化的方案与信息。官方网址:http://www.motrotech.com邮箱:info@motrotech.com电话:010-62740270发布于 2023-05-26 13:07・IP 属地北京协议栈以太网通信赞同 1添加评论分享喜欢收藏申请 机械手浅谈系列之---ethercat主站开发和实时操作系统_acontis ethercat主站费用-CSDN博客 机械手浅谈系列之---ethercat主站开发和实时操作系统 最新推荐文章于 2024-01-02 15:26:55 发布 hubeihualei 最新推荐文章于 2024-01-02 15:26:55 发布 阅读量4k 收藏 38 点赞数 8 分类专栏: 机械手 文章标签: ethercat 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/hubeihualei/article/details/116090460 版权 机械手 专栏收录该内容 2 篇文章 2 订阅 订阅专栏 做机械手的控制,实际上是对多个电机轴的控制。在2013年,那时候还是脉冲型电机驱动控制的天下,我甚至都没听说过实时以太网总线控制。接触到的主控除了PLC就是运动控制板块。由于机械手运动控制算法的复杂性,在2013年做了一款简易的PC+运动控制板卡的机械手控制器。 该控制器的核心算法是在PC上面,自研的板卡只做简单的脉冲发送。随着后面对机械手算法的深入研究,遇到的第一个瓶颈就是PC上面WINDOWS操作系统的实时性,PC上面的算法不能实时执行的话,很多高级功能也无法实现。后面了解到WINDOS下的商业实时内核ArdenceRtx。做了简单的尝试,由于收费昂贵和缺乏技术支持等原因,对于该实时内核并不满意。 接触实时内核后,实时以太网技术也开始逐渐进入视野,并重视起来。曾经花费1w去购买倍加福提供的ethercat主站协议栈。由于该代码是windows平台下的示例代码,而且没有伺服的控制示例,后来对于该方案的探索也没有实质性的进展。 后面团队引入linux方面的人才,视野才开阔起来。 Linux平台实时方案 linux平台下的实时内核有较多的选项:rtpreempt,xenomai,rtai等。 Xenomai 的实时性非常强,但是在使用上有一些限制和需要注意的事项。我早期第一个在linux平台下,使用的就是该内核。实时线程需要调用Xenomai的实时api, 而且实时线程如果调用了非实时设备类api,会被自动切换为非实时线程。 RTAI 这个实时补丁,比较好的一个背书就是LINUXcnc开源项目了。 Rtpreempt实时性要弱于后面2者,但是它的官方支持背景非常强大,而且有很多的linux内核版本可以匹配。另外一个优点是,按照普通linux平台编写程序就可以,不需要第三方的实时api. 据德国acontis代理商的信息,国外在ethercat主控上面,主流使用该实时内核。后面。后期将项目也从xenomai切换到了rtpreempt。 总结下实时程序编写的原则: 1) 根据功能的实时性需要,合理分配线程的优先级。基本上ethercat主线程就会分配最高优先级。 2) 一切算法的计算时间都需要量化,并对关键时间段进行实时监控,超过限定需要有报错等处理。 3) 实时线程不得进行设备类调用(print打印,文件操作等),当然ethercat类实时驱动是例外(因为实时以太网驱动做了特殊处理)。 4) 注意多线程互斥锁的问题,实时线程和非实时线程如果都操作互斥锁,可能带来优先级反转。 商业独立实时操作系统 Vxworks使用比较广泛,机器人控制方面还不知道哪家在使用。 国产的sylixos推广的比较好,开发工具和支持的库也比较多,有几个机器人厂家在尝试使用。 Ethercat协议栈方面 商业ethercat协议栈 德国acontis,据说KUKA就是用的该商业栈。 德国KPAStudio ethercat商业协议栈。 国内的机器人控制器厂商主要用这2个商业协议栈,特别是acontis居多。收费方面一般是一次性的开发费+没台主站设备安装费。 开源ethercat协议栈 德国IGH,这个成熟度较高,国内的研究使用方面的文章也非常多。首要推荐使用该协议栈。对于伺服控制的开发,还需要了解CIA402协议,然后根据该协议调用IGH相关接口就可以实现伺服的控制,生手可能需要3-6个月的时间,才能消化掌握。难点主要还是DC同步时序问题。早期踩过的坑是,伺服偶尔出现卡顿,一直没有找到根本原因,直到几年后才根本解决。主要的解决思路是,伺服初始化的时候需要进行每个伺服时钟偏移的调整,保证相位同步。这也是经过长时间的摸索才找到的解决方法。 SOME开源协议栈:功能方面没有IGH强大,比较偏向底层协议栈,需要自己加太多的代码,才能实现伺服的控制。 2015年的时候,曾经试用过acontis和kpa, 效果都不错,唯一不方便的地方就是增减ethercat设备时,必须用它们的软件进行配置文件的生成,这点比较麻烦。 下面列举下了解到的机器人品牌的技术栈选择。 台湾宝元:linux+rtpreempt+igh 以色列高创:linux+rtpreempt+igh 国产NBT:linux+rtpreempt+acontis 如有笔误,还请指教! WeiXin18820959358 优惠劵 hubeihualei 关注 关注 8 点赞 踩 38 收藏 觉得还不错? 一键收藏 知道了 2 评论 机械手浅谈系列之---ethercat主站开发和实时操作系统 做机械手的控制,实际上是对多个电机轴的控制。在2013年,那时候还是脉冲型电机驱动控制的天下,我甚至都没听说过实时以太网总线控制。接触到的主控除了PLC就是运动控制板块。由于机械手运动控制算法的复杂性,在2013年做了一款简易的PC+运动控制板卡的机械手控制器。该控制器的核心算法是在PC上面,自研的板卡只做简单的脉冲发送。随着后面对机械手算法的深入研究,遇到的第一个瓶颈就是PC上面WINDOWS操作系统的实时性,PC上面的算法不能实时执行的话,很多高级功能也无法实现。后面了解到WINDOS下的商业实时内核 复制链接 扫一扫 专栏目录 2 条评论 您还未登录,请先 登录 后发表或查看评论 EtherCAT从站开发 caixf的博客 01-02 490 开发一个EtherCAT从站,并将从站连接到EtherCAT主站 soem-w5500-rpi:Raspberry pi的开源实时EtherCAT主站 02-05 soem-w5500-rpi:Raspberry pi的开源实时EtherCAT主站 EtherCAT主站芯片(ECM-XF)数据手册+参考原理图+使用说明 05-27 EtherCAT主站芯片(ECM-XF)数据手册+参考原理图+使用说明 要想自己打板玩一玩Ethercat的老哥们往这里看 ethercat-1.5.2.rar_Ethercat主站_ethercat 1.5.2_igh_igh Windows_mas 07-14 主要是关于igh开源主站的介绍以及使用。这个可以作为参考文档。 Soem-跟从站通讯到OP状态-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 01-09 Soem-跟从站通讯到OP状态-添加备注-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 9 -- SOEM之基于QT搭建自己的EtherCAT主站,这一篇博客的源代码,博客链接( https://blog.csdn.net/qq_50808730/article/details/134361490 )。 注意: 该项目源代码只是提供了 QT-SOEM 配置从站到OP状态,没有对EtherCAT从站进行操作。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。 Soem主站识别到 几 个从站。 [工业互联-17]:常见EtherCAT主站与实现方法 文火冰糖(王文兵)的博客 07-08 4543 EtherCAT(Ethernet for Control Automation Technology)是一种实时以太网通信协议,用于工业自动化和控制系统中实现高性能、实时数据传输和控制。它是由EtherCAT技术组织(ETG)开发和标准化的。EtherCAT基于以太网物理层和数据链路层,但使用了一种特殊的通信方法,称为"Processing on the Fly"。这种方法使得数据帧能够在通过从站设备时进行实时处理,而不需要完全接收整个数据帧。这样,数据传输和控制可以实现高效率和低延迟。 [工业互联-22]:常见EtherCAT主站方案:Acontis公司的商用Windows 解决方案 文火冰糖(王文兵)的博客 07-10 1004 在Windows系统中,仅需使用一块标准以太网卡即可运行EtherCAT主站协议栈。即Windows系统下配置EtherCAT主站不需调用特殊的接口网卡,可以直接运行在内置于主板中的板载以太网控制器或低成本的外部标准网卡上。 EtherCat--主站开源的C语言库SOEM-环境搭建 qq_41931610的博客 03-03 3960 由于开发winpcap项目的目的在于为win32应用程序提供访问网络底层的能力,因此开发包里面有大量的WIN32的标识符,直接使用会出现“未定以标识符”错误。运行simple_test.exe \Device\NPF_{XXXX},其中\Device\NPF_{XXXX}是电脑的网络设备符。3.新建一个空项目。以管理员的权限打开VS2017,新建一个VC++的Win32控制台应用程序,设置为空项目。生成全部测试文件(生成exe等文件)simple_test.exe文件,至此完成了SOEM源码的编译。 自建极简Ethercat主站-底层驱动编写 西澳峰的博客 06-05 2059 MECM(Mini Ethercat Master),名字随便起的。已经学习了一段时间的Ethercat总线了,目前的想法就是自己简单实现一个Ethercat主站,没有太多的冗余功能,暂时不考虑太多的容错机制,仅实现目前用到的FOE、COE、过程数据通信这三个功能,仅用于学习和加深理解。主站的硬件是GD32F450Z_EVAL开发板,板载的以太网芯片是DP83848VV。基本接口已经写好,接下来就是按照Ethercat的数据包对数据进行打包,然后将发送出去。名称说明长度。 EtherCAT有哪些主流开源代码?它们的优点是什么? absinjun的博客 12-28 3751 EtherCAT两大主流开源代码为SOEM和Igh EtherCAT Master。 SOEM SOEM 全称 Simple Open EtherCAT Master 优点: 非常易于使用 静态分配内存,占用空间少 易于移植驱动程序和应用程序层 可在Window、Linux平台运行 IGH EtherCAT Master 优点: 成熟的EtherCAT主站 稳定性好 性能好 对EtherCAT的功能支持更加全面 对比表 开源主站 SOEM IGH EtherCAT Master 版 Soem-1个电机转圈圈PV模式-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 最新发布 01-09 Soem-1个电机转圈圈PV模式-添加代码注释-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 16 --Qt-Soem通过界面按键控制电机转圈圈PV模式,这一篇博客的源代码,博客链接( 正在编写,2024.1.14发布, https://editor.csdn.net/md?articleId=135431287 )。 注意: 该项目源代码提供了 QT-SOEM 配置从站到OP状态,并且对1个EtherCAT从站 电机进行操作,通过 PV模式 让 1个电机转圈圈,正反转及停止。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。 Soem主站识别到 几 个从站。 并且对1个EtherCAT从站 电机进行操作,通过 PV模式 让 1个电机转圈圈,正反转及停止。 EtherCAT协议完整版 02-10 EthereCAT协议完整版,包含概述,物理层服务定义和协议规范,数据链路层服务于规范,应用层服务于规范 EtherCAT FP介绍系列文章—多网段 MotroEngineer的博客 05-10 108 相对于设置了相同循环时间的其他总线系统,EtherCAT系统结构通常能减少25%-30%的CPU负载,EtherCAT的出现为系统的实时性能和拓扑的灵活性树立了新的标准。多网络方案允许在一个主站应用程序下实现多个独立的EtherCAT物理网络,每个网络之间的周期和分布时钟都是独立的互不干扰。在同一EtherCAT网络下不同类型的设备可能对总线循环周期有不同的需求,使用分帧处理扩展功能包,可以让不同周期的过程数据独立发送,减少单一循环周期下的网络带宽占用。 基于STM32的伺服总线EtherCAT主站设计——SOEM方案 weixin_48501028的博客 04-16 7552 本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。 SylixOS周期定时抖动分析 Jackstraw瑞的博客 09-18 702 1.概述
自动化与控制行业中有很多场景需要循环周期控制,而运动控制领域对循环周期控制的时间确定性要求尤为严格,周期抖动的时间确定性和周期控制的极限范围直接影响运动控制产品的质量和性能。
SylixOS作为一款嵌入式实时操作系统,针对不同循环周期和不同程度的时间确定性要求均有对应的周期控制方式,其中就有为周期性任务解决多任务调度冲突并且时间确定性良好的速率单调调度(Rate Monoto EtherCAT主站 11-09 2351 就目前而言,EtherCAT技术已经很普遍,各个运动控制器升级到该技术,也很有必要,必将节省大量的人力物力,提高系统的稳定性! 首先,就从站而言,(FPGA ip从站方案所占的资源的价格不容小觑),美信的AX58100很便宜,也很方便,推荐!!! 其次,主站方面,推荐FPGA纯verilog方案,硬件成本上占优势!(很多运控或者数控系统,都有一个fpga,利用这个fpga多余的逻辑,做个主站,何乐而不为;反正你的这个fpga省不了)。 ... 基于rt thread smart构建EtherCAT主站 cln512的博客 05-22 1989 基于rt thread smart构建EtherCAT主站 Acontis Ec-Master主站编译&调试方法 hanmingjunv5的博客 12-01 1792 1.开发包目录 Bin --Linux\x64 --EcMasterDemoDc :编译好的测试程序 --libemllRTL8169.so :运行主站时需要加载的网卡驱动 Doc --EC-Master_ClassA/B:主站功能介绍 --EC-Master_QuickStart_Guide:快速开始文档 Examples --示例 SDK:开发包 --INC:开发程序所需头文件 --LIB\Linux\x64:编译用户程序时需要链接的库 --libAtemRasS ethercat主站开发教程 07-12 EtherCAT(以太CAT)是一种实时以太网技术,用于工业自动化领域中的分布式控制系统。要开发EtherCAT主站,您可以按照以下步骤进行: 1. 硬件准备: - 获取一块支持EtherCAT通信的主站开发板或模块。 - 配置主站开发板的连接接口,如以太网端口。 2. 软件准备: - 下载并安装EtherCAT主站开发工具包,如EtherCAT Master Stack。 - 在开发环境中配置EtherCAT主站开发工具包。 3. 主站配置: - 在主站开发工具包中创建一个新的EtherCAT主站项目。 - 配置主站的网络参数,如IP地址和子网掩码。 - 添加从站设备到主站项目中。 4. 主站程序开发: - 使用EtherCAT主站开发工具包提供的API,编写主站程序。 - 实现主站和从站之间的数据通信和同步。 5. 主站部署: - 将主站程序烧录到主站开发板或模块中。 - 连接主站开发板和从站设备。 6. 测试和调试: - 运行主站程序并监视通信状态。 - 调试主站程序,确保与从站设备之间的通信正常。 以上是一个基本的EtherCAT主站开发流程,具体的开发工具和步骤可能因厂商和开发环境而有所差异。建议您参考相关的EtherCAT主站开发文档和示例代码,以获取更详细的指导和帮助。 “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 hubeihualei CSDN认证博客专家 CSDN认证企业博客 码龄12年 暂无认证 10 原创 24万+ 周排名 17万+ 总排名 3万+ 访问 等级 350 积分 35 粉丝 17 获赞 14 评论 127 收藏 私信 关注 热门文章 AGV激光Slam导航环境要求说明 6343 激光导航AGV-激光雷达安装要求 4738 【构建基于树莓派cm4的机器人控制系统的运行环境】 4652 机械手浅谈系列之---ethercat主站开发和实时操作系统 4067 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 3671 分类专栏 机械手 2篇 华友高科 2篇 最新评论 机械手浅谈系列之---ethercat主站开发和实时操作系统 Bobby95: 您好,请问下关于同步时钟配置这一块,主站的同步周期和同步偏移要怎么配置? 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 qq827240898: 你好,请问抖动问题解决了吗 HYGK开源机器人控制系统 智能玩家a: 你好,igh相关的程序没有看到呢,能分享一下吗?3个链接,只有第一个能点。后面两个没权限。 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 weixin_44513187: csp本身就会造成抖动,在松下的说明书里写的很清楚了 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 he35059226: 加微信号he35059226,讨论讨论 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 ethercat主站开发之-----一拖多驱动控制 【构建基于树莓派cm4的机器人控制系统的运行环境】 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 2023年1篇 2022年2篇 2021年2篇 2019年5篇 目录 目录 分类专栏 机械手 2篇 华友高科 2篇 目录 评论 2 被折叠的 条评论 为什么被折叠? 到【灌水乐园】发言 查看更多评论 添加红包 祝福语 请填写红包祝福语或标题 红包数量 个 红包个数最小为10个 红包总金额 元 红包金额最低5元 余额支付 当前余额3.43元 前往充值 > 需支付:10.00元 取消 确定 下一步 知道了 成就一亿技术人! 领取后你会自动成为博主和红包主的粉丝 规则 hope_wisdom 发出的红包 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 余额充值 EtherCAT主站方案_哔哩哔哩_bilibili 首页番剧直播游戏中心会员购漫画赛事投稿EtherCAT主站方案 5707 4 2020-04-19 20:43:12 未经作者授权,禁止转载501416520本课程由虹科首席技术工程师陈海焕陈工为我们介绍EtherCAT主站的实现方案以及性能的相关影响因素。本站仅上架部分工业通讯相关课程,如需了解更多,敬请关注公众号【工业通讯】→进入【虹科云课堂】查看更多!五一期间,虹科云课堂往期直播82节课程限时免费回看,更有邀请达人参与抽奖活动等你来!科技科工机械工业通讯协议EtherCAT主站 广州虹科电子 发消息 虹科是工业/汽车/电子/医药/IT/通信等领域的解决方案合作伙伴,www.hkaco.com | 4009993848 关注 1.9万 桌面AI伙伴,陪你High翻天! 接下来播放 自动连播认识工业通讯技术广州虹科电子 4806 0 初识EtherCAT协议-虹科云课堂广州虹科电子 7292 31 【工业通讯】EtherCAT&EtherNet/IP基础知识讲解合集广州虹科电子 3.3万 83 什么是SCADA广州虹科电子 2.2万 24 【网络安全】网络流量分析技术及方案广州虹科电子 2208 0 EtherCAT IO广州虹科电子 566 1 【汽车总线技术】UDS诊断基础讲解合集广州虹科电子 7.8万 370 虹科基于TDOA定位技术的频谱监测方案(一)广州虹科电子 1490 0 虹科分享 | 基于C#语言的PCAN二次开发广州虹科电子 1016 0 【汽车总线技术】CAN总线技术基础讲解合集广州虹科电子 16.9万 879 CANvas—免费的CAN总线软件广州虹科电子 1207 0 虹科分享 | 制药工艺设备验证广州虹科电子 943 0 广州虹科电子科技有限公司宣传片2018广州虹科电子 1131 0 自动驾驶的硬件在环测试方案广州虹科电子 4320 1 虹科TeraEyes-HV 太赫兹实时成像系统 动态应用效果展示广州虹科电子 2246 0 PXI是什么以及如何使用它?广州虹科电子 3656 0 虹科教程之如何启动 SBench6 并选择实际或模拟的硬件广州虹科电子 164 0 2022EDICON北京场回顾广州虹科电子 62 0 BACnet协议基础知识广州虹科电子 2217 4 【工业物联网】认识工业互联网广州虹科电子 1.4万 14 展开 小窗 客服 顶部 赛事库 课堂 2021 [FPGA]FPGA设计EtherCAT主站的方法和常见问题_ethercat fpga 延迟-CSDN博客 [FPGA]FPGA设计EtherCAT主站的方法和常见问题 最新推荐文章于 2024-03-10 19:48:26 发布 21ic电子工程师 最新推荐文章于 2024-03-10 19:48:26 发布 阅读量484 收藏 3 点赞数 1 分类专栏: 嵌入式基础知识 文章标签: fpga开发 嵌入式硬件 原文链接:https://bbs.21ic.com/icview-3148480-1-1.html 版权 嵌入式基础知识 专栏收录该内容 1559 篇文章 178 订阅 订阅专栏 作者从事EtherCAT等实时工业网络及运控产品的开发多年。基于FPGA的EtherCAT主站,是不少公司的明智选择。无论是实时性,灵活性,还是性价比均可有很好的保证。 一、基于FPGA的EtherCAT主站的设计方法 FPGA模块主要分为五部分:初始化、状态机、PDO、SDO、同步。 1)初始化模块 初始化主要工作是搜集网络拓扑结构、搜集各个节点的信息内容、初始化各个节点的时间系统与初始同步。 2)状态机模块 该模块主要实现各个节点的状态机转化。 INIT->预运行->安全运行->运行 3)PDO模块 该模块实现PDO数据的准备、发送、接收。 4)SDO模块 该模块实现SDO数据的准备、发送、接收。 5)同步 该模块实现动态时间同步。 将以上五个模块设计完成,加上与ARM/DSP/CPU通信的通信接口,以及与运控相关的模块(模拟量、IO、手轮等),即可实现整个设计。二、基于FPGA的EtherCAT主站的常见问题 1)初始化模块中,访问节点EEPROM的方式理解比较绕 2)状态机转移中,出现转移不成功,记得读取节点0x134寄存器,查看错误代码,根据错误代码来查看具体不能转移成功的原因。 这里,会出现林林总总的原因,只要对照手册,基本都能解决。 这里,也是整个主站设计中,比较耗时间的问题之一。 3)PDO模块中,部分厂家对设置寻址和逻辑寻址有特殊要求,需要注意。 4)SDO模块中,部分厂家支持FMMU来进行数据访问,部分厂家仅支持寄存器来进行数据访问。 5)同步模块中,出现从站之间的同步问题,主站和从站之间的同步问题,出现产品应用与主站之间的同步问题。 关于同步算法,也是最耗时间的问题。 关于同步方案,可以以FPGA主站作为同步源,也可以以第一个伺服作为同步源;后者难度高点,但作者经历前者的产品应用多一些。三、EtherCAT主站方案的比较 开发时间层面:基于ARM的开源linux主站最优,基于ARM+FPGA的主站次之 产品成本层面:基于FPGA的主站最优,基于ARM的开源linux主站次之 产品性能层面:基于FPGA的主站最优,基于ARM+FPGA的主站次之。 --------------------- 作者:feihufuture 链接:https://bbs.21ic.com/icview-3148480-1-1.html 来源:21ic.com 此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 优惠劵 21ic电子工程师 关注 关注 1 点赞 踩 3 收藏 觉得还不错? 一键收藏 知道了 0 评论 [FPGA]FPGA设计EtherCAT主站的方法和常见问题 将以上五个模块设计完成,加上与ARM/DSP/CPU通信的通信接口,以及与运控相关的模块(模拟量、IO、手轮等),即可实现整个设计。2)状态机转移中,出现转移不成功,记得读取节点0x134寄存器,查看错误代码,根据错误代码来查看具体不能转移成功的原因。5)同步模块中,出现从站之间的同步问题,主站和从站之间的同步问题,出现产品应用与主站之间的同步问题。开发时间层面:基于ARM的开源linux主站最优,基于ARM+FPGA的主站次之。产品性能层面:基于FPGA的主站最优,基于ARM+FPGA的主站次之。 复制链接 扫一扫 专栏目录 多通路fpga 通信_【论文精选】基于FPGA的EtherCAT从站通信链路分析与验证 weixin_39876856的博客 12-29 416 原标题:【论文精选】基于FPGA的EtherCAT从站通信链路分析与验证马保全1,2,姚旺君1,2,刘云龙1,2,张晓莉1,2,黄 兵1,2,赵德政1,2(1.工业控制系统信息安全技术国家工程实验室,北京100083;2.华北计算机系统工程研究所,北京100083)摘 要:EtherCAT是工业控制领域广泛应用的现场总线之一,从站控制器ESC(EtherCAT Slave Controller)是... 一份EtherCAT主站的FPGA Verilog代码 EtherCAT通信协议、FPGA 2301_78846259的博客 06-25 398 EtherCAT使用主从结构,其中主站负责控制和协调网络中的从站设备。通过EtherCAT,主站可以实时地与多个从站设备进行通信,实现高效的数据传输和控制。主站负责控制和协调整个网络,而从站则负责执行主站下发的指令和提供实时数据。主站可以同时与多个从站进行通信,实现高效的分布式控制。主站通过一个特殊的EtherCAT数据帧将指令和数据发送给从站,从站接收到数据后,根据指令进行相应的操作,并将结果返回给主站。EtherCAT的设计目标是提供低延迟、高带宽和实时性能,以满足工业自动化领域对实时通信的需求。 参与评论 您还未登录,请先 登录 后发表或查看评论 基于FPGA的EtherCAT主从站设计与实现 ethercat 主站 FPGA verilog 代码 2301_76250113的博客 01-13 525 基于FPGA的EtherCAT主从站设计与实现 ethercat 主站 FPGA verilog 代码。 基于FPGA状态机设计实现EtherCAT从站基本通信链路并验证 IClance999的博客 01-10 2677 分类号 090 密 级 U D C 编 号 XXX 论 文 基于FPGA状态机设计实现EtherCAT从站基本通信链路并验证 公... 【技术干货】基于赛灵思FPGA板卡的高性能EtherCAT主站方案 HackEle的博客 08-02 1587 图片来源:虹科电子技术背景EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发。EtherCAT 具有高性能、低成本、容易使用等特点,目前在工业领域有着广泛的应用。ZCU102 评估套件可帮助设计人员快速启动面向汽车、工业、视频以及通信应用的设计。该套件具有基于 Xilinx 16nm FinFET+ 可编程逻辑架构的 Zynq® UltraScal... ECAT运动控制器ARM软件设计 m0_68477479的博客 03-21 6182 ECAT运动控制器ARM软件设计 一、ARM向FPGA发送目标位置 1、对应的操作地址 define CUR_POS_SERVO 1define TARGET_CUR_POSL 2 `define TARGET_CUR_POSH 3 2、操作步骤 下发每个轴的位置时,先通过写地址1,告知FPGA接下来要发送目标位置的伺服; 再通过写地址2向FPGA写目标位置的低16bit; 再通过写地址3向FPGA写目标位置的高16bit。 3、注意 通过地址1,向FPGA写接下来要操 虹科分享 | FPGA 实现的直通与存储转发切换延迟 工业通讯__HongKe的博客 05-06 553 在本篇文章中,我们将展示两种可在FPGA上实现的COTS IEC 62439-3交换机IP核的延迟的比较。第一种是混合使用直通交换和存储-转发交换架构,第二种则是仅基于存储-转发交换技术。 基于ARM+FPGA的EtherCAT主站设计及实现-论文 05-18 基于ARM+FPGA的EtherCAT主站设计及实现 EtherCAT主站配置过程分析 01-15 固高主站+一个固高GTHD伺服驱动Ethercat通讯建立全过程分析 ethercat 主站 FPGA verilog 代码 05-23 ethercat 主站 FPGA verilog 代码 基于ARMFPGA的EtherCAT主站设计及实现 12-22 基于ARMFPGA的EtherCAT主站设计及实现,讲解了基于ARM与FPGA的EtherCAT主站实现。 基于FPGA的EtherCAT主站研究 03-13 基于FPGA的EtherCAT主站研究,董伯麟,张越盈,EtherCAT作为以太网实时现场总线,在工业领域的应用已经越来越广泛。在运动控制器、数控系统中,支持EtherCAT协议以实现对数字伺服驱� 信迈基于FPGA ZYNQ的Ethercat高实时工业控制解决方案 YEYUANGEN的专栏 06-27 2217 信迈zynq ethercat主站 FPGA高实时带加密实现32轴 性能优势 更快的循环周期,可以达到31.25us 更低的抖动,抖动时间小于0.004us 同步性能好,主站和各个从站设备可以达到远小于1us的时钟同步精度(4轴实测50ns) 性能对比: 更多性能对比总结: ............ 一份EtherCAT主站的FPGA Verilog代码 ethercat 主站 FPGA verilog 代码 lmirtgh的博客 08-22 155 然后,我们将详细介绍FPGA Verilog代码的设计思路和实现方法,包括主站的状态机设计、数据帧的解析和发送、以及通信时序的控制等方面。在本文中,我们将介绍一份EtherCAT主站的FPGA Verilog代码,讨论它在实际工程中的应用及其重要性。其中,EtherCAT主站的设计是一个重要的问题,它直接影响到整个EtherCAT系统的实时性、可靠性和稳定性。通过本文的阅读,读者将能够深入了解EtherCAT主站的设计和实现过程,掌握相关的编程技术和操作方法,为实际工程应用提供参考和借鉴。 基于AM5728 DSP+ARM+FPGA的实时工业以太网EtherCAT主站实现 YEYUANGEN的专栏 06-21 2822 针对EtherCAT的数控系统的实现,提出了一种基于EtherCAT技术的实时通信及DSP控制的可行系统方案,构建了EtherCAT主站网络结构,并重点分析了EtherCAT主站的状态机、分布时钟、CoE协议。 本实验使用AM57x开发板、Linux-4.4.19内核,提供基于EtherCAT协议控制伺服驱动器,驱动伺服电机运转的方法。 实验硬件: 评估板: TI AM5728 ID... [FPGA] FPGA设计EtherCAT主站的方法和常见问题 ic2121的博客 09-24 1867 作者从事EtherCAT等实时工业网络及运控产品的开发多年。基于FPGA的EtherCAT主站,是不少公司的明智选择。无论是实时性,灵活性,还是性价比均可有很好的保证。 一、基于FPGA的EtherCAT主站的设计方法 FPGA模块主要分为五部分:初始化、状态机、PDO、SDO、同步。 1)初始化模块 初始化主要工作是搜集网络拓扑结构、搜集各个节点的信息内容、初始化各个节点的时间系统与初始同步。 2)状态机模块 该模块主要实现各个节点的状态机转化。 INIT->预运行->安全 基于FPGA的Ethercat定制栈最大可实现32轴 goodbey155的博客 08-30 6197 基于FPGA的Ethercat主栈协议 (最大可带32轴同步运行,同步抖动±75ns,控制精度125us) 各位老板: 我司有多年的FPGA研发经验; 基于FPGA的Ethercat定制栈更是达到行业领先水平 感谢抽空阅读,欢迎合作 市场痛点 【PLC厂家的痛点】 目前,国内的大多数PLC厂家主要通过增加运控模块来实现轴的运动控制,可控制的轴数比较少(通常是4-6轴),并且模块的价... Vivado原语模板 最新发布 duanzw102的专栏 03-10 356 然后在Vreilog--->Device Primitive Insantiation下,找到对应的FPGA芯片查看其下面的原语模板,如Artix-7的ODDR原语。FPGA原语是芯片制造商已经定义好的基本电路元件,是一系列组成逻辑电路的基本单元,FPGA开发者编写逻辑代码时可以调用原语进行底层构建。在Vivado下可以查看原语库中的所有原语,并给出了例化模板。原语可分为预定义原语和用户自定义原语。预定义原语为如and/or等门级原语不需要例化,可以直接调用。 ethercat主站硬件 05-17 EtherCAT主站可以使用多种不同的硬件平台来实现,包括PC、嵌入式系统、FPGA等。 常见的PC平台上的EtherCAT主站硬件包括: 1.以太网接口卡:如Beckhoff的EtherCAT PCI卡、Intel的I210网卡等。 2.EtherCAT控制器:如Beckhoff的CX系列、C6670系列等。 3.工控机:如Advantech、HP、DELL等品牌的工控机。 对于嵌入式系统和FPGA平台,一般需要使用专门的EtherCAT主站芯片来实现。常见的芯片厂商有Beckhoff、TI、Renesas等。其中Beckhoff的ET1100系列、ET1200系列、ET2000系列等芯片广泛应用于EtherCAT主站实现中。 需要注意的是,EtherCAT主站硬件的选择应该根据具体应用场景和需求来进行选择,并且需要考虑到实时性、稳定性、兼容性等方面的因素。 “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 21ic电子工程师 CSDN认证博客专家 CSDN认证企业博客 码龄3年 暂无认证 7 原创 2万+ 周排名 155万+ 总排名 153万+ 访问 等级 4705 积分 549 粉丝 772 获赞 164 评论 5493 收藏 私信 关注 热门文章 [国产单片机] 聊聊曾经那些很火的单片机 38559 pwm超详细解读,大佬细说pwm的控制方式 22741 WiFi信号覆盖面积小?如何扩大Wifi信号覆盖范围? 21443 什么是神经网络模型,常见神经网络模型有哪些? 19143 这里带你了解IR2104驱动电路 17063 分类专栏 嵌入式基础知识 1559篇 C 31篇 机器人 5篇 AI 37篇 编程 7篇 网络知识 35篇 物联网 24篇 自动化 无人机 5G 3篇 最新评论 [技术讨论][DDS] AD9833原理介绍及chiliDDS驱动分享(上) gammnf: 我的只有60mV,一般是啥原因导致的呢? [STM32H5]【NUCLEO- H563ZI 测评】USBX 之 CDC+HID 楠南难,太楠了: 博主,我今天用到这个了,想请教一下关于接线的问题,我这个例程死活跑不起来,怀疑是线路有问题,想请教你一下,望求教 [STM32F4]【把握住了】STM32F4驱动4路VL53L0测距你把握不住 风中之人: 8190这是失败了啊 哪里通过了? [RISC-V MCU 应用开发]基于CH32V307的物联网远程控制 馘耳: 大佬,请问工程可以发我一份吗 【杰发科技AC7802x测评】1 新版JLINK工具实现程序下载的方法 catstopher: 请问有搞过杰发AC78406基于UDS的boot吗,代码量必须小于20K,有方案的可以采购或者付费请教 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 [活动专区]【杰发科技AC7840x测评】+ CAN收发测试 [学习笔记]【杰发科技AC7840x测评】+开箱跑例程 pic单片机程序格式,探讨pic单片机开发问题 2024 02月 78篇 01月 64篇 2023年953篇 2022年628篇 2021年30篇 目录 目录 分类专栏 嵌入式基础知识 1559篇 C 31篇 机器人 5篇 AI 37篇 编程 7篇 网络知识 35篇 物联网 24篇 自动化 无人机 5G 3篇 目录 评论 被折叠的 条评论 为什么被折叠? 到【灌水乐园】发言 查看更多评论 添加红包 祝福语 请填写红包祝福语或标题 红包数量 个 红包个数最小为10个 红包总金额 元 红包金额最低5元 余额支付 当前余额3.43元 前往充值 > 需支付:10.00元 取消 确定 下一步 知道了 成就一亿技术人! 领取后你会自动成为博主和红包主的粉丝 规则 hope_wisdom 发出的红包 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 余额充值 EtherCAT从站设计开发教程_哔哩哔哩_bilibili 首页番剧直播游戏中心会员购漫画赛事投稿EtherCAT从站设计开发教程 840 0 2024-02-06 17:39:10 未经作者授权,禁止转载82204超详细的集成式EtherCAT从站模块DPort-ECT使用教程,手把手实例演示。美好生活 - Live A Great Life - Electronic科技科工机械操作教程周立功嵌入式工控机EtherCAT从站 ZLG致远电子 发消息 喜欢就点个关注吧,我们是智能物联生态系统产品与解决方案供应商。 关注 3997 桌面AI伙伴,陪你High翻天! 接下来播放 自动连播国内首创集成式EtherCAT从站模块来了!ZLG致远电子 3768 0 集成式EtherCAT从站模块是如何提升产品开发效率的?ZLG致远电子 194 0 如何实现Modbus组件与EtherCAT主控系统互联互通ZLG致远电子 212 0 如何快速设计开发EtherCAT从站?ZLG致远电子 403 0 CiA402是什么协议?ZLG致远电子 1131 1 EtherCAT分析仪超全的功能详解ZLG致远电子 1092 0 什么是“DBC解析”?ZLG致远电子 1735 0 【下篇】工程师如何轻松使用EtherCAT总线?ZLG致远电子 149 0 如何快速实现不同设备和EtherCAT总线的无缝连接?ZLG致远电子 351 0 如何快速实现基于UDS协议的ECU刷写功能?ZLG致远电子 554 0 【上篇】EtherCAT总线有什么优势?ZLG致远电子 206 0 DeviceNet设备如何接入EtherCAT系统?ZLG致远电子 201 0 ZMC600E EtherCAT主站控制器,为满足智能制造设备应用控制而生ZLG致远电子 524 0 现场总线中的UDS诊断到底是什么?ZLG致远电子 430 0 如何实现XCP/CCP标定的功能呢?ZLG致远电子 254 0 新一代EtherCAT网络分析仪,让实时以太网分析更简单!ZLG致远电子 685 0 汽车电子行业常用的XCP/CCP标定到底是什么?ZLG致远电子 1036 0 DPort-MM,专为满足双路以太网口扩展需求而设计ZLG致远电子 1.0万 1 如何使用数据持久化功能?ZLG致远电子 162 0 究竟DBC文件中的实际物理值是如何计算出来的?ZLG致远电子 496 0 展开 小窗 客服 顶部 赛事库 课堂 2021 机械手浅谈系列之---ethercat主站开发和实时操作系统_acontis ethercat主站费用-CSDN博客 机械手浅谈系列之---ethercat主站开发和实时操作系统 最新推荐文章于 2024-01-02 15:26:55 发布 hubeihualei 最新推荐文章于 2024-01-02 15:26:55 发布 阅读量4k 收藏 38 点赞数 8 分类专栏: 机械手 文章标签: ethercat 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/hubeihualei/article/details/116090460 版权 机械手 专栏收录该内容 2 篇文章 2 订阅 订阅专栏 做机械手的控制,实际上是对多个电机轴的控制。在2013年,那时候还是脉冲型电机驱动控制的天下,我甚至都没听说过实时以太网总线控制。接触到的主控除了PLC就是运动控制板块。由于机械手运动控制算法的复杂性,在2013年做了一款简易的PC+运动控制板卡的机械手控制器。 该控制器的核心算法是在PC上面,自研的板卡只做简单的脉冲发送。随着后面对机械手算法的深入研究,遇到的第一个瓶颈就是PC上面WINDOWS操作系统的实时性,PC上面的算法不能实时执行的话,很多高级功能也无法实现。后面了解到WINDOS下的商业实时内核ArdenceRtx。做了简单的尝试,由于收费昂贵和缺乏技术支持等原因,对于该实时内核并不满意。 接触实时内核后,实时以太网技术也开始逐渐进入视野,并重视起来。曾经花费1w去购买倍加福提供的ethercat主站协议栈。由于该代码是windows平台下的示例代码,而且没有伺服的控制示例,后来对于该方案的探索也没有实质性的进展。 后面团队引入linux方面的人才,视野才开阔起来。 Linux平台实时方案 linux平台下的实时内核有较多的选项:rtpreempt,xenomai,rtai等。 Xenomai 的实时性非常强,但是在使用上有一些限制和需要注意的事项。我早期第一个在linux平台下,使用的就是该内核。实时线程需要调用Xenomai的实时api, 而且实时线程如果调用了非实时设备类api,会被自动切换为非实时线程。 RTAI 这个实时补丁,比较好的一个背书就是LINUXcnc开源项目了。 Rtpreempt实时性要弱于后面2者,但是它的官方支持背景非常强大,而且有很多的linux内核版本可以匹配。另外一个优点是,按照普通linux平台编写程序就可以,不需要第三方的实时api. 据德国acontis代理商的信息,国外在ethercat主控上面,主流使用该实时内核。后面。后期将项目也从xenomai切换到了rtpreempt。 总结下实时程序编写的原则: 1) 根据功能的实时性需要,合理分配线程的优先级。基本上ethercat主线程就会分配最高优先级。 2) 一切算法的计算时间都需要量化,并对关键时间段进行实时监控,超过限定需要有报错等处理。 3) 实时线程不得进行设备类调用(print打印,文件操作等),当然ethercat类实时驱动是例外(因为实时以太网驱动做了特殊处理)。 4) 注意多线程互斥锁的问题,实时线程和非实时线程如果都操作互斥锁,可能带来优先级反转。 商业独立实时操作系统 Vxworks使用比较广泛,机器人控制方面还不知道哪家在使用。 国产的sylixos推广的比较好,开发工具和支持的库也比较多,有几个机器人厂家在尝试使用。 Ethercat协议栈方面 商业ethercat协议栈 德国acontis,据说KUKA就是用的该商业栈。 德国KPAStudio ethercat商业协议栈。 国内的机器人控制器厂商主要用这2个商业协议栈,特别是acontis居多。收费方面一般是一次性的开发费+没台主站设备安装费。 开源ethercat协议栈 德国IGH,这个成熟度较高,国内的研究使用方面的文章也非常多。首要推荐使用该协议栈。对于伺服控制的开发,还需要了解CIA402协议,然后根据该协议调用IGH相关接口就可以实现伺服的控制,生手可能需要3-6个月的时间,才能消化掌握。难点主要还是DC同步时序问题。早期踩过的坑是,伺服偶尔出现卡顿,一直没有找到根本原因,直到几年后才根本解决。主要的解决思路是,伺服初始化的时候需要进行每个伺服时钟偏移的调整,保证相位同步。这也是经过长时间的摸索才找到的解决方法。 SOME开源协议栈:功能方面没有IGH强大,比较偏向底层协议栈,需要自己加太多的代码,才能实现伺服的控制。 2015年的时候,曾经试用过acontis和kpa, 效果都不错,唯一不方便的地方就是增减ethercat设备时,必须用它们的软件进行配置文件的生成,这点比较麻烦。 下面列举下了解到的机器人品牌的技术栈选择。 台湾宝元:linux+rtpreempt+igh 以色列高创:linux+rtpreempt+igh 国产NBT:linux+rtpreempt+acontis 如有笔误,还请指教! WeiXin18820959358 优惠劵 hubeihualei 关注 关注 8 点赞 踩 38 收藏 觉得还不错? 一键收藏 知道了 2 评论 机械手浅谈系列之---ethercat主站开发和实时操作系统 做机械手的控制,实际上是对多个电机轴的控制。在2013年,那时候还是脉冲型电机驱动控制的天下,我甚至都没听说过实时以太网总线控制。接触到的主控除了PLC就是运动控制板块。由于机械手运动控制算法的复杂性,在2013年做了一款简易的PC+运动控制板卡的机械手控制器。该控制器的核心算法是在PC上面,自研的板卡只做简单的脉冲发送。随着后面对机械手算法的深入研究,遇到的第一个瓶颈就是PC上面WINDOWS操作系统的实时性,PC上面的算法不能实时执行的话,很多高级功能也无法实现。后面了解到WINDOS下的商业实时内核 复制链接 扫一扫 专栏目录 2 条评论 您还未登录,请先 登录 后发表或查看评论 SylixOS上EtherCAT实现 Jackstraw瑞的博客 11-01 2959 1 EtherCAT开源协议栈介绍
目前常见开源的主站代码为RT-LAB开发的SOEM(Simple OpenSource EtherCAT Master)和EtherLab的the IgH EtherCAT® Master,SylixOS对两者都支持。其中IgH作为常用的EtherCAT开源协议栈,SylixOS已移植支持。
2 SylixOS-IgH使用框架
SylixO EtherCAT从站开发 caixf的博客 01-02 490 开发一个EtherCAT从站,并将从站连接到EtherCAT主站 EtherCAT主站芯片(ECM-XF)数据手册+参考原理图+使用说明 05-27 EtherCAT主站芯片(ECM-XF)数据手册+参考原理图+使用说明 要想自己打板玩一玩Ethercat的老哥们往这里看 ethercat-1.5.2.rar_Ethercat主站_ethercat 1.5.2_igh_igh Windows_mas 07-14 主要是关于igh开源主站的介绍以及使用。这个可以作为参考文档。 Soem-跟从站通讯到OP状态-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 01-09 Soem-跟从站通讯到OP状态-添加备注-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 9 -- SOEM之基于QT搭建自己的EtherCAT主站,这一篇博客的源代码,博客链接( https://blog.csdn.net/qq_50808730/article/details/134361490 )。 注意: 该项目源代码只是提供了 QT-SOEM 配置从站到OP状态,没有对EtherCAT从站进行操作。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。 Soem主站识别到 几 个从站。 [工业互联-17]:常见EtherCAT主站与实现方法 文火冰糖(王文兵)的博客 07-08 4543 EtherCAT(Ethernet for Control Automation Technology)是一种实时以太网通信协议,用于工业自动化和控制系统中实现高性能、实时数据传输和控制。它是由EtherCAT技术组织(ETG)开发和标准化的。EtherCAT基于以太网物理层和数据链路层,但使用了一种特殊的通信方法,称为"Processing on the Fly"。这种方法使得数据帧能够在通过从站设备时进行实时处理,而不需要完全接收整个数据帧。这样,数据传输和控制可以实现高效率和低延迟。 [工业互联-22]:常见EtherCAT主站方案:Acontis公司的商用Windows 解决方案 文火冰糖(王文兵)的博客 07-10 1004 在Windows系统中,仅需使用一块标准以太网卡即可运行EtherCAT主站协议栈。即Windows系统下配置EtherCAT主站不需调用特殊的接口网卡,可以直接运行在内置于主板中的板载以太网控制器或低成本的外部标准网卡上。 EtherCat--主站开源的C语言库SOEM-环境搭建 qq_41931610的博客 03-03 3960 由于开发winpcap项目的目的在于为win32应用程序提供访问网络底层的能力,因此开发包里面有大量的WIN32的标识符,直接使用会出现“未定以标识符”错误。运行simple_test.exe \Device\NPF_{XXXX},其中\Device\NPF_{XXXX}是电脑的网络设备符。3.新建一个空项目。以管理员的权限打开VS2017,新建一个VC++的Win32控制台应用程序,设置为空项目。生成全部测试文件(生成exe等文件)simple_test.exe文件,至此完成了SOEM源码的编译。 自建极简Ethercat主站-底层驱动编写 西澳峰的博客 06-05 2059 MECM(Mini Ethercat Master),名字随便起的。已经学习了一段时间的Ethercat总线了,目前的想法就是自己简单实现一个Ethercat主站,没有太多的冗余功能,暂时不考虑太多的容错机制,仅实现目前用到的FOE、COE、过程数据通信这三个功能,仅用于学习和加深理解。主站的硬件是GD32F450Z_EVAL开发板,板载的以太网芯片是DP83848VV。基本接口已经写好,接下来就是按照Ethercat的数据包对数据进行打包,然后将发送出去。名称说明长度。 EtherCAT有哪些主流开源代码?它们的优点是什么? absinjun的博客 12-28 3751 EtherCAT两大主流开源代码为SOEM和Igh EtherCAT Master。 SOEM SOEM 全称 Simple Open EtherCAT Master 优点: 非常易于使用 静态分配内存,占用空间少 易于移植驱动程序和应用程序层 可在Window、Linux平台运行 IGH EtherCAT Master 优点: 成熟的EtherCAT主站 稳定性好 性能好 对EtherCAT的功能支持更加全面 对比表 开源主站 SOEM IGH EtherCAT Master 版 Soem-1个电机转圈圈PV模式-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 最新发布 01-09 Soem-1个电机转圈圈PV模式-添加代码注释-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 16 --Qt-Soem通过界面按键控制电机转圈圈PV模式,这一篇博客的源代码,博客链接( 正在编写,2024.1.14发布, https://editor.csdn.net/md?articleId=135431287 )。 注意: 该项目源代码提供了 QT-SOEM 配置从站到OP状态,并且对1个EtherCAT从站 电机进行操作,通过 PV模式 让 1个电机转圈圈,正反转及停止。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。 Soem主站识别到 几 个从站。 并且对1个EtherCAT从站 电机进行操作,通过 PV模式 让 1个电机转圈圈,正反转及停止。 EtherCAT协议完整版 02-10 EthereCAT协议完整版,包含概述,物理层服务定义和协议规范,数据链路层服务于规范,应用层服务于规范 EtherCAT FP介绍系列文章—多网段 MotroEngineer的博客 05-10 108 相对于设置了相同循环时间的其他总线系统,EtherCAT系统结构通常能减少25%-30%的CPU负载,EtherCAT的出现为系统的实时性能和拓扑的灵活性树立了新的标准。多网络方案允许在一个主站应用程序下实现多个独立的EtherCAT物理网络,每个网络之间的周期和分布时钟都是独立的互不干扰。在同一EtherCAT网络下不同类型的设备可能对总线循环周期有不同的需求,使用分帧处理扩展功能包,可以让不同周期的过程数据独立发送,减少单一循环周期下的网络带宽占用。 基于STM32的伺服总线EtherCAT主站设计——SOEM方案 weixin_48501028的博客 04-16 7552 本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。 SylixOS周期定时抖动分析 Jackstraw瑞的博客 09-18 702 1.概述
自动化与控制行业中有很多场景需要循环周期控制,而运动控制领域对循环周期控制的时间确定性要求尤为严格,周期抖动的时间确定性和周期控制的极限范围直接影响运动控制产品的质量和性能。
SylixOS作为一款嵌入式实时操作系统,针对不同循环周期和不同程度的时间确定性要求均有对应的周期控制方式,其中就有为周期性任务解决多任务调度冲突并且时间确定性良好的速率单调调度(Rate Monoto EtherCAT主站 11-09 2351 就目前而言,EtherCAT技术已经很普遍,各个运动控制器升级到该技术,也很有必要,必将节省大量的人力物力,提高系统的稳定性! 首先,就从站而言,(FPGA ip从站方案所占的资源的价格不容小觑),美信的AX58100很便宜,也很方便,推荐!!! 其次,主站方面,推荐FPGA纯verilog方案,硬件成本上占优势!(很多运控或者数控系统,都有一个fpga,利用这个fpga多余的逻辑,做个主站,何乐而不为;反正你的这个fpga省不了)。 ... 基于rt thread smart构建EtherCAT主站 cln512的博客 05-22 1989 基于rt thread smart构建EtherCAT主站 Acontis Ec-Master主站编译&调试方法 hanmingjunv5的博客 12-01 1792 1.开发包目录 Bin --Linux\x64 --EcMasterDemoDc :编译好的测试程序 --libemllRTL8169.so :运行主站时需要加载的网卡驱动 Doc --EC-Master_ClassA/B:主站功能介绍 --EC-Master_QuickStart_Guide:快速开始文档 Examples --示例 SDK:开发包 --INC:开发程序所需头文件 --LIB\Linux\x64:编译用户程序时需要链接的库 --libAtemRasS ethercat主站开发教程 07-12 EtherCAT(以太CAT)是一种实时以太网技术,用于工业自动化领域中的分布式控制系统。要开发EtherCAT主站,您可以按照以下步骤进行: 1. 硬件准备: - 获取一块支持EtherCAT通信的主站开发板或模块。 - 配置主站开发板的连接接口,如以太网端口。 2. 软件准备: - 下载并安装EtherCAT主站开发工具包,如EtherCAT Master Stack。 - 在开发环境中配置EtherCAT主站开发工具包。 3. 主站配置: - 在主站开发工具包中创建一个新的EtherCAT主站项目。 - 配置主站的网络参数,如IP地址和子网掩码。 - 添加从站设备到主站项目中。 4. 主站程序开发: - 使用EtherCAT主站开发工具包提供的API,编写主站程序。 - 实现主站和从站之间的数据通信和同步。 5. 主站部署: - 将主站程序烧录到主站开发板或模块中。 - 连接主站开发板和从站设备。 6. 测试和调试: - 运行主站程序并监视通信状态。 - 调试主站程序,确保与从站设备之间的通信正常。 以上是一个基本的EtherCAT主站开发流程,具体的开发工具和步骤可能因厂商和开发环境而有所差异。建议您参考相关的EtherCAT主站开发文档和示例代码,以获取更详细的指导和帮助。 “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 hubeihualei CSDN认证博客专家 CSDN认证企业博客 码龄12年 暂无认证 10 原创 24万+ 周排名 17万+ 总排名 3万+ 访问 等级 350 积分 35 粉丝 17 获赞 14 评论 127 收藏 私信 关注 热门文章 AGV激光Slam导航环境要求说明 6343 激光导航AGV-激光雷达安装要求 4738 【构建基于树莓派cm4的机器人控制系统的运行环境】 4652 机械手浅谈系列之---ethercat主站开发和实时操作系统 4067 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 3671 分类专栏 机械手 2篇 华友高科 2篇 最新评论 机械手浅谈系列之---ethercat主站开发和实时操作系统 Bobby95: 您好,请问下关于同步时钟配置这一块,主站的同步周期和同步偏移要怎么配置? 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 qq827240898: 你好,请问抖动问题解决了吗 HYGK开源机器人控制系统 智能玩家a: 你好,igh相关的程序没有看到呢,能分享一下吗?3个链接,只有第一个能点。后面两个没权限。 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 weixin_44513187: csp本身就会造成抖动,在松下的说明书里写的很清楚了 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 he35059226: 加微信号he35059226,讨论讨论 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 ethercat主站开发之-----一拖多驱动控制 【构建基于树莓派cm4的机器人控制系统的运行环境】 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 2023年1篇 2022年2篇 2021年2篇 2019年5篇 目录 目录 分类专栏 机械手 2篇 华友高科 2篇 目录 评论 2 被折叠的 条评论 为什么被折叠? 到【灌水乐园】发言 查看更多评论 添加红包 祝福语 请填写红包祝福语或标题 红包数量 个 红包个数最小为10个 红包总金额 元 红包金额最低5元 余额支付 当前余额3.43元 前往充值 > 需支付:10.00元 取消 确定 下一步 知道了 成就一亿技术人! 领取后你会自动成为博主和红包主的粉丝 规则 hope_wisdom 发出的红包 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 余额充值 EtherCAT学习之路——概述 - 知乎首发于EtherCAT学习之路切换模式写文章登录/注册EtherCAT学习之路——概述白细胞 最近在做基于EtherCAT的项目,看了一些网上的博客,感觉写的都比较松散。虽然,自己也是才开始学习,希望能把这段时间学到的东西总结一下。这是倍福的官方介绍,有时间的可以看一下。1.EtherCAT简介 EtherCAT是由德国BECKHOFF自动化公司于2003年提出的实时工业以太网技术。它具有高速和高数据有效率的特点,支持多种设备连接拓扑结构。其从站节点使用专用的控制芯片,主站使用标准的以太网控制器。 EtherCAT是一种工业以太网技术,看到的大多数应用场景都是伺服电机。因为是基于以太网的技术,所以EtherCAT相比于CAN总线而言,速率上要快不少。EtherCAT可以达到100M的速率,而CAN只有1M。此外,EtherCAT还具备低延时和精准同步的特点。 在工业总线中,低延时、精准同步是用户的关键需求。试想一下,工厂中某个器件的生产需要A/B/C三个机器协同操作,原本预想的是A先操作期间,然后B把器件传递给C,C再操作。如果,A/B/C不同步,或者操作命令的传达有延时,A还没有操作完器件,B就已经开始进行传递了。这时要么器件损坏,要么就做出来个半成品。而EtherCAT相比于普通的以太网技术就有这两点的优点。2.EtherCAT基本原理 EtherCAT基本原理这一节PLC攻城狮的《浅析EtherCAT 总线》讲的还是比较清楚,推荐大家看一下。下面我就简单说一下自己的理解。 倍福官方对EtherCAT的传递机制的命名叫做:ON The Fly。图 2-1 On The Fly On The Fly技术可以从两方面来解读,第一个方面是以太帧“时分复用”。一般以太帧里都只包含了一个设备发送的消息,5个设备就会发送5条以太帧。而EtherCAT则是多个从站共享一条以太帧。就像图2-1中的火车,EtherCAT主站发出了“火车”(以太帧),各个从站则从这辆火车的不同的“车厢”(子报文)中提取或插入自己的“乘客”(消息)。这样一来就实现了以太帧的“时分复用”,只用一条以太帧(最大1486byte),就可以让各个从站都收发出自己的消息,大大的降低了通信的延时(这一部分《浅析EtherCAT 总线》里面讲的比较清楚,还没理解的同学可以看看)。 On The Fly影响的另一个方面就是总线仲裁了。所谓总线(例如CAN总线),就是大家都共用一条通道来通信,各个设备都挂载在同一条总线上。所以,当一个总线上的多个设备同时想要发消息的时候,就会产生冲突,所以,就有总线仲裁的机制。控制器决定当前时刻,谁来发消息,谁来“占用”这条总线。而EtherCAT玩了一个花样,EtherCAT的各个设备之间是一种P2P(Point to Point)的连接方式,这些设备根本没有连接在“同一条”总线上。下面是EtherCAT的连接结构。图 2-2 EtherCAT连接结构 图2-2中,最左边的是主站,后面的都是从站,各个从站下面还挂载了不同的设备。可以看到主站向从站1发送以太帧,从站1接收、处理完自己的子报文后,再把以太帧发送给从站;从站2接收,处理完自己的子报文后在发送给从站3;如此往返,直到最后一个从站n接收处理完自己的消息,再把这条以太帧返回回去。所以,各个从站之间根本就不会存在总线冲突。EtherCAT只需要预先配置好各个从站占用的子报文位置,也就是On The Fly技术,就可以解决总线总裁这一个老大难的问题,确实是一箭双雕。 当然,这种解决方案也是有它的缺点的。比如,从站数量非常多的时候,最后一个从站就需要等前面的从站一次次转发才能收到消息。当然,我觉得EtherCAT应该也想到了这点,应该也采取了某种机制来避免这种最远设备延迟的缺陷。但是,我还没深挖这个问题,所以,没看到相关的解决机制。如果有了解的同学希望能指教一下。3.EtherCAT系统组成 EtherCAT系统主要就一个主站和若干从站组成。如图3-1所示:图3-1 EtherCAT系统组成 EtherCAT一般使用软件的方式来实现主站,包括倍福的TwinCAT,Igh,KingStar等等都是基于一台实时操作系统的PC,通过以太网卡,来实现主站的功能。因为,主站不是我的项目重点,所以,目前了解的还不多。先挖一个坑,后面有时间了研究一下,再来补上。现在我是用TwinCAT的免费版来学习和调试的。TwinCAT本身是收费的,不过,它有试用版,试用版不具备实时功能,调试一下设备还是足够了。 从站的组成如图3-2所示:图 3-2 从站组成 从站一般是有3部分器件组成的:物理层器件、EtherCAT从站控制器(EtherCAT Slave Control)和微处理器(MCU)。物理层器件就是以太网的PHY芯片和网口,ESC是实现EtherCAT协议栈的专用ASIC,从站控制微处理器主要实现应用层(如CANopen)和用户自定义的程序。 看到这里没有通信基础知识的通信可能就有点懵逼了。物理层,数据链路层,应用层这些是个啥玩意?这里我就简单说一下,想要深入理解还是可以看看OSI模型,大多数的通信技术都脱离不了这个框架。图 3-3 OSI模型 这里偷了个懒,盗用一下PLC攻城狮的图片。OSI中有7层,EtherCAT系统中只用了3层:物理层、数据链路层、应用层。先降维的说一下这几层是啥意思。最基本的通信就是咱们人类说话,我就以我们普通对话来讲解一下这三层的意思。 物理层:人类的语言是通过嘴发声,声波在空气中传播,传递到耳朵,耳朵听音再汇聚到大脑,大脑最终判断出声音中的信息。我们的嘴、耳、声波和空气就是物理层。物理层的重点是信号在介质中的传递表示,不同的字有不同的发音规则,不同的频率和声调,比如“哦”,我们就需要发出“o”这个音,我们听到“o”这个音的时候,才能判断出“哦”这个字。计算机通信的原理和这个也是一样的,信号在光纤、电缆以及空气中传播,计算机需要判断电缆上的电平的高低来判断0,1bit。当然,计算机比人类要傻很多,它不知道“某句话”的“发音”是从什么时候开始的,什么时候结束的,所以,物理层还需要告诉它信号的起始时刻和持续的长度等等。 数据链路层:通过前面的物理层,我们已经具备了基本的发声的手段,通过嘴改变声音的频率、音调、音长等特征(通信系统中,天线或者光模块改变信号的电平高低、信号频率、调制方式等特征),让声音在空气中传播(通信系统中,信号在相应的介质中传播),然后,耳朵识别这些频率、音调、音长等特征(通信系统中,接收端的识别信号的电平高低、频率、调制方式),最终实现口到耳的传播。 但是,光是这样还足够实现通信。试想一下,你和你的几个朋友处在一个嘈杂的环境当中,远处有汽车的轰鸣,旁边还有小孩子在哭闹,你的朋友们每个人在抢着发言,大家七嘴八舌的,根本听不清对方在说什么。所以,你和你的朋友之间想要对话就必须克服两个困难,第一,屏蔽掉耳旁的那些轰鸣声、哭闹声;第二,需要建立一种对话机制,让大家互相可以听清对方的话语。 第一点中描述的那些轰鸣、哭闹声,实际上就是通信系统中的噪声,噪声太大时,我们是无法通信的,因为我们根本听不清旁边的人在说些什么,只能听到轰鸣、哭闹声。最简单克服噪声的办法就是提高信号的发射功率,也就是大声地说话,让自己的声音盖过那些哭闹声,也即是通信系统中的功率控制。还有一种办法就是我们过滤掉一些噪声,虽然,这些声音都会进入我们的耳朵,但是,我们的大脑可以过滤掉一些不关注的声音,专注的去接收那些关注的声音,也即是通信系统中的频率选择。此外,大家七嘴八舌的说话也是一个问题。7,8个人同时在说话,你能听清楚一两个就不错了,其他人在说啥,根本没法听清。所以,我们说话的时候,一般会有一个轮流的机制。每个人说两句,别人说话的时候,别插嘴。或者,两个人说悄悄话,不打扰到别人,自己也听得清。这里的轮流说话机制,就是通信系统中的“时分复用”或者“频分复用”;一个人说7个人听,就是广播;1对1的悄悄话就是单播。数据链路层实际上就是用来解决以上的这些问题。 数据链路层会将待传输的消息组成一个帧,如图3-4所示:图3-4 EtherCAT帧结构 这个帧里就会包含目的地址、源地址、帧数据、帧校验位等。通过目的地址就可以确定帧传递的对象,通过源地址接收方也可以知道是谁发送了这条帧。在数据帧之外的地方,一般还会存在一个控制器(比如EtherCAT主站),这个控制器会决定,其他的从站什么时候传输数据,数据可以占用多少的资源。在其他的一些更复杂的通信系统中,数据链路层还会根据当前的信道条件(噪声情况),来决定各个设备的发射功率,调制方式等。 应用层:说完了数据链路层,我们还需要继续了解一下应用层。首先需要明确的一点,这里的应用层和我们手机、电脑上的应用程序不是一个东西。最为常见的应用层协议就是HTTP。简单来说,应用层是对数据的一种格式约定。这里还是用人类的对话来打个比方。你和一个老外,大家都有口有耳,也都是文明人,知道等对方说完自己再说。但是,你不懂英文,他不懂中文,你们还是无法交流。他说了“double”,你以为是“打包”;他说“You need cry deal”,你以为是“有你的快递”。这实际上就是你们的应用层协议不对等,他安装的是“英语”应用层协议,你安装的是“中文”应用层协议,大家说话牛头不对马嘴,根本无法交流。再夸张一点,我和你都是中国人,我们都听得懂中文,当时我是学通信的,你是学自动化的,我说PRACH信道,信道检查与估计,匹配滤波这些词的时候,你能明白每一个字的意思,但是连着一起是啥就不知道了。这就是因为你确实“通信系统”这个应用层协议。应用层协议最终的目的,就是让消息的收发双方知道这一串“1010101010”代表的是什么意思。本来这一章准备昨天就写完了,谁知道写了这么多无关的内容,后面准备新开一个博客把OSI的7层就讲一下,然后再把这一节删除掉。4.学习书目 其实,前面说了这么多,我觉得只有这一节最重要,介绍一下我的参考书目。网上虽然有各种各样的博客、知乎文字,但是始终是比不上书本上的详细和系统的。网上这些博客可能可以吃个快餐,但绝对不是什么捷径。不系统的学习,只能让你一知半解,能做个Demo出来就不错了。一旦遇到一点bug,根本无从下手。所以,一定要多读书,读好书。 这里有几本书要给大家推荐一下。 首先是北京航空航天大学出版社,郇极、刘艳强编写的《工业以太网现场总线EtherCAT驱动程序设计及应用》。这本书详细的介绍了EtherCAT协议、从站控制芯片以及相关应用层协议。我这里的大多数内容都取自于这本书中,如果能把这本书都看懂、看明白,那EtherCAT从站开发,应该不会有太大的难点。 第二是周立功的《CANopen轻松入门》。EtherCAT是一个数据链路层的协议,所以还需要配合上层的应用层协议才能更好的工作,CANopen即是工业物联网中一个比较常用的应用层协议。事实上,进行从站开发的时候,应用层协议会占到很大的比例。因为,EtherCAT从站一般都会使用一个专用ASIC(如ET1100)来实现EtherCAT协议栈,也即是完成数据链路层的工作。对于数据链路层,我们只需要做一些配置工作,而应用层协议则需要通过软件来实现。 第三是倍福官方的《EtherCAT Slave Information Specification 》和《Application Note ET9300》。前面说了,EtherCAT协议栈的功能都是在ET1100上实现的,开发从站是不涉及这部分数据链路层的代码的。但是,我们还是对从站进行相应的配置,包括PDI控制,SYNC信号脉冲宽度等信息(称为EtherCAT Slave Information,ESI)。这些信息的配置就在《EtherCAT Slave Information Specification》里有详细讲解。此外,从站开发还需要实现CANopen等应用层协议。对于应用层协议的实现,在《Application Note ET9300》里有比较详细的讲解。像ET1100、AX58100、LAN9252这些EtherCAT控制芯片,其芯片厂商都会提供一些Demo程序,这些Demo程序实际上都是基于《Application Note ET9300》里的软件框架来完成的。《Application Note ET9300》只有英文版,我自己也还没有看完,而且比较重要,后面专门拿一章来细讲。 第四是SSC,这是倍福提供的一个软件。前面说了,从站开发的两个关键步骤是EtherCAT控制芯片的配置和应用层协议的实现。倍福提供了SSC这样一个软件,它可以直接根据配置和需求,生成所需的xml描述文件和应用层代码。当然,这个软件生成的代码原生只适配与倍福自己的ET1100或ET1200芯片,其他的LAN9252、AX58100都做一些修改。这个东西看着很美好,也就那么回事。其实,每个芯片厂商都有提供自己的Demo程序,这些Demo程序都简单实现了应用层协议。如果是使用非倍福的芯片,不如直接在芯片厂商的Demo程序上改,这样可以避免一些莫名其妙的bug。不过,如果所需的应用层协议,芯片厂商没有提供Demo程序的话,还是需要用SSC生成一个参考,然后,再基于这个参考来修改。题外话原本以为一个晚上可以搞定的工作,生生花了2个晚上。很多地方写得比较零碎,特别是OSI那一段扯得有点远了,写了不少和主题无关的内容,后面找时间再重新精简一下。第一次写博客,可能有不少不准确或者错误的地方,还请大家见谅。如有不对之处,还请多多指教。编辑于 2020-03-13 16:39工业互联网/物联网平台个人博客以太网(Ethernet)赞同 19716 条评论分享喜欢收藏申请转载文章被以下专栏收录EtherCAT学习之路EtherCAT从站开 机械手浅谈系列之---ethercat主站开发和实时操作系统_acontis ethercat主站费用-CSDN博客 机械手浅谈系列之---ethercat主站开发和实时操作系统 最新推荐文章于 2024-01-02 15:26:55 发布 hubeihualei 最新推荐文章于 2024-01-02 15:26:55 发布 阅读量4k 收藏 38 点赞数 8 分类专栏: 机械手 文章标签: ethercat 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/hubeihualei/article/details/116090460 版权 机械手 专栏收录该内容 2 篇文章 2 订阅 订阅专栏 做机械手的控制,实际上是对多个电机轴的控制。在2013年,那时候还是脉冲型电机驱动控制的天下,我甚至都没听说过实时以太网总线控制。接触到的主控除了PLC就是运动控制板块。由于机械手运动控制算法的复杂性,在2013年做了一款简易的PC+运动控制板卡的机械手控制器。 该控制器的核心算法是在PC上面,自研的板卡只做简单的脉冲发送。随着后面对机械手算法的深入研究,遇到的第一个瓶颈就是PC上面WINDOWS操作系统的实时性,PC上面的算法不能实时执行的话,很多高级功能也无法实现。后面了解到WINDOS下的商业实时内核ArdenceRtx。做了简单的尝试,由于收费昂贵和缺乏技术支持等原因,对于该实时内核并不满意。 接触实时内核后,实时以太网技术也开始逐渐进入视野,并重视起来。曾经花费1w去购买倍加福提供的ethercat主站协议栈。由于该代码是windows平台下的示例代码,而且没有伺服的控制示例,后来对于该方案的探索也没有实质性的进展。 后面团队引入linux方面的人才,视野才开阔起来。 Linux平台实时方案 linux平台下的实时内核有较多的选项:rtpreempt,xenomai,rtai等。 Xenomai 的实时性非常强,但是在使用上有一些限制和需要注意的事项。我早期第一个在linux平台下,使用的就是该内核。实时线程需要调用Xenomai的实时api, 而且实时线程如果调用了非实时设备类api,会被自动切换为非实时线程。 RTAI 这个实时补丁,比较好的一个背书就是LINUXcnc开源项目了。 Rtpreempt实时性要弱于后面2者,但是它的官方支持背景非常强大,而且有很多的linux内核版本可以匹配。另外一个优点是,按照普通linux平台编写程序就可以,不需要第三方的实时api. 据德国acontis代理商的信息,国外在ethercat主控上面,主流使用该实时内核。后面。后期将项目也从xenomai切换到了rtpreempt。 总结下实时程序编写的原则: 1) 根据功能的实时性需要,合理分配线程的优先级。基本上ethercat主线程就会分配最高优先级。 2) 一切算法的计算时间都需要量化,并对关键时间段进行实时监控,超过限定需要有报错等处理。 3) 实时线程不得进行设备类调用(print打印,文件操作等),当然ethercat类实时驱动是例外(因为实时以太网驱动做了特殊处理)。 4) 注意多线程互斥锁的问题,实时线程和非实时线程如果都操作互斥锁,可能带来优先级反转。 商业独立实时操作系统 Vxworks使用比较广泛,机器人控制方面还不知道哪家在使用。 国产的sylixos推广的比较好,开发工具和支持的库也比较多,有几个机器人厂家在尝试使用。 Ethercat协议栈方面 商业ethercat协议栈 德国acontis,据说KUKA就是用的该商业栈。 德国KPAStudio ethercat商业协议栈。 国内的机器人控制器厂商主要用这2个商业协议栈,特别是acontis居多。收费方面一般是一次性的开发费+没台主站设备安装费。 开源ethercat协议栈 德国IGH,这个成熟度较高,国内的研究使用方面的文章也非常多。首要推荐使用该协议栈。对于伺服控制的开发,还需要了解CIA402协议,然后根据该协议调用IGH相关接口就可以实现伺服的控制,生手可能需要3-6个月的时间,才能消化掌握。难点主要还是DC同步时序问题。早期踩过的坑是,伺服偶尔出现卡顿,一直没有找到根本原因,直到几年后才根本解决。主要的解决思路是,伺服初始化的时候需要进行每个伺服时钟偏移的调整,保证相位同步。这也是经过长时间的摸索才找到的解决方法。 SOME开源协议栈:功能方面没有IGH强大,比较偏向底层协议栈,需要自己加太多的代码,才能实现伺服的控制。 2015年的时候,曾经试用过acontis和kpa, 效果都不错,唯一不方便的地方就是增减ethercat设备时,必须用它们的软件进行配置文件的生成,这点比较麻烦。 下面列举下了解到的机器人品牌的技术栈选择。 台湾宝元:linux+rtpreempt+igh 以色列高创:linux+rtpreempt+igh 国产NBT:linux+rtpreempt+acontis 如有笔误,还请指教! WeiXin18820959358 优惠劵 hubeihualei 关注 关注 8 点赞 踩 38 收藏 觉得还不错? 一键收藏 知道了 2 评论 机械手浅谈系列之---ethercat主站开发和实时操作系统 做机械手的控制,实际上是对多个电机轴的控制。在2013年,那时候还是脉冲型电机驱动控制的天下,我甚至都没听说过实时以太网总线控制。接触到的主控除了PLC就是运动控制板块。由于机械手运动控制算法的复杂性,在2013年做了一款简易的PC+运动控制板卡的机械手控制器。该控制器的核心算法是在PC上面,自研的板卡只做简单的脉冲发送。随着后面对机械手算法的深入研究,遇到的第一个瓶颈就是PC上面WINDOWS操作系统的实时性,PC上面的算法不能实时执行的话,很多高级功能也无法实现。后面了解到WINDOS下的商业实时内核 复制链接 扫一扫 专栏目录 2 条评论 您还未登录,请先 登录 后发表或查看评论 EtherCAT从站开发 caixf的博客 01-02 490 开发一个EtherCAT从站,并将从站连接到EtherCAT主站 soem-w5500-rpi:Raspberry pi的开源实时EtherCAT主站 02-05 soem-w5500-rpi:Raspberry pi的开源实时EtherCAT主站 EtherCAT主站芯片(ECM-XF)数据手册+参考原理图+使用说明 05-27 EtherCAT主站芯片(ECM-XF)数据手册+参考原理图+使用说明 要想自己打板玩一玩Ethercat的老哥们往这里看 ethercat-1.5.2.rar_Ethercat主站_ethercat 1.5.2_igh_igh Windows_mas 07-14 主要是关于igh开源主站的介绍以及使用。这个可以作为参考文档。 Soem-跟从站通讯到OP状态-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 01-09 Soem-跟从站通讯到OP状态-添加备注-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 9 -- SOEM之基于QT搭建自己的EtherCAT主站,这一篇博客的源代码,博客链接( https://blog.csdn.net/qq_50808730/article/details/134361490 )。 注意: 该项目源代码只是提供了 QT-SOEM 配置从站到OP状态,没有对EtherCAT从站进行操作。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。 Soem主站识别到 几 个从站。 [工业互联-17]:常见EtherCAT主站与实现方法 文火冰糖(王文兵)的博客 07-08 4543 EtherCAT(Ethernet for Control Automation Technology)是一种实时以太网通信协议,用于工业自动化和控制系统中实现高性能、实时数据传输和控制。它是由EtherCAT技术组织(ETG)开发和标准化的。EtherCAT基于以太网物理层和数据链路层,但使用了一种特殊的通信方法,称为"Processing on the Fly"。这种方法使得数据帧能够在通过从站设备时进行实时处理,而不需要完全接收整个数据帧。这样,数据传输和控制可以实现高效率和低延迟。 [工业互联-22]:常见EtherCAT主站方案:Acontis公司的商用Windows 解决方案 文火冰糖(王文兵)的博客 07-10 1004 在Windows系统中,仅需使用一块标准以太网卡即可运行EtherCAT主站协议栈。即Windows系统下配置EtherCAT主站不需调用特殊的接口网卡,可以直接运行在内置于主板中的板载以太网控制器或低成本的外部标准网卡上。 EtherCat--主站开源的C语言库SOEM-环境搭建 qq_41931610的博客 03-03 3960 由于开发winpcap项目的目的在于为win32应用程序提供访问网络底层的能力,因此开发包里面有大量的WIN32的标识符,直接使用会出现“未定以标识符”错误。运行simple_test.exe \Device\NPF_{XXXX},其中\Device\NPF_{XXXX}是电脑的网络设备符。3.新建一个空项目。以管理员的权限打开VS2017,新建一个VC++的Win32控制台应用程序,设置为空项目。生成全部测试文件(生成exe等文件)simple_test.exe文件,至此完成了SOEM源码的编译。 自建极简Ethercat主站-底层驱动编写 西澳峰的博客 06-05 2059 MECM(Mini Ethercat Master),名字随便起的。已经学习了一段时间的Ethercat总线了,目前的想法就是自己简单实现一个Ethercat主站,没有太多的冗余功能,暂时不考虑太多的容错机制,仅实现目前用到的FOE、COE、过程数据通信这三个功能,仅用于学习和加深理解。主站的硬件是GD32F450Z_EVAL开发板,板载的以太网芯片是DP83848VV。基本接口已经写好,接下来就是按照Ethercat的数据包对数据进行打包,然后将发送出去。名称说明长度。 EtherCAT有哪些主流开源代码?它们的优点是什么? absinjun的博客 12-28 3751 EtherCAT两大主流开源代码为SOEM和Igh EtherCAT Master。 SOEM SOEM 全称 Simple Open EtherCAT Master 优点: 非常易于使用 静态分配内存,占用空间少 易于移植驱动程序和应用程序层 可在Window、Linux平台运行 IGH EtherCAT Master 优点: 成熟的EtherCAT主站 稳定性好 性能好 对EtherCAT的功能支持更加全面 对比表 开源主站 SOEM IGH EtherCAT Master 版 Soem-1个电机转圈圈PV模式-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码 最新发布 01-09 Soem-1个电机转圈圈PV模式-添加代码注释-CSDN.zip EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 16 --Qt-Soem通过界面按键控制电机转圈圈PV模式,这一篇博客的源代码,博客链接( 正在编写,2024.1.14发布, https://editor.csdn.net/md?articleId=135431287 )。 注意: 该项目源代码提供了 QT-SOEM 配置从站到OP状态,并且对1个EtherCAT从站 电机进行操作,通过 PV模式 让 1个电机转圈圈,正反转及停止。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。 Soem主站识别到 几 个从站。 并且对1个EtherCAT从站 电机进行操作,通过 PV模式 让 1个电机转圈圈,正反转及停止。 EtherCAT协议完整版 02-10 EthereCAT协议完整版,包含概述,物理层服务定义和协议规范,数据链路层服务于规范,应用层服务于规范 EtherCAT FP介绍系列文章—多网段 MotroEngineer的博客 05-10 108 相对于设置了相同循环时间的其他总线系统,EtherCAT系统结构通常能减少25%-30%的CPU负载,EtherCAT的出现为系统的实时性能和拓扑的灵活性树立了新的标准。多网络方案允许在一个主站应用程序下实现多个独立的EtherCAT物理网络,每个网络之间的周期和分布时钟都是独立的互不干扰。在同一EtherCAT网络下不同类型的设备可能对总线循环周期有不同的需求,使用分帧处理扩展功能包,可以让不同周期的过程数据独立发送,减少单一循环周期下的网络带宽占用。 基于STM32的伺服总线EtherCAT主站设计——SOEM方案 weixin_48501028的博客 04-16 7552 本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。 SylixOS周期定时抖动分析 Jackstraw瑞的博客 09-18 702 1.概述
自动化与控制行业中有很多场景需要循环周期控制,而运动控制领域对循环周期控制的时间确定性要求尤为严格,周期抖动的时间确定性和周期控制的极限范围直接影响运动控制产品的质量和性能。
SylixOS作为一款嵌入式实时操作系统,针对不同循环周期和不同程度的时间确定性要求均有对应的周期控制方式,其中就有为周期性任务解决多任务调度冲突并且时间确定性良好的速率单调调度(Rate Monoto EtherCAT主站 11-09 2351 就目前而言,EtherCAT技术已经很普遍,各个运动控制器升级到该技术,也很有必要,必将节省大量的人力物力,提高系统的稳定性! 首先,就从站而言,(FPGA ip从站方案所占的资源的价格不容小觑),美信的AX58100很便宜,也很方便,推荐!!! 其次,主站方面,推荐FPGA纯verilog方案,硬件成本上占优势!(很多运控或者数控系统,都有一个fpga,利用这个fpga多余的逻辑,做个主站,何乐而不为;反正你的这个fpga省不了)。 ... 基于rt thread smart构建EtherCAT主站 cln512的博客 05-22 1989 基于rt thread smart构建EtherCAT主站 Acontis Ec-Master主站编译&调试方法 hanmingjunv5的博客 12-01 1792 1.开发包目录 Bin --Linux\x64 --EcMasterDemoDc :编译好的测试程序 --libemllRTL8169.so :运行主站时需要加载的网卡驱动 Doc --EC-Master_ClassA/B:主站功能介绍 --EC-Master_QuickStart_Guide:快速开始文档 Examples --示例 SDK:开发包 --INC:开发程序所需头文件 --LIB\Linux\x64:编译用户程序时需要链接的库 --libAtemRasS ethercat主站开发教程 07-12 EtherCAT(以太CAT)是一种实时以太网技术,用于工业自动化领域中的分布式控制系统。要开发EtherCAT主站,您可以按照以下步骤进行: 1. 硬件准备: - 获取一块支持EtherCAT通信的主站开发板或模块。 - 配置主站开发板的连接接口,如以太网端口。 2. 软件准备: - 下载并安装EtherCAT主站开发工具包,如EtherCAT Master Stack。 - 在开发环境中配置EtherCAT主站开发工具包。 3. 主站配置: - 在主站开发工具包中创建一个新的EtherCAT主站项目。 - 配置主站的网络参数,如IP地址和子网掩码。 - 添加从站设备到主站项目中。 4. 主站程序开发: - 使用EtherCAT主站开发工具包提供的API,编写主站程序。 - 实现主站和从站之间的数据通信和同步。 5. 主站部署: - 将主站程序烧录到主站开发板或模块中。 - 连接主站开发板和从站设备。 6. 测试和调试: - 运行主站程序并监视通信状态。 - 调试主站程序,确保与从站设备之间的通信正常。 以上是一个基本的EtherCAT主站开发流程,具体的开发工具和步骤可能因厂商和开发环境而有所差异。建议您参考相关的EtherCAT主站开发文档和示例代码,以获取更详细的指导和帮助。 “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 hubeihualei CSDN认证博客专家 CSDN认证企业博客 码龄12年 暂无认证 10 原创 24万+ 周排名 17万+ 总排名 3万+ 访问 等级 350 积分 35 粉丝 17 获赞 14 评论 127 收藏 私信 关注 热门文章 AGV激光Slam导航环境要求说明 6343 激光导航AGV-激光雷达安装要求 4738 【构建基于树莓派cm4的机器人控制系统的运行环境】 4652 机械手浅谈系列之---ethercat主站开发和实时操作系统 4067 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 3671 分类专栏 机械手 2篇 华友高科 2篇 最新评论 机械手浅谈系列之---ethercat主站开发和实时操作系统 Bobby95: 您好,请问下关于同步时钟配置这一块,主站的同步周期和同步偏移要怎么配置? 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 qq827240898: 你好,请问抖动问题解决了吗 HYGK开源机器人控制系统 智能玩家a: 你好,igh相关的程序没有看到呢,能分享一下吗?3个链接,只有第一个能点。后面两个没权限。 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 weixin_44513187: csp本身就会造成抖动,在松下的说明书里写的很清楚了 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 he35059226: 加微信号he35059226,讨论讨论 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 ethercat主站开发之-----一拖多驱动控制 【构建基于树莓派cm4的机器人控制系统的运行环境】 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】 2023年1篇 2022年2篇 2021年2篇 2019年5篇 目录 目录 分类专栏 机械手 2篇 华友高科 2篇 目录 评论 2 被折叠的 条评论 为什么被折叠? 到【灌水乐园】发言 查看更多评论 添加红包 祝福语 请填写红包祝福语或标题 红包数量 个 红包个数最小为10个 红包总金额 元 红包金额最低5元 余额支付 当前余额3.43元 前往充值 > 需支付:10.00元 取消 确定 下一步 知道了 成就一亿技术人! 领取后你会自动成为博主和红包主的粉丝 规则 hope_wisdom 发出的红包 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 余额充值 【原创】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 - 沐多 - 博客园 会员 周边 新闻 博问 AI培训 云市场 所有博客 当前博客 我的博客 我的园子 账号设置 简洁模式 ... 退出登录 注册 登录 沐多 博客园 首页 新随笔 联系 管理 订阅 【原创】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 目录0 获取源码1 启动脚本1.1 start1.2 stop2 主站实例创建2.1 Master Phases2.2 数据报与状态机数据报状态机2.3 master状态机及数据报初始化2.4 初始化EtherCAT device2.5 设置IDLE 线程的发送间隔:2.6 初始化字符设备3 网卡4 IDLE阶段内核线程4.1 数据报发送4.2 数据报接收 版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/ 0 获取源码 IgH EtherCAT Master现已迁移到gitlab:https://gitlab.com/etherlab.org/ethercat,可以使用以下命令克隆存储库: git clone https://gitlab.com/etherlab.org/ethercat.git git checkout stable-1.5 上面的是igh官方的仓库,下面是其他Ethercat主站: https://github.com/ribalda/ethercat 基于官方,功能更为全面的igh etehrcat主站。 https://github.com/leducp/KickCAT 一个C++写的全新etehrcat主站,目前功能不完善。 https://github.com/ethercrab-rs/ethercrab 一个纯rust语言编写的全新etehrcat主站,目前功能不完善。 本文主要讲igh。 1 启动脚本 igh通过脚本来启动,可以是systemd、init.d或sysconfig。分别位于源码script目录下: 对于systemd方式,编译时由ethercat.service.in文件生成ethercat.service。ethercat.service中指定了执行文件为ethercatctl.ethercatctl文件由``ethercatctl.in`生成。init.d和sysconfig类似,都是生成一个可执行脚本,且脚本完成的工作一致,主要完成加载主站模块、网卡驱动、给主站内核模块传递参数、卸载模块等操作。 ethercat.conf共同的配置文件,配置主站使用的网卡、驱动等信息。下面看脚本start和stop所做的工作。 1.1 start 加载ec_master.ko 模块参数: main_devices :主网卡MAC地址,多个main_devices 表示创建多个主站,MAC参数个数master_count。 backup_devices :备用网卡MAC地址,多个backup_devices 表示创建多个主站,MAC参数个数backup_count。 debug_level :调试level,调试信息输出级别。 eoe_interfaces eoe接口,eoe_count表示eoe_interfaces 的个数。 eoe_autocreate 是否自动创建eoe handler。 pcap_size Pcap buffer size。 遍历配置文件中/etc/sysconfig/ethercat的环境变量DEVICE_MODULES,位于ethercat.conf中。 在每个DEVICE_MODULES前添加前缀ec_替换,如DEVICE_MODULES为igb的话,添加前缀后为ec_igb。 modinfo检查该模块是否存在。 对于非generic和rtdm的驱动,需要先将网卡与当前驱动unbind,unbind后的网卡才能被新驱动接管。 加载该驱动。 start加载了两个内核模块,ec_master.ko和网卡驱动ec_xxx.ko,ec_master先根据内核参数(网卡MAC)来创建主站实例,此时主站处于Orphaned phase。后续加载网卡驱动ec_xxx.ko,执行网卡驱动probe,根据MAC地址将网卡与主站实例匹配,此时主站得到操作的网卡设备,进入Idle phase。详细过程见后文。 1.2 stop 卸载内核模块ec_master.ko和网卡驱动ec_xxx.ko。 遍历配置文件中的环境变量DEVICE_MODULES。 在每个DEVICE_MODULES前添加前缀‘ec_’替换。 lsmod检查该模块是否被加载。 卸载模块。 后文“主站”和”master“均表示主站或主站实例对象,slave和从站表示从站或从站对象,中英混用,不刻意区分。 2 主站实例创建 一个使用IgH的控制器中可以有多个EtherCAT主站,每个主站可以绑定了一个主网卡和一个备用网卡,一般备用网卡不使用,线缆冗余功能时才使用备用网卡(文中假设只有一个主网卡)。 start过程中执行insmod ec_master.ko,这个时候,先调用的就是 module_init 调用的初始化函数ec_init_module()。先根据参数main_devices 的个数master_count,每个master需要一个设备节点来与应用程序交互,所以master_count决定需要创建多少个matser和多少个字符设备; 这里先分配注册master_count个字符设备的主次设备号device_number和名称,这样每个master对应的设备在文件系统中就是/dev/EtherCAT0、/dev/EtherCAT1...(Linux下)。 if (master_count) { if (alloc_chrdev_region(&device_number, 0, master_count, "EtherCAT")) { EC_ERR("Failed to obtain device number(s)!\n"); ... } } class = class_create(THIS_MODULE, "EtherCAT"); 解析模块参数得到MAC地址,保存到数组macs中。 for (i = 0; i < master_count; i++) { ret = ec_mac_parse(macs[i][0], main_devices[i], 0); if (i < backup_count) { ret = ec_mac_parse(macs[i][1], backup_devices[i], 1); } } 分配master_count个主站对象的内存,调用ec_master_init()初始化这些实例。 if (master_count) { if (!(masters = kmalloc(sizeof(ec_master_t) * master_count, GFP_KERNEL))) { ... } } for (i = 0; i < master_count; i++) { ret = ec_master_init(&masters[i], i, macs[i][0], macs[i][1], device_number, class, debug_level); ... } 2.1 Master Phases igh中,状态机是其核心思想,一切操作基于状态机来执行,对创建的每个EtherCAT主站实例都需要经过如下阶段转换(见图2.3),主站各阶段操作如下: Orphaned phase 此时主站实例已经分配初始化,正在等待以太网设备连接,即还没有与网卡驱动联系起来,此时无法使用总线通讯。 Idle phase 当主站与网卡绑定后,Idle线程ec_master_idle_thread开始运行,主站处于IDLE状态,ec_master_idle_thread主要完成从站拓扑扫描、配置站点地址等工作。该阶段命令行工具能够访问总线,但无法进行过程数据交换,因为还缺少总线配置。 Operation phase 应用程序请求主站提供总线配置并激活主站后,主站处于operation状态,ec_master_idle_thread停止运行,内核线程变为ec_master_operation_thread,之后应用可周期交换过程数据。 具体的后面会说到。 2.2 数据报与状态机 继续看master初始化代码ec_master_init前,我们先了解数据报与状态机的关系,这对后续理解很有帮助。 数据报 EtherCAT是以以太网为基础的现场总线系统,EtherCAT使用标准的IEEE802.3以太网帧,在主站一侧使用标准的以太网控制器,不需要额外的硬件。并在以太网帧头使用以太网类型0x88A4来和其他以太网帧相区别(EtherCAT数据还可以通过UDP/IP 来传输,本文已忽略),标准的IEEE802.3以太网帧中数据部分为EtherCAT的数据,标准的IEEE802.3以太网帧与EtherCAT数据帧关系如下: EtherCAT数据位于以太网帧数据区,EtherCAT数据由EtherCAT头和若干EtherCAT数据报文组成。其中EtheRCAT头中记录了EtherCAT数据报的长度、和类型,类型为1表示与从站通讯。EtherCAT数据报文内包含多个子报文,每个子报文又由子报文头、数据和WKC域组成。子报文结构含义如下。 整个EtherCAT网络形成一个环状,主站与从站之间是通过EtherCAT数据报来交互,一个EtherCAT报文从网卡TX发出后,从站ESC芯片EtherCAT报文进行交换数据,最后该报文回到主站。网上有个经典的EtherCAT动态图(刷新后动态图重新播放). 认识EtherCAT数据帧结构后,我们看IgH内是如何表示一个EtherCAT数据报文的?EtherCAT数据报文在igh中用对象ec_datagram_t表示。 typedef struct { struct list_head queue; /**< 发送和接收时插入主站帧队列. */ struct list_head sent; /**< 已发送数据报的主站列表项. */ ec_device_index_t device_index; /**< 发送/接收数据报的设备。 */ ec_datagram_type_t type; /**< 帧类型 (APRD, BWR, etc.). */ uint8_t address[EC_ADDR_LEN]; /**< Recipient address. */ uint8_t *data; /**< 数据. */ ec_origin_t data_origin; /**< 数据保存的地方. */ size_t mem_size; /**< Datagram \a data memory size. */ size_t data_size; /**< Size of the data in \a data. */ uint8_t index; /**< Index (set by master). */ uint16_t working_counter; /**< 工作计数. */ ec_datagram_state_t state; /**数据帧状态 */ #ifdef EC_HAVE_CYCLES cycles_t cycles_sent; /**< Time, 数据报何时发送. */ #endif unsigned long jiffies_sent; /**< Jiffies,数据报何时发送. */ #ifdef EC_HAVE_CYCLES cycles_t cycles_received; /**< Time, 何时被接收. */ #endif unsigned long jiffies_received; /**< Jiffies,何时被接收. */ unsigned int skip_count; /**< 尚未收到的重新排队数. */ unsigned long stats_output_jiffies; /**< Last statistics output. */ char name[EC_DATAGRAM_NAME_SIZE]; /**< Description of the datagram. */ } ec_datagram_t; 可以看到上面子报文中各字段大都在ec_datagram_t中有表示了,不过多介绍,其它几个成员简单介绍下, device_index表示这个数据报是属于哪个网卡设备发送接收的,IgH中一个master实例可以使用多个多个网卡设备来发送/接收EtherCAT数据帧,device_index就是表示master下的网络设备的。 data_origin表示每个master管理着多个空闲的ec_datagram_t,这些ec_datagram_t分成了三类,给不同的状态机使用,具体的后文马上会细说,data_origin就是表示这个ec_datagram_t是属于哪类的。 index表示该数据报是EtherCAT数据区的第index个子报文,在master发送一个完整的EtherCAT数据报时,组装以太网数据帧时使用。 data这个指向子报文的数据内存区,由于每个子报文交换数据不同,其大小不同,所以数据区为动态分配,mem_size表示的就是分配的大小。 data_size表示数据报操作的数据大小,比如该数据报用于读从站的某个寄存器,该值就是这个寄存器的大小。 jiffies_sent、jiffies_received、cycles_sent、cycles_received使用不同时钟方式是记录数据帧发送接收时间的,用于统计。 ec_datagram_state_t表示数据报的状态,每个数据报(ec_datagram_t)也是基于状态来处理,有6种状态: EC_DATAGRAM_INIT :数据报已经初始化 EC_DATAGRAM_QUEUED :插入发送队列准备发送 EC_DATAGRAM_SENT :已经发送(还存在队列中) EC_DATAGRAM_RECEIVED:该数据报已接收,并从发送队列删除 EC_DATAGRAM_TIMED_OUT :该数据报发送后,接收超时,从发送队列删除 EC_DATAGRAM_ERROR :发送和接收过程中出错(从队列删除),校验错误、不匹配等。 M位在master发送时组装EtherCAT数据帧时确定,接收时也根据该位判断后面还有没有子报文。 数据报对象初始化由函数ec_datagram_init()完成: void ec_datagram_init(ec_datagram_t *datagram /**< EtherCAT datagram. */) { INIT_LIST_HEAD(&datagram->queue); // mark as unqueued datagram->device_index = EC_DEVICE_MAIN; /*默认主设备使用*/ datagram->type = EC_DATAGRAM_NONE; /*数据报类型*/ memset(datagram->address, 0x00, EC_ADDR_LEN); /*数据报地址清零*/ datagram->data = NULL; datagram->data_origin = EC_ORIG_INTERNAL; /*默认内部数据*/ datagram->mem_size = 0; datagram->data_size = 0; datagram->index = 0x00; datagram->working_counter = 0x0000; datagram->state = EC_DATAGRAM_INIT; /*初始状态*/ #ifdef EC_HAVE_CYCLES datagram->cycles_sent = 0; #endif datagram->jiffies_sent = 0; #ifdef EC_HAVE_CYCLES datagram->cycles_received = 0; #endif datagram->jiffies_received = 0; datagram->skip_count = 0; datagram->stats_output_jiffies = 0; memset(datagram->name, 0x00, EC_DATAGRAM_NAME_SIZE); } 状态机 说完IgH数据报对象,我们来看有限状态机(fsm),有限状态机(fsm):表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。说起状态机,相信大家大学时候都有用过吧,不管是单片机、FPGA,用它写按键、菜单、协议处理、控制器什么的爽的一塌糊涂。其实我们使用的计算机就是本就是基于状态机作为计算模型的,它对数字系统的设计具有十分重要的作用。另外Linux TCP协议也是由状态机实现。 同样igh主站内部机制使用有限状态机来实现,IgH内状态机的基本表示如下: struct ec_fsm_xxx { ec_datagram_t *datagram; /**< 主站状态机使用的数据报对象 */ void (*state)(ec_fsm_master_t *); /**< 状态函数 */ .... }; IgH EtherCAT协议栈几乎所有功能通过状态机实现,每个状态机管理着某个对象的状态、功能实现的状态装换,而这些状态转换是基于EtherCAT数据报来进行的,如状态机A0状态函数填充datagram,经EtherCAT数据帧发出后,经过slave ESC处理,回到网卡接收端接收后,交给状态机A1状态的下一个状态函数解析处理。所以每个状态机内都包含有指向该状态机操作的数据报对象指针datagram和状态执行的状态函数void (*state)(ec_fsm_master_t *); 总结一句话:状态机是根据数据报的状态来执行,每个状态机都需要操作一个数据报对象。 现在知道了状态机与数据报的关系,下面介绍IgH EtherCAT协议栈中有哪些状态机,及状态机使用的数据报对象是从哪里分配如何管理的。 master状态机 前面说到主站具有的三个阶段,当主站与网卡设备attach后进入Idle phase,处于Idle phase后,开始执行主站状态机。 主站状态机包含1个主状态机和许多子状态机,matser状态机主要目的是: Bus monitoring 监控EtherCAT总线拓扑结构,如果发生改变,则重新扫描。 Slave confguration 监视从站的应用程序层状态。如果从站未处于其应有的状态,则从站将被(重新)配置 Request handling 请求处理(源自应用程序或外部来源),主站任务应该处理异步请求,例如:SII访问,SDO访问或类似。 主状态机ec_fsm_master_t结构如下: struct ec_fsm_master { ec_master_t *master; /**< master the FSM runs on */ ec_datagram_t *datagram; /**< 主站状态机使用的数据报对象 */ unsigned int retries; /**< retries on datagram timeout. */ void (*state)(ec_fsm_master_t *); /**< master state function */ ec_device_index_t dev_idx; /**< Current device index (for scanning etc.). */ int idle; /**< state machine is in idle phase */ unsigned long scan_jiffies; /**< beginning of slave scanning */ uint8_t link_state[EC_MAX_NUM_DEVICES]; /**< Last link state for every device. */ unsigned int slaves_responding[EC_MAX_NUM_DEVICES]; /**<每个设备的响应从站数。*/ unsigned int rescan_required; /**< A bus rescan is required. */ ec_slave_state_t slave_states[EC_MAX_NUM_DEVICES]; /**< AL states of responding slaves for every device. */ ec_slave_t *slave; /**< current slave */ ec_sii_write_request_t *sii_request; /**< SII write request */ off_t sii_index; /**< index to SII write request data */ ec_sdo_request_t *sdo_request; /**< SDO request to process. */ ec_fsm_coe_t fsm_coe; /**< CoE state machine */ ec_fsm_soe_t fsm_soe; /**< SoE state machine */ ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */ ec_fsm_change_t fsm_change; /**< State change state machine */ ec_fsm_slave_config_t fsm_slave_config; /**< slave state machine */ ec_fsm_slave_scan_t fsm_slave_scan; /**< slave state machine */ ec_fsm_sii_t fsm_sii; /**< SII state machine */ }; 可以看到,主站状态机结构下还有很多子状态机,想象一下如果主站的所有功能通过一个状态机来完成,那么这个状态机的状态数量、各状态之间的联系会有多恐怖,复杂性级别将会提高到无法管理的水平。为此,IgH中,将EtherCAT主状态机的某些功能用子状态机完成。这有助于封装相关工作流,并且避免“状态爆炸”现象。这样当主站完成coe功能时,可以由子状态机fsm_coe去完成。具体各功能是如何通过状态机完成的,文章后面会介绍。 slave状态机 slave状态机管理着每个从站的状态,所以位于从站对象(ec_slave_t)内: struct ec_slave { ec_master_t *master; /**< Master owning the slave. */ ..... ec_fsm_slave_t fsm; /**< Slave state machine. */ ..... }; struct ec_fsm_slave { ec_slave_t *slave; /**< slave the FSM runs on */ struct list_head list; /**< Used for execution list. */ ec_dict_request_t int_dict_request; /**< Internal dictionary request. */ void (*state)(ec_fsm_slave_t *, ec_datagram_t *); /**< State function. */ ec_datagram_t *datagram; /**< Previous state datagram. */ ec_sdo_request_t *sdo_request; /**< SDO request to process. */ ec_reg_request_t *reg_request; /**< Register request to process. */ ec_foe_request_t *foe_request; /**< FoE request to process. */ off_t foe_index; /**< Index to FoE write request data. */ ec_soe_request_t *soe_request; /**< SoE request to process. */ ec_eoe_request_t *eoe_request; /**< EoE request to process. */ ec_mbg_request_t *mbg_request; /**< MBox Gateway request to process. */ ec_dict_request_t *dict_request; /**< Dictionary request to process. */ ec_fsm_coe_t fsm_coe; /**< CoE state machine. */ ec_fsm_foe_t fsm_foe; /**< FoE state machine. */ ec_fsm_soe_t fsm_soe; /**< SoE state machine. */ ec_fsm_eoe_t fsm_eoe; /**< EoE state machine. */ ec_fsm_mbg_t fsm_mbg; /**< MBox Gateway state machine. */ ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */ ec_fsm_change_t fsm_change; /**< State change state machine */ ec_fsm_slave_scan_t fsm_slave_scan; /**< slave scan state machine */ ec_fsm_slave_config_t fsm_slave_config; /**< slave config state machine. */ }; slave状态机和master状态机类似,slave状态机内还包含许多子状态机。slave状态机主要目的是: 主站管理从站状态 主站与从站应用层(AL)通讯。比如具有EoE功能的从站,主站通过该从站下的子状态机fsm_eoe来管理主站与从站应用层的EOE通讯。 数据报对象的管理 上面简单介绍了IgH内的状态机,状态机输入输出的对象是datagram,fsm对象内只有数据报对象的指针,那fsm工作过程中的数据报对象从哪里分配? 由于每个循环周期都需要操作数据报对象,IgH为减少datagram的动态分配操作,提高主站性能,在master初始化的时候预分配了主站运行需要的所有datagram对象。在master实例我们可以看到下面的数据报对象: struct ec_master { ... ec_datagram_t fsm_datagram; /**< Datagram used for state machines. */ ... ec_datagram_t ref_sync_datagram; /**< Datagram used for synchronizing the reference clock to the master clock.*/ ec_datagram_t sync_datagram; /**< Datagram used for DC drift compensation. */ ec_datagram_t sync_mon_datagram; /**< Datagram used for DC synchronisation monitoring. */ ... ec_datagram_t ext_datagram_ring[EC_EXT_RING_SIZE]; } 这些数据报对象都是已经分配内存的,但由于报文不同,报文操作的数据大小不同,所以datagram数据区大小随状态机的具体操作而变化,在具体使用时才分配数据区内存。 以上数据报对象给状态机使用,别忘了还有过程数据也需要数据报对象,所以IgH中数据报类型分为以下四类: 分为三类(非常重要): 数据报对象 用途 Datagram_pairs 过程数据报 fsm_datagram[] Fsm_master及子状态机专用的数据报对象。 ext_datagram_ring[] 动态分配给fsm_slave及其子fsm。 ref_sync_datagram sync_datagram sync64_datagram sync_mon_datagram 应用专用数据报用于时钟同步。 其中fsm_datagram为master状态机及master下的子状态机执行过程中操作的对象。 ext_datagram_ring[]是一个环形队列,当fsm_slave从站状态机处于ready状态,可以开始处理与slave相关请求,如配置、扫描、SDO、PDO等,这时会从ext_datagram_ring[]中给该fsm_slave分配一个数据报,并运行fsm_slave状态机检查并处理请求。 应用专用数据报用于时钟同步,与时钟强相关,它们比较特殊,它们的数据区大小是恒定的,所以其数据区在主站初始化时就已分配内存,应用调用时直接填数据发送,避免linux的内存分配带来时钟的偏差。 数据报数据区(data)内存通过ec_datagram_prealloc()来分配. int ec_datagram_prealloc( ec_datagram_t *datagram, /**< EtherCAT datagram. */ size_t size /**< New payload size in bytes. */ ) { if (datagram->data_origin == EC_ORIG_EXTERNAL || size <= datagram->mem_size) return 0; ...... if (!(datagram->data = kmalloc(size, GFP_KERNEL))) { ...... } datagram->mem_size = size; return 0; } 数据区的大小为一个以太网帧中单个Ethercat数据报的最大数据大小EC_MAX_DATA_SIZE。 /** Size of an EtherCAT frame header. */ #define EC_FRAME_HEADER_SIZE 2 /** Size of an EtherCAT datagram header. */ #define EC_DATAGRAM_HEADER_SIZE 10 /** Size of an EtherCAT datagram footer. */ #define EC_DATAGRAM_FOOTER_SIZE 2 /** Size of the EtherCAT address field. */ #define EC_ADDR_LEN 4 /** Resulting maximum data size of a single datagram in a frame. */ #define EC_MAX_DATA_SIZE (ETH_DATA_LEN - EC_FRAME_HEADER_SIZE \ - EC_DATAGRAM_HEADER_SIZE - EC_DATAGRAM_FOOTER_SIZE) 由于以太网帧的大小有限,因此数据报的最大大小受到限制,即以太网帧长度 1500 - ethercat头2byte- ethercat子数据报报头10字节-WKC 2字节,如图: 如果过程数据镜像的大小超过该限制,就必须发送多个帧,并且必须对映像进行分区以使用多个数据报。 Domain自动进行管理。 2.3 master状态机及数据报初始化 对状态机及数据报对象有初步认识后,我们回到ec_master.ko模块入口函数ec_init_module()主站实例初始化ec_master_init(),主要完成主站状态机初始化及数据报: // init state machine datagram ec_datagram_init(&master->fsm_datagram); /*初始化数据报对象*/ snprintf(master->fsm_datagram.name, EC_DATAGRAM_NAME_SIZE, "master-fsm"); ret = ec_datagram_prealloc(&master->fsm_datagram, EC_MAX_DATA_SIZE); // create state machine object ec_fsm_master_init(&master->fsm, master, &master->fsm_datagram); /*初始化master fsm*/ 其中ec_fsm_master_init初始化master fsm和子状态机,并指定了master fsm使用的数据报对象fsm_datagram。 void ec_fsm_master_init( ec_fsm_master_t *fsm, /**< Master state machine. */ ec_master_t *master, /**< EtherCAT master. */ ec_datagram_t *datagram /**< Datagram object to use. */ ) { fsm->master = master; fsm->datagram = datagram; ec_fsm_master_reset(fsm); // init sub-state-machines ec_fsm_coe_init(&fsm->fsm_coe); ec_fsm_soe_init(&fsm->fsm_soe); ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe); ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram, &fsm->fsm_change, &fsm->fsm_coe, &fsm->fsm_soe, &fsm->fsm_pdo); ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram, &fsm->fsm_slave_config, &fsm->fsm_pdo); ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); } 初始化外部数据报队列 外部数据报队列用于从站状态机,每个状态机执行期间使用的数据报从该区域分配,下面是初始化ext_datagram_ring中每个结构: for (i = 0; i < EC_EXT_RING_SIZE; i++) { ec_datagram_t *datagram = &master->ext_datagram_ring[i]; ec_datagram_init(datagram); snprintf(datagram->name, EC_DATAGRAM_NAME_SIZE, "ext-%u", i); } 非应用数据报队列链表,如EOE数据报会插入该队列后发送。 INIT_LIST_HEAD(&master->ext_datagram_queue); 同样初始化几个时钟相关数据报对象,它们功能固定,所以数据区大小固定,就不贴代码了,比如sync_mon_datagram,它的作用是用于同步监控,获取从站系统时间差,所以是一个BRD数据报,在此直接将数据报操作偏移地址初始化,使用时能快速填充发送。 ec_datagram_init(&master->sync_mon_datagram); ...... ret = ec_datagram_brd(&master->sync_mon_datagram, 0x092c, 4); 地址 位 名称 描述 复位值 0x092c~0x092F 0~30 系统时间差 本地系统时间副本与参考时钟系统时间值之差 0 31 符号 0:本地系统时间≥参考时钟时间1:本地系统时间<参考时钟时间 0 另外比较重要的是将使用的网卡MAC地址放到macs[]中,在网卡驱动probe过程中根据MAC来匹配主站使用哪个网卡。 for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_MAX_NUM_DEVICES; dev_idx++) { master->macs[dev_idx] = NULL; } master->macs[EC_DEVICE_MAIN] = main_mac; 2.4 初始化EtherCAT device master协议栈主要完成EtherCAT数据报的解析和组装,然后需要再添加EtherNet报头和FCS组成一个完整的以太网帧,最后通过网卡设备发送出去。为与以太网设备驱动层解耦,igh使用ec_device_t来封装底层以太网设备,一般来说每个master只有一个ec_device_t,这个编译时配置决定,若启用线缆冗余功能,可指定多个网卡设备: struct ec_device { ec_master_t *master; /**< EtherCAT master */ struct net_device *dev; /**< 使用的网络设备 */ ec_pollfunc_t poll; /**< pointer to the device's poll function */ struct module *module; /**< pointer to the device's owning module */ uint8_t open; /**< true, if the net_device has been opened */ uint8_t link_state; /**< device link state */ struct sk_buff *tx_skb[EC_TX_RING_SIZE]; /**< transmit skb ring */ unsigned int tx_ring_index; /**< last ring entry used to transmit */ #ifdef EC_HAVE_CYCLES cycles_t cycles_poll; /**< cycles of last poll */ #endif #ifdef EC_DEBUG_RING struct timeval timeval_poll; #endif unsigned long jiffies_poll; /**< jiffies of last poll */ // Frame statistics u64 tx_count; /**< 发送的帧数 */ u64 last_tx_count; /**<上次统计周期发送的帧数。 */ u64 rx_count; /**< 接收的帧数 */ u64 last_rx_count; /**< 上一个统计周期收到的帧数。 */ u64 tx_bytes; /**< 发送的字节数 */ u64 last_tx_bytes; /**< 上一个统计周期发送的字节数。 */ u64 rx_bytes; /**< Number of bytes received. */ u64 last_rx_bytes; /**< Number of bytes received of last statistics cycle. */ u64 tx_errors; /**< Number of transmit errors. */ s32 tx_frame_rates[EC_RATE_COUNT]; /**< Transmit rates in frames/s for different statistics cycle periods. */ s32 rx_frame_rates[EC_RATE_COUNT]; /**< Receive rates in frames/s for different statistics cycle periods. */ s32 tx_byte_rates[EC_RATE_COUNT]; /**< Transmit rates in byte/s for different statistics cycle periods. */ s32 rx_byte_rates[EC_RATE_COUNT]; /**< Receive rates in byte/s for different statistics cycle periods. */ ...... }; 成员*master表示改对象属于哪个master,*dev指向使用的以太网设备net_device,poll该网络设备poll函数,tx_skb[]以太网帧发送缓冲区队列,需要发送的以太网帧会先放到该队里,tx_ring_index管理tx_skb[],以及一些网络统计变量,下面初始化ec_device_t对象: /*\master\master.c*/ for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master); dev_idx++) { ret = ec_device_init(&master->devices[dev_idx], master); if (ret < 0) { goto out_clear_devices; } } /*\master\device.c*/ int ec_device_init( ec_device_t *device, /**< EtherCAT device */ ec_master_t *master /**< master owning the device */ ) { int ret; unsigned int i; struct ethhdr *eth; .... device->master = master; device->dev = NULL; device->poll = NULL; device->module = NULL; device->open = 0; device->link_state = 0; for (i = 0; i < EC_TX_RING_SIZE; i++) { device->tx_skb[i] = NULL; } ...... ec_device_clear_stats(device); ...... for (i = 0; i < EC_TX_RING_SIZE; i++) { if (!(device->tx_skb[i] = dev_alloc_skb(ETH_FRAME_LEN))) { ...... } // add Ethernet-II-header skb_reserve(device->tx_skb[i], ETH_HLEN); eth = (struct ethhdr *) skb_push(device->tx_skb[i], ETH_HLEN); eth->h_proto = htons(0x88A4); memset(eth->h_dest, 0xFF, ETH_ALEN); } ..... } 主要关注分配以太网帧发送队列内存tx_skb[],并填充Ethernet报头中的以太网类型字段为0x88A4,目标MAC地址0xFFFFFFFF FFFF,对于源MAC地址、sk_buff所属网络设备、ec_device_t对象使用的网络设备net_device,将在网卡驱动初始化与master建立联系过程中设置。 2.5 设置IDLE 线程的发送间隔: ec_master_set_send_interval(master, 1000000 / HZ); 根据网卡速率计算: void ec_master_set_send_interval( ec_master_t *master, /**< EtherCAT master */ unsigned int send_interval /**< Send interval */ ) { master->send_interval = send_interval; //发送间隔 us master->max_queue_size = (send_interval * 1000) / EC_BYTE_TRANSMISSION_TIME_NS; master->max_queue_size -= master->max_queue_size / 10; } 100Mbps网卡发送一字节数据需要的时间EC_BYTE_TRANSMISSION_TIME_NS: 1/(100 MBit/s / 8 bit/byte) = 80 ns/byte. 2.6 初始化字符设备 由于主站位于内核空间,用户空间应用与主站交互通过字符设备来交互; 创建普通字符设备,给普通linux应用和Ethercat tool使用。若使用xenomai或RTAI,则再创建实时字符设备,提供给实时应用使用。 ...... master->class_device = device_create(class, NULL, MKDEV(MAJOR(device_number), master->index), NULL, "EtherCAT%u", master->index); ...... #ifdef EC_RTDM // init RTDM device ret = ec_rtdm_dev_init(&master->rtdm_dev, master); ... #endif 到这里明白了IgH中的状态机与数据报之间的关系,主站对象也创建好了,但是主站还没有网卡设备与之关联,主站也还没有工作,下面简单看一下ecdev_offer流程。 关于网卡驱动代码详细解析推荐这两篇文章: Monitoring and Tuning the Linux Networking Stack: Sending Data Monitoring and Tuning the Linux Networking Stack: Receiving Data 3 网卡 网卡probe static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { ...... adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); if (adapter->ecdev) { /*注册打开ec_net设备*/ err = ecdev_open(adapter->ecdev); ..... adapter->ec_watchdog_jiffies = jiffies; } else { /*注册普通网络设备*/ ...... err = register_netdev(netdev); ...... } ...... } 给主站提供网络设备:ecdev_offer 根据MAC地址找到master下的ec_device_t对象 device->dev = net_dev; device->poll = poll; device->module = module; 上面我们只设置了ec_device_t->tx_skb[]中sk_buff的以太网类型和目的地址,现在继续填充源MAC地址为网卡的MAC地址、sk_buff所属的net_device: for (i = 0; i < EC_TX_RING_SIZE; i++) { device->tx_skb[i]->dev = net_dev; eth = (struct ethhdr *) (device->tx_skb[i]->data); memcpy(eth->h_source, net_dev->dev_addr, ETH_ALEN); } 调用网络设备接口打开网络设备 int ec_device_open( ec_device_t *device /**< EtherCAT device */ ) { int ret; ..... ret = device->dev->open(device->dev); if (!ret) device->open = 1; .... return ret; } 当master下的所有的网络设备都open后,master从ORPHANED转到IDLE阶段 int ec_master_enter_idle_phase( ec_master_t *master /**< EtherCAT master */ ) { int ret; ec_device_index_t dev_idx; ...... master->send_cb = ec_master_internal_send_cb; master->receive_cb = ec_master_internal_receive_cb; master->cb_data = master; master->phase = EC_IDLE; /*更新master状态*/ // reset number of responding slaves to trigger scanning for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master); dev_idx++) { master->fsm.slaves_responding[dev_idx] = 0; } ret = ec_master_nrthread_start(master, ec_master_idle_thread, "EtherCAT-IDLE"); .... return ret; } 其中主要设置master发送和接收回调函数,应用通过发送和接收数据时,将通过这两接口直接发送和接收。创建master idle线程ec_master_idle_thread。 4 IDLE阶段内核线程 综上,状态机操作对象是datagram,datagram发送出去后回到主站交给状态机的下一个状态处理,所以主站需要循环地执行状态机、发送EtherCAT数据帧、接收EtherCAT数据帧、执行状态机、发送EtherCAT数据帧、……来驱动状态机运行,这个循环由内核线程来完成。 当主站与网卡绑定后,应用还没有请求主站,主站处于IDLE状态,这时循环由内核线程ec_master_idle_thread来完成,主要完成从站拓扑扫描、配置站点地址等工作。 static int ec_master_idle_thread(void *priv_data) { ec_master_t *master = (ec_master_t *) priv_data; int fsm_exec; #ifdef EC_USE_HRTIMER size_t sent_bytes; #endif // send interval in IDLE phase ec_master_set_send_interval(master, 250000 / HZ); while (!kthread_should_stop()) { // receive ecrt_master_receive(master); /*接收上个循环发送的数据帧*/ ...... // execute master & slave state machines ...... fsm_exec = ec_fsm_master_exec(&master->fsm); /*执行master状态机*/ ec_master_exec_slave_fsms(master); /*为从站状态机分配datagram,并执行从站状态机*/ ...... if (fsm_exec) { ec_master_queue_datagram(master, &master->fsm_datagram); /*将master状态机处理的datagram插入发送链表*/ } // send ecrt_master_send(master); /*组装以太网帧并调用网卡发送*/ sent_bytes = master->devices[EC_DEVICE_MAIN].tx_skb[ master->devices[EC_DEVICE_MAIN].tx_ring_index]->len; up(&master->io_sem); if (ec_fsm_master_idle(&master->fsm)) { ec_master_nanosleep(master->send_interval * 1000); set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); } else { ec_master_nanosleep(sent_bytes * EC_BYTE_TRANSMISSION_TIME_NS); } } EC_MASTER_DBG(master, 1, "Master IDLE thread exiting...\n"); return 0; } 整个过程简单概述如下。 4.1 数据报发送 下面介绍IgH中状态机处理后数据报的发送流程(ecrt_master_send())。 master使用一个链表datagram_queue来管理要发送的子报文对象datagram,需要发送的子报文对象会先插入该链表中,统一发送时,分配一个sock_buff,从datagram_queue上取出报文对象,设置index(index是发送后接收回来与原报文对应的标识之一),将一个个报文对象按EtherCAT数据帧结构填充到sock_buff中,最后通过网卡设备驱动函数hard_start_xmit,将sock_buff从网卡发送出去。 4.2 数据报接收 接收数据时,通过网卡设备驱动ec_poll函数取出Packet得到以太网数据,然后解析其中的EtherCAT数据帧,解析流程如下: 得到子报文index,遍历发送链表datagram_queue,找到index对应的datagram。 将子报文数据拷贝到datagram数据区。 将以太网帧内子报文中的WKC值复制到datagram中的WKC。 将datagram从链表datagram_queue删除。 根据子报文头M位判断还有没有子报文,有则跳转1继续处理下一个子报文,否则完成接收。 接收完成后,进入下一个循环,内核线程运行状态机或周期应用进行下一个周期,处理接收的Ethercat报文。 先简单介绍到这,敬请关注后续文章。。。。 作者:wsg1100 出处:http://www.cnblogs.com/wsg1100/ 本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 posted @ 2021-02-22 23:39 沐多 阅读(9835) 评论(6) 编辑 收藏 举报 会员力量,点亮园子希望 刷新页面返回顶部 公告 Copyright © 2024 沐多 Powered by .NET 8.0 on KubernetesEtherCAT学习之路——概述 - 知乎
【EtherCAT】4.实现一个成熟的从站 - 知乎
【原创】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 - 沐多 - 博客园
EtherCAT主站开发“利器”——EC-Master软件协议栈 - 知乎
机械手浅谈系列之---ethercat主站开发和实时操作系统_acontis ethercat主站费用-CSDN博客
>EtherCAT主站方案_哔哩哔哩_bilibili
[FPGA]FPGA设计EtherCAT主站的方法和常见问题_ethercat fpga 延迟-CSDN博客
>EtherCAT从站设计开发教程_哔哩哔哩_bilibili
机械手浅谈系列之---ethercat主站开发和实时操作系统_acontis ethercat主站费用-CSDN博客
>EtherCAT学习之路——概述 - 知乎
机械手浅谈系列之---ethercat主站开发和实时操作系统_acontis ethercat主站费用-CSDN博客
>【原创】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 - 沐多 - 博客园