导图社区 西门子PLC通讯-S7协议
这是一篇关于西门子PLC通讯-S7协议的思维导图,S7通信协议是西门子S7系列PLC内部集成的一种通信协议,是S7系列PLC的精髓所在。
编辑于2022-01-20 16:07:41S7协议
仿真
PLCSIM Advanced
博途V15
存储区监控
抓包工具
WireShark
TCP
Fiddler
HTTP
协议简介
S7以太网协议本身也是TCP/IP协议簇的一员
S7协议在OSI中的位置相当于将物理层和数据链路层之上的协议进行了定义
S7comm的协议栈修改程度更高,在应用层组织的数据经过COTP协议、TPKT协议的进一步处理后,最终通过TCP进行传输
支持两种方式
支持两种方式基于客户端(Client)/服务器(Server)的单边通信
S7单边通信
只需要在客户端一侧进行配置和编程
服务器一侧只需要准备好需要被访问的数据,不需要任何编程
基于伙伴(Partner)/伙伴(Partner)的双边通信
S7双边通信
通信双方都需要进行配置和编程
通信需要先建立连接。主动请求建立连接的是主动伙伴(Active Partner),被动等 待建立连接的是被动伙伴(Passive Partner)
当通信建立后,通信双方都可以发送或接受数据
ISO/OSI七层模型 - TCP/IP - S7
7-应用层
应用层
S7
6-表示层
应用层
S7 COTP
5-会话层
应用层
S7 TPKT
4-传输层
传输层
TCP(102端口)
3-网络层
网络层
IP
2-链路层
链路层
工业以太网
1-物理层
物理层
通信方式
三次通信建立
TCP三次握手
COTP连接请求
S7通信建立
功能操作
协议结构
TPKT(Transport Service ontop of the TCP):通过TCP的传输服务
介于TCP和COTP之间。属于传输服务类的协议,它为上层的COTP和下层TCP进行了过渡。功能为在COTP和TCP之间建立桥梁,其内容包含了上层协议数据包的长度。一般与COTP一起发送,当作Header段。
Windows远程桌面协议也是基于TPKT的,默认端口3389
报文结构
Version
[1b]默认0x03
Reserved
[1b]保留字节,默认0x00
Length
[2b]包括Payload和此三部分在内的总长度
COTP(Connection-Oriented Transport Protocol),即面向连接的传输协议
从这个名字就可以看出,它的传输必然是依赖于连接的,所以在传输数据前必然有类似TCP握手建立链接的操作
报文两种形态
连接包
length
[1b]数据的长度,但并不包含length这个字段
PDU type
[1b]标识类型,图中的0x0d即为连接确认的类型
0x0e
连接请求
0x0d
连接确认
0x08
断开请求
0x0c
断开确认
0x05
拒绝
0x01
加急数据
0x02
加急数据确认
0x04
用户数据
0x07
TPDU错误
0x0f
数据传输
DST reference
[2b]目标的引用,可以认为是用来唯一标识目标
目的地参照符,用来标识目标
SRC reference
[2b]源的引用,同上
来源参考,用来标识来源
option
[1b]可以看到wireshark将8位拆为了前四位和后两位
前四位标识class,也就是标识类别
倒数第二位对应Extended formats,是否使用拓展样式
倒数第一位对应No explicit flow control,是否有明确的指定流控制
parameter[3]
code
[1b]标识类型
0xc0
tpdu的size,tpdu即传送协议数据单元,也就是传输的数据的大小
0xc1
src-tsap,翻译过来应该叫源的端到端传输
机架号与插槽号
0xc2
dst-tsap,同上
length
[1b]
DT包
length
[1b]
PDU type
[1b]
为0x0f,即为数据传输
option
[1b]以位为单位划分:
第一位,标识是否为最后一个数据包(从这可以看出,COPT协议当数据较多时,会分为几个单元传输
后七位,标识TPDU的number
S7 Communication
Header
Protocol id
[1b]协议id,始终设置0x32
ROSCTR
[1b]pdu(协议数据单元(Protocol Data Unit))的类型
0x01
JobRequest 主站发送的请求,给从站分配一个任务(例如读/写存储器、读/写块、启动/停止设备、通信设置)
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:附加数据长度
2byte
Big-Endian
数据长度,如果读取PLC内部数据,此处为0x0000;而对于其他功能,则为Data部分的数据长度;
Error class[Ack_Data]
[1b]错误类型
仅存在于Ack-Data消息中
0x00
无错误
0x81
应用程序关系错误
0x82
对象定义错误
0x83
无资源可用错误
0x84
服务处理错误
0x85
请求错误
0x87
访问错误
Error code[Ack_Data]
[1b]错误码
仅存在于Ack-Data消息中
Parameter
取决于不同的PDU类型。内容和结构根据PDU的消息和功能类型而有很大差异
报文结构(2)
按功能码区分
[1b]功能码
0xF0
设置通信
后续字节
Reserverd
保留字段,默认0x00
Max AmQ Callee
Ack队列的大小(被叫)
Max AmQ Caller
Ack队列的大小(主叫)
PDU Length
0x04
读取变量
后续字节
Item Count
[1b] Request Item结构的数量。
[请求]Parameter Item
对应字节
Specification Type
[1b]该字段确定结构的主要类型,对于读/写消息,它总是具有值0x12,代表变量规范。
Length
[1b]此项目其余部分的长度。
Syntax ID
[1b]此字段确定寻址模式和项结构其余部分的格式。它具有任意类型寻址的常量值0x10
Variable Type
[1b]用于确定变量的类型和长度
常见值
1:BIT
2:BYTE
3:CHAR
4:WORD
5:INTEGER
6:DWORD
7:DINTL
8:REAL
9:DATE
Count
[2b] 连接读取长度。对于单变量读或写,它设置为1
DB Number
[2b]数据库的地址,如果该区域未设置为DB,则忽略该数据(参见下一个字段)
Area
[1b]选择寻址变量的存储区域
常见的区域
0x03
System info of 200 family | 200系列系统信息
0x05
System flags of 200 family | 200系列系统标志
0x06
Analog inputs of 200 family | 200系列模拟量输入
0x07
Analog outputs of 200 family | 200系列模拟量输出
0x80
Direct peripheral access (P) | 直接访问外设
0x81
Inputs (I) | 输入(I)
0x82
Outputs (Q) | 输出(Q)
0x83
Flags (M) | 内部标志(M)
0x84
Data blocks (DB) | 数据块(DB)
0x85
Instance data blocks (DI) | 背景数据块(DI)
0x86
Local data (L) | 局部变量(L)
0x87
Unknown yet (V) | 全局变量(V)
0x1c
S7 counters (C) | S7计数器(C)
0x1d
S7 timers (T) | S7定时器(T)
0x1e
IEC counters (200 family) | IEC计数器(200系列)
0x1f
IEC timers (200 family) | IEC定时器(200系列)
Address
[3b]包含所选存储区中寻址变量的偏移量。DBX40.3将是0x000143 40 * 8 + 3
[响应]Data Item
Rreturn Code
[1b]操作的返回值,0xff操作成功
[1b]响应状态
0xff
成功
0x00
Reserved | 未定义,预留
0x01
硬件错误
0x03
对象不允许访问
0x05
地址越界,无效地址,所需的地址超出此PLC的极限
0x06
请求的数据类型与存储类型不一致
0x07
日期类型不一致
0x0a
对象不存在
Variable Type
[1b]用于确定变量的类型和长度
常见值
0x00
空
0x03
Bit
0x04
Word/Word/Word
0x05
INTEGER
0x07
Real
0x09
OCTET STRING
Count
[2b]响应数据长度
Data
此字段包含已寻址变量的实际值,其大小为len(variable) * count
0x05
写变量
后续字节
Item Count
[1b] Request Item结构的数量。
[请求]Parameter Item
同0x04功能码中说明一致
[请求/响应]Data Item
[响应]Rreturn Code
[1b]操作的返回值,请求时永远为0x00
Variable Type
[1b]与 Request Item中的相同
Count
[2b]响应数据长度
Data
此字段包含已寻址变量的实际值,其大小为len(variable) * count
0x1A
请求下载
Job - Request Download
Function Code
[1b] 0x1d用于开始上传
Function Status
[1b]仅用于上传消息,如果要发送更多数据,则设置为0x01
即功能状态,包含错误是否发生、是否使用另一个检索块/文件来请求的更多数据
Unknown byte(s) in blockcontrol
[2b]无意义,一般为0x0000
Unknown byte(s) in blockcontrol
[4b]无意义,一般为0x00000000
Session ID
[4b]与每个上传序列相关联的唯一ID,它在Ack Data - Start Upload消息中设置
Block Length
Payload Length
都是编码为ASCII字符串的十进制数字
Ack Data - Request Download
仅包含功能代码
0x1B
下载块
Job - Download Block
Function Code
[1b] 0x1e用于开始上传
Function Status
[1b]仅用于上传消息,如果要发送更多数据,则设置为0x01
Unknown
[2b]总是0x0000
Session ID
[4b]与每个上传序列相关联的唯一ID,它在Ack Data - Start Upload消息中设置
传输文件名。其余消息的结构与前面讨论的相同
Ack Data - Download Block
只包含功能代码(0x1B)
0x1C
下载结束
Job - End Upload
Function Code
[1b] 0x1c用于开始上传
Function Status
[1b]仅用于上传消息,如果要发送更多数据,则设置为0x01
Unknown
[2b]总是0x0000
Session ID
[4b]与每个上传序列相关联的唯一ID,它在Ack Data - Start Upload消息中设置
Ack Data - End Upload
只包含功能代码(0x1c)
0x1D
开始上传
Job-Start Upload
Function Code
[1b] 0x1d用于开始上传
Function Status
[1b]仅用于上传消息,如果要发送更多数据,则设置为0x01
Unknown
[2b]总是0x0000
Session ID
[4b]与每个上传序列相关联的唯一ID,它在Ack Data - Start Upload消息中设置
Filename Length
[1b]以下文件名的长度
Filename
标识上面引入的块的文件名
Ack Data - Start Upload
Function Code
[1b] 0x1d用于开始上传
Function Status
[1b]与上述相同
Unknown
[2b]总是0x0100
Session ID
[4b] 此处设置会话ID,连续消息使用相同的值
Length String Length
[1b]以下块长度字符串的长度
Length String
编码为ASCII C字符串的块的十进制长度
0x1E
上传
Job - Upload
Function Code
[1b] 0x1e用于开始上传
Function Status
[1b]仅用于上传消息,如果要发送更多数据,则设置为0x01
Unknown
[2b]总是0x0000
Session ID
[4b]与每个上传序列相关联的唯一ID,它在Ack Data - Start Upload消息中设置
Ack Data - Upload
Function Code
[1b] 0x1e用于上传
Function Status
[1b]如果要发送更多数据,则设置为0x01
Data
Length
[2b] 块数据的长度
Unknown
[2b]总是0x00fb
Block Data
上传数据块的一部分
0x1F
结束上传
Job - End Upload
Function Code
[1b] 0x1f用于开始上传
Function Status
[1b]仅用于上传消息,如果要发送更多数据,则设置为0x01
Unknown
[2b]总是0x0000
Session ID
[4b]与每个上传序列相关联的唯一ID,它在Ack Data - Start Upload消息中设置
Ack Data - End Upload
只包含功能代码(0x1f)
0x28
PLC 控制
Job - PLC Control
调用的方法
_INSE
激活设备上下载的块,参数是块的名称(例如OB1)
_DELE
从设备的文件系统中删除一个块,该参数也是块的名称
P_PROGRAM
设置设备的运行状态(启动,停止,mem重置)。它在没有参数的情况下发送以启动设备,但是停止plc程序使用不同的功能代码
_GARB
压缩PLC内存
_MODU
将ram复制到rom,该参数包含文件系统标识符(A/E/P)
参数(也被编码为ASCII字符串)的ASCII名字
Ack Data - PLC Control
仅包含PLC控制功能码
0x29
PLC 停止
Job - PLC Control
P_PROGRAM
设置设备的运行状态(启动,停止,mem重置)。它在没有参数的情况下发送以启动设备,但是停止plc程序使用不同的功能代码
西门子PLC存储区
Merker
[M]任意标记变量或标志寄存器驻留在这里。
Data Block
[DB] DB区域是存储设备不同功能所需数据的最常见位置,这些数据块编号为地址的一部分。
示例地址是DB123X 2.1,它访问数据块#123的第三个字节的第二个位
Input
[I]数字和模拟输入模块值,映射到存储器。
Output
[Q]类似的存储器映射输出。
Counter
PLC程序使用的不同计数器的[C]值。
Timer
PLC程序使用的不同定时器的[T]值。
还有其他不太常见的存储区域(例如本地数据[L]和外设访问[P]等)。
通信库封装
建立连接
读/多读
写/多写
启停
时间操作