EtherCAT笔记(四)——EtherCAT数据帧结构

        EtherCAT数据包含2B的数据头和44~1948B的数据区。数据区由多个子报文组成。由于EtherCAT本身是通过以太网数据帧的形式传输,因此其协议帧中会携带以太网的帧头。

 其中,解释如下:

(1)以太网数据帧头:EtherCAT协议基于以太网数据帧形式传输,携带以太网数据帧头包含目的地址6 Bytes, 源地址6 Bytes和基于IEEE 802.3的帧类型0x88A4,长度为2 Bytes。

(2)目的地址:接收方的MAC地址,总长度6 Bytes, 48 bits.

(3)源地址:发送方的MAC地址,总长度 6 Bytes, 48 bits.

Mac地址:通常是48位长,格式为XX:XX:XX:XX:XX:XX,其中XX是十六进制数字

// -------------------------------------------------------------------------------
// 常用MAC地址定义
// -------------------------------------------------------------------------------
// 广播地址
const ETHERNET_ADDRESS_LEN BroadcastEthernetAddress = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
// 第一个广播地址
const ETHERNET_ADDRESS FirstMulticastEthernetAddress = {0x01, 0, 0x5e, 0, 0, 0};
// 空MAC地址
const ETHERNET_ADDRESS NullEthernetAddress = { 0, 0, 0, 0, 0, 0 };
// --------------------------------------------------------------------------------
// 以太网数据帧头的数据结构定义
// --------------------------------------------------------------------------------
typedef struct TETHERNET_FRAME
{ETHERNET_ADDRESS	Destination;	// 目的地址ETHERNET_ADDRESS	Source;			// 源地址USHORT				FrameType;		// 主机字节顺序
}ETHERNET_FRAME, *PETHERNET_FRAME;

 (4)帧类型:帧类型根据标准定义有不同类型,其中EtherCAT固定使用0x88A4。

#define ETHERNET_FRAME_TYPE_ECAT	0x88A4		// EtherCAT数据帧的以太类型
#define ETHERNET_MAX_FRAME_LEN		1518		// 以太网数据帧的最大长度, 6+6+2+2+1498+4

 (5)EtherCAT数据由EtherCAT数据头和EtherCAT数据区组成。

 (6)EtherCAT头由长度、保留位和类型组成。其中长度表示EtherCAT数据区长度,即所有子报文长度总和;类型中,1表示与从站通信,其余数据保留。

// --------------------------------------------------------------------------------
// EtherCAT数据头定义
// --------------------------------------------------------------------------------
typedef struct TETYPE_88A4_HEADER
{USHORT Length : 11;		// 后续数据长度USHORT Reserved : 1;	// 保留USHORT Type : 4;		// 由ETYPE_88A4_TYPE_xxx定义
}ETYPE_88A4_HEADER, *PETYPE_88A4_HEADER;
#define ETYPE_88A4_HEADER_LEN	sizeof(ETYPE_88A4_HEADER)
// --------------------------------------------------------------------------------
// EtherCAT 数据帧类型定义
// --------------------------------------------------------------------------------
#define		ETYPE_88A4_TYPE_ECAT		1		// ECAT header follows
#define		ETYPE_88A4_TYPE_ADS			2		// ADS header follows
#define		ETYPE_88A4_TYPE_IO			3		// IO
#define		ETYPE_88A4_TYPE_NV			4		// Network Variables
#define		ETYPE_88A4_TYPE_CANOPEN5	5		// ETHERCAT_CANOPEN_HEADER follows

 (7)EtherCAT数据区由多个子报文组成,子报文中包含子报文头、子报文数据和工作计数器WKC。

 (7.1) 命令:寻址方式和读写方式定义。

