S7comm协议

协议简介

基本背景

西门子为PLC,SCADA,PLC之间的通信设计的专属协议,相比较Modbus协议栈修改程度更高

适用于S7-300、S7-400、S7-1200

应用层数据→COTP协议+TPKT协议→TCP传输数据

西门子PLC系统

PLC指Programmable Logic Controller(逻辑控制器)

image-20241116154433315
模块名称缩写功能
电源模块PS提供PLC系统运行所需的电源
CPU模块CPU负责处理信息和执行用户编写的程序
通信模块IM实现PLC与其他设备之间的通讯和数据交换
数字量输入模块DI接收外部数字量信号(如开关信号、传感器信号)
数字量输出模块DO输出数字量信号控制外部设备(如继电器、灯等)
模拟量输入模块AI接收外部模拟量信号(如电压、电流等)
模拟量输出模块AO输出模拟量信号控制外部设备(如变频器等)

S7comm协议栈

levelOSI layerProtocol
7Application Layer 应用层S7 communication
6Presentation Layer 表示层S7 communication(COTP)
5Session Layer 会话层S7 communication(TPKT)
4Transport Layer 传输层ISO-on-TCP (RFC 1006)
3Network Layer 网络层IP
2Data Link Layer 数据链路层Ethernet
1Physical Layer 物理层Ethernet

前面四层S7comm协议并不涉及,由计算机底层驱动实现

第五层:TPRK 应用数据传输协议,介于TCP和COTP之间,建立两者之间桥梁

第六层:COTP 定位于TCP协议之上的协议,以“Packet”为基本单位传输数据

第七层:S7 comm 与用户数据相关,对PLC数据的读取报文在这里完成

image-20241116162030953

TPKT协议

基本概述

TPKT is an "encapsulation" protocol. It carries the OSI packet in its own packet's data payload and then passes the resulting structure to TCP, from then on, the packet is processed as a TCP/IP packet. The OSI programs passing data to TPKT are unaware that their data will be carried over TCP/IP because TPKT emulates the OSI protocol Transport Service Access Point(TSAP)

翻译:

TPKT 是一种 “封装 ”协议。
它在自己的数据包有效载荷中携带 OSI 数据包,然后将产生的结构传递给 TCP
同时,数据包就作为 TCP/IP 数据包处理,向 TPKT 传输数据的 OSI 程序并不知道它们的数据将通过 TCP/IP 传输
因为 TPKT 模拟的是 OSI 协议传输服务接入点(TSAP)

协议包解析

解析:

image-20241116170416947

示例:

image-20241116170403108

COTP协议

基本概述

官方定义:https://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

OSI 7层协议定义的位于TCP之上的协议,以“Packet”为基本单位来传输数据

两种形态:

COTP连接包(COTP Connection Packet)

COTP功能包(COTP Fuction Packet)

COTP Connection Packet

S7Comm的握手包

image-20241116172635123

示例:

请求连接包

image-20241116172823292

连接确认包

image-20241116172907777

COTP Fuction Packet

相较于COTP Connection Packet更加简洁

image-20241117154834883

Length:

和COTP Connection Packet类似

PDU type:

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,数据传输

opt:

Boolean类型

Extended formats

No explicit flow control

示例:

image-20241117155331319

PDU类型为连接请求(0x0f)→数据传输的包

S7Comm协议

协议概述

S7Comm数据作为COTP数据包的有效载荷

协议标识符:

第一个字节0x32

协议构成:

image-20241117155751461

S7Comm Header

Header 定义:

  • 包的类型
  • 参数长度
  • 数据长度

Header 格式

