版本比较

标识

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

...

《siemensS7驱动》该驱动支持与西门子的S7系列PLC之间的通讯,通讯方式通过以太网进行通讯,支持的硬件型号为S7-200/300/400三个系列。对于S7-1200系列尚未测试。

通讯方式:上位机电脑作为TCP客户端,西门子PLC作为TCP服务端。

西门子PLC的TCP通讯方式的缺省端口号为:102。

支持的通讯口

  • S7-200 Smart PPI串口(DB9针)
  • S7-200 PPI串口(DB9针)
  • S7-300 MPI串口(DB9针)
  • S7-200 Smart 网口
  • S7-200 网口
  • S7-300/S7-400网口
  • S7-1200/S7-1500网口。需满足以下条件:
    • 1、西门子S7-1200/S7-1500如果想要被访问,必须设置:“允许来自远程对象的PUT/GET通信访问,然后下载到PLC”,并下载到PLC。方法见:西门子S7-1200/1500编程软件博途Step7 V15.1 V16
    • 2、西门子S7-1200/S7-1500,DB数据块需取消优化(缺省为优化),否则将只能通过名称访问,通过绝对地址无法访问。eview驱动返回错误码:0x05(地址范围越界)。取消方法见图。取消后,需要重新下载到PLC

通讯方式解释:

  • PPI协议是S7-200CPU最基本的通信方式
  • MPI协议是S7-300/S7-400CPU最基本的通信方式

见过的CPU

  • 300:CPU315-2DP
  • 400:CPU416-2DP
  • 200 Smart:SR20
    • smart200有四种型号 CR、ST、SR、CRS
    • CR只能通过以太网进行上下载程序
    • ST、SR在软件和固件为V2.3版本 支持使用编程电缆,ST、SR可以通过MicroSD卡把CPU固件更新至2.3版本(不影响程序)
    • CRS只有2.3版本(没有以太网口)支持电缆通信
  • 200:224
  • 1200:1211
  • 1500:ET200SP(1510SP)

通讯方式

  • 上位机电脑作为TCP客户端,西门子PLC作为TCP服务端。

网络缺省端口

  • 西门子PLC的TCP通讯方式的缺省端口号为:102。

驱动名称:bin驱动名称:bin/drivers/simenss7drv/simenss7drv.exe

...

网络方式需要配置:CPU类型、CPU所在槽号、CPU所在机架

b) MPI/PPI

...

DB9针串口连接

PLC300、PLC400及以上型号的PLC,接入DB9针的DP口(RS485协议),通过西门子MPI通讯协议接入网关或eview

...

PLC S7-200,接入图示的两个DB9针的一个:

不需要配置:CPU所在槽号、CPU所在机架对PPI协议输入数值无意义

不需要配置:CPU所在槽号、CPU所在机架对S7 200 PPI协议输入数值无意义

三、 驱动配置

在驱动中,增加一个名称和模块名称均为simenss7drv的驱动。

...

  • 连接方式选择:tcpclient
  • ip:西门子PLC的IP,此为通过Step7 编程软件为通讯模块(CP443-1)设定的IP地址。【如果不知道IP,可以尝试将电脑和西门子PLC用网线连接起来,电脑配置192.168.x.y,运行exe,网段输入:192.168.x.1—192.168.x.255,端口输入:102.尝试扫描,看能不能扫描到PLC】
  • 端口:102
  • 参数1:PLC类型和协议,格式:PLCModel:Protocol。
    • PLC类型支持:200,300,400,1200,分别表示S7-200,S7-300,S7-400,S7-1200,未输入则默认为式:S7-200。
    • PLC协议:所有PLC均支持TCP方式,S7-200支持PPI,S7-300等支持MPI。未输入缺省为TCP
    • 示例:200:tcp, 200:ppi, 200;300:tcp,300:mpi,300
  • 参数2:CPU在机架上的槽号(slot),第一个槽号为1。未输入时默认为1。对S7-200型号该参数无效。
  • 参数3:CPU在的机架号,第一个机架为0。未输入默认为0。对S7-200型号该参数无效。

