当前位置: 首页 > article >正文

【物联网-S7Comm协议】

物联网-S7Comm协议

  • ■ 调试工具
  • ■ S7协议-简介
  • ■ S7协议和modbusTCP协议区别
  • ■ OSI 层 S7 协议
  • ■ S7协议数据结构 (TPKT+COTP+S7Comm)
    • ■ TPKT(第五层:会话层) 总共占4个字节
    • ■ COTP(第六层:表示层)
      • ■ 1. COTP连接包(COTP Connection Packet)也就是S7Comm的握手包
      • ■ 2. COTP功能包 (COTP Fuction Packet)
    • ■ S7Comm(第七层:应用层)总用占24个字节
      • ■ 1. S7Comm Header:
      • ■ 2. S7Comm Parameter:
  • ■ S7协议的工作流程
  • ■ 数据包分析
    • ■ S7 Setup Communication (Job)
    • ■ S7 Setup Communication (ACk_data)
    • ■ 读取数据 (Job)
    • ■ 读取数据 (ACk_data)
    • ■ 读取数据
  • ■ 读写部分代码

■ 调试工具

Wireshark 抓包工具
Wireshark 抓包工具进行抓包看详细的发送报文格式。
西门子PLC调试助手

■ S7协议-简介

S7Comm( S7 Communication)是西门子专有的协议,是西门子 S7 通讯协议簇里的一种。
S7 通信协议是西门子 S7 系列 PLC 内部集成的一种通信协议,是 S7 系列 PLC 的精髓所在。
它是一种运行在传输层之上的(会话层/表示层/应用层)、经过特殊优化的通信协议,其信息传输可以基于 MPI 网络、 PROFIBUS 网络
或者以太网。

■ S7协议和modbusTCP协议区别

项目说明
1工作方式:S7协议是基于串行通信方式进行通信的,
而modbusTCP协议则采用了基于以太网的通信方式,可以实现更高的数据传输速度和数据量。
2通信速度:S7通信速度相对较慢,一般为12Mbps以下;
modbusTCP协议则支持更高的通信速度和更广的数据带宽,可达到100Mbps或以上的速度。
3网络拓扑:S7协议在网络拓扑方面相对简单,通常采用星形网络拓扑;
而modbusTCP协议支持基于以太网的网状拓扑结构,可以实现更复杂的网络配置和更完备的自组网功能。
4实时性:modbusTCP协议具有更高的实时性能,可满足工业自动化领域的实时控制要求。

■ OSI 层 S7 协议

OSI层S7 协议
第 7 层:应用层 S7 协议 S7 Communication
第 6 层:表示层 S7 协议(COTP)
第 5 层:会话层 S7 协议(TPKT)
第 4 层:传输层 Transmission Control Protocol
第 3 层:网络层 IP
第 2 层:数据链路层 Ethernet
第 1 层:物理层 Ethernet

■ S7协议数据结构 (TPKT+COTP+S7Comm)

■ TPKT(第五层:会话层) 总共占4个字节

在这里插入图片描述

版本号预留长度
1字节1字节2字节
0x030x000x001F

■ COTP(第六层:表示层)

■ 1. COTP连接包(COTP Connection Packet)也就是S7Comm的握手包

在这里插入图片描述

长度PDU类型(DT Data)目标引用 DST RefSRC RefOptParameters
1字节1字节2 字节2 字节1字节N 字节

■ 2. COTP功能包 (COTP Fuction Packet)

在这里插入图片描述

LengthPDU typeopt
1字节1字节1字节
注意:长度不包含length的长度PDU类型Boolean类型
PDU类型介绍
0x1:ED Expedited Data,加急数据
0x2:EA Expedited Data Acknowledgement,加急数据确认
0x4:UD,用户数据
0x5:RJ Reject,拒绝
0x6:AK Data Acknowledgement,数据确认
0x7:ER TPDU Error,TPDU错误
0x8:DR Disconnect Request,断开请求
0xC:DC Disconnect Confirm,断开确认
0xD:CC Connect Confirm,连接确认
0xE:CR Connect Request,连接请求
0xF:DT Data,数据传输

■ S7Comm(第七层:应用层)总用占24个字节

■ 1. S7Comm Header:

在这里插入图片描述

