Snap7是一个用于处理S7以太网协议,与西门子S7系列PLC通讯的开源通讯组件。支持与S7-200、S7-200 Smart、S7-300、S7-400、S7-1200以及S7-1500的以太网通信。
网络上有一个基于Snap7开发的Python开源库python-snap7,下面就具体介绍利用Python实现与S7-1200的通信。
1.安装开源库 python-snap
2. PLC端准备
IP地址设置,与PC同一网段;
注:本例使用TIA V13
3. Python程序开发
主要通过read_area和write_area两个函数实现对PLC数据的读写
读取M位存储区数据:
read_area(area,dbnumber,start,size)
area:
area参数用于区分I、Q、M、DB存储区:
areas = ADict({
'PE': 0x81, #input 输入区
'PA': 0x82, #output 输出区
'MK': 0x83, #bit memory 中间存储区(M区)
'DB': 0x84, #DB区
'CT': 0x1C, #counters
'TM': 0x1D, #Timers
})
dnumber:0
start:起始地址
size:读取长度
下图举例读取S7-1200 %MW2的数据;
写M位存储区数据:
write_area(self, area, dbnumber, start, data)
area:0x83;
dnumber:0
start:起始地址
data:数据
import snap7
from snap7.util import * #对位操作的函数要导入该库
import time
client = snap7.client.Client()
# IP地址,机架,槽位
client.connect('192.168.0.1',0,1)
#测试是否通讯成功
if client.get_connected():
print('连接成功')
else:
print('连接失败')
a = bytearray(2) # 定义一个包含两个字节类型的数组
a[0]=0x08
a[1]=0x02
#往M区起始为2的地址写入数据a
client.write_area(0x83,0,2,a)
还有一种方法,先读取需要修改的数据,然后通过set方法修改其值,最后通过write_area写入,这样就不必按字节写入了。
res = client.read_area(0x83,0,0,2)
set_int(res,0,128) # 128是写入的值
client.write_area(0x83,0,0,res)
最后分享一个跑马灯视频: