文章目录
- 一、设置 IP 地址
- 二、软件程序
- 三、使用 Wireshark 抓包
- 四、协议分析
- 五、抓包分析
- 六、附录:功能码
- 七、附录:IDS 地址规范码
- 八、附录:数值传输码
- 九、附录:数据区域码
- 十、附录:返回码
一、设置 IP 地址
1. 物理连接
分别将 HMI 和 S7-1200 连接到交换机的通信网口,电脑端连接到交换机的监控口。
图1.1.1 连接交换机
2. IP设置
(1)设置 S7-1200 的 IP 地址为 192.168.0.1
选择目标 PLC ,右击选择“属性”,打开 PLC 属性配置。
图1.2.1 设备属性配置
选择“ PROFINET 接口”栏,修改“ IP 协议”中“ IP 地址”。
图1.2.2 配置 IP 地址
编译后下载到设备,搜索当前节点中目标设备,确认设备后下载。
图1.2.3 搜索设备
图1.2.4 确认下载
(2)设置 HMI 的 IP 地址为 192.168.0.2
选择目标工程 ,右击选择“属性”,打开属性配置。
图1.2.5 系统属性配置
选择“设备”栏 ,选择“以太网设备”,配置本机使用 IP 地址。
图1.2.6 配置本机 IP 地址
选择“以太网设备”,右击新建目标设备,配置目标设备协议。
图1.2.7 新建目标设备
图1.2.8 配置目标设备协议
(3)设置电脑以太网接口的 IP 地址为 192.168.0.5
图1.2.9 设置电脑以太网地址
二、软件程序
1. 西门子 S7-1200
注:西门子 S7-1200 中元件 I 、 Q 和 M 可以直接正常读写, DB 数据块必须添加和配置后才能正常读写, DB 数据块范围为1到99。
(1)新增 DB1 到 DB4 四个数据块。
图2.1.1 新增 DB 数据块
(2)四个数据块中数据配置相同,只使用了前16个 Byte ,以 DB1 为例进行配置。
图2.1.2 配置 DB 块中使用数据
(3)配置完成后,下载到 S7-1200 后,重新启动后生效。
2. 信捷 HMI
(1)按 Byte 读取 I0 ,按 Word 读取 I1 ,按 DWord 读取 I2 。
(2)按 Byte 读取 Q0 ,按 Word 读取 Q2 ,按 DWord 读取 Q4 。
(3)按 Byte 读取 M0 ,按 Word 读取 M4 ,按 DWord 读取 M8 。
(4)按 Byte 读取 DB1-0 ,按 Word 读取 DB1-1 ,按 DWord 读取 DB1-2 。
(5)按 Byte 读取 DB2-0 ,按 Word 读取 DB2-2 ,按 DWord 读取 DB2-4 。
(6)按 Byte 读取 DB3-0 ,按 Word 读取 DB3-4 ,按 DWord 读取 DB3-8。
(7)按 DWord 读取 DB4-0 、 DB4-2 、 DB4-4 、 DB4-6 、 DB4-8 、 DB4-10 和 DB4-12 ,按 Word 读取 DB4-14 。
图2.2.1 信捷 HMI 程序
三、使用 Wireshark 抓包
1. 启动抓包工程
在“ Interface List ”中选择“以太网”,点击“ Start ”。
图3.1.1 启动抓包工程
2. 设置过滤规则
在“ Filter ”中输入“ ip.addr == 192.168.0.1 ”,只显示与 192.168.0.1 有关的通信包。
图3.2.1 启动抓包工程
四、协议分析
1、TPKT层
4个 Byte :Version( 0x03 ) + Reserved( 0x00 ) + Length(2个 Byte ,高字节在前)。
2、COTP层
3个 Byte :Length( 0x02 ) + PDU Type( DT Data ,0x0f ) + TPDU number(.000 0000,0x80 )。
3、COMMUNICATION层
发包包含头部( Header )和参数( Parameter )两个部分,发包包含头部( Header )、参数( Parameter )和数据( Data )三个部分。
(1)头部( Header )
Byte[ 0 ]:协议 ID ,一般指定为 0x32 。
Byte[ 1 ]:PDU 类型 ,一般有 0x01( Job ,主设备发起请求)、 0x02( Ack ,确认请求)、0x03( Ack_data ,确认数据响应,一般作为确认 0x01 请求)和0x07( USERDATA ,协议的扩展,参数字段包含请求/响应 ID )。
Byte[ 2 ] - Byte[ 3 ]:冗余数据,一般指定为 0x0000 。
Byte[ 4 ] - Byte[ 5 ]:协议数据单元的参考 ,通过请求事件增加。
Byte[ 6 ] - Byte[ 7 ]:参数 Parameter 总长度。
Byte[ 8 ] - Byte[ 9 ]:数据 Data 的长度,无data部分即为 0x0000 。
注:以上部分,发包和回包相同,各功能码相同,以下部分只在回包中出现:
Byte[ 10 ]:错误类型( Error class),一般为 0x00 。
Byte[ 11 ]:错误代码( Error code),一般为 0x00 。
(2)参数( Parameter )
以读取数据( 0x04 )为例,发包:
Byte[ 10 ]:功能码,读取数据为 0x04,详情见功能码附录。
Byte[ 11 ]:单元个数( Item count )。
Byte[ 12 ]:结构标识,代表变量规范,一般为 0x12 。
Byte[ 13 ]:长度规范,自此往后的长度,一般为 0x0a 。
Byte[ 14 ]:IDS的地址规范的格式类型,一般为 0x10 ,详情见 IDS 地址规范附录。
Byte[ 15 ]:数据传输大小,一般为 0x02, 详情见数值传输码附录。
Byte[ 16 ] - Byte[ 17 ]:数据长度。
Byte[ 18 ] - Byte[ 19 ]:DB 编号,如果访问的不是 DB 区域为 0x0000 。
Byte[ 20 ]:数据的区域,详情见数据区域码附录。
Byte[ 21 ] - Byte[ 23 ]:要读取数据的地址。
以读取数据( 0x04 )为例,回包:
Byte[ 12 ]:功能码,读取数据为 0x04,详情见功能码附录。
Byte[ 13 ]:单元个数( Item count )。
(3)数据( Data )
以读取数据( 0x04 )为例,回包:
Byte[ 14 ]:返回码,一般为 0xff ,详情见返回码附录。
Byte[ 15 ]:数据传输大小,一般为 0x02, 详情见数值传输码附录。
Byte[ 16 ] - Byte[ 17 ]:数据长度。
Byte[ 18 ]:自此开始即为数据,如果数据长度不满足会填充 0x00 。
五、抓包分析
1. 握手一
此处不做详细解释,有兴趣的可以自行了解。
图4.1.1 握手一包一
图4.1.2 握手一包二
图4.1.3 握手一包三
2. 握手二
此处不做详细解释,有兴趣的可以自行了解。
图4.2.1 握手二包一
图4.2.2 握手二包二
3. 握手三
此处不做详细解释,有兴趣的可以自行了解。
图4.3.1 握手三包一
图4.3.2 握手三包二
4. 数据交互
(1) 读取请求1
头部部分: PDU 类型为 0x01 (主设备发起请求),参数部分总长度为98( 0x0062 )个 Byte ,无数据部分。
参数部分:功能码为 0x04(读取数值),8个单元,每个单元12个 Byte ,前4个 Byte 相同( 0x12 + 0x0A + 0x10 + 0x02 ),其余8个 Byte 含义分别如下:
1)单元1:00 06 00 00 81 00 00 00
数据长度为6个 Byte, I 数据区域,起始地址为 0x000000 。
2)单元2:00 08 00 00 82 00 00 00
数据长度为8个 Byte, Q 数据区域,起始地址为 0x000000 。
3)单元3:00 01 00 00 83 00 00 00
数据长度为1个 Byte, M 数据区域,起始地址为 0x000000 。
4)单元4:00 08 00 00 83 00 00 20
数据长度为8个 Byte, M 数据区域,起始地址为 0x000020 。
5)单元5:00 06 00 01 84 00 00 00
数据长度为6个 Byte,DB1 数据区域,起始地址为 0x000000 。
6)单元6:00 08 00 02 84 00 00 00
数据长度为8个 Byte,DB2 数据区域,起始地址为 0x000000 。
7)单元7:00 01 00 03 84 00 00 00
数据长度为1个 Byte,DB3 数据区域,起始地址为 0x000000 。
8)单元8:00 08 00 03 84 00 00 20
数据长度为8个 Byte,DB3 数据区域,起始地址为 0x000020 。
图4.4.1 读取请求1
(2) 读取返回1
头部部分: PDU 类型为 0x03 (确认数据响应),参数部分总长度为2( 0x0062 )个 Byte ,数据部分总长度80( 0x0050 )。
参数部分:功能码为 0x04(读取数值),8个单元,一般情况每个单元前2个 Byte 相同(0xff + 0x04,读取成功,按 Byte / Word / DWord 读取,长度按 Bit 计算),其余 Byte 含义分别如下:
1)单元1:00 30 00 00 00 00 00 00
数据长度为48( 0x30 )个 Bit ,I0( Byte ) = 0x00 , I1( Word ) = 0x0000, I2( DWord ) = 0x00000000 。
2)单元2:00 40 00 00 00 00 00 00 00 00
数据长度为64( 0x40 )个 Bit ,Q0( Byte ) = 0x00 ,Q2( Word ) = 0x0000, Q4( DWord ) = 0x00000000 。
3)单元3:00 08 00 00
数据长度为8( 0x8 )个 Bit ,M0( Byte ) = 0x00 。
4)单元4:00 40 00 00 00 00 00 00 00 00
数据长度为64( 0x40 )个 Bit ,M4( Word ) = 0x0000, M8( DWord ) = 0x00000000 。
5)单元5:00 30 00 01 02 03 04 05
数据长度为48( 0x30 )个 Bit ,DB1.0( Byte ) = 0x00, DB1.1( Word ) = 0x0102, DB1.2( DWord ) = 0x02030405。
6)单元6:00 40 00 01 02 03 04 05 06 07
数据长度为64( 0x40 )个 Bit ,DB2.0( Byte ) = 0x00, DB1.2( Word ) = 0x0203, DB2.4( DWord ) = 0x04050607。
7)单元7:00 08 00 00
数据长度为8( 0x08 )个 Bit ,DB3.0( Byte ) = 0x00 。
8)单元8:00 40 04 05 06 07 08 09 0a 0b
数据长度为64( 0x40 )个 Bit ,DB3.4( Word ) = 0x0405, DB3.8( DWord ) = 0x08090a0b。
图4.4.2 读取返回1
(3) 读取请求2
头部部分: PDU 类型为 0x01 (主设备发起请求),参数部分总长度为26
( 0x001a )个 Byte ,无数据部分。
参数部分:功能码为 0x04(读取数值),2个单元,每个单元12个 Byte ,前4个 Byte 相同( 0x12 + 0x0A + 0x10 + 0x02 ),其余8个 Byte 含义分别如下:
1)单元1:00 08 00 04 84 00 00 00
数据长度为8个 Byte, DB4 数据区域,起始地址为 0x000000 。
2)单元2:00 08 00 04 84 00 00 40
数据长度为8个 Byte, DB4 数据区域,起始地址为 0x000040 。
图4.4.3 读取请求2
(4) 读取返回2
头部部分: PDU 类型为 0x03 (确认数据响应),参数部分总长度为2( 0x0062 )个 Byte ,数据部分总长度24( 0x0018 )。
参数部分:功能码为 0x04(读取数值),2个单元,一般情况每个单元前2个 Byte 相同(0xff + 0x04,读取成功,按 Byte / Word / DWord 读取,长度按 Bit 计算),其余 Byte 含义分别如下:
1)单元1:00 40 00 01 02 03 04 05 06 07
数据长度为64( 0x40 )个 Bit ,DB4.0( DWord ) = 0x00010203, DB4.2( DWord ) = 0x02030405,DB4.4( DWord ) = 0x04050607 。
2)单元2:00 40 08 09 0a 0b 0c 0d 0e 0f
数据长度为64( 0x40 )个 Bit ,DB4.6( DWord ) = 0x06070809, DB4.8( DWord ) = 0x08090a0b,DB4.10( DWord ) = 0x0a0b0c0d,DB4.12( DWord ) = 0x0c0d0e0f,DB4.14( Word ) = 0x0e0f 。
图4.4.4 读取返回2
六、附录:功能码
功能码 | 含义 |
0x00 | CPU serivces ,CPU服务 |
0xf0 | Setup communication ,建立通讯 |
0x04 | Read Var ,读取值 |
0x05 | Write Var ,写入值 |
0x1a | Request download ,请求下载 |
0x1b | Download block ,下载块 |
0x1c | Download ended ,下载结束 |
0x1d | Start upload ,开始上传 |
0x1e | Upload ,上传 |
0x1f | End upload ,上传结束 |
0x28 | PI-Service ,程序调用服务 |
0x29 | PLC Stop ,关闭 PLC |
七、附录:IDS 地址规范码
功能码 | 含义 |
0x10 | S7ANY Address data S7-Any pointer-like DB1.DBX10.2 |
0x13 | PBC-R_ID R_ID for PBC |
0x15 | ALARM_LOCKFREE Alarm lock/free dataset |
0x16 | ALARM_IND Alarm indication dataset |
0x19 | ALARM_ACK Alarm acknowledge message dataset |
0x1a | ALARM_QUERYREQ Alarm query request dataset |
0x1c | NOTIFY_IND Notify indication dataset |
0xa2 | DRIVEESANY seen on Drive ES Starter with routing over S7 |
0xb2 | 1200SYM Symbolic address mode of S7-1200 |
0xb0 | DBREAD Kind of DB block read, seen only at an S7-400 |
0x82 | NCK Sinumerik NCK HMI access |
八、附录:数值传输码
功能码 | 含义 |
0 | NULL |
3 | BIT bit access ,len is in bits |
4 | BYTE/WORD/DWORD byte/word/dword access ,len is in bits |
5 | INTEGER integer access ,len is in bits |
6 | DINTEGER integer access ,len is in bytes |
7 | REAL real access ,len is in bytes |
9 | OCTET STRING octet string ,len is in bytes |
九、附录:数据区域码
Hex | Value | 描述 |
0x03 | System info of 200 family | 200系列系统信息 |
0x05 | System info 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 ) | S7 计数器(200系列) |
0x1f | IEC timers( 200 family ) | S7 定时器(200系列) |
十、附录:返回码
功能码 | 含义 |
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 ,成功 |