image-20241117161757360
  1. 协议ID → Protocol Id:0x32
  2. PDU Type:0x01 – JOB(Request: job with acknowledgement):作业请求。由主设备发送的请求(例如,读/写存储器,读/写块,启动/停止设备,设置通信);
    0x02 – ACK(acknowledgement without additional field):确认响应,没有数据的简单确认(未遇到过由S7 300/400设备发送得)
    0x03 – ACK_DATA(Response: acknowledgement with additional field):确认数据响应,这个一般都是响应JOB的请求;
    0x07 – USERDATA:原始协议的扩展,参数字段包含请求/响应ID(用于编程/调试,读取SZL,安全功能,时间设置,循环读取…)
  3. Reserverd→冗余数据:通常0x0000
  4. PDU Reference→协议数据单元参考,随着事件的请求数量而增加
  5. Parameter length→参数的总长度
  6. Data length→数据长度
    • 读取PLC内部数据,设置为0x0000
    • 其余功能。设置为Dta部分数据长度
  7. Error class→错误类型
  8. Error code→错误代码

示例:

常规数据包:

image-20241117161828570

展示报错的数据包:

image-20241117161916189

Job & Ack_Data

Parameter的第一个字段是function→Job & Ack_Data

类型:unsigned integer→1 byte

后面将根据不同function对应的data以及后续的结构进行讲解(因为不同的function对应的data数据段的结构不一样)

建立通信(0xF0)

Setup communication [0xF0]

适用场景:每个会话开始时被发送,然后开始进行其他信号的交换

报文构成:

  1. 用于协商ACK队列的大小→决定了可以同时启动而不需要确认的并行作业的数量 大端序
  2. 用于协商最大的PDU长度→根据PDU类型长度定义功能 大端序
PDU=JOB

当PDU设置为JOB的时候,通信功能Parameter结构:

image-20241118142424889
Rserverd:保留字节
Max AmQ calling:parallel jobs with ack
Max AmQ called:parallel jobs with ack
PDU length:协商PDU长度
示例:

建立通信报文

image-20241118142956537

确认响应报文

image-20241118142922146

ACK队列的大小为1;最大PDU长度为240

读取值(0x04)

使用场景:数据读写操作通过指定变量的存储区域,地址(偏移量)及其大小或类型来执行

PDU=JOB

当PDU为JOB时,S7comm的结构为:

image-20241118143901179
parameter结构:
item count(Unsigned integer 1 byte):项目个数
Item 1:
Item 2:
Item 3:
Item ……:
Item n:
Item结构:
Request data lengthSpecification(Unsigned integer 1 byte): 确定项目结构的主要类型,通常为0x12,代表变量规

Length(Unsigned integer 1 byte): 本Item其余部分的长度

Syntax ID(Unsigned integer 1 byte): 确定寻址模式和其余项目结构的格式

Transport sizes(Unsigned integer 1 byte): 确定变量的类型和长度

Request data length(Unsigned integer 2 byte): 请求的数据长度

DB number(Unsigned integer 2 byte): DB模块的编号,如果访问的不是DB区域,为0x0000

Area(Unsigned integer, 1 byte): 区域类型

Address(Unsigned integer, 3 byte): 地址
示例:
image-20241118153537099
PDU=Ack_Data

当PDU类型为Ack_Data时,S7Comm的结构:

image-20241118155131877

Parameter只有function,item count两个字段

data段:

Return code(Unsigned integer, 1 byte): 返回代码

1Transport size(Unsigned integer, 1 byte): 数据的传输尺寸

Length(Unsigned integer, 2 bytes): 数据的长度

Data(根据情况而定):数据

Fill byte(Unsigned integer, 1 byte): 填充字节

示例:

image-20241118203340649

item1是读取DB1的0x000010(DB1.DBX 2.0 BIT 1)值→相应数据为01

写入值(0x5)

Write Va还需写入值,Write Var比Read Var多Data项

PDU=JOB
image-20241118205900024

data结构:

Return code(Unsigned integer, 1 byte): 返回代码,这里是未定义,所以为Reserved(0x00)

Transport size(unsigned integer, 1 byte): 确定变量的类型和长度

Length(unsigned integer, 2 bytes): 写入值的数据长度

Data(1 byte): 写入的数据

Fill byte(unsigned integer, 1 byte): 填充字节,如果数据的长度不足Length的话,则填充

示例:

向地址为0x000008的Flags(M)写入0x00的作业请求

PDU=Ack_Data

Parameter:function,item count字段

