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. 记一次 .NET某列控连锁系统 崩溃分析

    一:背景 1. 讲故事 过年喝了不少酒,脑子不灵光了,停了将近一个月没写博客,今天就当新年开工写一篇吧. 去年年初有位朋友找到我,说他们的系统会偶发性崩溃,在网上也发了不少帖子求助,没找到自己满意的答 ...

  2. StretchDIBits在一些图像尺寸下失败

    StretchDIBits用来打印图像,但是由于某种未知的原因,当图像达到特定尺寸时,它会失败. 图像数据从其他一些图像源以24位BGR格式加载到无符号int数组中.它可以在某些大小下工作,但根本无法 ...

  3. DVWA XSS

    XSS Store hign level <?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input $message = trim( $_P ...

  4. Ubuntu常用工具和问题整理

    安装Ubuntu虚拟机时常会遇到的几个问题 1.安装时设置镜像 安装Ubuntu系统时设置国内镜像可以加快安装速度:http://mirrors.aliyun.com/ubuntu/ 参考:ubunt ...

  5. 如何保证消息顺序执行(Rabbitmq/kafka)

    转载: https://www.cnblogs.com/-wenli/p/13047059.html https://www.jianshu.com/p/02fdcb9e8784

  6. locals和globals,函数的嵌套,nonlocal,闭包函数及特点以及匿名函数---day11

    1.locals和globals 1.1locals  获取当前作用域中的所有内容 locals 如果在函数外,调用locals(),获取打印的是打印之前的所有变量,返回字典,全局空间作用域 loca ...

  7. Redis动态配制,限内存,免重启

    p.p1 { margin: 0; font: 14px Menlo; color: rgba(0, 255, 255, 1); background-color: rgba(0, 0, 0, 0.8 ...

  8. 【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容

    问题描述 在Azure App Service for Windows 中部署web项目时候,需要在wwwroot下设置web.config,对于不同语言的项目,web.config文件中的httpP ...

  9. gorm整理

    目录 1. 约定 2. 结构体标签 3. 创建记录 4. 更新 5.删除 6. 查询 7.关联 8.链式操作 9.范围 10.多个立即执行方法的注意事项 11.错误处理 12.钩子 13.事务 14. ...

  10. 压测中TPS上不去的几种原因及分析?

    1. 服务器资源限制:服务器的硬件资源(如 CPU.内存.磁盘)可能不足以处理大量的请求.在高负载情况下,服务器可能无法及时响应所有的请求,导致 TPS 上不去.解决方法可以考虑升级硬件资源或通过负载 ...