协议ID(Protocol ID)PDU type预留PDU Reference参数长度数据长度Error classError code
1字节1字节2字节2字节2字节2字节1字节1字节
编号类型字节说明
0(unsigned integer, 1 byte):Protocol Id,协议ID,通常为0x32;
1(unsigned integer, 1 byte):ROSCTR,PDU type,PDU的类型
2~3(unsigned integer, 2 bytes):Redundancy Identification (Reserved),冗余数据,通常为0x0000;
4~5(unsigned integer, 2 bytes):Protocol Data Unit Reference,it’s increased by request event。协议数据单元参考,通过请求事件增加;
6~7(unsigned integer, 2 bytes):Parameter length,the total length (bytes) of parameter part。参数的总长度;
8~9(unsigned integer, 2 bytes):Data length,数据长度。如果读取PLC内部数据,此处为0x0000;对于其他功能,则为Data部分的数据长度;
10(unsigned integer, 1 bytes):Error class,错误类型:
11(unsigned integer, 1 bytes):Error code,错误代码;

■ 2. S7Comm Parameter:

在这里插入图片描述

功能码 Read Var:0x04
通信项数:0x01(Item1)通信项1:通信项 Header变量指定:   0x12地址长度:   0x0ASyntaxID:   0x10传输数据类型byte:  0x02通信项 Param读取长度:  0x04DB号: 0x01存储区类型DB存储区:  0x84开始字节: 0x000000
编号类型字节说明
0(Unsigned integer, 1 byte):Variable specification,确定项目结构的主要类型,通常为0x12,代表变量规范;
1(Unsigned integer, 1 byte):Length of following address specification,本Item其余部分的长度;
2(Unsigned integer, 1 byte):Syntax Ids of variable specification,确定寻址模式和其余项目结构的格式;
3(Unsigned integer, 1 byte):Transport sizes in item data,确定变量的类型和长度:
4~5(Unsigned integer ,2 byte):Request data length,请求的数据长度;
6~7(Unsigned integer, 2 byte):DB number,DB模块的编号,如果访问的不是DB区域,此处为0x0000;
8(Unsigned integer, 1 byte):Area,区域类型:
9~11(Unsigned integer, 3 byte):Address,地址。

■ S7协议的工作流程

工作流程说明
1client与server 通过socket和标准的TCP的方式建立连接
2client发送COTP,请求连接PLC,报文中包含Source TSAP和Destination TSAP,从而标识出CPU的机架号和槽号
3PLC返回COTP,确认连接,报文中包含Source TSAP和Destination TSAP,此时server确定client与哪个CPU进行通讯
4client发送S7 Communication给server,报文中包含Setup communication,即通讯请求,包含PDU的长度
5server返回S7 Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含PDU的长度
6client与server发送交换数据的报文,仍以S7 Communication完成

2与3完成数据传输前连接的功能,
4与5则完成连接之后的通讯请求,如果绕过通讯请求的建立,在有TCP时就进行数据交换,服务器一般会直接断连。

  1. 建立Socket连接:进行TCP三次握手
  2. COTP的握手请求(请求建立通信)
  3. 整个S7的握手请求(请求建立操作通信)
  4. 进行读写操作(S7协议报文)

■ 数据包分析

■ S7 Setup Communication (Job)

■ S7 Setup Communication (ACk_data)

在这里插入图片描述

■ 读取数据 (Job)

在这里插入图片描述

■ 读取数据 (ACk_data)

在这里插入图片描述
在这里插入图片描述
0x123 == data 0x007b

■ 读取数据

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

■ 读写部分代码

