工业以太网杂谈(二)

2022-11-14 19:28:41 浏览数 (1)

上一节和大家分享了WireShark对Modbus TCP/IP的解析(点击查看),本节和大家来聊一聊西门子工业以太网,谈到西门子工业以太网,我认为有些工程师还是比较混淆,会很简单的认为西门子工业以太网就是ProfiNet,其实不然,西门子工业以太网包含如下几种:

ISO,通过MAC地址实现数据交互,常用于控制器和上位机之间的通讯。

ISO on TCP,通过IP地址实现数据交互,常用语控制器和控制器通讯,或者控制器和上位机通讯。

Profinet RT,通过IP地址 GSD文件实现数据交互,常用于控制器和IO之间的通讯。

Profinet IRT,对于对时间要求严格的场景,数据的循环刷新时间小于1ms,循环扫描周期的抖动时间不大于1us(微秒),我们推荐Profinet IRT,常用于运动控制,或者Profinet RT 10ms数据刷新周期不满足要求的场合。

本章:

主要给大家通过Wireshark来分析S7COMM工业以太网协议,也就是我们常说的S7协议。

PLC里表现为PUT/GET,上位机表现为S7Net,C#,Python爱好者看到的是Snap7:

通过上图可以发现,关于S7协议,连接参数至少要包含如下内容:

IP地址,CPU机架号,CPU槽号,协议端口号:102

变量地址包含如下类型:

输入地址(I):

I:输入位地址,I0.0 长度:1个bit,可理解为开关量输入

IB:输入字节地址:IB0 长度:1个字节,可理解为模拟量输入

IW:输入字地址:IW0 长度:1个16位整型,可理解为模拟量输入

ID:输入双字地址:ID0 长度:1个32位双整型或者浮点型,可理解为模拟量输入

输出地址(Q):

Q:输出位地址,Q0.0 长度:1个bit,可理解为开关量输出

QB:输出字节地址:QB0 长度:1个字节,可理解为模拟量输出

QW:输出字地址:QW0 长度:1个16位整型,可理解为模拟量输出

内存地址(M):

M:内存变量位地址,M0.0 长度:1个bit

MB:内存变量字节地址:MB0 长度:1个字节

MW:内存变量字地址:MW0 长度:1个16位整型

MD:内存变量双字地址:MD0 长度:1个32位双整型或者浮点型

数据块地址(DB):

DBX:数据块中位地址 长度:1个bit

DBB:数据块中字节地址 长度:1个字节

DBW:数据块中字地址 长度:1个16位整形

DBD:数据块中双字地址 长度:1个32位整型或者32位浮点数

DBL:数据块中四字地址 长度:1个64为整形或者64位双精度浮点数

以上数据变量地址我们分为四个区域,分别对应的区域代码如下:

代码语言:javascript复制
输入区域(I):0x81
输出区域(Q):0x82
内存区域(M):0x83
数据块区域(DB):0x84

对于S7COMM协议的功能码包含2个,一个读取数据功能码(0x04)一个写入数据功能码(0x05)。

所以一条完整的S7COMM协议数据单元包含有三部分:

注意:如果该数据包是读请求数据包,则数据包不含有Data数据域部分,只包含Header和Parameter。

数据请求协议头(Header)由如下部分组成:

注意:如果该数据包位数据响应数据包,则Header协议头多了两个错误域,分别是错误类和错误代码。

Parameter(参数):

Parameter参数由功能码和变量Item组成。

请求数据包Parameter参数如下:

响应数据包Parameter参数如下:

常见功能码如下:

0x04:读变量

0x05:写变量

0xF0:通讯参数设置

以上我们介绍了S7COMM的基础协议规范,接下来我们用三个软件来进行仿真并用WireShark抓包,我们来将以上规范和数据包进行对应分析。

本文用到的软件如下:

1.WiSCADA 3.0 WEB工业组态软件 用于仿真I,Q,M区域的数据读写。

2. Snap7 server 用于提供DB区域的数据。

3.Snap7 Client 用于仿真DB区域的数据读写。

4.Wireshark 用于数据报抓取。

首先我们启动SNAP7 SERVER,运行S7 server的仿真软件我们部署在192.168.20.153的机器上,接下来我们启动SNAP7 Client,运行S7 Client 的仿真软件我们部署在本机,本机IP为192.168.20.124;WireShark 和 WiSCADA 3.0 均部署在192.168.20.124这台机器上;

接下来我们启动S7 Client仿真软件:

当出现Get system info OK,则说明客户端仿真软件已经成功连接到了仿真控制器。

接下来我们分别执行如下命令:

