S7协议解析

2023-11-08

S7

1 西门子通信场景

西门子设备使用多种不同现场总线协议,例如:MPI、Profibus、IE 、Profinet 等。Profinet用于将PLC连接到IO模块,而不是设备的管理协议。S7以太网通信协议,主要用于将PLC连接到(i)pc站(PG/PC - PLC 通信)。

大多数情况下,西门子通信遵循传统的主从模式(master-slave)或者**CS模式(**client-server )。

其中PC(master/client)将S7请求发送到现场设备(slave/server)。这些请求用于从设备查询或向设备发送数据或发出某些命令。
当PLC作为通信主站时(master)有一些例外,通过FB14/FB15设备可以向其他设备发起GET和PUT请求。

在S400系列中,实现了所谓的循环数据I/O功能,这类似于传统的发布者 - 订阅模型。PC可以订阅某些事件,而不是PLC 定期推送所请求的数据送到网络。还有一个合作伙伴(Partner )或点对点模型,当一个活动的合作伙伴请求连接并调用阻止发送(Block Send),与此同时被动合作伙伴调用阻止接收(Block Receive)方法。

2 S7的OSI模型

在这里插入图片描述

OSI layer Protocol
7 Application Layer S7 communication
6 Presentation Layer S7 communication(COTP)
5 Session Layer S7 communication(TPKT)
4 Transport Layer ISO-on-TCP (RFC 1006)
3 Network Layer IP
2 Data Link Layer Ethernet
1 Physical Layer Ethernet
其中,第1~4层会由计算机自己完成(底层驱动程序);
第5层TPKT,应用程数据传输协议,介于TCP和COTP协议之间;这是一个传输服务协议,主要用来在COTP和TCP之间建立桥梁;
第6层COTP,COTP 是 OSI 7层协议定义的位于TCP之上的协议。COTP 以“Packet”为基本单位来传输数据,这样接收方会得到与发送方具有相同边界的数据;
第7层,S7 communication,这一层和用户数据相关,对PLC数据的读取报文在这里完成;

刚看到TPKT和COPT也许会很迷惑,其实在具体的报文中:

	1、TPKT的作用是包含用户协议(5~7层)的数据长度(字节数);
	2、COTP的作用是定义了数据传输的基本单位(在S7Comm中 PDU TYPE:DT data);

计算机与PLC进行通讯,可以连接102端口,这是西门子开放的一个通讯端口;

3 S7协议的通讯流程

计算机与1500PLC进行S7Comm以太网通讯,需经过三个过程:

<1>“握手”

           当PC与PLC通过Socket建立链接时,会进行“三次握手”,这是标准的TCP连接方式;这个过程会有Socket自动完成;

<2> 通讯请求

          在“握手”之后,并不能马上进行数据交换,还需要"通讯请求"过程。这个过程包含两次报文交换:

            1> PC 发送COTP报文给PLC;在COTP报文中包含“连接请求”和“destination TSAP” - 明确CPU的机架号和槽号;

                  PLC反馈COTP报文,包含“连接确认”;

                    这样PLC就清楚了需要和那个CPU来进行数据通讯;

            2> PC 发送S7Comm报文给PLC;在S7 communicaton报文中包含“通讯请求”;

                  PLC反馈S7Comm报文。

<3> 交换数据

           数据读写就在这个过程内完成。我们可以组织报文来实现我们需要的功能。这个过程内的报文是S7Comm格式;  

           具体实现时,需要对S7Comm中的第5、6、7层进行编程。

4 S7的协议解析

4.1 S7 PDU

S7协议TCP/IP实现依赖于面向块的ISO传输服务,S7协议包含在TPKTISO-COTP协议中,允许PDU(协议数据单元)通过TCP承载。
ISO overTCP通信定义在RFC1006中,ISO-COTP定义在RFC2126其是基于ISO 8073协议(RFC905)。该结构如下图。
在这里插入图片描述

S7协议是面向功能/命令的,这意味着传输由S7请求和适当的应答组成(极少数例外)。在连接建立期间协商并行传输的数量和PDU的最大长度。

S7 PDU包含三部分:

头(Header):包含长度信息,PDU参考和消息类型常量

参数(Parameters):内容和结构根据PDU的消息和功能类型而有很大差异

数据(Data):该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等

根据实现的功能不同,S7 communication协议的结构会有所不同;例如,请求数据报文只包含前两部分;

