版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

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.1BitI:2.1I0.0是第一个位,从0开始,最多到I1.7,下一个位是I2.0bool
IW1SignedI:1
int16
Q1.1BitQ:1.1Q0.0是第一个位,从0开始bool
M1.1BitM:1.1M0.0是第一个位,从0开始bool
MW1SignedM:1
int16
C1SignedC:W1C是计时器int16
VW1SignedV:1
int16
VD3Floating PointV:3
float





FAQ

问题1:日志提示总是连接不上,用TCP工具连接端口102缺失可以的

解决:查看日志提示的槽号和实际设备槽号是否一致,不一致需要修改。槽号不对会导致数据发送不了。


协议分析

...

基本步骤。读取一个数据,分3步

  • 建立连接后获取pdu大小

连接建立之后,会发送MPI(这里为2)、机架号(这里为0)、槽号(第一个2,第二个1)获得PDU大小。

如果槽号给错误了,会收不到数据且会被PLC断开连接:

...

languagetext

...

  • 获取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断开连接:

代码块
languagetext
发送请求:
[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