五、 变量配置

  • 参数1:PLC型号,有如下值(未输入或输入不是下面之一则默认为式:S7-300
    • 200。表示S7-200/S7-200Smart/S7-200CN。
    • 300,表示S7-300系列
    • 400,表示S7-400系列
    • 1200,S7-1200系列
    • 1500,表示S7-1500系列
    • 示例:
      • 200
      • 300
      • 400
      • 1200
      • 1500
  • 参数2:PLC通讯方式。未输入缺省为TCP(RJ45网口)
    • TCP,所有西门子从S7-200到S7-1500均支持TCP网络协议。此时通过RJ45和PLC相连。
    • PPI,S7-200/S7-200Smart/S7-200CN支持PPI串口协议。如果连接了PPI DB9针串口,则需要输入PPI,且此时串口波特率需要和PLC一致
    • MPI或MPI:x,S7-300/S7-400支持MPI串口协议。如果MPI地址不是2(缺省值),则还需要指定地址。示例:
      • MPI
      • MPI:2
      • MPI:1
    • 如果连接了PPI或MPI(DB9针串口),此时串口波特率需要和PLC一致
  • 参数3:CPU在机架上的槽号(slot),第一个槽号为1。未输入时默认为1。
    • 对S7-200型号该参数无效。
    • 对S7-300到S7-1500有效。缺省槽号为1。槽号需要用编程软件看CPU所在槽号。
  • 参数4:CPU在的机架号,第一个机架为0。未输入默认为0。
    • 对S7-200型号该参数无效。
    • 对S7-300到S7-1500有效。缺省机架为0。机架需要用编程软件看CPU所在机架。
  • 槽号和机架号,如下面的1200,设备组态菜单可以看到,机架号为:0,CPU所在槽号为:1
    • Image Added

五、 变量配置

变量所需要配置的属性:增加变量所需要配置的属性

  • 变量名称:按照项目规范设计的字符串
  • 设备:选择刚刚配置的设备
  • 周期:根据需要而定,缺省为1秒
  • 可控制:使能


eview变量数据类型和PLC数据类型的对应关系:

  • PLC数据类型→eview数据类型
  • BOOL-→bool
  • BYTE-→uint8
  • INT–→int16
  • WORD--->uint16
  • DINT--→int32
  • DWORD-→uint32
  • REAL-→float

eview变量地址西门子S7 200/300/400

支持西门子PLC内各种寄存器类型的起始地址(这里不包含长度,长度由数据类型决定):

寄存器类型为DB时对应变量的变量1、寄存器类型为DB时对应变量的变量地址格式:

    驱动根据地址的连续情况自动计算合适的数据块大小。数据块的长度需与PLC程序中实际开辟的数据块长度匹配,不然数据读取失败。例如对于寄存器是DB类型的来说,s7-400长度限制416, s7-300长度限制188。对于其他寄存器类型的数据块长度一般会小于DB类型,具体长度需要查阅西门子相关手册。

支持:

int8,uint8:8位有符号及无符号整数

int16,uint16:16位有符号及无符号整数

int32,uint32:32位有符号及无符号整数;

float,浮点类型(4个字节)

Bool,布尔类型(一个位)

DBn:Bm,从第n个DB块中,第m个字节开始。一般适用数据类型:单个字节,取1个字节。

DBn:Xm.b,从第n个DB中,第m个字节开始,取1个位。一般适用数据类型:bool

DBn:Dm,从第n个DB块中,第m个字节开始,取4个字节(一个双字D代表4个字节)开始的地址。一般适用数据类型:4字节长度数值,包括uint32,int32,浮点数。

DBn:Wm,从第n个DB块,第m个字节开始,取2个字节(一个字W代表2个字节)。一般适用数据类型:2字节数值,也可以适用于单字节或四字节数值

DBn:m,从第n个DB块DBn中,第m个字节开始的地址,取1个字节。一般适用数据类型:单字节数值,也可以适用于单字节或四字节数值

DB块的变量地址写法:

  • 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的地址及数据类型对照说明(S7-300,Step7 V5.5):

Image Added

用户给出的点表,和eview点表不同。转换示例:示例:

PLC点表

eview变量地址

说明

数据类型

DB101W:307

DB101:W307

DB101块内,偏移307开始,取2个字节,转为16位无符号整数

uint16

DB101D:

310

307

DB101:D307

DB101块内,偏移307开始,取4个字节,转为32位无符号整数

uint32

DB101X:310.2

DB101:X307.2

DB101块内,偏移307开始的字节内取第3位,转为bool型

bool


寄存器类型为I2、寄存器类型为I(输入)、Q(输出)时对应变量的地址:

  • 支持布尔、8位无符号整形、16位整数、32位整数、浮点数,地址示例:

...

  • I:1

...

  • I:1.1

...

  • Q:1

...

  • Q1.1

寄存器类型为M时对应变量的变量地址

...

  • QB:1
  • QD:1

3、寄存器类型为V时对应变量的变量地址--(S7-200专用类型,相当于S7-300及以上型号的DB)

  • 支持布尔、8位无符号整形、16位整数、32位整数、浮点数,地址为:
  • V:1
  • V:1.1
  • VB:1
  • VD:1

3、寄存器类型为M时对应变量的变量地址

  • 支持布尔、8位无符号整形、16位整数、32位整数、浮点数,地址为:
  • M:1
  • M:1.1

4、寄存器类型为C、T时对应变量的变量地址

  • 支持16位无符号整数,地址为:
  • C:1

...

  • T:1

4、time_of_day的时间格式 采用uint32,可能是uint64(但是目前unit32 运行正常) 得到的是运行的Ms数

time_of_day的时间格式 采用uint32位 得到的是运行的Ms数
hour 计算结束时间/3600000
Min 计算结束时间%3600000/6000
Sec 计算结束时间%3600000%6000/1000

然后分别计算出时间 字节顺序设置为4 然后做计算

示例:

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.1

...

Bit

...

M:

...

PI、PQ、M

T:1

C:1

FAQ

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

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

1.1M0.0是第一个位,从0开始bool
MW1SignedM:1
int16
C1SignedC:W1C是计时器int16
VW1SignedV:1
int16
VD3Floating PointV:3
float





FAQ

  • 问题:日志提示总是连接不上,用TCP工具连接端口102缺失可以的
    • 解决:查看日志提示的槽号和实际设备槽号是否一致,不一致需要修改。槽号不对会导致数据发送不了。
  • 问题:驱动日志打印错误:读取失败,错误码:0x8104
  • 问题:驱动日志打印错误:读取DB块失败,错误码:0x05(地址范围越界)


协议分析

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

  • 获取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 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 未知

代码块
languagetext
发送请求:【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断开连接:

代码块
languagetext
请求:
[022] 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 00 00 16 11 D0 00 01 00 00 00 C1 02 01 00 C2 02 01 01 C0 01 09


  • 读取数值

数据:DB2:xxx的读取请求

代码块
languagetext
请求:【31】03 00 00 1F 02 F0 80 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 02 00 02 84 00 00 00

解释:
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为单位)

