前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >S7Comm报文详解

S7Comm报文详解

原创
作者头像
杜衡老师
发布2024-03-28 23:57:11
2790
发布2024-03-28 23:57:11
举报
文章被收录于专栏:工控协议详解

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简介
  • 2.TPKT
  • 3.COTP
    • 3.1 COTP连接包
      • 3.1 COTP功能包
      • 4.S7Comm
        • 4.1 S7头
          • 4.2 参数、数据
            • 4.2.1 建立通讯
            • 4.2.2 读取数据
            • 4.2.3写入数据
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档