using System;
using System.Net.Sockets;namespace Zhaoxi.SiemensS7.Study
{class Program{/// <summary>/// VS2019  16.9  社区版/// 框架.NET5    ->  项目没法直接找开/// </summary>/// <param name="args"></param>static void Main(string[] args){Console.WriteLine("Hello World!");// 调库S7.Net.Plc plc = new S7.Net.Plc(S7.Net.CpuType.S71500, "192.168.151.200", 0, 1);plc.Open(); VW100 Word   short ishort   int16 uint16 DB1.DBW100.0-7   Bit    S7.NET   粘包:两个报文一次接收了 请求了一个Word,2个Byte//var value = plc.Read("DB2.DBW0"); 基本的读写    读SZL、启停、上传下载// 关于连接报文:// 假如保证通信环境不会掉线,只做一次// 断线重连,再次进行TCP三次握手   COTP   Setup// 连接部分封装一个方法,这个方法主要做检查连接状态,Connect的重连操作-》连接正常了  再做COTP  Setup建立连接// 第一种,在一个后台线程做连续的连接状态判断,// 第二种,在读写操作方法里调用这个方法Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 可以进行TCP通信 ,也可以进行UDP通信 // 1、进行TCP的三次握手    连接西门子PLC  默认102端口socket.Connect("192.168.151.200", 102);try{// 2、进行COTP的连接请求byte[] cotpBytes = new byte[] {// TPKT0x03,0x00,0x00,0x16,// COTP0x11,0xe0,// 连接请求0x00,0x00,0x00,0x00,0x00,// Parameter-code0xc1,0x02,0x10,0x00,0xc2,0x02,0x03,0xFF,// 机架号和插槽号进行特殊的计算     机架0,插槽10xc0,0x01,0x0a};socket.Send(cotpBytes);int count = socket.Receive(new byte[22]);}catch (Exception ex){}// S7 Setup Communication    // 还有进行数据交换  PDUbyte[] setupBytes = new byte[] {// TPKT0x03,0x00,0x00,0x19,// COTP0x02,0xf0,// 数据传输0x80,// S7-Header0x32,0x01,0x00,0x00,0x00,0x00,// Parameter len0x00,0x08,// Data len0x00,0x00,// S7-Parameter0xf0,//   读:0x04    写:0x050x00,0x00,0x03,0x00,0x03,0x03,0xc0};socket.Send(setupBytes);// 百度网盘下载地址,包括模拟器,博途、安装视频// 已经建立好了通信,下一步进行数据的读写   DB   I  Q  M   // 读写的报文与响应解析,明天继续// V 区为什么读取不了?一会答疑的时候来讲// 做读写操作   发送特定指令   启停// 读哪个// DB2.DBW10-// 请求的是一个Word  Bit   5  DBW10.5 // BIT  BitAddr 可以是0-7任意数// Byte Word  DWord   BitAddr只是0int byteAddr = 10;int bitAddr = 0;// byteAddr = byteAddr << 3;byteAddr += bitAddr;byte[] readBytes = new byte[] {    //31+12  43   2B// TPKT0x03,0x00,0x00,0x2b,// COTP0x02,0xf0,// 数据传输0x80,// S7-Header0x32,0x01,0x00,0x00,0x00,0x00,// Parameter-Len0x00,0x1a,  //26个字节长度// Data-Len0x00,0x00,// S7-Paramter   26个字节0x04,// Read Var0x02,// 1个ITEM   涉及多读(不同存储区,分散存储的数据)// S7-Parameter-Item-10x12,0x0a,0x10,0x04,// 请求一个Word类型     0x02  Byte0x00,0x01,// 读取长度0x00,0x02,//DB块的编号0x84,// 区域类型// 把这个地址分成3个字节(byte)(byteAddr/256/256%256),(byte)(byteAddr/256%256),(byte)(byteAddr%256),// S7-Parameter-Item-2    读I2.1     12个字节0x12,0x0a,0x10,0x01,// 请求一个Word类型     0x02  Byte0x00,0x02,// 读取长度   ,读Bit   只能1个0x00,0x00,//DB块的编号0x81,// 区域类型// 把这个地址分成3个字节(byte)(((2<<3)+1)/256/256%256),(byte)(((2<<3)+1)/256%256),(byte)(((2<<3)+1)%256)// 肯定没有,固定的几个长度信息没有改  };socket.Send(readBytes);// 写// 下去}}
}
http://www.lryc.cn/news/2401791.html

相关文章:

  • NLP中的input_ids是什么?
  • LeetCode Hot100刷题——划分字母区间
  • c++ 基于OpenSSL的EVP接口进行SHA3-512和SM3哈希计算
  • Vue3实现拖拽改变元素大小
  • Spring IoC 详解:原理、实现与实战
  • 深入Java NIO:构建高性能网络应用
  • 数据分析后台设计指南:实战案例解析与5大设计要点总结
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(1)
  • SSH/RDP无法远程连接?腾讯云CVM及通用服务器连接失败原因与超全排查指南
  • 网络测试实战:金融数据传输的生死时速
  • 数据库系统概论(十四)详细讲解SQL中空值的处理
  • 【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3
  • [蓝桥杯]三体攻击
  • 深入解析支撑向量机(SVM):原理、推导与实现
  • 一台电脑联网如何共享另一台电脑?网线方式
  • 面试题:SQL 中如何将 多行合并为一行(合并行数据为列)?
  • MacroDroid安卓版:自动化操作,让生活更智能
  • 力提示(force prompting)的新方法
  • 【Redis实战:缓存与消息队列的应用】
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.12 R语言解题
  • 基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战
  • 告别局域网:实现NASCab云可云远程自由访问
  • 25_05_29docker
  • Java-IO流之缓冲流详解
  • vscode code runner 使用python虚拟环境
  • Python实现markdown文件转word
  • NLP学习路线图(十七):主题模型(LDA)
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(2)
  • 综采工作面电控4X型铜头连接器 conm/4x100s
  • 用ApiFox MCP一键生成接口文档,做接口测试