应答:【27】 03 00 00 1B 02 F0 80 32 03 00 00 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个字节,数据值


西门子S7 TCP(西门子S7 200PPI串口连接在北辰S7-Net模块后,通过网络访问北辰模块的网口)

  • 建立连接后获取pdu大小

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

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

代码块
languagetext
请求:【22】03 00 00 16 11 E0 00 00 00 01 00 C1 02 01 00 C2 02 01 01 C0 01 09
应答:【22】03 00 00 16 11 D0 00 01 00 00 00 C1 02 01 00 C2 02 01 01 C0 01 09
请求:【25】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 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


  • 读取数值

数据:DB2:xxx的读取请求

代码块
languagetext
S300:【31】03 00 00 1F 02 F0 80 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 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 0E 00 00 04 01 12 0A 10 1E 00 02 00 01 1E 00 00 01
应答:【25】03 00 00 19 02 F0 80 32 03 00 00 00 00 00 02 00 04 00 00 04 01 03 00 00 00

解释:
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为单位)

应答:【27】 03 00 00 1B 02 F0 80 32 03 00 00 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,偶校验(无校验是不行的!)

代码块
languagetext
发送: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驱动)

正常读取流程:
获取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大小(固定内容)
    发送[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或其他则取不到数据!

倒数第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

  • 获取一个数据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

  • 获取一个数据: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 53 00 0E 00 00 04 01 12 0A 10 02 00 04 00 01 84 00 00 18

接收[028]:03 00 00 1D 02 F0 80 32 03 00 00 00 77 00 02 00 08 00 00 04 01 FF 04 00 20 42 C8 38 D5


西门子S7-1200/S7-1500如果想要被访问,必须设置:

1、“允许来自远程对象的PUT/GET通信访问“,然后下载到PLC

2、取消每个DB块的优化。

3、并下载到PLC。

西门子PLC-1200发送读取数据的请求数据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

错误返回:

接收[019]:03 00 00 13 02 F0 80 32 02 00 00 00 00 00 00 00 00 81 04 — 返回0x8104,19个字节(而不是64个字节),说明未勾选“允许来自远程对象的PUT/GET通信访问

下面3个是正确的返回:

接收[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