zoukankan      html  css  js  c++  java
  • 西门子S7协议底层原理分析

    前言

    前面我们对ModbusRTU协议、ModbusTCP协议、欧姆龙FinsTCP协议、三菱SLMP协议都做了说明:今天我们来分享一下关于西门子S7协议的通信分析。西门子作为一个老牌工控企业,在中国市场拥有很高的市场占有率。如果要说起西门子的通信协议,相信大家多多少少能说出一些,比如MPI、PPI、USS、Profibus、Profinet、S7等,但是西门子在协议的开放性方面还是相对要封闭一些,所以很多协议都是不开放的。在这里,我主要是结合Wireshark抓包工具,跟大家去分享一下,如何是一步一步抓取西门子S7通信协议底层通信报文的,希望通过我一步一步地分析,让大家都能够对西门子S7协议有所了解的同时,也学会基本的抓包操作与报文分析。

    值得说明一下,西门子S7协议非开放协议,以下内容,仅供学习参考。

    环境搭建

    1、首先我们要准备要准备一个西门子的PLC,并保证PLC与PC之间的网络连接正常。

    PS:对于手头没有PLC的小伙伴,可以查看这篇文章:基于S7-PLCSIM Advanced搭建S7通信仿真环境

    2、为了抓取到通信的报文,需要实现PC与PLC之间的通信,这里我采用的方式是通过KepServer V6.4来实现,dotNET工控上位机 公众号后台回复 关键词:OPC学习套装

    3、安装Wireshark抓包软件,dotNET工控上位机 公众号后台回复关键词:Wireshark。(获取资料加VX:xiketang777)

    4、认识S7协议的网络模型。

    操作步骤

    1、首先将KepServer与PLC之间的通信连接配置好;

    2、将Wireshark软件打开,并处于监控报文状态;

    3、将KepServer进行连接PLC,此时Wireshark软件中会出现报文的数据,将KepServer连接停止并关闭软件,同时将Wireshark的监控停止,以便进行后续的报文分析;

    协议分析

    1、我们发现西门子的S7通信并不是简简单单的TCP通信,在TCP执行三次握手之后,还需要发送两次连接验证,在两次连接验证之后,才进行真正的数据交互。

    2、三次握手过程,如下图所示:(获取资料加VX:xiketang777)

    3、S7连接第一次验证,如下图所示:

     4、S7连接第二次验证,如下图所示:

     5、四次挥手过程,如下图所示:

     6、S7第一次验证发送报文分析:

    TPKT(第五层:会话层)

    该层总共占4个字节:

    版本号:0x03

    预留:0x00

    长度:0x0016

    COTP(第六层:表示层)

    该层总共占用18个字节:

    长度:0x11

    PDU类型(CR Connect Request 连接请求):0x0E

    目标引用:0x0000

    源引用:0x0001

    扩展格式/流控制:0x00

    参数代码 TPDU-Size:0xC0

    参数长度:0x01

    TPDU大小:0x0A

    参数代码 SRC-TASP:0xC1

    参数长度:0x02

    源TSAP Source TSAP:0x0201

    参数代码 DST-TASP:0xC2

    参数长度:0x02

    目标TSAP Destination TSAP:0x0201(获取资料加VX:xiketang777)

    7、S7第一次验证返回报文

    TPKT(第五层:会话层)

    该层总共占4个字节:

    版本号:0x03

    预留:0x00

    长度:0x0016

    COTP(第六层:表示层)

    该层总共占18个字节:

    长度:0x11

    PDU类型(CC Connect Confirm 连接确认):0x0D

    目标引用:0x0001

    源引用:0x0006

    扩展格式/流控制:0x00

    参数代码 TPDU-Size:0xC0

    参数长度:0x01

    TPDU大小:0x0A

    参数代码 SRC-TASP:0xC1

    参数长度:0x02

    Source TSAP:0x0201

    参数代码 DST-TASP:0xC2

    参数长度:0x02

    Destination TSAP:0x0201

    8、S7第二次验证发送报文

    TPKT(第五层:会话层)

    该层总共占4个字节:

    版本号:0x03

    预留:0x00

    长度:0x0019

    COTP(第六层:表示层)(获取资料加VX:xiketang777)

    该层总共占3个字节:

    长度:0x02

    PDU类型(DT Data):0XF0

    目标引用:0x80

    S7 Communication(第七层:应用层)

    该层总用占18个字节,并且分两部分:

    Header:

    协议ID(Protocol ID):0x32

    ROSCTR:0x01

    预留:0x0000

    协议数据单元引用:0x037C

    参数长度:0x0008

    数据长度:0x0000

    Parameter:

    功能码:0xF0

    预留:0x00

    最大AmQ(Calling):0x0001

    最大AmQ(Called):0x0001

    PDU长度:0x03C0

    9、S7第二次验证返回报文

    TPKT(第五层:会话层)

    该层总共占4个字节:

    版本号:0x03

    预留:0x00

    长度:0x0019

    COTP(第六层:表示层)

    该层总共占3个字节:

    长度:0x02

    PDU类型(DT Data):0XF0

    目标引用:0x80

    S7 Communication(第七层:应用层)

    该层总用占20个字节,并且分两部分:

    Header:

    协议ID(Protocol ID):0x32

    Ack_Data:0x03

    预留:0x0000

    协议数据单元引用:0x037C

    参数长度:0x0008

    数据长度:0x0000

    错误等级:0x00

    错误代码:0x00

    Parameter:

    功能码:0xF0

    预留:0x00

    最大AmQ(Calling):0x0001

    最大AmQ(Called):0x0001

    PDU长度:0x00F0

    10、读取数据发送报文:读取DB1.DBX0.0 开始的4个字节

    TPKT(第五层:会话层)

    该层总共占4个字节:

    版本号:0x03

    预留:0x00

    长度:0x001F

    COTP(第六层:表示层)

    该层总共占3个字节:

    长度:0x02

    PDU类型(DT Data):0XF0

    目标引用:0x80

    S7 Communication(第七层:应用层)

    该层总用占24个字节,并且分两部分:

    Header:(获取资料加VX:xiketang777)

    协议ID(Protocol ID):0x32

    Ack_Data:0x01

    预留:0x0000

    协议数据单元引用:0x037D

    参数长度:0x000E

    数据长度:0x0000

    Parameter:

    功能码 Read Var:0x04

    通信项数:0x01

    通信项1:

    通信项Header

    变量指定:0x12

    地址长度:0x0A

    Syntax ID:0x10

    传输数据类型 byte:0x02

    通信项Param

    读取长度:0x04

    DB号:0x01

    存储区类型 DB存储区:0x84

    开始字节:0x000000

    11、 读取数据返回报文

     

    TPKT(第五层:会话层)

    该层总共占4个字节:

    版本号:0x03

    预留:0x00

    长度:0x001D

    COTP(第六层:表示层)

    该层总共占3个字节:

    长度:0x02

    PDU类型(DT Data):0XF0

    目标引用:0x80

    S7 Communication(第七层:应用层)

    该层总用占22个字节,并且分两部分:

    Header:(获取资料加VX:xiketang777)

    协议ID(Protocol ID):0x32

    Ack_Data:0x03

    预留:0x0000

    协议数据单元引用:0x037D

    参数长度:0x0002

    数据长度:0x0008

    错误等级:0x00

    错误代码:0x00

    Parameter:

    功能码 Read Var:0x04

    通信项数:0x01

    通信项1:

    返回结果Success:0xFF

    传输数据类型 Byte/Word/DWord:0x04

    长度:0x0020

    数据:0x00000000

     

                END

  • 相关阅读:
    当前流行的智能硬件产品整理
    一个桌面视频录制利器推荐--Snagit
    微信支付---退款的坑
    微信支付退款证书服务器配置
    Git安装和TortoiseGit详细使用教程【基础篇】
    通俗易懂,什么是.NET Core以及.NET Core能做什么
    向ASP.NET Core迁移
    SQLServer 查看SQL语句的执行时间
    SqlServer 2014 Enterprise 企业版下载与安装教程(附图片)
    SQL Server表分区
  • 原文地址:https://www.cnblogs.com/xiketang/p/15243361.html
Copyright © 2011-2022 走看看