【物联网-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字节 |
0x03 | 0x00 | 0x001F |
■ COTP(第六层:表示层)
■ 1. COTP连接包(COTP Connection Packet)也就是S7Comm的握手包
长度 | PDU类型(DT Data) | 目标引用 DST Ref | SRC Ref | Opt | Parameters |
---|---|---|---|---|---|
1字节 | 1字节 | 2 字节 | 2 字节 | 1字节 | N 字节 |
■ 2. COTP功能包 (COTP Fuction Packet)
Length | PDU type | opt |
---|---|---|
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 class | Error 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协议的工作流程
工作流程 | 说明 |
---|---|
1 | client与server 通过socket和标准的TCP的方式建立连接 |
2 | client发送COTP,请求连接PLC,报文中包含Source TSAP和Destination TSAP,从而标识出CPU的机架号和槽号 |
3 | PLC返回COTP,确认连接,报文中包含Source TSAP和Destination TSAP,此时server确定client与哪个CPU进行通讯 |
4 | client发送S7 Communication给server,报文中包含Setup communication,即通讯请求,包含PDU的长度 |
5 | server返回S7 Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含PDU的长度 |
6 | client与server发送交换数据的报文,仍以S7 Communication完成 |
2与3完成数据传输前连接的功能,
4与5则完成连接之后的通讯请求,如果绕过通讯请求的建立,在有TCP时就进行数据交换,服务器一般会直接断连。
- 建立Socket连接:进行TCP三次握手
- COTP的握手请求(请求建立通信)
- 整个S7的握手请求(请求建立操作通信)
- 进行读写操作(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);// 写// 下去}}
}
相关文章:

