...
4、寄存器类型为C、T时对应变量的变量地址
- 支持16位无符号整数,地址为:
- C:1
- T:1
示例:
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缺失可以的
解决:查看日志提示的槽号和实际设备槽号是否一致,不一致需要修改。槽号不对会导致数据发送不了。
协议分析
...
基本步骤。读取一个数据,分3步
- 建立连接后获取pdu大小
连接建立之后,会发送MPI(这里为2)、机架号(这里为0)、槽号(第一个2,第二个1)获得PDU大小。
如果槽号给错误了,会收不到数据且会被PLC断开连接:
...
language | text |
---|
...
- 获取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
最后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 54 00 02 00 05 00 00 04 01 FF 04 00 08 06 --I1.1=I1.2=1
西门子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 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 |
...
西门子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 接收[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 0E 00 00 04 01 12 0A 10 02 00 01 07 8000 00 81 00 00 08 – 错误,但PLC-300可以
接收[027025]:03 00 00 1B 1A 02 F0 80 32 03 00 00 FF FF 00 08 00 00 02 00 05 00 F0 01 00 04 01 FF 04 00 01 08 00 F0获取一个数据I1.1。倒数第5个表示数据块号,对非V类型S7-200必须是00– 正确
- 获取一个数据V:1,int16。倒数第5个表示数据块号,S7-200对于V类型必须是01,如果是01或其他则取不到数据!
倒数第5个,必须是00,如果是01则取不到数据! 倒数第4个是块类型(0x81表示I)最后3个字节是偏移量数据
发送[031]:03 00 00 1F 02 F0 80 32 01 00 00 00 B5 00 00 0E 00 00 04 01 12 0A 10 02 00 02 00 01 84 00 00 81 00 00 08 – 错误,但PLC-300可以08
接收[025027]:03 : 03 00 00 1A 1B 02 F0 80 32 03 00 00 00 B5 00 00 02 00 05 06 00 00 04 01 FF 04 00 08 00 – 正确获取一个数据V10 41 40
- 获取一个数据C:1,int16。倒数第4个字节:1E是块类型。倒数第7个字节是取第几个计数器。每个计数器应该配置为2个字节的int16或uint16。返回的数据是每个计数器返回3个字节,只要取后面2个字节就行了
int16。倒数第5个表示数据块号,S7-200对于V类型必须是01,如果是01或其他则取不到数据!倒数第5个,必须是00,如果是01则取不到数据! 倒数第4个是块类型(0x81表示I)最后3个字节是偏移量数据
发送[031]:03 00 00 1F 1f 02 F0 f0 80 32 01 00 00 00 B5 00 0E 00 00 78 82 00 0e 00 00 04 01 12 0A 0a 10 02 1e 00 01 00 02 00 01 84 1e 00 00 08 01 --C1
接收[027028]: 03 :03 00 00 1B 1c 02 F0 f0 80 32 03 00 00 00 B5 00 00 78 82 00 02 00 06 07 00 00 04 01 FF ff 04 00 10 41 40
后去一个数据C:1,int16。倒数第4个字节:1E是块类型。倒数第7个字节是取第几个计数器。每个计数器应该配置为2个字节的int16或uint16。返回的数据是每个计数器返回3个字节,只要取后面2个字节就行了
18 00 01 4d
发送[031]:03 00 00 1f 02 f0 80 32 01 00 00 78 82 00 00 6e 69 00 0e 00 00 04 01 12 0a 10 1e 00 01 00 00 1e 00 00 01 0a ---C1C10
接收[028]:03 00 00 1c 02 f0 80 32 03 00 00 78 82 00 00 6e 69 00 02 00 07 00 00 04 01 ff 04 00 18 00 01 4d00 27 11
发送[031]:03 00 00 1f 1F 02 f0 F0 80 32 01 00 00 6e 69 00 02 00 0e 0E 00 00 04 01 12 0a 0A 10 1e 1E 00 01 00 00 1e 1E 00 00 0a ---C100A – C:10
接收[028]:03 00 00 1c 02 f0 1C 02 F0 80 32 03 00 00 00 6e 69 0A 00 02 00 07 00 00 04 01 ff FF 04 00 18 00 27 11
- 获取一个数据:VD3,float.0x84是类型(和DB相同)。应答数据的最后4个是返回的。00 04是长度4字节,00 01是块的序号号(1), 00 00 18是??
发送[031]:03 00 00 1F 02 F0 80 32 01 00 00 00 02 53 00 0E 00 00 04 01 12 0A 10 1E 02 00 04 00 01 84 00 00 1E 00 00 0A – C:1018
接收[028]:03 00 00 1C 02 1D 02 F0 80 32 03 00 00 00 0A 77 00 02 00 07 08 00 00 04 01 FF 04 00 18 00 27 1120 42 C8 38 D5
接收[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