1

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头报文格式如下:

用途版本保留长度
长度1byte1byte1byte
描述版本信息保留(值为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类型目的地参考源地址参考选项参数
长度1byte1byte2byte2byte1byte不定
描述除长度部分外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类型选项
长度1byte1byte1byte
描述除长度部分外COTP后续长度指示PDU(Protocol Data Unit,协议数据单元)的类型根据PDU类型不同,可能包含额外的控制信息

4.S7Comm

报文结构如下

用途S7头参数数据
长度10或12byte不定不定
描述报文头包含了执行特定操作所必需的控制信息数据部分是可选的,具体取决于执行的操作类型。

4.1 S7头

报文结构如下:

用途协议ID消息类型冗余识别议数据单元参考参数长度数据长度错误类型错误代码
长度1byte1byte2byte2byte2byte2byte1byte1byte
描述通常为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长度
长度1byte1byte2byte2byte2byte
描述0xF00x00

响应请求的报文格式与发送请求的报文格式相同,但S7头消息类型0x03- Ack-Data。

4.2.2 读取数据

4.2.2.1请求报文

S7头消息类型 0x01- Job Request,是功能码为0x04。请求部分只有参数部分,没有数据部分。

用途功能码项目计数项目1项目2……项目n
长度1byte1byte
描述0x04

每个项目的报文格式如下:

用途变量规范长度规范地址规范数据规范数据长度DB编号区域地址
长度1byte1byte1byte1byte2byte2byte1byte3byte
描述通常为0x12本项目剩余部分的长度IDS的地址规范的格式数据传输的大小和变量类型请求数据长度如果访问的不是DB区域,此处为0x0000数据的区域类型要读取数据的地址
  • 地址规范的常见值如下所示:
十六进制代码标识描述
0x10S7ANYS7-Any指针类似地址数据,例如DB1.DBX10.2
0x13PBC-R_IDPBC的R_ID
0x15ALARM_LOCKFREE报警锁定/释放数据集
0x16ALARM_IND报警指示数据集
0x19ALARM_ACK报警确认消息数据集
0x1aALARM_QUERYREQ报警查询请求数据集
0x1cNOTIFY_IND通知指示数据集
0xa2DRIVEESANY见于Drive ES Starter,通过S7进行路由
0xb21200SYMS7-1200的符号地址模式
0xb0DBREADDB块读取,仅在S7-400上见到
0x82NCKSinumerik NCK HMI访问

数据规范常见值如下:

类型描述长度单位
0NULL-
3BIT位访问
4BYTE/WORD/DWORD字节/字/双字访问
5INTEGER整数访问
6DINTEGER双整数访问字节
7REAL实数访问字节
9OCTET STRING八位字节字符串字节

数据区域常见值如下:

十六进制代码描述
0x03200系列系统信息
0x05200系列系统标志
0x06200系列模拟量输入
0x07200系列模拟量输出
0x80直接访问外设
0x81输入(I)
0x82输出(Q)
0x83内部标志(M)
0x84数据块(DB)
0x85实例数据块(DI)
0x86局部变量(L)
0x87未知(V)
0x1cS7计数器
0x1dS7定时器(T)
0x1e描述不明
0x1fIEC计数器(200系列)
0x20IEC定时器(200系列)
4.2.2.2 响应报文

响应报文S7头消息类型0x03- Ack-Data。响应报文既有参数部分,又有数据部分。

参数部分:

用途功能码项目计数
长度1byte1byte
描述0x04后续数据部分有几个

数据部分:

用途返回码数据规范数据长度返回数据填充数据
长度1byte1byte2byte不定不定
描述表示返回信息类型数据传输的大小和变量类型后续数据长度读取到的数据如返回数据不到数据长度的长度,则填充一部分00至此

常见返回码类型:

十六进制代码英文描述中文描述
0x00Reserved未定义,预留
0x01Hardware error硬件错误
0x03Accessing the object not allowed对象不允许访问
0x05Invalid address无效地址,所需的地址超出此PLC的极限
0x06Data type not supported数据类型不支持
0x07Data type inconsistent日期类型不一致
0x0aObject does not exist对象不存在
0xffSuccess成功

4.2.3写入数据

4.2.3.1 请求报文

S7头消息类型 0x01- Job Request,请求报文格式中参数部分和读取数据的相同,但功能码为0x05,且多了数据部分:

用途返回码数据规范数据长度写入数据填充数据
长度1byte1byte2byte不定不定
描述通常为0x00数据传输的大小和变量类型后续数据长度要写入的乳山市如写入数据不到数据长度的长度,则填充一部分00至此
4.2.3.2 响应报文

参数部分请求报文,数据部分为:

用途返回码
长度1byte
描述通常为0xff

杜衡老师
1 声望2 粉丝

引用和评论

0 条评论