解密PROFINET循环过程数据

过程数据会在IO控制器与IO设备之间周期性通信,如何解读这些周期性数据呢?本文给出了答案,并且通过Wireshark软件进行解析。

PROFINET过程数据报文结构

PROFINET报文遵循IEEE 802.3以太网报文结构,由目标地址、源地址、VLAN、帧类型、FrameId、C_SDU和APDU状态组成。IO控制器和IO设备发送数据时会包含2字节的VALN标签,而交换机在转发数据时会去掉VLAN标签。以太网报文(包含VLAN)最小长度为64字节,其中的C_SDU最小长度应该为40字节,所以如果实际数据组成不到40字节,会用0填充;而ADPU为数据状态,包含循环计数(Cycle Counter)和其他状态字节。

过程数据报文的结构

过程数据报文的数据域为C_SDU,也就是客户端/服务器数据单元(Client_Server Data Unit),通常由若干对象组成,分IO数据对象和IOCS:

  • IO数据对象:IO数据对象由子模块的过程数据及其IOPS组成,IOPS通常为1字节
  • IOCS对象:只包含子模块的IOCS,通常为1字节

C_SDU数据域结构

不过不同的子模块数据在C_SDU数据域的具体位置,也就是数据偏移,则是在启动时通过RPC连接请求进行设置,也就是参数化的过程。而在C_SDU数据域的对象之间有时会插入一些填充字节,以下举个例子来说明。

示例

过程数据的详细分析如下,该报文为一条输入IOCR。正如解读密文电报需要借助密码本,分析过程数据报文的密码本来自于启动时的RPC连接服务。

RPC连接服务的过程包含一些PNIO-CM报文的通信,下图为Wireshark对一帧PNIO-CM报文的分析,报文的数据由不同的块(Block)组成,其中红色标记的块(IOCRBlockReq)描述了IOCR,黄色标记的块(ExpectedSubmoduleBlockReq)描述了API及其子模块。

RPC连接请求报文

接下来对IOCRBlockReq进行分析,可以得到FrameID和数据部分在C_SDU数据域中是如何组成的,也就是过程数据大小和数据偏移,着重分析输入IOCR。

输出数据对应输入IOCRBlockReq,其中分配的FrameID为0x8000;

输入IOCR的IOCR块请求

通过分析上图所示的输入IOCRBlockReq,可以得出一帧输入过程数据报文中的C_SDU将包含了以下部分,并且每个部分在C_SDU的偏移:

C_SDU地址偏移 类型 API 槽Slot 子槽Subslot 数据长度 C_SDU长度
0 IO Data 0 0x0001 0x0001
17 IO Data 0 0x0000 0x0001
18 IO Data 0 0x0000 0x8000
19 IO Data 0 0x0000 0x8001
20 IO Data 0 0x0000 0x8002
21 IOCS 0 0x0002 0x0001 -

分析组成C_SDU的每个数据来源的子模块的信息,得出每个组成部分的数据大小和数据偏移,先从第一个子模块信息(黄色框中的Expected Submodule Block)开始:

第一个子模块信息

子模块属于API0和槽0,包含4个子模块,每个子模块包含的子模块号、子槽、数据长度、IOCS长度、子模块属性及其描述,比如说是输入还是输出数据,有的子模块的数据长度可能为0字节。

C SDU Offset Kind Api Slot Subslot Length of Data Length of Item
0 IO Data 0 0x0001 0x0001
17 IO Data 0 0x0000 0x0001 0 0 + 1
18 IO Data 0 0x0000 0x8000 0 0 + 1
19 IO Data 0 0x0000 0x8001 0 0 + 1
20 IO Data 0 0x0000 0x8002 0 0 + 1
21 IOCS 0 0x0002 0x0001 -

IOPS/IOCS长度通常是一个字节

参考第一个子模块分析方法,分析其余子模块信息:

完整分析

从上图中橙色方框的子模块信息可以最终得到IO数据的完整组成

C SDU Offset Kind Api Slot Subslot Length of Data Length of Item
0 IO Data 0 0x0001 0x0001 16 16 + 1
17 IO Data 0 0x0000 0x0001 0 0 + 1
18 IO Data 0 0x0000 0x8000 0 0 + 1
19 IO Data 0 0x0000 0x8001 0 0 + 1
20 IO Data 0 0x0000 0x8002 0 0 + 1
21 IOCS 0 0x0002 0x0001 - 1

该表包含多个0字节的IO数据对象,也就是说实际上这些PROFINET子模块并没有任何过程数据。

分析过程数据报文

最后根据以上背景表来分析PROFINET过程数据报文,过程数据通常也是周期性数据。下图显示了输入IOCR的特定报文,不仅应考虑帧ID,还应考虑报文的源MAC地址,因为相同的帧ID可能由RT模式下的不同设备使用。下图选择第106条报文进行分析。

PROFINET过程数据完整报文

蓝色标记部分是PROFINET过程数据完整报文中包含的过程数据CSDU(包括填充字节),过程数据组成部分及其含义解析如下表所示,可以看出“0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x10 0x01 0x00 0x00 0x00 0x00 0x8f 0xff”就是包含的16字节的实际过程数据,而6个0x80表示数据生产者状态。

C SDU Offset Kind Api Slot Subslot Length of Data Length of Item Data Status(IOPS/IOCS)
0 IO Data 0 0x0001 0x0001 16 16 + 1 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x10 0x01 0x00 0x00 0x00 0x00 0x8f 0xff 0x80
17 IO Data 0 0x0000 0x0001 0 0 + 1 - 0x80
18 IO Data 0 0x0000 0x8000 0 0 + 1 - 0x80
19 IO Data 0 0x0000 0x8001 0 0 + 1 - 0x80
20 IO Data 0 0x0000 0x8002 0 0 + 1 - 0x80
21 IOCS 0 0x0002 0x0001 - 1 - 0x80

状态值0x80表示该过程数据有效。对于IOCS对象,它表示相关过程数据的数据的消费者正在使用数据。(相关过程数据以相反的者向传输,因此不是此IOCR的一部分。换句话说,在这种情况下,槽0x1,子槽0x1是一个输入子模块和槽0x2,子槽0x1是输出子模块)。

posted on 2022-06-21 16:53  MichaelChen-99  阅读(2559)  评论(0)    收藏  举报

导航