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.翻转二叉树 (题目链接) 直观的思路是就把每一个节点的左右孩子交换一下就可以了, 深度优先-递归…

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

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

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

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

我对ChatGPT-5的期待

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

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 服务未…

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;} };只出…

数据模型(models)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 &#xff08;1&#xff09;在App中添加数据模型 在app1的models.py中添加如下代码&#xff1a; from django.db import models # 引入django.…

Qt开发 | Qt界面布局 | 水平布局 | 竖直布局 | 栅格布局 | 分裂器布局 | setLayout使用 | 添加右键菜单 | 布局切换与布局删除重构

文章目录 一、Qt界面布局二、Qt水平布局--QHBoxLayout三、Qt竖直布局四、Qt栅格布局五、分裂器布局代码实现六、setLayout使用说明七、布局切换与布局删除重构1.如何添加右键菜单2.布局切换与布局删除重构 一、Qt界面布局 Qt的界面布局类型可分为如下几种 水平布局&#xff08;…

谐波减速器行业发展速度有望加快 工业机器人领域为其最大需求端

谐波减速器行业发展速度有望加快 工业机器人领域为其最大需求端 谐波减速器指通过增大转矩、降低转速等方式实现减速目的的精密传动装置。谐波减速器具有轻量化、体积小、承载能力大、精度高、可靠性高、运行噪音小等优势&#xff0c;广泛应用于工业机器人、半导体制造、精密医…

AWS中国云配置强制MFA策略后导致AWS CLI和IDEA中无法使用问题

问题 之前的文章《AWS中国IAM用户强制使用MFA》&#xff0c;启用必须使用MFA策略才能使用AWS服务。但是&#xff0c;开启之后&#xff0c;遇到了本地开发环境的IDEA和AWS CLI不能正常调用ssm的配置中心问题。 解决思路 在本地配置文件中&#xff0c;配置使用能够正常使用ssm…

web开发前后端分离

文章目录 1.广义上的前后端分离 1.广义上的前后端分离 优点&#xff1a; 1.前后端分离&#xff0c;便于后期维护;2.前端服务器只需要返回静态界面&#xff0c;后端服务器只提供增删查改的数据返回&#xff0c;把数据的转换逻辑的处理压力转移到了客户端;

MySQL 8版本的新功能和改进有哪些?(MySQL收藏版)

目录 1. 简单介绍 2. 发展历史 3. MySQL 8产品特性 4. 数据库性能重点分析 1. 原生 JSON 支持改进 2. 隐式列优化 3. 改进的查询优化器 4. 并行查询 5. 分区表改进 MySQL 是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典公司 M…

了解SD-WAN与传统WAN的区别

近年来&#xff0c;许多企业选择了SD-WAN作为他们的网络解决方案。云基础架构的SD-WAN不仅具备成本效益&#xff0c;而且提供更安全、更可靠的WAN连接&#xff0c;有助于实现持续盈利。客户能够更好地控制他们的网络&#xff0c;个性化定制且无需额外成本。 那么&#xff0c;为…

服务器数据恢复—raid故障导致部分分区无法识别/不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌DL380服务器中3块SAS硬盘组建了一组raid。 服务器故障&#xff1a; RAID中多块磁盘出现故障离线导致RAID瘫痪&#xff0c;其中一块硬盘状态指示灯显示红色。服务器上运行的数据库在D分区&#xff0c;备份文件存放在E分区。由于RAID瘫…

[信号与系统]模拟域中的一阶低通滤波器和二阶滤波器

前言 不是学电子出身的&#xff0c;这里很多东西是问了朋友… 模拟域中的一阶低通滤波器传递函数 模拟域中的一阶低通滤波器的传递函数可以表示为&#xff1a; H ( s ) 1 s ω c H(s) \frac{1}{s \omega_c} H(s)sωc​1​ 这是因为一阶低通滤波器的设计目标是允许低频信…

05-java基础——循环习题

循环的选择&#xff1a;知道循环的次数或者知道循环的范围就使用for循环&#xff0c;其次再使用while循环 猜数字 程序自动生成一个1-100之间的随机数&#xff0c;在代码中使用键盘录入去猜出这个数字是多少&#xff1f; 要求&#xff1a;使用循环猜&#xff0c;一直猜中为止…