【物联网-S7Comm协议】
物联网-S7Comm协议
- ■ 调试工具
- ■ S7协议-简介
- ■ S7协议和modbusTCP协议区别
- ■ OSI 层 S7 协议
- ■ S7协议数据结构 (TPKT+COTP+S7Comm)
- ■ TPKT
- ■ COTP
- ■ 1. COTP连接包(COTP Connection Packet)也就是S7Comm的握手包
- ■ 2. COTP功能包 (COTP Fuction Packet)
- ■ S7Comm
- ■ 1. S7Comm Header
- ■ 2. S7Comm Parameter
- ■ 3. S7Comm Data
- ■ S7协议的工作流程
- ■ 1. 建立Socket连接:进行TCP三次握手(TCP)
- ■ 2. COTP的握手请求(请求建立通信) (COTP)
- ■ 3. 整个S7的握手请求(请求建立操作通信)(S7COMM-Function-Setup communication)
- ■ 4. 进行读写操作(S7协议报文)(S7COMM-Function-Read W)
- ■ 数据包分析
- ■ S7通信请求-第一次握手发送返回字节格式
- ■ S7通信请求-第二次握手发送返回字节格式
- ■ 数据读取/写入报文格式
- ■ S7Comm-读
- ■ S7Comm-写
- ■ S7 Setup Communication (Job)
- ■ S7 Setup Communication (ACk_data)
- ■ 读取数据 (Job)
- ■ 读取数据 (ACk_data)
- ■ 注意点 (获取数据)
- ■ 获取数据:I区 只能读取,不能写入。
- ■ 获取数据:I区 放在Item 中间位置获取数据,会在返回Item 中填充一个字节:Fill byte:00。
- ■ 获取数据:I区 按位只能获取一个位,获取多个位会出现返回错误。
- ■ 获取数据:I区 按位只能获取一个位,返回数据是一个0x01,表示一个bit数据,不会返回相邻数据位 。
- ■ 附件
- ■ 附件一: CTOP->PDU type 枚举
- ■ 附件二:S7Header->ROSCTR 枚举
- ■ 附件三:S7Header->Error class 枚举
- ■ 附件四:S7Parameter->Error code 枚举
- ■ 附件五:S7Parameter->Function 枚举
- ■ 附件六:S7Parameter->item->Syntax ID 枚举
- ■ 附件七:S7Parameter->Item->Transport szie 枚举
- ■ 附件八:S7Parameter->Item->Area 枚举
- ■ 附件九:S7Parameter->Item->Return code
- ■ 附件十:Userdata
- ■ 附件十一:PI service names
- ■ 附件十二:文件系统
- ■ 附件十三:文件系统
- ■ S7协议-S7COMM-控制支持情况
- ■ C#连接西门子S-200smart代码
- ■ C语言代码实现:
- ■ 写入PLC地址数据代码
- ■ 读取PLC地址数据代码
- ■ 解析S7协议代码
- ■ Python(使用Python 读写PLC,并通过Wireshark工具抓包分析数据)
- ■ 安装 python-snap7 setuptools
- ■ 读写 PLC S7-200 Python代码
- ■ 错误一: ModuleNotFoundError: No module named 'snap7.types'
- ■ 错误二:ModuleNotFoundError: No module named 'pkg_resources'
- ■ Python 和 c语言数据对比
- ■ 大小端模式
- ■ 01 读PLC操作(大端模式)
- ■ 02 写PLC操作(大端模式)
- ■ 02 写MCU数据(大端模式)
■ 调试工具
Wireshark 抓包工具
Wireshark 抓包工具进行抓包看详细的发送报文格式。
西门子PLC调试助手
■ S7协议-简介
S7Comm( S7 Communication)是西门子专有的协议,是西门子 S7 通讯协议簇里的一种。
S7 通信协议是西门子 S7 系列 PLC 内部集成的一种通信协议,是 S7 系列 PLC 的精髓所在。
它是一种运行在传输层之上的(会话层/表示层/应用层)、经过特殊优化的通信协议,其信息传输可以基于 MPI 网络、 PROFIBUS 网络
或者以太网。
■ S7协议和modbusTCP协议区别
| 项目 | 说明 |
|---|---|
| 1 | 工作方式:S7协议是基于串行通信方式进行通信的, 而modbusTCP协议则采用了基于以太网的通信方式,可以实现更高的数据传输速度和数据量。 |
| 2 | 通信速度:S7通信速度相对较慢,一般为12Mbps以下; modbusTCP协议则支持更高的通信速度和更广的数据带宽,可达到100Mbps或以上的速度。 |
| 3 | 网络拓扑:S7协议在网络拓扑方面相对简单,通常采用星形网络拓扑; 而modbusTCP协议支持基于以太网的网状拓扑结构,可以实现更复杂的网络配置和更完备的自组网功能。 |
| 4 | 实时性:modbusTCP协议具有更高的实时性能,可满足工业自动化领域的实时控制要求。 |
■ OSI 层 S7 协议
| OSI层 | S7 协议 | – |
|---|---|---|
| 第 7 层: | 应用层 S7 协议 S7 Communication | |
| 第 6 层: | 表示层 S7 协议(COTP) | |
| 第 5 层: | 会话层 S7 协议(TPKT) | |
| 第 4 层: | 传输层 Transmission Control Protocol | |
| 第 3 层: | 网络层 IP | |
| 第 2 层: | 数据链路层 Ethernet | |
| 第 1 层: | 物理层 Ethernet |
■ S7协议数据结构 (TPKT+COTP+S7Comm)
■ TPKT
| 版本号 | 预留 | 长度 |
|---|---|---|
| 1字节 | 1字节 | 2字节 |
| 0x03 | 0x00 | 0x001F |
■ COTP
■ 1. COTP连接包(COTP Connection Packet)也就是S7Comm的握手包
| COTP通信请求包 | -------- | ------- |
|---|---|---|
| 字节数 | 介绍 | 说明 |
| 1字节 | Length 长度 | |
| 1字节 | Type PDU类型 | |
| 2 字节 | DST reference 目标引用 | |
| 2 字节 | SRC reference 源引用 | |
| 1字节 | Opt | |
| N 字节 | Parameters 参数 | 后面可以有多个参数 |
| Parameters | -------- | ------- |
|---|---|---|
| 字节数 | 字段介绍 | 说明 |
| 1字节 | code | |
| 1字节 | Length | |
| Length 个 字节 | Data |
■ 2. COTP功能包 (COTP Fuction Packet)
| COTP功能包 | -------- | ------- |
|---|---|---|
| 字节数 | 介绍 | 说明 |
| 1字节 | Length | 长度不包含length的长度 |
| 1字节 | PDU type | PDU类型 |
| 1字节 | opt | Boolean类型 |
■ S7Comm
| S7Comm | -------- | ------- |
|---|---|---|
| 字节数 | 介绍 | 说明 |
| 12字节 | Header | |
| N字节 | Parameter | |
| N 字节 | Data |
■ 1. S7Comm Header
| S7Comm Header | -------- | ------- |
|---|---|---|
| 字节数 | 字段介绍 | 说明 |
| 1 | 协议ID(Protocol ID) | Protocol Id,协议ID,通常为0x32; |
| 1 | PDU type | ROSCTR,PDU type,PDU的类型 0x01- Job Request:主站发送的请求(例如读/写存储器,读/写块,启动/停止设备,通信设置) 0x02- Ack:从站发送的简单确认没有数据字段(从未见过它由S300 / S400设备发送) 0x03- Ack-Data:带有可选数据字段的确认,包含对作业请求的回复 0x07- Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取…) |
| 2 | Reserved 预留 | Redundancy Identification (Reserved),冗余数据,通常为0x0000; |
| 2 | PDU Reference | Protocol Data Unit Reference,it’s increased by request event。协议数据单元参考,通过请求事件增加; |
| 2 | Parameter 参数长度 | the total length (bytes) of parameter part。参数的总长度; |
| 2 | Data length 数据长度 | 如果读取PLC内部数据,此处为0x0000;对于其他功能,则为Data部分的数据长度; |
| 1 | Error class | Error class,错误类型: |
| 1 | Error code | Error code,错误代码; |
■ 2. S7Comm Parameter
| S7Comm Parameter | -------- | ------- |
|---|---|---|
| 字节数 | 字段介绍 | 说明 |
| 1 | Function 功能码 | 0x04: |
| 1 | Item count 通信项数 | 下面有几项数据 |
| N | Item[1] | 第一个通信项数数据 |
| N | Item[2] | 第二个通信项数数据 |
| N | Item[N] | 第N个通信项数数据 |
| 通信项数 | -------- | ------- |
|---|---|---|
| 字节数 | 字段介绍 | 说明 |
| 1 | specification | 确定项目结构的主要类型,通常为 0x12,代表变量规范; |
| 1 | Length | 本Item剩余部分的长度; |
| 1 | SyntaxID | 地址规范格式; |
| 1 | Transport size | 数据传输 变量的类型和长度: |
| 2 | Request data length | 请求的数据长度; |
| 2 | DB number, | DB模块的编号,如果访问的不是DB区域,此处为0x0000; |
| 1 | Area | 数据的区域类型 |
| 3 | Address | 要读的数据地址 |
■ 3. S7Comm Data
数据参数取决于消息类型。
■ S7协议的工作流程
■ 1. 建立Socket连接:进行TCP三次握手(TCP)
■ 2. COTP的握手请求(请求建立通信) (COTP)
■ 3. 整个S7的握手请求(请求建立操作通信)(S7COMM-Function-Setup communication)
■ 4. 进行读写操作(S7协议报文)(S7COMM-Function-Read W)
| 工作流程 | 说明 |
|---|---|
| 1 | client与server 通过socket和标准的TCP的方式建立连接 |
| 2 | client发送COTP,请求连接PLC,报文中包含Source TSAP和Destination TSAP,从而标识出CPU的机架号和槽号 |
| 3 | PLC返回COTP,确认连接,报文中包含Source TSAP和Destination TSAP,此时server确定client与哪个CPU进行通讯 |
| 4 | client发送S7 Communication给server,报文中包含Setup communication,即通讯请求,包含PDU的长度 |
| 5 | server返回S7 Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含PDU的长度 |
| 6 | client与server发送交换数据的报文,仍以S7 Communication完成 |
2与3完成数据传输前连接的功能,
4与5则完成连接之后的通讯请求,如果绕过通讯请求的建立,在有TCP时就进行数据交换,服务器一般会直接断连。
■ 数据包分析
■ S7通信请求-第一次握手发送返回字节格式
■ S7通信请求-第二次握手发送返回字节格式
■ 数据读取/写入报文格式
■ S7Comm-读
Byte Address:
例如 Q1.2item->Start=1;bit=2;item->Start=(item->Start<<3)+((item->TransportSize==S7_TS_BIT)?bit:0);■ S7Comm-写
注意:先写完Item0【0-N】数据后在后面写入Item data 【0-N】数据
■ S7 Setup Communication (Job)
■ S7 Setup Communication (ACk_data)
■ 读取数据 (Job)
■ 读取数据 (ACk_data)
0x123 == data 0x007b
■ 注意点 (获取数据)
■ 获取数据:I区 只能读取,不能写入。
■ 获取数据:I区 放在Item 中间位置获取数据,会在返回Item 中填充一个字节:Fill byte:00。
■ 获取数据:I区 按位只能获取一个位,获取多个位会出现返回错误。
I区 按位只能获取一个位,获取多个位会出现返回错误。
I区 按字节能获取一个字节,可获取多个位。
■ 获取数据:I区 按位只能获取一个位,返回数据是一个0x01,表示一个bit数据,不会返回相邻数据位 。
■ 附件
■ 附件一: CTOP->PDU type 枚举
#defineS7_PDU_CR0xe0//CR Connect Request,连接请求#defineS7_PDU_CC0xd0//CC Connect Confirm,连接确认#defineS7_PDU_DR0x08//DR Disconnect Request,断开请求#defineS7_PDU_DC0x0C//DC Disconnect Confirm,断开确认#defineS7_PDU_RJ0x05//RJ Reject,拒绝#defineS7_PDU_ED0x01//ED Expedited Data,加急数据#defineS7_PDU_EA0x02//EA Expedited Data Acknowledgement,加急数据确认#defineS7_PDU_UD0x04//UD,用户数据#defineS7_PDU_ER0x07//ER TPDU Error,TPDU错误#defineS7_PDU_DT0xf0//数据传输■ 附件二:S7Header->ROSCTR 枚举
#defineS7_ROSCTR_JOB0x01#defineS7_ROSCTR_ACK0x02#defineS7_ROSCTR_ACK_DATA0x03#defineS7_ROSCTR_USERDATA0x07■ 附件三:S7Header->Error class 枚举
/** * S7协议错误类别枚举 (Error Class) * 该字段位于S7协议头的第8字节,标识错误的类别 */#defineS7_ERR_CLASS_SUCCESS0x00//无错误 (0x00)#defineS7_ERR_CLASS_RESOURCE0x81//资源错误 (0x81-0x83)#defineS7_ERR_CLASS_OBJECT0x82//协议错误 (0x84)#defineS7_ERR_CLASS_NO_RESOURCE0x83//#defineS7_ERR_CLASS_PROTOCOL0x84//#defineS7_ERR_CLASS_HARDWARE0x85//硬件错误 (0x85)#defineS7_ERR_CLASS_OBJECT_ACCESS0x87//对象访问错误 (0x87)//#define S7_ERR_CLASS_STATE_CONFLICT 0xD2 //状态冲突 (0xD2)//#define S7_ERR_CLASS_NOT_SUPPORTED 0xD3 //功能不支持 (0xD3)//#define S7_ERR_CLASS_GENERAL 0xDE //一般错误 (0xDE)//#define S7_ERR_CLASS_COMM_SERVICE 0xF0 //通信服务错误 (0xF0)■ 附件四:S7Parameter->Error code 枚举
■ 附件五:S7Parameter->Function 枚举
#defineS7_FUNCTION_CPU0x00#defineS7_FUNCTION_READ0x04#defineS7_FUNCTION_WRITE0x05#defineS7_FUNCTION_PLC_CONTROL0x28#defineS7_FUNCTION_PLC_STOP0x29■ 附件六:S7Parameter->item->Syntax ID 枚举
#defineS7_SYNTAX_ANY0x10/**< S7-Any 指针地址格式,如 DB1.DBX10.2 */#defineS7_PBC_R_ID0x13/**< PBC 过程块通信中的 R_ID */#defineS7_ALARM_LOCKFREE0x15/**< 报警锁定/释放控制 */#defineS7_ALARM_IND0x16/**< 报警触发指示 */#defineS7_ALARM_ACK0x19/**< 报警确认消息 */#defineS7_ALARM_QUERYREQ0x1A/**< 报警查询请求 */#defineS7_NOTIFY_IND0x1C/**< 通知指示数据集 */#defineS7_DRIVE_ES_ANY0xA2/**< Drive ES 地址格式(路由访问) */#defineS7_1200_SYMBOLIC0xB0/**< S7-1200 符号地址访问 */#defineS7_DB_READ_S74000xB2/**< 仅用于 S7-400 的 DB 读取 */#defineS7_NCK_HMI_ACCESS0x82/**< Sinumerik NCK HMI 数据访问 */■ 附件七:S7Parameter->Item->Transport szie 枚举
#defineS7_TS_BIT0x01// BOOL#defineS7_TS_BYTE0x02// BYTE / UINT8#defineS7_TS_CHAR0x03// CHAR#defineS7_TS_WORD0x04// WORD / UINT16#defineS7_TS_INT0x05// INT / SINT16#defineS7_TS_DWORD0x06// DWORD / UINT32#defineS7_TS_DINT0x07// DINT / SINT32#defineS7_TS_DATE0x09// DATE#defineS7_TS_TOD0x0A// Time Of Day#defineS7_TS_DATA_ITEM_NULL0x00// NULL#defineS7_TS_DATA_ITEM_BIT0x03// BIT#defineS7_TS_DATA_ITEM_BWD0x04// BYTE/WORD/DWORD#defineS7_TS_DATA_ITEM_INTEGER0x05// INTEGER#defineS7_TS_DATA_ITEM_REAL0x07// REAL#defineS7_TS_DATA_ITEM_OCTETSTRING0x09// OCTETSTRING■ 附件八:S7Parameter->Item->Area 枚举
// Area IDconstbyte S7AreaPE=0x81;constbyte S7AreaPA=0x82;constbyte S7AreaMK=0x83;constbyte S7AreaDB=0x84;constbyte S7AreaCT=0x1C;constbyte S7AreaTM=0x1D;■ 附件九:S7Parameter->Item->Return code
#defineS7_RC_SUCCESS0xFF//表示成功#defineS7_RC_HARDWARE_ERROR0x01//硬件错误#defineS7_RC_ACCESS_DENIED0x03//对象访问被禁止(例如,由于权限)#defineS7_RC_INVALID_ADDRESS0x05//无效地址(地址超出范围)#defineS7_RC_DATA_TYPE_NOT_SUPPORTED0x06//数据类型不支持#defineS7_RC_DATA_TYPE_MISMATCH0x07//数据类型不一致#defineS7_RC_OBJECT_NOT_FOUND0x0A//对象不存在