1、TwinCAT 设置成混杂模式
保存后重启TwinCAT。
此时我的设备无法进入OP状态,WireShark也没有任何数据。
2、TwinCAT无法进入OP状态,如何再次进入到OP状态?
①点击绿色按钮后,点击弹窗的确定按钮,消除弹窗,此时仍无法进入OP状态
②重新加载设备
选择是。
可以了。
3、EtherCAT数据帧初步分析
EtherCAT采用标准的IEEE 802.3以太网帧,帧类型为0x88A4。EtherCAT帧是由EtherCAT帧头和最大有效长度为1498字节的EtherCAT报文组成。
Ether CAT 通信帧结构采用标准以外网帧结构,是通过对传统协议进行修改形成,在标准协议里插入专用帧类型的 Ether CAT 数据帧,也就是说,标准协议的数据内容就是 Ether CAT 的数据帧。专用帧类型用 0x88A4 进行标记。也因为如此,Ether CAT 通信可被标准的以太网通信完全兼容。Ether CAT 数据帧的报文结构如图。
两个对比学习。
Ether CAT 的子报文主要由三个部分组成,分别是子报文头、子报文数据和工作计数器 WKC(Working Counter)。工作计数器 WCK 存在的目的是判断子报文是否被从站读取或插入过,通过记录从站对子报文进行操作的次数来实现。
Ether CAT 子报文的结构定义见表 2-2。子报文包含命令、索引、地址区长度、标志位、状态位、数据区和工作计数器等 7 个部分。报文中的命令一般是 8 位,用来表示报文寻址方式和读写操作;索引就是帧编码;从站通信地址是地址去中的32位二进制码;标志位M是后续报文的表示,如果 Ether CAT 数据帧有多个子报文,除最后一个子报文的标志位外,其他子报文的标志位都需要被职位;子报文数据属于用户自定义部分,长度一般是 1486个 byte。
EtherCAT 子报文所有的服务都是以主站操作捎述的 。 数据链路!去规定了从站内部物理存储、读写和交换(读取并马上写入〉数据的服务。读写操作和寻址方式共同决定了子报文的通信服务类型,由子报文头中的命令字节表示。EtherCAT 支持的所有命令如表2.4所列 。
先储备上述基础知识,报文的分析总是枯燥和快乐的,快乐的是从无知到懵懵懂懂。
看抓到的第一帧数据,29字节。
①好理解的数据
6字节(010105010000)目标mac;
6字节(000000000000)源mac;
0x88A4(88a4); …… 目前总计14字节
EtherCAT frame header(16bit,2字节)
.... .000 0000 1101 = Length: 0x00d …… 11位
.... 0... .... .... = Reserved: Valid (0x0) …… 1位
0001 .... .... .... = Type: EtherCAT command (0x1) …… 4位
②子报文
EtherCAT datagram(s): 'BWR': Len: 1, Adp 0x0, Ado 0x101, Wc 0
EtherCAT datagram: Cmd: 'BWR' (8), Len: 1, Adp 0x0, Ado 0x101, Cnt 0
Header
Cmd : 8 (Broadcast Write)
Index: 0x80
索引:80 BWR命令下每发出1条子报文,索引会加1,范围在0x80~0xff
Slave Addr: 0x0000
Offset Addr: 0x0101
地址区: 00 00 01 01 除逻辑寻址命令外,地址区会拆分成Slave Addr 和 Offset Addr,也就是Slave Addr:0x0000,Offset Addr:0x0101,注意一下,这是小端模式,要怎么读你懂的;如果是逻辑寻址,地址区就只有一个32位的 Log Addr:0x 01010000。(我还看不懂…)
Length : 1 (0x1) - No Roundtrip - Last Sub Command
.... .000 0000 0001 = Length: 1
..00 0... .... .... = Reserved: Valid (0)
.0.. .... .... .... = Round trip: Frame is not circulating
0... .... .... .... = Last indicator: Last EtherCAT datagram
长度:0100 报文数据区长度,小端模式,正确排序是0x0001,将它扩写成二进制:
0000 0000 0000 0001;
把无关的位用*代替:
0*** **** **** ****最高位,就是帧结构里的M,为0表示只有一帧,为1表示后续还有后续报文;
*000 0*** **** ****高2、3、4位是保留位,但实际情况下,使用wireshark解析,高第二位的定义是.0.. .... .... .... = Round trip: Frame is not circulating;
**** *000 0000 0001剩余的低11位是数据长度。
Interrupt: 0x0000
状态位:0000中断到来标志
ESC Ctrl (0x101): 0x00, Port 0: Auto loop, Port 1: Auto loop, Port 2: Auto loop, Port 3: Auto loop
.... ..00 = Port 0: Auto loop (0x0)
.... 00.. = Port 1: Auto loop (0x0)
..00 .... = Port 2: Auto loop (0x0)
00.. .... = Port 3: Auto loop (0x0)
数据:00 报文结构,用户定义
Working Cnt: 0
WKC:00 WKC了子报文被从站操作的次数,主站为每个通信服务子报文设置预期的WKC。发送子报文中的工作计数器初值为0,子报文被从站正确处理后,工作计数器的值将增加一个增量,主站比较返回子报文中的WKC和预期WKC来判断子报文是否被正确处理。WKC由ESC在处理数据帧的同时进行处理,不同的通信服务对WKC的增加方式不同。