<1>Header

   *01(1 byte): protocol Id: 0x32;

   *02a(1 byte): ROSCTR: Job (01);

   *02b(2 byte): redundancy identification (reserved): 0x0000;

   *2c(2 byte): protocol data unit reference; it’s increased by request event;

   *2d(2 byte): parameter length - the total length (bytes) of parameter part;

   *2e(2 byte): data length; 读取PLC内部数据,此处为00 00;对于其他功能,例如:读取CPU的型号,此处为Data部分的数据长度;

<2>Parameter(读取数据)

  *3(1 byte): function code: Read Var (0x04);writeVar (0x05);

    *4(1 byte): item count;

    *5(1 byte): variable specification: 0x12;

    *6(1 byte): length of following address specification – is 7~12length in byte;

    *7(1 byte): syntax Id: S7ANY (0x10);

    *8(1 byte):transport size: BYTE(2);

    *9(2 byte): requested data length;

    *10(2 byte): DB number; 如果访问的不是DB区域,此处为00 00;

    *11(1 byte): Area: 0x84= data block(DB); 0X82= outputs(Q); 0x81=inputs(I); 0x83= Flags(M); 0x1d= S7 timers(T); 0x1c= S7counters(C);

    *12(3 byte):address- start address from zero bit

    *5~*12构成了一个基本的数据请求单元[Item],对多个不同地址区域的数据请求,就是有多个[Item]构成的。

     Parameter部分的数据结构可以总结为:

                 [Function code ]+ [Item count] + Item[1] + Item[2]  . . . Item[n]  

<3>Data

      这一部分与功能有关,例如:读取CPU型号、向CPU存储区写数据;在请求数据报文中此部分不包含任何数据。

4.2 头

头长度为10-12个字节,确认消息包含两个额外的错误代码字节。除此之外,标头格式在所有PDU中是一致的
在这里插入图片描述
字段:

Protocol ID: [1b]协议常量,始终设置为0x32

Message Type: [1b]消息的一般类型(有时称为ROSCTR类型),消息的其余部分在很大程度上取决于Message Type和功能代码。

                0x01- Job Request:主站发送的请求(例如读/写存储器,读/写块,启动/停止设备,通信设置)

                0x02- Ack:从站发送的简单确认没有数据字段(从未见过它由S300 / S400设备发送)

                0x03- Ack-Data:带有可选数据字段的确认,包含对作业请求的回复

                0x07- Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取..)

Reserved: [2b]始终设置为0x0000(但可能忽略)

PDU reference: [2b]由主站生成,每次新传输递增,用于链接对其请求的响应,Little-Endian(注意:这是WinCC,Step7和其他西门子程序的行为,它可能是随机的生成后,PLC只将其复制到回复中)

Parameter Length: [2b]参数字段的长度,Big-Endian

Data Length: [2b]数据字段的长度,Big-Endian

(Error class): [1b]仅存在于Ack-Data消息中,可能的错误常量查看协议常量

(Error code): [1b]仅出现在Ack-Data消息中,可能的错误常量查看协议常量

4.3 parameter

parameter参数取决于Message Type和功能代码。这里分析仅针对Message Type为:

    (1)0x01- Job Request:主站发送的请求(例如读/写存储器,读/写块,启动/停止设备,通信设置)

   (2) 0x03- Ack-Data:带有可选数据字段的确认,包含对作业请求的回复

Job和Ack Data消息的parameter都是以功能代码开头,其余字段的结构取决于此值。

4.4 设置通信[0xF0] ——即S7协议开始

在可以交换任何其他消息之前,在每个会话开始时会发送该消息对(Job 和Ack Data)。它用于协商Ack队列的大小和最大PDU长度,双方都声明其支持的值。Ack队列的长度决定了可以在没有确认的情况下同时启动的并行作业的数量。PDU和队列长度字段都是大端。

在这里插入图片描述

字段:

function code:功能代码,通信设置为0xf0

reserverd:保留字段,默认为ox00

Max AmQ Caller :Ack队列的大小(主叫)

Max AmQ Callee:Ack队列的大小(被叫)

PDU length: PDU长度。

4.5 S7寻址模型。

通过指定变量的存储区域地址(偏移量)及其大小或类型来执行数据读取和写入操作。

如前所述,通过指定地址来访问变量,该地址由三个主要属性组成。

1、存储区域:

Merker: [M]任意标记变量或标志寄存器驻留在这里。

Data Block: [DB] DB区域是存储设备不同功能所需数据的最常见位置,这些数据块编号为地址的一部分。

Input: [I]数字和模拟输入模块值,映射到存储器。

Output: [Q]类似的存储器映射输出。

Counter: PLC程序使用的不同计数器的[C]值。

Timer: PLC程序使用的不同定时器的[T]值。

还有其他不太常见的存储区域(例如本地数据[L]和外设访问[P]等)。

