一、 说明

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

支持的通讯口

通讯方式解释:

见过的CPU

通讯方式

网络缺省端口

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

二、 PLC连接方式

a) 以太网络连接

西门子PLC200、PLC300、PLC400及以上配置的PLC,如果PLC上配置了以RJ45接口的太网卡(包括CP243、CP343、CP443等),首选通过网络方式连接到网关或eview。RJ45网口:

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

b) MPI/PPI DB9针串口连接

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

PLC200通过DB9针的串口(RS485协议),通过西门子PPI通讯协议接入网关或eview。

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

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

三、 驱动配置

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

四、 设备配置

在驱动simenss7drv下增加一个设备,

五、 变量配置

变量所需要配置的属性:


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

eview变量地址

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

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

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

DB块的变量地址写法:

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


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

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

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

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

示例:

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


协议分析

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

西门子S7 TCP(西门子S7 300)

连接建立之后,会发送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模块后,通过网络访问北辰模块的网口)

连接建立之后,会发送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 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的读取请求

请求:【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模块后,通过网络访问北辰模块的网口)

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

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

请求:【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的读取请求

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,偶校验(无校验是不行的!)

发送: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驱动)

倒数第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 – 正确

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

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