启动Wireshark选择到网卡,开始抓取

读取全部DB1的数据

从DB1.DBB0连续写入10个数分别是1-10

接下来我们先来看读取全部DB1的数据报文:

我们可以看到3760号报文为请求,DB1数据块信息的报文,3761号报文为3760的响应报文,3762号报文为变量读取报文,3763号为3762的响应报文;8033号报文为写入数据报文,8034号报文为8033的响应报文。

我们先来展开分析3762号报文:

物理层:Frame 3762,第3762号数据帧,线路上85个字节数据,从接口NPF_...获取到了85字节数据

数据链路层:源MAC地址(34:f3:9a:39:e4:96)和目的MAC地址(4e:ca:20:c4:32:bf)

网络层:IPv4,源IP地址(192.168.20.124),目的IP地址(192.168.20.153)

传输层:源端口:53094,目的端口:102(S7协议端口)序列号:39,确认号:112,长度:31

TPKT: 为上层的ISO和下层的TCP做过渡,属于传输服务协议,类似的还有我们常见的RDP远程桌面协议。(下篇讲解)

ISO8073/x.224 CPTP 面向连接的传输协议(下篇讲解)

应用层:S7 Communication

我们知道3762号数据帧为读数据请求包,所以没有Data域,Header和Paramter参数如下:

协议ID:所有的S7COMM协议的起始字节均为0x32,所以该协议是0x32开始的协议。

ROSCTR:PDU类型,此字段是整个Header最重要的一部分,他决定了后面Parameter参数的结构,PDU的类型主要包含如下几种:

Job:0x01 , 主设备请求,作业请求。由Client设备发送的请求(包括读/写变量,通讯参数设置等)

ACK_DATA: 0x03,响应Job的请求,一般由Server 设备发出。

UserData:0x07 ,协议扩展,可用于读取时钟,读取控制器状态,读取DB块信息,上下载或者读取SZL。

上图ROSCTR为0x01,所以是读写变量的Job报文。

功能码 0x04:读变量

Item:DB1.DBX 0.0 Byte 462,为DB块地址;

Area:0x84说明读取的变量区域为DB块区域;

以上信息均与我们前面讲到的协议基础相对应。

这个Frame3762的含义就是:

MAC地址为34:f3:9a:39:e4:96,IP地址为192.168.20.124,向目的MAC地址为4e:ca:20:c4:32:bf,IP地址为192.168.20.153的102端口,通过S7COMM协议去读取DB1.DBX 0.0 开始的462个字节的数据请求。

接下来我们看3763号响应报文:

这个Frame3763的含义就是:

MAC地址为4e:ca:20:c4:32:bf,IP地址为192.168.20.153的102端口向目的MAC地址为34:f3:9a:39:e4:96,IP地址为192.168.20.124,响应S7COMM协议去读取DB1.DBX 0.0 开始的462个字节的报文,并返回462个字节的数据。

接下来我们看写数据报文的区别,我们展开8033号数据帧:

由上图看到和3762号读数据报文不一样的地方,功能码:0x05变成了写变量,多了数据字段,所以上图报文的含义为:

MAC地址为34:f3:9a:39:e4:96,IP地址为192.168.20.124,向目的MAC地址为4e:ca:20:c4:32:bf,IP地址为192.168.20.153的102端口,通过S7COMM协议去写入DB1.DBX 0.0 开始的10个字节的数据请求。写入数据分别是01,02,03,04,05,06,07,08,09,10

对应的8034号响应报文为:

PDU类型变成了响应数据,无故障,功能码为0x05,并返回状态数据为写入成功。

以上我们分析了DB块区域(0x84)的读写报文,接下来我们来看看I,Q,M有什么区别?

我们用WiSCADA 3.0建立一个S7Net的驱动,并建立I0.0,IB0,Q0.0 QB0 M0.0和MB0的数据地址如下:

S7Net连接参数我们还是设置到192.168.20.153,我们仿真S1500,所以CPU机架号和位置都设置为0,如果是S7-300,CPU位置设置为2,S7-400 CPU位置设置为3,端口号设置为102,启动WiSCADA 3.0变量仿真环境,并开启Wireshark。

Wireshark报文如下:

我们来展开285号报文:

285号报文和3762号报文的主要区别为Area变为了0x81,输入地址区;因此该报文是去192.168.20.153去读取I0.0 – I0.7一个字节的数据。

286号报文:

285号报文的响应报文,结果为请求的变量地址不存在;因为我们的S7服务端软件只能仿真DB区域,没有Input输入区,所以响应结果为变量不存在。

0 人点赞