...
- DBn:Bm或DBn:DBm或DBn:m。从第n个DB块中,第m个字节开始。一般适用数据类型:单个字节,取1个字节。也可以适用于单字节或四字节数值
- DB2:B24
- DB2:DB24
- DB2:24
- DBn:Xm.b或DBn:DBXm.b。从第n个DB中,第m个字节开始,取1个位。一般适用数据类型:bool
- DB2:X2.1
- DB2:DBX2.1
- DBn:Dm或DBnDBDm,从第n个DB块中,第m个字节开始,取4个字节(一个双字D代表4个字节)开始的地址。一般适用数据类型:4字节长度数值,包括uint32,int32,浮点数。
- DB2:D24
- DB2:DBD24
- DBn:Wm或DBn:DBWm,从第n个DB块,第m个字节开始,取2个字节(一个字W代表2个字节)。一般适用数据类型:2字节数值,也可以适用于单字节或四字节数值
- DB2:W24
- DB2:DBW24
- 注意:
- DBn,DB块序号n从1开始(不是0开始)
- DBn的n可以是任意值。DB1可以不存在,直接DB40
- DBn:DBWm,m从0开始(不是从1开始),m表示的从该DB块内的第m字节,而不是第m个字或双字
- DBn:DBXm.b,b代表为,b从0开始
PLC编程软件内DB块和eview的地址及数据类型对照说明:PLC编程软件内DB块和eview的地址及数据类型对照说明(S7-300,Step7 V5.5):
用户给出的点表,和eview点表不同。转换示例:
PLC点表 | eview变量地址 | 说明 | 数据类型 |
DB101W:307 | DB101:W307 | DB101块内,偏移307开始,取2个字节,转为16位无符号整数 | uint16 |
DB101D:307 | DB101:D307 | DB101块内,偏移307开始,取4个字节,转为32位无符号整数 | uint32 |
DB101X:310.2 | DB101:X307.2 | DB101块内,偏移307开始的字节内取第3位,转为bool型 | bool |
...
4、寄存器类型为C、T时对应变量的变量地址
- 支持16位无符号整数,地址为:
- C:1
- T:1
FAQ
问题1:日志提示总是连接不上,用TCP工具连接端口102缺失可以的
解决:查看日志提示的槽号和实际设备槽号是否一致,不一致需要修改。槽号不对会导致数据发送不了。
协议分析
西门子S7 TCP(西门子S7 300)
- 建立连接后获取pdu大小
连接建立之后,会发送MPI(这里为2)、机架号(这里为0)、槽号(第一个2,第二个1)获得PDU大小。
如果槽号给错误了,会收不到数据且会被PLC断开连接:
示例:
PLC点表 | PLC数据类型 | eview变量地址 | 说明 | 数据类型 |
DB101W:307 | INT | DB101块内,偏移307开始,取2个字节,转为16位无符号整数 | uint16 | |
DB101D:307 | DINT | DB101:D307 | DB101块内,偏移307开始,取4个字节,转为32位无符号整数 | uint32 |
DB101X:310.2 | BOOL | DB101:X307.2 | DB101块内,偏移307开始的字节内取第3位,转为bool型 | bool |
I2.1 | Bit | I:2.1 | I0.0是第一个位,从0开始,最多到I1.7,下一个位是I2.0 | bool |
IW1 | Signed | I:1 | int16 | |
Q1.1 | Bit | Q:1.1 | Q0.0是第一个位,从0开始 | bool |
M1.1 | Bit | M:1.1 | M0.0是第一个位,从0开始 | bool |
MW1 | Signed | M:1 | int16 | |
C1 | Signed | C:W1 | C是计时器 | int16 |
VW1 | Signed | V:1 | int16 | |
VD3 | Floating Point | V:3 | float | |
FAQ
问题1:日志提示总是连接不上,用TCP工具连接端口102缺失可以的
解决:查看日志提示的槽号和实际设备槽号是否一致,不一致需要修改。槽号不对会导致数据发送不了。
协议分析
西门子S7 TCP(西门子S7 300)
- 建立连接后获取pdu大小
连接建立之后,会发送MPI(这里为2)、机架号(这里为0)、槽号(第一个2,第二个1)获得PDU大小。
如果槽号给错误了,会收不到数据且会被PLC断开连接:
代码块 | ||
---|---|---|
| ||
发送请求:
[022] 03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 02 C0 01 09 (槽号2,错误槽号,会导致被PLC断开连接)
[022] 03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 01 C0 01 09 (槽号1)
对于上面槽号为1的请求,接受22个字节应答:
[022] 03 00 00 16 11 D0 00 01 00 01 00 C0 01 09 C1 02 01 00 C2 02 01 01 |
- 读取数值
数据:DB101:W305-W309的读取请求
代码块 | ||
---|---|---|
| ||
发送请求:【31】03 00 00 1f 02 f0 80 32 01 00 00 03 54 00 0e 00 00 04 01 12 0a 10 02 00 06 00 65 84 00 09 88
解释:
B1 B2:03 00 00 未知
B3 B4: 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节
B12 B13:03 54,序列号
B24 B25:00 06 = 06,读取的寄存器个数(??)
B26 B27:00 65=0x0065=101=DB101
B28:84 = 0x84,读取的数据块类型为DB块
B29~B31:=00 09 88=0x0000988=2440,2440/8=305*8 读取的偏移量offset(bit为单位)
PLC回复报文:
【31】03 00 00 1f 02 f0 80 32 03 00 00 03 54 00 02 00 0a 00 00 04 01 ff 04 00 30 00 03 ff 03 eb 00
解释:
B1 B2:03 00 00 未知
B3 B4: 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节
B12 B13:03 54,序列号,应该等于请求的序列号
B16 B17:00 0a = 0x000A=10,读取请求寄存器个数(6)+4
B24 B25:00 30 = 0x0030=48=6*8,读取的位长度(字节长度6)
B26 ~最后:6个字节,数据值
【31】03 00 00 1f 02 f0 80 32 03 00 00 03 56 00 02 00 0a 00 00 04 01 ff 04 00 30 00 04 00 03 ec 00 |
西门子S7 TCP(西门子S7 300 MPI连接在北辰S7-Net模块后,通过网络访问北辰模块的网口)
- 建立连接后获取pdu大小
连接建立之后,会发送MPI(这里为2)、机架号(这里为0)、槽号(第一个2,第二个1)获得PDU大小。
如果槽号给错误了,会收不到数据且会被PLC断开连接:
代码块 | ||
---|---|---|
| ||
请求: | ||
代码块 | ||
| ||
发送请求: [022] 03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 02 C0 01 09 (槽号2,错误槽号,会导致被PLC断开连接) [022] 03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 01 C0 01 09 (槽号1) 对于上面槽号为1的请求,接受22个字节应答:应答: [022] 03 00 00 16 11 D0 00 01 00 0100 00 C0 01 09 C1 02 01 00 C2 02 01 01 C0 01 09 |
- 读取数值
数据:DB101数据:DB2:W305-W309的读取请求xxx的读取请求
代码块 | ||
---|---|---|
| ||
发送请求:【31】03请求:【31】03 00 00 1F 1f 0202 f0F0 80 32 01 00 00 00 0300 54 0000 0e0E 00 00 04 01 12 0a0A 10 02 00 02 06 0000 02 65 8484 00 0900 8800 解释: B1 B2:03 00 00 未知 B3 B4: 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节 B12 B13:03 54,序列号 B24 B25:00 06 = 06,读取的寄存器个数(??) B26 B27:00 65=0x0065=101=DB101 B28:84 = 0x84,读取的数据块类型为DB块 B29~B31:=00 09 88=0x0000988=2440,2440/8=305*8 读取的偏移量offset(bit为单位) PLC回复报文: 【31】03 00 00 1f 02 f0 80 32 03 00 00 03 54 00 02 00 0a 00 00 04 01 ff 04 00 30 00 03 ff 03 eb 00 解释: B1 B2:03应答:【27】 03 00 00 1B 02 F0 80 32 03 00 00 00 00 00 未知 B3 B4:02 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节 B12 B13:03 54,序列号,应该等于请求的序列号 B16 B17:00 0a = 0x000A=10,读取请求寄存器个数(6)+4 B24 B25:00 30 = 0x0030=48=6*8,读取的位长度(字节长度6) B26 ~最后:6个字节,数据值 【31】0306 00 00 04 01 FF 04 00 10 00 00 解释: B1 B2:03 00 00 1f 02 f0 80 32 03 00 00 03 56 00 02 00 0a 00 00 04 01 ff 04 00 30 00 04 00 03 ec 00 |
...
未知
B3 B4: 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节
B12 B13:03 54,序列号,应该等于请求的序列号
B16 B17:00 0a = 0x000A=10,读取请求寄存器个数(6)+4
B24 B25:00 30 = 0x0030=48=6*8,读取的位长度(字节长度6)
B26 ~最后:2个字节,数据值 |
西门子S7 TCP(西门子S7 200PPI串口连接在北辰S7-Net模块后,通过网络访问北辰模块的网口)
- 建立连接后获取pdu大小
连接建立之后,会发送MPI(这里为2)、机架号(这里为0)、槽号(第一个2,第二个1)获得PDU大小。
如果槽号给错误了,会收不到数据且会被PLC断开连接:
代码块 | ||
---|---|---|
| ||
请求: [022] 03请求:【22】03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 01 C0 01 09 (槽号1) 应答: [022] 03 应答:【22】03 00 00 16 11 D0 00 01 00 00 00 C1 02 01 00 C2 02 01 01 C0 01 09 |
- 读取数值
数据:DB2:xxx的读取请求
代码块 | ||
---|---|---|
| ||
请求:【31】03 请求:【25】03 00 00 1F19 02 F0 80 32 01 00 00 FF FF 00 08 00 00 0EF0 00 00 04 01 1200 0A01 1007 0280 应答:【27】03 00 0200 001B 02 84F0 0080 00 00 解释: B1 B2:03 32 03 00 00 未知 B3 B4:FF FF 00 1F08 00 00 00 00 F0 01 00 01 00 01 00 F0 |
- 读取数值
数据:DB2:xxx的读取请求
代码块 | ||
---|---|---|
| ||
S300:【31】03= 0x1F=31,读取报文总长度,从第一个字节到最后1个字节 B12 B13:03 54,序列号 B24 B25:00 06 = 06,读取的寄存器个数(??) B26 B27:00 65=0x0065=101=DB101 B28:84 = 0x84,读取的数据块类型为DB块 B29~B31:=00 09 88=0x0000988=2440,2440/8=305*8 读取的偏移量offset(bit为单位) 应答:【27】 03 00 00 1B1F 02 F0 80 32 0301 00 00 00 00 00 020E 00 06 00 00 04 01 FF12 04 00 10 00 00 解释: B1 B2:03 00 00 未知 B3 B4: 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节 B12 B13:03 54,序列号,应该等于请求的序列号 B16 B17:00 0a = 0x000A=10,读取请求寄存器个数(6)+4 B24 B25:00 30 = 0x0030=48=6*8,读取的位长度(字节长度6) B26 ~最后:2个字节,数据值 |
西门子S7 TCP(西门子S7 200PPI串口连接在北辰S7-Net模块后,通过网络访问北辰模块的网口)
- 建立连接后获取pdu大小
连接建立之后,会发送MPI(这里为2)、机架号(这里为0)、槽号(第一个2,第二个1)获得PDU大小。
如果槽号给错误了,会收不到数据且会被PLC断开连接:
代码块 | ||
---|---|---|
| ||
请求:【22】03 00 00 16 11 E00A 10 02 00 02 00 02 84 00 00 00 请求:【31】03 00 00 1F 02 F0 80 32 01 00 00 00 00 00 010E 00 C100 0204 01 12 0A 10 1E 00 C202 0200 01 1E 00 00 01 应答:【25】03 C000 0100 09 应答:【22】0319 0002 00F0 1680 1132 D003 00 0100 00 00 00 C102 0200 0104 00 C200 0204 01 0103 C000 01 09 请求:【25】0300 00 解释: B1 B2:03 00 00 19 02 F0 80 32 01 00 00 FF FF 00 08 00 00 F0 00 00 01 00 01 07 80 应答:【27】03未知 B3 B4: 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节 B12 B13:03 54,序列号 B24 B25:00 06 = 06,读取的寄存器个数(??) B26 B27:00 65=0x0065=101=DB101 B28:84 = 0x84,读取的数据块类型为DB块 B29~B31:=00 09 88=0x0000988=2440,2440/8=305*8 读取的偏移量offset(bit为单位) 应答:【27】 03 00 00 1B 02 F0 80 32 03 00 00 FF FF 00 08 00 00 0002 00 F0 0106 00 01 00 01 00 F0 |
- 读取数值
数据:DB2:xxx的读取请求
代码块 | ||
---|---|---|
| ||
S300:【31】03 00 00 1F 02 F0 80 32 01 0000 04 01 FF 04 00 10 00 00 解释: B1 B2:03 00 00 0E 未知 B3 B4: 00 001F 04 01 12 0A 10 02 00 02 00 02 84 00 00 00 请求:【31】03 00 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节 B12 B13:03 54,序列号,应该等于请求的序列号 B16 B17:00 0a = 0x000A=10,读取请求寄存器个数(6)+4 B24 B25:00 30 = 0x0030=48=6*8,读取的位长度(字节长度6) B26 ~最后:2个字节,数据值 |
西门子PLC S7-200/S7-200 Smart两种PLC的PPI协议(S7-300不适用)
串口设置:串口转换线+USB转串口
缺省为:9600,数据位:8,停止位:1,偶校验(无校验是不行的!)
代码块 | ||
---|---|---|
| ||
发送:68 1B 1B 68 02 00 7C02 F0 80 32 01 00 00 00 0002 00 0E 00 00 04 01 12 0A 10 1E02 00 0201 00 0100 1E81 00 00 08 7E 0116 应答:【25】03或者68 001B 001B 1968 02 F000 806C 32 01 0300 00 FF FF 00 0E 00 00 00 04 01 12 0A 10 02 00 0402 00 00 04 01 0384 00 00 08 006F 16 接收到:E5 解释: B1立即发送:10 B2:0302 00 5C 005E 未知16 B3接收到数据:68 B4:17 0017 1F68 = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节 B12 B13:03 54,序列号 B24 B25:00 06 = 06,读取的寄存器个数(??) B26 B27:00 65=0x0065=101=DB101 B28:84 = 0x84,读取的数据块类型为DB块 B29~B31:=00 09 88=0x0000988=2440,2440/8=305*8 读取的偏移量offset(bit为单位) 应答:【27】 0300 02 08 32 03 00 00 FF FF 00 02 00 06 00 00 1B04 0201 F0FF 8004 3200 0310 00 00 5D 00 00 00 02 00 06 00 00 04 01 FF 04 00 10 00 00 解释: B1 B2:03 00 00 未知 B3 B4: 00 1F = 0x1F=31,读取报文总长度,从第一个字节到最后1个字节 B12 B13:03 54,序列号,应该等于请求的序列号 B16 B17:00 0a = 0x000A=10,读取请求寄存器个数(6)+4 B24 B25:00 30 = 0x0030=48=6*8,读取的位长度(字节长度6) B26 ~最后:2个字节,数据值 |
西门子PLC S7-200/S7-200 Smart两种PLC的PPI协议(S7-300不适用)
串口设置:串口转换线+USB转串口
缺省为:9600,数据位:8,停止位:1,偶校验(无校验是不行的!)
代码块 | ||
---|---|---|
| ||
发送:68 1B 1B 68 02 00 7C 32 01 00 00 00 02 00 0E 00 00 04 01 12 0A 10 02 00 01 00 00 81 00 00 08 7E 16
或者68 1B 1B 68 02 00 6C 32 01 00 00 FF FF 00 0E 00 00 04 01 12 0A 10 02 00 02 00 01 84 00 00 08 6F 16
接收到:E5
立即发送:10 02 00 5C 5E 16
接收到数据:68 17 17 68 00 02 08 32 03 00 00 FF FF 00 02 00 06 00 00 04 01 FF 04 00 10 00 00 5D 16 |
西门子PLC-300发送读取数据的请求数据I1.1(eview驱动)
16 |
西门子PLC-300发送读取数据的请求数据I1.1(eview驱动)
正常读取流程:
获取pdu大小(倒数第4个字节为槽号)
发送[022]:03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 01 C0 01 09 接收[022]:03 00 00 16 11 D0 00 01 00 00 00 C1 02 01 00 C2 02 01 01 C0 01 09
第二次握手 发送[025]:03 00 00 19 02 F0 80 32 01 00 00 FF FF 00 08 00 00 F0 00 00 01 00 01 07 80
接收[027]:03 00 00 1B 02 F0 80 32 03 00 00 FF FF 00 08 00 00 00 00 F0 00 00 01 00 01 00 F0
获取一个数据I1.1。最后3个字节是:偏移量I1.1偏移量是8.倒数第4个字节81表示I。倒数第5个字节为块号,S7-300及以上型号必须==01(I、Q等块)或>=1的DB块号
发送[031]:03 00 00 1F 02 F0 80 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 01 00 01 81 00 00 08
接收[026]:03 00 00 1A 02 F0 80 32 03 00 00 00 00 00 02 00 05 00 00 04 01 FF 04 00 08 00 --I1.1==0
接收[026]:03 00 00 1A 02 F0 80 32 03 00 00 00 01 00 02 00 05 00 00 04 01 FF 04 00 08 02 -I1.1值为1
接收[026]:03 00 00 1A 02 F0 80 32 03 00 00 00 54 00 02 00 05 00 00 04 01 FF 04 00 08 06 --I1.1=I1.2=1
西门子PLC-200发送读取数据的请求数据I1.1(eview驱动)
正常读取流程:
获取pdu大小(固定内容)正常读取流程:
获取pdu大小(倒数第4个字节为槽号)
发送[022]:03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 01 C0 01 09
接收[022]:03 00 00 16 11 D0 00 01 00 00 00 C1 02 01 00 C2 02 01 01 C0 01 09
第二次握手(固定内容)
第二次握手 发送[025]:03 00 00 19 02 F0 80 32 01 00 00 FF FF 00 08 00 00 F0 00 00 01 00 01 07 80
接收[027]:03 00 00 1B 02 F0 80 32 03 00 00 FF FF 00 08 00 00 00 00 F0 00 01 00 01 00 01 00 F0
获取一个数据I1.1。最后3个字节是:偏移量I1.1偏移量是8.倒数第4个字节81表示I。1。倒数第5个表示数据块号,对非V类型S7-200必须是00,如果是01或其他则取不到数据!
倒数第5个,必须是00,如果是01则取不到数据! 倒数第4个是块类型(0x81表示I)最后3个字节是偏移量数据倒数第5个字节为块号,S7-300及以上型号必须==01(I、Q等块)或>=1的DB块号
发送[031]:03 00 00 1F 02 F0 80 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 01 00 01 81 00 00 08
接收[026]:03 00 00 1A 02 F0 80 32 03 00 00 00 0E 00 00 04 01 12 0A 10 02 00 05 01 00 00 04 01 FF 04 81 00 08 00 --I1.1==008 – 错误,但PLC-300可以
接收[026025]:03 00 00 1A 02 F0 80 32 03 00 00 00 01 00 00 02 00 05 00 00 04 01 FF 04 00 08 02 -I100 – 正确
获取一个数据V:1,int16。倒数第5个表示数据块号,S7-200对于V类型必须是01,如果是01或其他则取不到数据!
倒数第5个,必须是00,如果是01则取不到数据! 倒数第4个是块类型(0x81表示I)最后3个字节是偏移量数据
发送[031.1值为1
接收[026]:03 00 00 1A 1F 02 F0 80 32 03 32 01 00 00 00 B5 00 54 00 0E 00 00 04 01 12 0A 10 02 00 05 02 00 01 84 00 04 01 FF 04 00 08 06 --I1.1=I1.2=1
西门子PLC-200发送读取数据的请求数据I1.1(eview驱动)
正常读取流程:
获取pdu大小(固定内容)
发送[022]:03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 01 C0 01 09
接收[022]:03 00 00 16 11 D0 00 01 00 00 00 C1 02 01 00 C2 02 01 01 C0 01 09
第二次握手(固定内容)
发送[025]:03 00 00 19 02 F0 80 32 01 00 00 FF FF 00 08 00 00 F0 00 00 01 00 01 07 80
接收[027]:03 00 00 1B 02 F0 80 32 03 00 00 FF FF 00 08 00 00 00 00 F0 01 00 01 00 01 00 F0
获取一个数据I1.1。倒数第5个表示数据块号,对非V类型S7-200必须是00,如果是01或其他则取不到数据!
倒数第5个,必须是00,如果是01则取不到数据! 倒数第4个是块类型(0x81表示I)最后3个字节是偏移量数据
发送[031]:03 00 00 1F 02 F0 80 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 01 00 00 81 00 00 08 – 错误,但PLC-300可以
接收[025]:03 00 00 1A 02 F0 80 32 03 00 00 00 00 00 02 00 05 00 00 04 01 FF 04 00 08 00 – 正确
获取一个数据V:1,int16。倒数第5个表示数据块号,S7-200对于V类型必须是01,如果是01或其他则取不到数据!
接收[027]: 03 00 00 1B 02 F0 80 32 03 00 00 00 B5 00 02 00 06 00 00 04 01 FF 04 00 10 41 40
后去一个数据C:1,int16。倒数第4个字节:1E是块类型。倒数第7个字节是取第几个计数器。每个计数器应该配置为2个字节的int16或uint16。返回的数据是每个计数器返回3个字节,只要取后面2个字节就行了
发送[031]:03 00 00 1f 02 f0 80 32 01 00 00 78 82 00 0e 00 00 04 01 12 0a 10 1e 00 01 00 00 1e 00 00 01 --C1
接收[028]:03 00 00 1c 02 f0 80 32 03 00 00 78 82 00 02 00 07 00 00 04 01 ff 04 00 18 00 01 4d
发送[031]:03 00 00 1f 02 f0 80 32 01 00 00 6e 69 00 0e 00 00 04 01 12 0a 10 1e 00 01 00 00 1e 00 00 0a ---C10
接收[028]:03 00 00 1c 02 f0 80 32 03 00 00 6e 69 00 02 00 07 00 00 04 01 ff 04 00 18 00 27 11
发送[031]:03 00 00 1F 02 F0 80 32 01 00 00 00 02 00 0E 00 00 04 01 12 0A 10 1E 00 01 00 00 1E 00 00 0A – C:10
接收[028]:03 00 00 1C 02 F0 80 32 03 00 00 00 0A 00 02 00 07 00 00 04 01 FF 04 00 18 00 27 11
接收[031]:03 00 00 1F 02 F0 80 32 03 00 00 11 2B 00 02 00 0A 00 00 04 01 FF 04 00 30 00 01 4D 00 00 00倒数第5个,必须是00,如果是01则取不到数据! 倒数第4个是块类型(0x81表示I)最后3个字节是偏移量数据
发送[031]:03 00 00 1F 02 F0 80 32 01 00 00 00 B5 00 0E 00 00 04 01 12 0A 10 02 00 02 00 01 84 00 00 08
接收[027]: 03 00 00 1B 02 F0 80 32 03 00 00 00 B5 00 02 00 06 00 00 04 01 FF 04 00 10 41 40