首页 > 其他分享 >S7Comm报文详解

S7Comm报文详解

时间:2024-03-28 23:55:06浏览次数:28  
标签:COTP Data 报文 S7 详解 S7Comm 长度 数据 1byte

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

标签:COTP,Data,报文,S7,详解,S7Comm,长度,数据,1byte
From: https://www.cnblogs.com/AsarumMaxim/p/18102903

相关文章

  • 【docker常用命令系列】Docker save语法用法示例详解
    【docker常用命令系列】Dockersave语法用法示例详解源自专栏《docker常用命令系列目录导航?》文章目录[【docker常用命令系列】Dockersave语法用法示例详解](https://zhuanlan.zhihu.com/p/689619518/)概览用法别名选项示例参考链接概览dockerimagesav......
  • Java抽象类详解:定义、特性与实例化限制(day12)
    抽象类总结一下今天老师上课的内容,前面几节课听得是有点懵,在讲到内存问题,也就是代码在栈、堆、以及方法区是怎么执行的,听得不是很懂,今天讲到抽象类以及重写的机制,似乎开始慢慢懂得了java的底层原理。父类:子类:上面的Cat类重写父类的eat()方法。Test:如果我们将父类的......
  • 【AOP技术之穿透版】AOP详解
    这篇文章将让你知道AOP相关详细知识,分为基础和进阶,看完会觉得AOP也不过如此。。。制作不易,觉得不错请点赞收藏!!!目录1.AOP基础1.1 AOP概述1.2 事务管理1.3 什么又是面向方法编程呢,为什么又需要面向方法编程呢?1.4 AOP的作用(无侵入性:解耦)1.5  AOP快速入......
  • Mysql(数据库)知识详解【4】~{索引,主键优化}
    记住满元素中间元素向上裂变就行了因为如果是5个节点,比第一个节点小的算一个指针,逼最后一个节点大的算一个指针,里面是4个指针所有元素都会出现在叶子节点并且诸多叶子节点通过指针构造一张单项链表看我:除了最下面节点,上面的节点(叶子空间最大16k)全部放满内存......
  • 探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较
    1.数据格式介绍数据格式是用于组织和存储数据的规范化结构,不同的数据格式适用于不同的场景。常见的数据格式包括JSON、YAML、XML、CSV等。数据可视化|一个覆盖广泛主题工具的高效在线平台(amd794.com)https://amd794.com/jsonformat2.JSON(JavaScriptObjectNotation)......
  • 【机器学习】决策树学习下篇(详解)
    引言在当今数据驱动的时代,机器学习技术已成为解决复杂问题不可或缺的工具。其中,决策树学习作为一种基础且强大的算法,广泛应用于各种领域,包括但不限于金融风控、医疗诊断、客户关系管理等。决策树以其简单直观、易于理解和实现的特点,受到了数据科学家和业界专家的青睐。过拟合......
  • 操作符详解
    文章目录操作符的分类1.算数操作符-加法(+):将两个操作数相加。-减法(-):从第一个操作数中减去第二个操作数。-乘法(*):将两个操作数相乘。-除法(/):将第一个操作数除以第二个操作数。-模运算(%):返回两个操作数相除的余数。2.赋值操作符:=和复合赋值示例代码3.单目操......
  • 【剑指offer】73. 数组中只出现一次的两个数字(超详解)
    题目链接acwingleetcode题目描述给你一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。输入:nums=[1,2,......
  • #yyds盘点# Java双刃剑之Unsafe类详解
    for(inti=0;i<2;i++){unsafe.copyMemory(null,addr,null,addr3+size*i,4);}System.out.println(unsafe.getInt(addr));System.out.println(unsafe.getLong(addr3));}finally{unsafe.freeMemory(addr);unsafe.freeMemory(addr3);}}先看结果输出:addr:24......
  • Python学习——例题详解1、字符串简单加密和解密
    1、加密原理    基于按位异或(^),对字符串进行简单的加密算法原理:ord('A')^ord('P')#加密,运算结果:17chr(17^ord('p'))#解密,运算结果:‘A’2、例题    给定字符串text作为明文(要加密的原文,同上述A)和key作为密钥(同上述P),使用按位异或循环处理text的每一个......