Snap7是一个用于处理S7以太网协议,与西门子S7系列PLC通讯的开源通讯组件。支持与S7-200、S7-200 Smart、S7-300、S7-400、S7-1200以及S7-1500的以太网通信。
1. 安装开源库python-snap;
pip install python-snap7
2. Python版本python3.6;
1. snap7库简单介绍
snap7库主要通过read_area和write_area两个函数实现对PLC数据的读写;
snap7中有专门的方法读取数据。
读取M位存储区数据:
读取存储区数据的编号:
areas = ADict({
'PE': 0x81,
'PA': 0x82,
'MK': 0x83,
'DB': 0x84,
'CT': 0x1C,
'TM': 0x1D,
})
读数据;
read_area(area,dbnumber,start,size)
area:area参数用于区分I、Q、M、DB存储区:
dnumber:0
start:起始地址
size:读取长度
在snap7中加入PLC使用的是PE那就在代码中使用的是‘0x81’的编码
例:read_area(0x84, 100, 0, 0)
通过S7采集的数据返回的数据是 byteorder类型,所以如果需要变成自己能用的数据还需要转下格式。
2. 完整的代码
import snap7
from snap7.util import * # 对位操作的函数要导入该库
import time
import json
client = snap7.client.Client()
# IP地址,机架,槽位
client.connect('10.0.11.241', 0, 1)
# 测试是否通讯成功
if client.get_connected():
print('连接成功')
else:
print('连接失败')
def cj_s7():
while True:
cj0 = client.read_area(0x84, 100, 0, 2)
cj1 = client.read_area(0x84, 100, 1, 2)
cj_time = time.time()
log_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print("数据解析结果点位1:"+cj0)
print("数据解析结果点位2:"+cj1)
time.sleep(1)#等待一秒,一秒一个的获取数据
#有必要的情况下可以创建个多线程
def xc():
# 创建线程
thread_hi = cj_s7()
# 启动线程
thread_hi.start()
print('Main thread has ended!')
if __name__ == '__main__':
xc()
s7协议我也是刚开始接触,所以很多地方也有需要完善学习的地方,希望有个老师能来指导指导下。
谢谢,可以留下或私聊下联系方式:qq:3025905045