Data:Return code字段

示例:

image-20241120015834350

向地址为0x000008的Flags(M)写入0x00成功

下载功能

西门子设备程序代码和大部分数据存储在块中(存在自己的编码格式的块)

文件夹格式
  1. File identifier(ASCII):(1 byte)文件标识符,Complete Module),$(Module header for up-loading)
  2. Block type:(2 bytes)块类型。具体类型
  3. Block number(5 bytes)块编号
  4. Destination filesystem(ASCII):(1 byte)目标的文件系统(三种文件系统如下:
    • P(Passive (copied, but not chained) module):被动文件系统
    • A (Active embedded module):主动文件系统
    • B (Active as well as passive module):既主既被文件系统

示例:

文件名为0A00001P

文件标识是_,块类型为DB,块的编号为00001,目标块的文件系统是P

用于将DB 1复制到被动文件系统或从被动文件系统复制

下载有3中不同的功能类型:

请求下载(Request download [0x1A])
下载块(Download block [0x1B])
下载结束(Download ended [0x1C])

下载流程

Step7向PLC发送一个请求下载的Job

PLC收到后则回复一个Ack_Data

Step7向PLC发送一个下载结束的Job来关闭下载会话(所有字节传输完毕后)

时序图:

image-20241120202704682
请求下载(Request download [0x1A])
PDU=JOB

Request download [0x1A]没有Data

Parameter的结构:

  1. (1 byte): Function Status,功能码状态
  2. (2 bytes): for all unknown bytes in blockcontrol
  3. (4 bytes): 无意义,一般为0x00000000
  4. (1 byte): filename length,文件名长度
  5. (_ bytes): filename, default is 9 byte,文件名,长度一般为9个字节
    • (1 byte): File identifier(ASCII),文件标识符。其有_ (Complete Module),$ (Module header for up-loading)两种文件标识符
    • (2 bytes): Block type,块类型
    • (5 bytes): Block number,块编号
    • (1 byte): Destination filesystem(ASCII),目标的文件系统
  6. (1 byte): Length part 2 in bytes,参数的第二部分长度,也就是接下来的字段长度
  7. (1 byte): Unknown char(ASCII)
  8. (6 bytes): Length load memory in bytes(ASCII)
  9. (6 bytes): Length of MC7 code in bytes(ASCII)

示例:

image-20241120202638748

文件标识:_ (Complete Module)

块类型:OB

块编号:00001

目标块的文件系统:P (Passive (copied, but not chained) module)

PDU=Ack_Data

Request download [0x1A]的Parameter中仅一个function

image-20241120202715624

下载块(0x1B)

PDU=JOB

Download block [0x1B]也没有Data,其Parameter的结构与Request download(0x1A)的Parameter的第一部分相同

示例:

image-20241121004358027
PDU=Ack_Data

Parameter:

(1 byte): Function Status,功能码状态

Data:

  1. (Unsigned integer, 2 bytes): Length,数据长度
  2. (Unsigned integer, 2 bytes): Unknown byte(s) in blockcontrol,未知字节
  3. (Label,data_length-4 bytes): Data,数据

示例:

image-20241121004753552

下载结束(0x1C)

PDU=JOB

Download ended [0x1C]没有Data,Parameter与Download block (0x1B)的Parameter和Request download(0x1A)的Parameter的第一部分相同

示例:

image-20241121004745213
PDU=Ack_Data

Download ended [0x1C]的Parameter中只有一个function

image-20241121004844882

上传功能

上传是PLC发送块数据给Step7

功能类型:

  • 开始上传(Start upload [0x1D])
  • 上传(Upload [0x1E])
  • 上传结束(End upload [0x1F])

上传流程:

  1. Step7向PLC发送开始上传的Job
  2. PLC收到后回复Ack_Data(包含Step7块的长度,上传会话ID)
  3. PLC继续上传块数据到Step7(直到STEP7接收完毕)
  4. Step7发送结束上传的作业请求→关闭上传会话
image-20241121005051451

完整上传示例:

图34 一个完整的上传过程例子

开始请求(0x1D)

PDU=JOB

Start upload [0x1D]没有Data,Parameter:

  1. (1 byte)Function Status:功能码状态
  2. (2 bytes)for all unknown bytes in blockcontrol
  3. (4 bytes)上传的会话ID:此时为0x00000000
  4. (1 byte)filename length:文件名长度
  5. (? bytes) filename, default is 9 byte:文件名,长度一般为9个字节(1 byte)File identifier(ASCII):文件标识符,_ (Complete Module)、$ (Module header for up-loading)两种文件标识符(2 bytes)Block type:块类型(5 bytes)Block number:块编号(1 byte)Destination filesystem(ASCII):目标的文件系统(和下载一样)

示例:

image-20241121011339781

文件标识:_ (Complete Module)

块类型:0B(SDB)

块的编号;00000

文件系统:A (Active embedded module)

PUD=Ack_Data

Start upload [0x1D]的Parameter结构:

  1. (1 byte): Function Status,功能码状态
  2. (2 bytes): for all unknown bytes in blockcontrol
  3. (4 bytes): 上传的会话ID,告诉Step7上传会话ID
  4. (Unsigned integer, 1 byte): Blocklengthstring Length
  5. (Character string): Blocklength,块的长度

示例:

image-20241121011608462

ID:0x00000007

上传(0x1E)

PDU=JOB

没有Data,Parameter结构:

  1. (1 byte)Function Status:功能码状态
  2. (2 bytes)for all unknown bytes in blockcontrol
  3. (4 bytes)上传的会话ID:告诉Step7上传会话ID

示例:

image-20241121011959092
PDU=Ack_Data

Parameter结构:

(1 byte):Function Status:功能码状态

Data结构:

  1. (Unsigned integer, 2 bytes)Length:数据长度
  2. (Unsigned integer, 2 bytes)Unknown byte(s) in blockcontrol:未知字节
  3. (Label,data_length-4 bytes)Data:数据

示例:

image-20241121012201320

上传结束(0x1F)

PLC收到后关闭会话,返回一个结束相应

PDU=JOB

没有Data,Parameter结构:

  1. (1 byte)Function Status:功能码状态
  2. (2 bytes)Error code:错误代码
  3. (4 bytes)::上传的会话ID

示例:

image-20241121012411026
PDU=Ack_Data

End upload [0x1F]的Parameter中只有一个function

image-20241121012434114

程序调用服务(0x28)

程序调用是用于在PLC执行修改执行/内存状态的日常工作(启动或停止PLC控制程序、激活或删除程序块)

PDU=JOB

没有Data,Parameter结构:

  1. (7 bytes): Unknown
  2. (Unsigned integer, 2 bytes):Parameter block length
  3. (?bytes): Parameter block:参数
  4. (Unsigned integer, 1 byte)String length:PI service的字符串长度
  5. (Character string, ASCII)PI (program invocation) Service name:程序调用服务名

服务名称相关参数的示例:

_INSE:激活设备上下载的块,参数是块的名称(比如:OB 1)

_DELE:从设备的文件系统中删除一个块,该参数也是该块的名称

P_PROGRAM:设置设备的运行状态(启动、停止、复位)

_GARB:压缩PLC内存

_MODU:将ram复制到ROM,参数包含文件系统标识符(A/E/P)

服务调用的参数是块的话

Parameter block结构:

  1. (1 byte)Number of block
  2. (1 byte)Unknown:默认为0x00
  3. (? bytes)filename;文件名(2 bytes, ASCII)Block type:块类

    (5 bytes, ASCII)Block number:块编号

    (1 byte, ASCII)Destination filesystem(ASCII):目标的文件系统(和下载上传相同)

示例:

_INSE(激活PLC模块)的作业请求
image-20241121013205409

对应的请求响应:

image-20241121013253855
_MODU(复制RAM到ROM)的作业请求
图43_MODU(复制RAM到ROM)的作业请求

Parameter block中只有Argument

5.2.7 PLC STOP [0x29]

和程序调用服务(0x28)类似,没有Parameter block

示例:

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