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功能包。

  1. COTP连接包:COTP连接包主要用于建立、维护和断开COTP协议层的连接。这一过程包括连接请求(CR-Connect Request)、连接确认(CC-Connect Confirm)、断开请求(DR-Disconnect Request)和断开确认(DC-Disconnect Confirm)等步骤。通过这些连接包,COTP能够在通信双方之间建立一个稳定的、可靠的会话,保证数据的顺序传输和完整性。
  2. 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报文详解的更多相关文章

  1. HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解

    一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...

  2. http协议之报文详解

    一. 概述 用于HTTP协议交互的信息被称为HTTP报文.请求端(客户端)的http报文叫做请求报文,响应端的叫做响应报文. 报文,是网络中交换和传输的数据单元,即站点一次性要发送的数据块.报文包含了 ...

  3. HTTP/1.1报文详解

    本文为<三万长文50+趣图带你领悟web编程的内功心法>第三个章节. 3.HTTP/1.1报文详解 在RFC2616中心详细的描述了HTTP/1.1[1]的报文,感兴趣的朋友也可以前往阅读 ...

  4. 应用层(一)HTTP服务访问基本流程和HTTP报文详解

    HTTP属于TCP/IP模型中一个面向文本的应用层协议,所使用的服务器端口号的TCP中的80端口,通信双方在这个基础上进行通信. 每个服务器都有一个应用进程,时刻监听着80端口的用户访问请求.当有用户 ...

  5. HTTP请求与响应报文详解

    如图所示,这是客户端往服务器发送请求时的报文: 一般来说,将报文分成三个部分,请求行.请求头.请求体 如图,请求行包括三部分内容 1.请求方法,在HTTP里的请求方法种类较多,但就移动端开发来说,常用 ...

  6. ModbusRtu通信报文详解【二】

    这里接着上一篇内容对ModbusRtu的通信报文做个详细描述: [1]强制单个线圈 功能码:05H [2]预置单个寄存器 功能码:06H [3]强制多个线圈 功能码;0FH [4]预置多个寄存器 功能 ...

  7. ModbusRtu通信报文详解【一】

    Modbus协议可谓是工业控制领域应用最广泛的协议之一.根据不同的电气接口,包括Modbus Rtu/ASCII,Modbus TCP/UDP,从学习的角度来说,只要学会其中一种,剩余的都是大同小异的 ...

  8. HTTP报文详解

    二.HTTP请求首部字段 1 Accept 2 Accept-Charset 3 Accept-Encoding 4 Accept-Language 5 Authorization 6

  9. ModbusTCP报文详解【二】

    [1]功能码05H [2]功能码06H [3]功能码0FH [4]功能码10H

  10. ModbusTCP报文详解【一】

    [1]功能码01H [2]功能码02H [3]功能码03H [4]功能码04H

随机推荐

  1. 神经网络优化篇:详解深度学习框架(Deep Learning frameworks)

    深度学习框架 一小点作者内心os:24年春节已过完,从熟悉的地方又回到陌生的地方谋生,愿新的一年都得偿所愿,心想事成. 学到这会儿会发现,除非应用更复杂的模型,例如卷积神经网络,或者循环神经网络,或者 ...

  2. Java Socket编程系列(四)开发支持多客户端访问的Server

    例子来自Java官方教程,稍作调整. 上一篇介绍了单客户端访问的Server实现,这一篇实现的是多个客户端请求服务端,根据服务端提示进行一系列操作. 协议类(和系列三一样没变): package co ...

  3. UtilMeta - 简洁高效的 Python 后端元框架

    最近开源了我开发多年的一个 Python 后端框架:UtilMeta 项目介绍 UtilMeta 是一个用于开发 API 服务的后端元框架,基于 Python 类型注解标准高效构建声明式接口与 ORM ...

  4. 服务端高性能网络IO编程模型简析

    服务端高性能网络IO编程模型简析 一.客户端与服务器端 多数网络应用可以分为客户端(client)和服务器端(server)模型,然后中间通过各种定义的协议来进行两端的通信. 比如常用的 Nginx ...

  5. 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 ...

  6. [BUUCTF][WEB][ACTF2020 新生赛]Upload 1

    打开靶机url,右键查看网页源代码 其中有一段代码 <div class="light"><span class="glow"> < ...

  7. 使用TLP对Linux系统进行充电保护

    https://zhuanlan.zhihu.com/p/65546444 TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具 https://blog.csdn.net/zxw781 ...

  8. Java纯手打web服务器(二)

    概要:这里对上一篇中的访问资源进行改进,将访问servlet和静态资源进行区分. 主要不同的地方是加入了两种分析器 servlet分析器 if (request.getUri().startsWith ...

  9. Java 演示线程的死锁问题

    1 package bytezero.deadlock; 2 3 /** 4 * 演示线程的死锁问题: 5 * 6 * 1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃 7 ...

  10. C++ //栈 stack 容器 先进后出 不允许遍历

    1 //栈 stack 容器 先进后出 不允许遍历 2 3 4 #include<iostream> 5 #include<stack> 6 7 using namespace ...