// --------------------------------------------------------------------------------
// EtherCAT 命令类型定义,寻址方式将在下一节做介绍
// -------------------------------------------------------------------------------- 
typedef enum
{EC_CMD_TYPE_NOP = 0,   // 没有操作EC_CMD_TYPE_APRD = 1,  // 主站使用顺序寻址在从站中*读取*一定长度的数据EC_CMD_TYPE_APWR = 2,  // 主站使用顺序寻址在从站中*写入*一定长度的数据EC_CMD_TYPE_APRW = 3,  // 主站使用顺序寻址与从站*交换*数据EC_CMD_TYPE_FPRD = 4,  // 主站使用设置寻址与在从站中*读取*一定长度的数据EC_CMD_TYPE_FPWR = 5,  // 主站使用设置寻址与在从站中*写入*一定长度的数据EC_CMD_TYPE_FPRW = 6,  // 主站使用设置寻址与从站*交换*数据EC_CMD_TYPE_BRD = 7,   // 主站从所有从站的物理地址读取数据并做逻辑或EC_CMD_TYPE_BWR = 8,   // 主站广播写入所有从站EC_CMD_TYPE_BRW = 9,   // 与所有从站交换数据,对读取的数据做逻辑或EC_CMD_TYPE_LRD = 10,  // 主站使用逻辑寻址在从站*读取*一定长度的数据EC_CMD_TYPE_LWR = 11,  // 主站使用逻辑寻址在从站*写入*一定长度的数据EC_CMD_TYPE_LRW = 12,  // 主站使用逻辑寻址与从*站交*换数据EC_CMD_TYPE_ARMW = 13, // 由从站读取数据,并写入后所有从站地址相同EC_CMD_TYPE_EXT = 255, // 由从站读取数据,并写入后所有从站地址相同
}EC_CMD_TYPE;

 (7.2)索引:帧编码。

// --------------------------------------------------------------------------------
// EtherCAT 数据帧INDEX定义
// -------------------------------------------------------------------------------- 
#define EC_HEAD_IDX_ACYCLIC_MASK 0x80
#define EC_HEAD_IDX_SLAVECMD	 0x80
#define EC_HEAD_IDX_EXTERN_VALUE 0xFF

 (7.3) 地址区:从站地址

 (7.4) 长度:报文数据区长度

 (7.5) R:保留位

 (7.6)M:后续报文标志

 (7.7)状态位:中断到来标志

 (7.8) 数据区:子报文数据结构定义

 (7.9) WKC:工作计数器,用于记录子报文被从站操作的次数。子报文每次被从站正确处理后WKC增加一个量。

为使更清楚的认识EtherCAT数据帧结构,以下贴上Ethernet数据帧结构图作为对比。

 

!图转自: https://www.cnblogs.com/qishui/p/5437301.html

!图转自 以太网帧结构-CSDN博客 

其中可以看出,Ethernet的帧结构与EtherCAT帧结构的异同。去除Ethernet前导码部分,其中帧类型部分EtherCAT协议定义成了0x88A4。对于IP数据区,EtherCAT做出与以太网协议帧有主要差异的定义,这部分的原因是基于在这样一个系统中传输率的考虑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经典神经网络(12)Transformer代码详解及其在Multi30k数据集上的训练

经典神经网络(12)Transformer代码详解及其在Multi30k数据集上的训练 论文链接:https://arxiv.org/pdf/1706.03762v2 原理可以参考:Self-Attention和Transformer 网络架构图如下: 1 Transformer编码器模块 1.1 Embedding位置编码 在实际…

【AI大模型】GPTS 与 Assistants API

前言 2023 年 11 月 6 日,OpenAI DevDay 发表了一系列新能力,其中包括:GPT Store 和 Assistants API。 GPTs 和 Assistants API 本质是降低开发门槛 可操控性和易用性之间的权衡与折中: 更多技术路线选择:原生 API、…

6.二叉树.题目1

6.二叉树.题目 题目1.翻转二叉树2.对称二叉树3.二叉树的最大深度4.二叉树的最小深度5.完全二叉树的节点个数6.平衡二叉树7.二叉树的所有路径8.左叶子之和 总结 题目 1.翻转二叉树 (题目链接) 直观的思路是就把每一个节点的左右孩子交换一下就可以了, 深度优先-递归…

ArcGIS Pro SDK (六)CoreHost

核心主机 环境:Visual Studio 2022 .NET6 ArcGIS Pro SDK 3.0 1 初始化核心主机 using ArcGIS.Core.Data; //必须引用ArcGIS.CoreHost.dll using ArcGIS.Core.Hosting;class Program {//[STAThread] 必须出现在应用程序入口点上[STAThread]static void Main(stri…

艺术与科技的融合:AI绘画工具的革命性影响*

在艺术的长河中,人类一直是创造美的主体。然而,随着人工智能技术的飞速发展,AI绘画工具的出现,正在重新定义艺术创作的边界。这些工具不仅能够模仿传统艺术风格,还能够创造出前所未有的视觉体验,引发人们对…

stm32学习笔记---TIM输出比较(理论部分)

目录 TIM简介 定时器类型 基本定时器的结构图 时基单元 预分频器 计数器 自动重装寄存器 主模式触发DAC的功能 通用定时器的结构图 计数器的计数模式 内外时钟源选择和主从触发模式的结构 外部时钟模式2 外部时钟模式1 其他部分 输出比较电路 输入捕获电路 高…

深度测试中的隐藏面消除技术