2、变量类型
变量的类型决定了它的长度以及它应该如何解释。一些例子是:

BIT:[X]一位。

WORD:两个字节宽的无符号整数。

DINT:四字节宽的有符号整数。

REAL:四个字节宽的IEEE浮点数。

COUNTER:PLC程序计数器使用的计数器类型。

示例:

变量的示例地址是DB123X 2.1,它访问数据块#123的第三个字节的第二个位。

在这个简短的介绍之后,回到协议的变量读/写的实现。
S7协议支持使用不同的寻址模式在单个消息中查询多个变量读/写。
主要有三种模式:

any-type:这是默认的寻址模式,用于查询任意变量。为每个寻址变量指定所有三个参数(区域,地址,类型)。

db-type:这是专门用于解决DB区域变量的特殊模式,它比any-type地址更紧凑。

symbolic-addressing: S7-1200/1500系列设备使用此模式,允许使用预定义的符号名称寻址某些变量。此处不会详细介绍此模式。

对于每种寻址模式,Parameters头的结构方式相同:

    Function Code: [1b]读取的常量值0x04或写入作业和回复的0x05。

    Item Count: [1b] Request Item结构的数量。

    Request Item:此结构用于解决实际变量,其长度和字段取决于所使用的寻址类型。这些项目仅存在于作业请求中,无论寻址模式是什么,还是读取或写入请求,都会从相应的Ack数据中发出。

4.6 DATA

S7 PDU 的Data 部分根据消息的类型(read/write)和方向(Job/Ack Data)而变化:

    Read Request:该Data 部分是空的。

    Read Response: Ack数据消息的Data 部分由Data Item结构组成,每个结构对应于原始请求中存在的每个 Request Items。这些项包含读变量的实际值,格式取决于寻址模式。

    Write Request:包含与读响应类似的 Data Items,一个用于 Parameter头中的每个Request Items。类似地,这些包含要在从设备上写入的变量值。

    Write Response:Ack数据消息的数据部分只包含原始 Write Request中每个Request Items的一个字节错误代码。有关错误代码值,请参阅协议常量。

总而言之,Request Item 始终包含变量的描述,其中多个可以在作业请求中发送,而 Data Item包含所描述变量的实际值。所述 Data Item的结构必须开始于偶数字节,所以如果它们的长度是奇数且有以下 Data Item然后将它们填充以零字节。

剩下要讨论的是Request/Data Item结构的格式。如前所述,它们依赖于所使用的寻址模式,因此将基于此介绍它们。

https://www.jianshu.com/p/0e9f74d683b4
http://www.zyiz.net/tech/detail-112446.html
https://www.likecs.com/default/index/show?id=94470

4.7 一些字段

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

S7协议解析 的相关文章

  • 安卓默认启动的活动界面

    是在AndroidManifest 的activity 的标签中 加入 的活动是默认启动的
  • ENVI5.3安装

    一 下载地址 BT下载地址 链接 https pan baidu com s 1Z1l0qXQjSaEf3VQj9 qcAw 提取码 4il4 压缩包下载 链接 https pan baidu com s 1EbdO0uDiBdbFFdQx
  • java中定义score方法_elasticsearch 自定义 script score JavaAPI查询详解

    一 自定义score的应用场景 先打个比方 比如新产品上架了 我想让最新上架的产品搜索时候 排在前面 怎么办呢 很简单按时间排序 嗯这种方法很好实现 但下面又有个需求 比如我要求排序中上架时间的比重为40 自营产品为20 促销产品的比重为4