【物联网-S7Comm协议】
物联网-S7Comm协议 ■ 调试工具■ S7协议-简介■ S7协议和modbusTCP协议区别■ OSI 层 S7 协议■ S7协议数据结构 (TPKTCOTPS7Comm)■ TPKT(第五层:会话层) 总共占4个字节■ COTP(第六层:表示层…...
NLP中的input_ids是什么?
在自然语言处理(NLP)中,input_ids 是什么 在自然语言处理(NLP)中,input_ids 是将文本转换为模型可处理的数字表示后的结果,是模型输入的核心参数之一。 一、基本概念 文本数字化 原始文本(如 “Hello world!”)无法直接被模型处理,需要通过分词器(Tokenizer) 将其…...
LeetCode Hot100刷题——划分字母区间
763.划分字母区间 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 "ababcc" 能够被分为 ["abab", "cc"],但类似 ["aba", "bcc"…...
c++ 基于OpenSSL的EVP接口进行SHA3-512和SM3哈希计算
通过OpenSSL的EVP接口进行 SHA3-512 和 SM3 哈希计算 #include <iostream> #include <openssl/evp.h> #include <cstring>using namespace std;void PrintHex(const std::string &hexStr) {for (unsigned char c : hexStr){printf("%02x", c)…...
Vue3实现拖拽改变元素大小
代码实现 整体页面结构通过一个 dragResize-wrapper 包含左右两个区域,左侧区域包含一个可拖拽的边界。以下是关键代码 HTML 部分 <template><div class"dragResize-wrapper"><div class"dragResize-left"><div class&…...
Spring IoC 详解:原理、实现与实战
Spring IoC 详解:原理、实现与实战 前言 Spring IoC(Inversion of Control,控制反转)是Spring框架的核心基础。它通过解耦对象的创建与依赖关系管理,极大提升了系统的可维护性和扩展性。本文将系统梳理Spring IoC的原…...
深入Java NIO:构建高性能网络应用
引言 在上一篇文章中,我们介绍了Java网络编程的基础模型:阻塞式I/O和线程池模型。这些模型在处理高并发场景时存在明显的局限性。本文将深入探讨Java NIO(New I/O)技术,这是一种能够显著提升网络应用性能的非阻塞I/O模…...

数据分析后台设计指南:实战案例解析与5大设计要点总结
引言 数据于企业而言异常重要,企业通过数据可以优化战略决策,因此企业对数据的采集正趋向智能化、数字化,数据分析后台就是企业智能化、数字化记录、分析数据的渠道。本文分享一个数据分析后台原型实战案例,通过页面拆解总结原型…...
深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(1)
一、背景:为什么需要模型剪枝? 随着深度学习的发展,模型参数量和计算量呈指数级增长。以ResNet18为例,其在ImageNet上的参数量约为1100万,虽然在服务器端运行流畅,但在移动端或嵌入式设备上部署时…...
SSH/RDP无法远程连接?腾讯云CVM及通用服务器连接失败原因与超全排查指南
更多服务器知识,尽在hostol.com 嘿,各位服务器的“船长”和“管理员”们!咱们在浩瀚的数字海洋中驾驭着自己的服务器“战舰”,最怕遇到什么情况?除了数据丢失,恐怕就是突然发现自己被锁在“驾驶舱”门外—…...

网络测试实战:金融数据传输的生死时速
阅读原文 7.4 网络测试实战--数据传输:当毫秒决定百万盈亏 你的交易指令为何总是慢人一步? 在2020年"原油宝"事件中,中行原油宝产品因为数据传输延迟导致客户未能及时平仓,最终亏损超过90亿元。这个血淋淋的案例揭示了…...

数据库系统概论(十四)详细讲解SQL中空值的处理
数据库系统概论(十四)详细讲解SQL中空值的处理 前言一、什么是空值?二、空值是怎么产生的?1. 插入数据时主动留空2. 更新数据时设置为空3. 外连接查询时自然出现 三、如何判断空值?例子:查“漏填数据的学生…...

【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3
❝ KubeSphere V4已经开源半年多,而且v4.1.3也已经出来了,修复了众多bug。介于V4优秀的LuBan架构,核心组件非常少,资源占用也显著降低,同时带来众多功能和便利性。我们决定与时俱进,使用1.30版本的Kubernet…...
[蓝桥杯]三体攻击
三体攻击 题目描述 三体人将对地球发起攻击。为了抵御攻击,地球人派出 A B CA B C 艘战舰,在太空中排成一个 AA 层 BB 行 CC 列的立方体。其中,第 ii 层第 jj 行第 kk 列的战舰(记为战舰 (i, j, k)(i, j, k)&am…...
深入解析支撑向量机(SVM):原理、推导与实现
在机器学习领域,支撑向量机(Support Vector Machine,简称SVM)是一种广泛使用的分类算法,以其强大的分类性能和优雅的数学原理而备受关注。本文将从问题定义、数学推导到实际应用,深入解析SVM的核心原理和实…...

一台电脑联网如何共享另一台电脑?网线方式
前言 公司内网一个人只能申请一个账号和一个主机设备;会检测MAC地址;如果有两台设备,另一台就没有网;因为是联想老电脑,共享热点用不了,但是有一根网线,现在解决网线方式共享网络; …...
面试题:SQL 中如何将 多行合并为一行(合并行数据为列)?
✅ 面试题:SQL 中如何将 多行合并为一行(合并行数据为列)? 这是面试和实战中非常常见的场景,属于“行列转换”问题之一,常用于报表聚合、分类汇总、透视表生成等。 go专栏:https://duoke360.co…...

MacroDroid安卓版:自动化操作,让生活更智能
在智能手机的日常使用中,我们常常会遇到一些重复性的任务,如定时开启或关闭Wi-Fi、自动回复消息、根据位置调整音量等。这些任务虽然简单,但频繁操作会让人感到繁琐。MacroDroid安卓版正是为了解决这些问题而设计的,它是一款功能强…...

力提示(force prompting)的新方法
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

【Redis实战:缓存与消息队列的应用】
在现代互联网开发中,Redis 作为一款高性能的内存数据库,广泛应用于缓存和消息队列等场景。本文将深入探讨 Redis 在这两个领域的应用,并通过代码示例比较两个流行的框架(Redis 和 RabbitMQ)的特点与适用场景࿰…...

实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.12 R语言解题
本文是实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.12 R语言解题。主要涉及线性回归、回归的显著性、残差分析。 10-12 vial <- seq(1, 12, 1) Viscosity <- c(26,24,175,160,163,55,62,100,26,30…...
基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战
基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战 在本文中,我将详细介绍如何使用LangChain框架构建一个完整的RAG(检索增强生成)问答系统。通过向量检索获取相关上下文,并结合大语言模型,我们能够…...

告别局域网:实现NASCab云可云远程自由访问
文章目录 前言1. 检查NASCab本地端口2. Qindows安装Cpolar3. 配置NASCab远程地址4. 远程访问NASCab小结 5. 固定NASCab公网地址6. 固定地址访问NASCab 前言 在数字化生活日益普及的今天,拥有一个属于自己的私有云存储(如NASCab云可云)已成为…...
25_05_29docker
Linux_docker篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目: 版本号: 1.0,0 作者: 老王要学习 日期: 2025.04.25 适用环境: Centos7 文档说明 环境准备 硬件要求 服务器: 2核CPU、2GB内存…...
Java-IO流之缓冲流详解
Java-IO流之缓冲流详解 一、缓冲流概述1.1 什么是缓冲流1.2 缓冲流的工作原理1.3 缓冲流的优势 二、字节缓冲流详解2.1 BufferedInputStream2.1.1 构造函数2.1.2 核心方法2.1.3 使用示例 2.2 BufferedOutputStream2.2.1 构造函数2.2.2 核心方法2.2.3 使用示例 三、字符缓冲流详…...
vscode code runner 使用python虚拟环境
转载如下: zVS Code插件Code Runner使用python虚拟环境_coderunner python-CSDN博客...

Python实现markdown文件转word
1.markdown内容如下: 2.转换后的内容如下: 3.附上代码: import argparse import os from markdown import markdown from bs4 import BeautifulSoup from docx import Document from docx.shared import Inches from docx.enum.text import …...

NLP学习路线图(十七):主题模型(LDA)
在浩瀚的文本海洋中航行,人类大脑天然具备发现主题的能力——翻阅几份报纸,我们迅速辨别出"政治"、"体育"、"科技"等板块;浏览社交媒体,我们下意识区分出美食分享、旅行见闻或科技测评。但机器如何…...
深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(2)
前言 《深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(1)》里面我只是提到了对conv1层进行剪枝,只是为了验证这个剪枝的整个过程,但是后面也有提到:仅裁剪 conv1层的影响极大,原因如…...

综采工作面电控4X型铜头连接器 conm/4x100s
综采工作面作为现代化煤矿生产的核心区域,其设备运行的稳定性和安全性直接关系到整个矿井的生产效率。在综采工作面的电气控制系统中,电控连接器扮演着至关重要的角色,而4X型铜头连接器CONM/4X100S作为其中的关键部件,其性能优劣直…...