by STANCH 标签:#计算机图形学 #深度测试 #深度测试 #隐藏面消除 1.概述 根据我们的日常经验,近处的物体会挡住后面的物体,在三维场景中通常通过深度缓冲来实现这样的效果。深度缓冲记录着屏幕对应的每个像素的深度值。模型一开始所在的局部…

Pytorch读书笔记:PyTorch模型训练实用教程

文章目录 饭不能不吃,书也不能不看。本文为《PyTorch模型训练实用教程——余霆嵩》读书笔记目录: 大佬github地址:点击跳转

【Three】Three js有哪些优势和不足

Three.js 的优势和不足可以总结如下: 优势: 易于使用:Three.js 封装了 WebGL 的底层复杂性,提供了简洁而强大的 API,使得开发者能够更快速地学习和使用 3D 图形技术。 功能丰富:支持多种几何体、材质、贴…

zerotier-one自建根服务器方法三

一、简介 zerotier-one免费账户有25设备的限制,如果自己的设备多了就需要付费。不过zerotier-one是开源软件,我们可以自己建立根服务器,不用付费速度还很快。 今天接着上一篇文章继续写。 二、准备工作 准备一个有公网IP的云主机。 要稳…

PostgreSQL逻辑备份-pg_dump

1.pg_dump备份恢复 pg_dump 是一个逻辑备份工具。使用 pg_dump 可以在数据库处于使用状态下进行一致 性的备份, 它不会阻塞其他用户对数据库的访问 。 一致性备份是 pg_dump 开始运行时,给数据库打了一个快照,且在 pg_dump 运行过程 中发生…

我对ChatGPT-5的期待

在科技飞速发展的今天,人工智能(AI)已经成为我们生活中不可或缺的一部分。尤其是近年来,随着ChatGPT等先进AI模型的推出,我们见证了AI技术在智能水平上的巨大飞跃。作为这一领域的最新成果,GPT-5的即将发布…

addresstool解决了地址方面什么问题

Addresstool 主要解决以下与地址处理相关的挑战: 地址标准化: 它能够将各种非标准化或随意书写的地址信息转换为统一、规范的格式。这包括纠正行政区划名称、标准化道路名称等,确保所有地址按照既定规则表达,便于后续的数据分析和处理。 地址…

在C++、动态库、窗体应用程序中,表示圆周率Π=3.1415926...

一、C .h #define _USE_MATH_DEFINES #include "math.h".cpp Math::PI;//在.cpp文件中正常使用二、动态库 生成dll:文件–新建–项目–其他语言–Visual Basic–类库–名称–ClassLibrary1, Classbrary1成功生成解决方案,则会自…

2005年下半年软件设计师【上午题】试题及答案

文章目录 2005年下半年软件设计师上午题--试题2005年下半年软件设计师上午题--答案 2005年下半年软件设计师上午题–试题 2005年下半年软件设计师上午题–答案

解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)

错误消息 ssh: connect to host IP port 22: Connection timed out 指出 SSH 客户端尝试连接到指定的 IP 地址和端口号(默认 SSH 端口是 22),但是连接超时了。这意味着客户端没有在预定时间内收到来自服务器的响应。 可能的原因 SSH 服务未…

数据库-索引与视图-视图的定义与操纵

创建视图: CREATE [OR REPLACE] [ALGORITHM {UNDEFINED | MERGE | TEMPTABLE}]VIEW view_name [(column_list)]AS select_statement[WITH [CASCADED | LOCAL] CHECK OPTION] OR REPLACE:表示替换已有视图; ALGORITHM:表示视图选…

【LinuxC语言】详解TCP/IP

文章目录 前言TCP与UDP协议的介绍TCP协议流式传输TCP的三次握手连接TCP的四次挥手连接断开总结前言 在我们的日常生活中,无论是浏览网页,还是发送电子邮件,甚至是在线视频聊天,都离不开网络通信。而在网络通信中,TCP和UDP协议起着至关重要的作用。本文将以通俗易懂的语言…

C语言---C指针+ASCII码

内存地址:内存中每个字节单位都有一个编号(一般用十六进制表示) 存储类型 数据类型 *指针变量名;int *p; //定义了一个指针变量p,指向的数据是int类型的。访问指针所指向空间的内容用取内容运算符* &:取地址符&am…

LeetCode —— 只出现一次的数字

只出现一次的数字 I 本题依靠异或运算符的特性&#xff0c;两个相同数据异或等于0&#xff0c;数字与0异或为本身即可解答。代码如下: class Solution { public:int singleNumber(vector<int>& nums) {int ret 0;for (auto e : nums){ret ^ e;}return ret;} };只出…