随机推荐

  • git branch管理常用命令

    本文转载至 http www 2cto com os 201307 229235 html git branch管理常用命令 查看本地分支 plain git branch dev master 代表当前位于dev分支 查看远程分支 pla
  • python netcdf4读取nc格式的气象数据

    一 nc格式数据介绍 NetCDF全称为network Common Data Format 中文译法为 网络通用数据格式 netcdf文件开始的目的是用于存储气象科学中的数据 现在已经成为许多数据采集软件的生成文件的格式 从数学上来说 n
  • PROJ4是什么?

    GIS Geographic Information System 地理信息系统 领域中最常提及 的一个概念是坐标系统 当我们提及一个地理位置的时候 与之伴随而产生的是该位置必定在一个空间参考下 当我们使用GPS设备获取到某个位置的经纬度的
  • Linux常用配置及硬件检测命令

    一些比较常见的linux命令 主要用于检测服务器的配置和硬件信息 包括 操作系统 CPU 内存 硬盘分区 系统时间 负载 网络相关 进程 用户 开关机 启动等方面 适用于主流操作系统 常见的centos ubuntu debian等 操作系
  • python selenium 三种等待方式详解

    引言 当你觉得你的定位没有问题 但是却直接报了元素不可见 那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素还没出来就已经报错了 试着程序调试程序运行速度 等待元素可见再继续运行程序 1 强制等待 sleep 优点 简单明了 需
  • 【国家参考文献标准GB/T 7714—2015】

    GB T 7714 2015 2 1 参考文献著录方法几种主要类型的参考文献 专著 专著中的析出文献 连续出版物 连续出版物中的析出文献 专利文献 电子文献等 的著录项目与格式要求如下 2 1 1 专著 图书 M 指以单行本或多卷册形式 在
  • 游戏开发unity编辑器扩展知识系列:获取选中文件的路径

    参考 Unity 编辑器下获取选择文件路径
  • Python中如何输出换行?

    Python中如何输出换行 在Python中 输出换行可以使用的方法有两种 分别是用转义符号或使用print 接下来我们通过这篇文章为大家详细的讲解一下 方法1 用转义符号 str3 老男孩教育 n str4 帮助有志向的年轻人通过努力学习
  • Threejs + vue 学习- VR 看房

    知识点 参考链接 threejs github 图片下载 https gitee com congyingcy threejs learning tree master three public imgs 直接跳转 代码下载 直接跳转 立方
  • maven自定义Archetype

    1 创建模板项目 如下 2 模板项目的pom xml中添加archetype插件
  • 光纤验收测试标准、参数及常用设备

    在光纤工程项目中必须执行一系列的测试以确保其完整性 一根光缆从出厂到工程安装完毕 需要进行机械测试 几何测试 光测及传输测试 前3个测试一般在工厂进行 传输测试则是光缆布线系统工程验收的必要步骤 综合布线工程电气测试包括电缆系统电气性能测试
  • ChatGPT追祖寻宗:GPT-1论文要点解读

    论文地址 Improving Language Understanding by Generative Pre Training 最近一直忙着打比赛 好久没更文了 这两天突然想再回顾一下GPT 1和GPT 2的论文 于是花时间又整理了一下
  • mysql(十)mysql主从复制--主库切换

    概述 可能为了更迭升级服务器 或者主库出现问题 又或者只是希望重新分配容量 此时需要切换主库 如果这是计划内的切换 会相对容易点 只需要在从库上使用CHANGE MASTER TO命令 并设置合适的值 大多数的值都是可选的 至少要指定需要改
  • C++数据结构笔记(8)循环链表实现

    1 循环链表与单链表的区别在于尾部结点存在指向头结点的指针 2 无论尾部结点指向第一个结点 头结点 还是第二个结点 第一个有效结点 都可以被称为循环链表 3 判断循环结束的两种方式 遍历次数等于size 或判断next指针是否指向头结点 4
  • Ubuntu 20.04 LTS 系统下 安装Nvidia 显卡驱动、CUDA、cuDNN, 并可进行CUDA版本切换

    因为做深度学习的研究项目 为全新机器在Ubuntu 20 04 LTS 系统下 安装Nvidia 显卡驱动 Cuda Cudnn 并进行CUDA版本切换 成功安装完成了 写个记录 1 安装Nvidia 显卡驱动 步骤一 安装更新软件列表和依
  • 模糊测试--强制性安全漏洞发掘

    文档分享地址链接 链接 http pan baidu com s 1dDeROHj 密码 o15z 前 言 我知道 人类和鱼类能够和平共处 George W Bush 2000年9月29日 简介 模糊测试的概念至少已经流传了20年 但是直到
  • python游戏毕设项目 愤怒的小鸟游戏设计与实现 (源码)

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3 1 环境配置 3 2 Pygame介绍 4 具体实现 5 最后 0 项目简介 Hi 各位同学好呀 这里是L学长 今天向大家分享一个今年 2022 最新完成的毕业设计项目作
  • Linux地图投影Proj4应用,proj4 地图投影坐标转换库 - 下载 - 搜珍网

    压缩包 proj 4 7 0 zip 列表 proj 4 7 0 proj 4 7 0 README proj 4 7 0 configure in proj 4 7 0 aclocal m4 proj 4 7 0 Makefile am
  • RestTemplate使用方法

    单独使用调用其他服务请求 public static void getRestTemplate String urls RestTemplate restTemplate new RestTemplate MultiValueMap
  • S7协议解析

    S7 1 西门子通信场景 西门子设备使用多种不同现场总线协议 例如 MPI Profibus IE Profinet 等 Profinet用于将PLC连接到IO模块 而不是设备的管理协议 S7以太网通信协议 主要用于将PLC连接到 i pc