S7Comm报文详解
S7协议是西门子公司为其S7系列PLC(可编程逻辑控制器)通信而设计的一种专用协议。S7协议主要用于西门子PLC之间的通信,以及PLC与其他设备的通信。该协议支持多种通信方式,如MPI(多点接口)、PROFIBUS和Industrial Ethernet等。S7协议的报文结构相对复杂,可分为多个层次。
1. 简介
对比OSI参考模型的话,一层到四层(即物理层、数据链路层、网络层、传输层)与常规的TCP/IP通信相同,这里不在赘述。第五层(会话层)通过S7的TPKT实现,六层(表示层)通过COTP实现,S7Comm则于第七层(应用层)。
整个S7协议结构如下图(不含TCP/IP部分,下同)
TPKT头 | COTP头 | S7Comm头 | S7Comm参数 | 数据 |
---|
2.TPKT
TPKT头报文格式如下:
用途 | 版本 | 保留 | 长度 |
---|---|---|---|
长度 | 1byte | 1byte | 1byte |
描述 | 版本信息 | 保留(值为0x00) | TPKT、COTP、S7三层协议的总长度(单位字节) |
3.COTP
COTP分为两类,一类是COTP连接包,一类是COTP功能包。
- COTP连接包:COTP连接包主要用于建立、维护和断开COTP协议层的连接。这一过程包括连接请求(CR-Connect Request)、连接确认(CC-Connect Confirm)、断开请求(DR-Disconnect Request)和断开确认(DC-Disconnect Confirm)等步骤。通过这些连接包,COTP能够在通信双方之间建立一个稳定的、可靠的会话,保证数据的顺序传输和完整性。
- COTP功能包:COTP功能包用于在已建立的COTP连接上进行数据传输和控制信息交换。这包括数据传输(DT-Data Transfer)功能,通过它发送用户数据;以及一些控制功能,如流量控制、复位、错误报告等。功能包使得COTP能够在连接的基础上提供高效、可靠的数据交换服务。
简而言之,COTP连接包主要用于建立和管理连接,而COTP功能包则用于在这些连接上进行实际的数据传输和控制操作。
3.1 COTP连接包
用途 | 长度 | PDU类型 | 目的地参考 | 源地址参考 | 选项 | 参数 |
---|---|---|---|---|---|---|
长度 | 1byte | 1byte | 2byte | 2byte | 1byte | 不定 |
描述 | 除长度部分外COTP后续长度 | 指示PDU(Protocol Data Unit,协议数据单元)的类型 | 在建立连接时由接收方提供,用于标识目标或会话的唯一参考号。在连接建立后的通信中,这个字段用来确保数据包被送达到正确的会话。 | 在连接请求时由发起方提供,用于标识源或会话的唯一参考号。这同样用于确保通信双方在正确的会话中交换数据。 | 根据PDU类型不同,可能包含额外的控制信息 | 额外的参数或控制信息,这些信息的存在和格式依据PDU类型和选项字段而定。 |
其中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,数据传输
3.1 COTP功能包
用途 | 长度 | PDU类型 | 选项 |
---|---|---|---|
长度 | 1byte | 1byte | 1byte |
描述 | 除长度部分外COTP后续长度 | 指示PDU(Protocol Data Unit,协议数据单元)的类型 | 根据PDU类型不同,可能包含额外的控制信息 |
4.S7Comm
报文结构如下
用途 | S7头 | 参数 | 数据 |
---|---|---|---|
长度 | 10或12byte | 不定 | 不定 |
描述 | 报文头 | 包含了执行特定操作所必需的控制信息 | 数据部分是可选的,具体取决于执行的操作类型。 |
4.1 S7头
报文结构如下:
用途 | 协议ID | 消息类型 | 冗余识别 | 议数据单元参考 | 参数长度 | 数据长度 | 错误类型 | 错误代码 |
---|---|---|---|---|---|---|---|---|
长度 | 1byte | 1byte | 2byte | 2byte | 2byte | 2byte | 1byte | 1byte |
描述 | 通常为0x32 | 指示消息类型 | 用于冗余管理,帮助识别和管理通信过程中可能出现的重复数据包,确保数据的一致性和准确性。通常为0x0000 | 这是一个标识符,用来将请求和相应的响应匹配起来。在复杂的通信过程中,这个字段确保了每个请求都能得到正确的响应。= | 参数字段的长度 | 数据部分的长度 | 可选,仅存在于Ack-Data消息中,如果传输过程中出现错误,这个字段将标识错误的类型 | 可选,仅存在于Ack-Data消息中,每个错误类型下可能有多个错误代码,指明了发生错误的具体原因 |
其中,PDU类型有以下值:
- 0x01- Job Request:主站发送的请求(例如读/写存储器,读/写块,启动/停止设备,通信设置)
- 0x02- Ack:从站发送的简单确认没有数据字段(从未见过它由S300 / S400设备发送)
- 0x03- Ack-Data:带有可选数据字段的确认,包含对作业请求的回复
- 0x07- Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取..)
4.2 参数、数据
参数取决于消息类型,参数报文的第1个byte是功能码(此处仅介绍建立通讯、读取数据、写入数据三类报文格式)
4.2.1 建立通讯
在每个会话开始时会发送握手消息。它用于协商Ack队列的大小和最大PDU长度,双方都声明其支持的值以确保数据已成功传输。PDU和Ack队列长度字段都遵循大端的数据表示法。
发送请求的报文格式:
S7头消息类型 0x01- Job Request,是功能码为0xF0
用途 | 功能码 | 冗余数据 | Ack队列的大小(主叫) | Ack队列的大小(被叫) | 协商PDU长度 |
---|---|---|---|---|---|
长度 | 1byte | 1byte | 2byte | 2byte | 2byte |
描述 | 0xF0 | 0x00 |
响应请求的报文格式与发送请求的报文格式相同,但S7头消息类型0x03- Ack-Data。
4.2.2 读取数据
4.2.2.1请求报文
S7头消息类型 0x01- Job Request,是功能码为0x04。请求部分只有参数部分,没有数据部分。
用途 | 功能码 | 项目计数 | 项目1 | 项目2 | …… | 项目n |
---|---|---|---|---|---|---|
长度 | 1byte | 1byte | ||||
描述 | 0x04 |
每个项目的报文格式如下:
用途 | 变量规范 | 长度规范 | 地址规范 | 数据规范 | 数据长度 | DB编号 | 区域 | 地址 |
---|---|---|---|---|---|---|---|---|
长度 | 1byte | 1byte | 1byte | 1byte | 2byte | 2byte | 1byte | 3byte |
描述 | 通常为0x12 | 本项目剩余部分的长度 | IDS的地址规范的格式 | 数据传输的大小和变量类型 | 请求数据长度 | 如果访问的不是DB区域,此处为0x0000 | 数据的区域类型 | 要读取数据的地址 |
- 地址规范的常见值如下所示:
十六进制代码 | 标识 | 描述 |
---|---|---|
0x10 | S7ANY | S7-Any指针类似地址数据,例如DB1.DBX10.2 |
0x13 | PBC-R_ID | PBC的R_ID |
0x15 | ALARM_LOCKFREE | 报警锁定/释放数据集 |
0x16 | ALARM_IND | 报警指示数据集 |
0x19 | ALARM_ACK | 报警确认消息数据集 |
0x1a | ALARM_QUERYREQ | 报警查询请求数据集 |
0x1c | NOTIFY_IND | 通知指示数据集 |
0xa2 | DRIVEESANY | 见于Drive ES Starter,通过S7进行路由 |
0xb2 | 1200SYM | S7-1200的符号地址模式 |
0xb0 | DBREAD | DB块读取,仅在S7-400上见到 |
0x82 | NCK | Sinumerik NCK HMI访问 |
数据规范常见值如下:
值 | 类型 | 描述 | 长度单位 |
---|---|---|---|
0 | NULL | 空 | - |
3 | BIT | 位访问 | 位 |
4 | BYTE/WORD/DWORD | 字节/字/双字访问 | 位 |
5 | INTEGER | 整数访问 | 位 |
6 | DINTEGER | 双整数访问 | 字节 |
7 | REAL | 实数访问 | 字节 |
9 | OCTET STRING | 八位字节字符串 | 字节 |
数据区域常见值如下:
十六进制代码 | 描述 |
---|---|
0x03 | 200系列系统信息 |
0x05 | 200系列系统标志 |
0x06 | 200系列模拟量输入 |
0x07 | 200系列模拟量输出 |
0x80 | 直接访问外设 |
0x81 | 输入(I) |
0x82 | 输出(Q) |
0x83 | 内部标志(M) |
0x84 | 数据块(DB) |
0x85 | 实例数据块(DI) |
0x86 | 局部变量(L) |
0x87 | 未知(V) |
0x1c | S7计数器 |
0x1d | S7定时器(T) |
0x1e | 描述不明 |
0x1f | IEC计数器(200系列) |
0x20 | IEC定时器(200系列) |
4.2.2.2 响应报文
响应报文S7头消息类型0x03- Ack-Data。响应报文既有参数部分,又有数据部分。
参数部分:
用途 | 功能码 | 项目计数 |
---|---|---|
长度 | 1byte | 1byte |
描述 | 0x04 | 后续数据部分有几个 |
数据部分:
用途 | 返回码 | 数据规范 | 数据长度 | 返回数据 | 填充数据 |
---|---|---|---|---|---|
长度 | 1byte | 1byte | 2byte | 不定 | 不定 |
描述 | 表示返回信息类型 | 数据传输的大小和变量类型 | 后续数据长度 | 读取到的数据 | 如返回数据不到数据长度的长度,则填充一部分00至此 |
常见返回码类型:
十六进制代码 | 英文描述 | 中文描述 |
---|---|---|
0x00 | Reserved | 未定义,预留 |
0x01 | Hardware error | 硬件错误 |
0x03 | Accessing the object not allowed | 对象不允许访问 |
0x05 | Invalid address | 无效地址,所需的地址超出此PLC的极限 |
0x06 | Data type not supported | 数据类型不支持 |
0x07 | Data type inconsistent | 日期类型不一致 |
0x0a | Object does not exist | 对象不存在 |
0xff | Success | 成功 |
4.2.3写入数据
4.2.3.1 请求报文
S7头消息类型 0x01- Job Request,请求报文格式中参数部分和读取数据的相同,但功能码为0x05,且多了数据部分:
用途 | 返回码 | 数据规范 | 数据长度 | 写入数据 | 填充数据 |
---|---|---|---|---|---|
长度 | 1byte | 1byte | 2byte | 不定 | 不定 |
描述 | 通常为0x00 | 数据传输的大小和变量类型 | 后续数据长度 | 要写入的乳山市 | 如写入数据不到数据长度的长度,则填充一部分00至此 |
4.2.3.2 响应报文
参数部分请求报文,数据部分为:
用途 | 返回码 |
---|---|
长度 | 1byte |
描述 | 通常为0xff |
S7Comm报文详解的更多相关文章
- HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解
一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...
- http协议之报文详解
一. 概述 用于HTTP协议交互的信息被称为HTTP报文.请求端(客户端)的http报文叫做请求报文,响应端的叫做响应报文. 报文,是网络中交换和传输的数据单元,即站点一次性要发送的数据块.报文包含了 ...
- HTTP/1.1报文详解
本文为<三万长文50+趣图带你领悟web编程的内功心法>第三个章节. 3.HTTP/1.1报文详解 在RFC2616中心详细的描述了HTTP/1.1[1]的报文,感兴趣的朋友也可以前往阅读 ...
- 应用层(一)HTTP服务访问基本流程和HTTP报文详解
HTTP属于TCP/IP模型中一个面向文本的应用层协议,所使用的服务器端口号的TCP中的80端口,通信双方在这个基础上进行通信. 每个服务器都有一个应用进程,时刻监听着80端口的用户访问请求.当有用户 ...
- HTTP请求与响应报文详解
如图所示,这是客户端往服务器发送请求时的报文: 一般来说,将报文分成三个部分,请求行.请求头.请求体 如图,请求行包括三部分内容 1.请求方法,在HTTP里的请求方法种类较多,但就移动端开发来说,常用 ...
- ModbusRtu通信报文详解【二】
这里接着上一篇内容对ModbusRtu的通信报文做个详细描述: [1]强制单个线圈 功能码:05H [2]预置单个寄存器 功能码:06H [3]强制多个线圈 功能码;0FH [4]预置多个寄存器 功能 ...
- ModbusRtu通信报文详解【一】
Modbus协议可谓是工业控制领域应用最广泛的协议之一.根据不同的电气接口,包括Modbus Rtu/ASCII,Modbus TCP/UDP,从学习的角度来说,只要学会其中一种,剩余的都是大同小异的 ...
- HTTP报文详解
二.HTTP请求首部字段 1 Accept 2 Accept-Charset 3 Accept-Encoding 4 Accept-Language 5 Authorization 6
- ModbusTCP报文详解【二】
[1]功能码05H [2]功能码06H [3]功能码0FH [4]功能码10H
- ModbusTCP报文详解【一】
[1]功能码01H [2]功能码02H [3]功能码03H [4]功能码04H
随机推荐
- 神经网络优化篇:详解深度学习框架(Deep Learning frameworks)
深度学习框架 一小点作者内心os:24年春节已过完,从熟悉的地方又回到陌生的地方谋生,愿新的一年都得偿所愿,心想事成. 学到这会儿会发现,除非应用更复杂的模型,例如卷积神经网络,或者循环神经网络,或者 ...
- Java Socket编程系列(四)开发支持多客户端访问的Server
例子来自Java官方教程,稍作调整. 上一篇介绍了单客户端访问的Server实现,这一篇实现的是多个客户端请求服务端,根据服务端提示进行一系列操作. 协议类(和系列三一样没变): package co ...
- UtilMeta - 简洁高效的 Python 后端元框架
最近开源了我开发多年的一个 Python 后端框架:UtilMeta 项目介绍 UtilMeta 是一个用于开发 API 服务的后端元框架,基于 Python 类型注解标准高效构建声明式接口与 ORM ...
- 服务端高性能网络IO编程模型简析
服务端高性能网络IO编程模型简析 一.客户端与服务器端 多数网络应用可以分为客户端(client)和服务器端(server)模型,然后中间通过各种定义的协议来进行两端的通信. 比如常用的 Nginx ...
- 2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti
2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti ...
- [BUUCTF][WEB][ACTF2020 新生赛]Upload 1
打开靶机url,右键查看网页源代码 其中有一段代码 <div class="light"><span class="glow"> < ...
- 使用TLP对Linux系统进行充电保护
https://zhuanlan.zhihu.com/p/65546444 TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具 https://blog.csdn.net/zxw781 ...
- Java纯手打web服务器(二)
概要:这里对上一篇中的访问资源进行改进,将访问servlet和静态资源进行区分. 主要不同的地方是加入了两种分析器 servlet分析器 if (request.getUri().startsWith ...
- Java 演示线程的死锁问题
1 package bytezero.deadlock; 2 3 /** 4 * 演示线程的死锁问题: 5 * 6 * 1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃 7 ...
- C++ //栈 stack 容器 先进后出 不允许遍历
1 //栈 stack 容器 先进后出 不允许遍历 2 3 4 #include<iostream> 5 #include<stack> 6 7 using namespace ...