转自:https://blog.csdn.net/zh_666888/article/details/111795364
新的一篇文章,开始讲下一个点——过程数据。过程数据,顾名思义,就是一直循环传输的数据,在整个过程中不间断的传输,其每次传输的时间称为同步周期。这点类似于Ethercat中的PDO数据,而下下篇将要讲到的非周期数据和Ehtercat的SDO通道相似,或许各种不同的协议在形式上或者服务模式下是高度相似的。
过程数据,在整个链路上循环传输,每一台从站都与主站之间有着相关的交互连接,当网络中存在多个从站,可想而知,数据量将会是庞大的,数据量就像路上的汽车,有限的带宽是马路,过多的汽车就像早高峰那样,必然引起堵车,同样的网络中也会阻塞,或者导致网络负载过高。对此,我们国家比较喜欢建高架,变着花样的增大马路容量。而在现成的工业网络中是很难实现的,那意味着不兼容,意味着高成本。所以Profinet,采用减小单个数据包实现,保持马路容量不变,减小汽车体积。减少的东西并不是直接删掉了,如果这样就没有存在的意义了,就像大客车从50座减小为2座,那还搞什么运营不是?Profinet的实现其实与TCP相似,都是对通信的双方进行握手,然后保存双方最初交换的信息,后面可以循环传送数据了,也就是基本都是PZD的数据,都是干货,如图1所示。这是一种以空间换带宽,这种握手数据必将占用主站内存,所以有限的内存小,主站匹配的从站都是固定的,当然不是唯一因素。
图1 RT过程数据
讲到过程数据就不得不提一下全同步,过程数据的两种传输模式。从字面意思就是,IRT比RT传输的更稳定,时序处理更可靠。提到这里必然会看到下面图2,这是经典的一张描述PROFINET网络层次,这张图有点不全,缺少了IRT,IRT在2 RT并列,是属于链路层的一种,中间和RT一样,直接跨到应用层,不经过网络层,会话层,表示层,尽可能提高传输效率。为了保证IRT专用车道,在芯片的硬件层面需要开辟独立的数据通道,以保证其不受其他数据的影响,RT和普通以太网数据包共用传输通道带宽。
图2 PROFINET结构图
下面就IRT模式下的过程数据传输做一下帧的分析。之前提到过,过程数据的传输为了减少不必要的传递数据,所以在最初的时候需要进行握手—建立连接,然后双方互通Input和Output数据结构,供后续识别。这里就牵扯到AR(Application Relation)和CR(Commucation Relation),如果有机会再讲一下这部分知识点,它应该属于PLC启动过程中的必要内容,首先确定AR,CR的内容就跟着确定了,包括连接建立的超时处理,AR确定方式,CR传输过程的等都放到《PLC启动过程》一文中,前提是我有机会写这篇。
图3 Connect帧
如图3所示,找到最初的建立连接的地方,这个帧的抓取最简单的情况就是PLC上电的时候抓取,过程中我尝试制造断线等都不会再重建,理论上重新下载组态也会重建这个连接。把294帧数据展开,如图4所示,内容有点长,这里就直接看到重点的地方,我们只看InputCR。再Input CR中有两个API,一个为0x0,另一个是0x3a00。API是AP的标识,AP(Application Process)是一个完整的应用过程划分的每一小块的标识。一个应用过程涉及众多设备和功能,所以划分的应用过程分布在不同的设备上,遍布网络。AP-0是缺省的,用于编制应用过程,这个用做设备管理。其他的AP号是由Profidrive行规进行分配。在每一个AP下面会有Slot和SubSlot,大家习惯的成为“槽”和“子槽”,(ps:我一直不习惯这么叫,太难听),在API-0下带着的也是缺省的槽号。0号槽下面的0x8000~0x8002,属于专用子槽,能且仅能出现在哎0号API下,作为接口出现,0x80xx定义IP地址和DNS名称,用于设备远程访问调用。0x XX00~02是表示端口的,最大可以表示到255号。
图4 InputCR
接着API 0,下面就是API-0x3a00,这里的API由行规定义,其中PROfidrive强制为0x3A00。Profidrive定义了运动控制相关内容,当然也包括IO等。所以在这个API下定义的就是我们的报文。槽1,子槽1用于基本参数访问通道,如图7所示,为GSD文件中的定义。 子槽3是特定报文。知道了具体意义,下一步就是分析报文内容,在一连串的数据中要想找到对应的内容就离不开Offset,偏移量指示其距离原始点的位置。结合图4,图5,图6,我这里画出如下表所示。
API |
Identify |
Slot |
Subslot |
Offset |
Properties |
Length |
0 |
2 |
0 |
1 |
0 |
0 |
0 |
0 |
3 |
0 |
0x8000 |
1 |
0 |
0 |
0 |
4 |
0 |
0x8001 |
2 |
0 |
0 |
0 |
5 |
0 |
0x8002 |
3 |
0 |
0 |
0x3A00 |
0xFFFF |
1 |
1 |
4 |
0 |
0 |
0x3A00 |
0x1389 |
1 |
2 |
5 |
0 |
0 |
0x3A00 |
0x69 |
1 |
3 |
6 |
3 |
20 |
0x3A00 |
0x69 |
1 |
3 |
27 |
IOCS |
图5 API:0的展开
图6 API:0x3a00展开
图7 GSD基本参数通道定义
如表1所示,我们获得了在建立连接时,其Input CR的内容,从表中可以看到各通道的偏移量。这里按如图8所示,通过Wireshark抓取的一帧数据。因为用的抓包工具,这里看到的时广播地址回给PLC的,可以先忽略。如表2为过程数据的帧结构,上面洋洋洒洒的写了五六页,仅仅针对于C_SDU字段的内容解读。根据图8的数据,Type =0x8892,Frame ID= 0x0100,0x0100是专门用于RT_CLASS3的帧ID,所以也可以确认这是一帧IRT帧。接着都是数据0x80,这个用于对长度为0的确认标识,有效报文的值为0340 0000 0000 3010 11CF 0000 0000 075A 0000 0000,后面接着又是其他数据。
DST |
SRC |
VLAN |
Type |
Frame ID |
C_SDU |
APDU |
图8 IRT帧数据
以上就是过程数据的解析过程,这里忽略了IOCS和IOPS,大家有兴趣可以看一下,主要用作数据可用性的确认(Good or Bad),在PLC 300/400常见,现在博图封装了功能块,很多都隐藏到里面判断,所以无需知道这两个意思也可以看到数据传输状态,披着羊皮的狼而已。欢迎评论区共同交流。附:遥远的星星 https://blog.csdn.net/zh_666888/