Python入门到放弃(十三) | 西门子PLC变量读写


JZGKCHINA
工控技术分享平台
尊重原创 勿抄袭
勿私放其他平台

「人生苦短,我用 Python」
Python 诞生之初就被誉为最容易上手的编程语言。进入火热的 AI 人工智能时代后,它也逐渐取代 Java,成为编程界的头牌语言。
从1月21日,我们给剑指工控的网友们带来一个完全免费的福利—— 超简单 跟我学-Python,每周一期,由剑指工控大神剑思庭主讲哦!如今4个月过去了,课程已经接近尾声,同时,也迎来高潮:
Python在工控领域的应用
来吧!一起学起来!



01
安装 Python
02
03
04
05
06
07
08
09
10
11
12

说明:
Python 3.9 是当前可用的最新版本 Python ,因此,我们将在以下说明中引用该版本。此外,这些说明 专用于 Windows 10 。如果使用以前版本的 Windows,则基本说明是相同的,不过某些步骤中的过程可能略有不同。
第十三讲
西门子PLC变量读写
本次以Snap7正是一个开源的、32/64位的、多平台的西门子以太网通讯库为例,讲解如何采用这个snap7这个库与西门子PLC进行通讯。
Snap7的下载网址为:
http://snap7.sourceforge.net/
开发环境搭建
这里主要从Windows搭建Python环境下的Snap7开发环境。环境搭建主要就是Snap7和python-snap7两个库的安装。安装Snap7 Windows下,需要根据Python的版本(64位),将下载的Snap7的发布库copy到对应的windows\system32目录下即可

安装python-snap7
snap7的python库安装就简单很多了,Windows 命令行下,直接pip安装即可。
$ pip install python-snap7
经过上面两步,环境就算搭建好了,通过一个连接测试代码试试,判断下环境是否搭建正常。
import snap7
client = snap7.client.Client()
client.connect('192.168.0.12', 0, 1)
client.disconnect()
如果看到 红色提示
snap7.snap7exceptions.Snap7Exception: TCP : Unreachable peer表示 连接成功 ,否则是连接失败。
接下来配置PLC侧的设置,IP配置:

选择访问级别,选择完全访问权限

勾选“允许来自远程对象的PUT/GET通信访问

DB块取消勾选优化访问

在DB块中数据选择可以从HMI/OPC UA访问

结合python-snap7的文档API和源码分析,python-snap7重要的两个方法是read_area和write_area,通过这两个方法就能读和写PLC的对应存储地址。
read_area(self, area, dbnumber, start, size):
"""This is the main function to read data from a PLC.
With it you can read DB, Inputs, Outputs, Merkers, Timers and Counters.
:param dbnumber: The DB number, only used when area= S7AreaDB
:param start: offset to start writing
:param size: number of units to read
Area通过下表就可以得知。

接下来我们通过读写PLC的M10.1、MW201来具体看看如何读写PLC。
import struct
import time
import snap7
def plc_connect(ip, rack=0, slot=1):
连接初始化
:param ip:
:param rack: 通常为0
:param slot: 根据plc安装,一般为0或1
:return:
client = snap7.client.Client()
client.connect(ip, rack, slot)
return client
def plc_con_close(client):
:param client:
:return:
client.disconnect()
def test_mk10_1(client):
测试M10.1
:return:
area = snap7.snap7types.areas.MK
dbnumber = 0
amount = 1
start = 10
print(u'初始值')
mk_data = client.read_area(area, dbnumber, start, amount)
print(struct.unpack('!c', mk_data))
print(u'置1')
client.write_area(area, dbnumber, start, b'\x01')
print(u'当前值')
mk_cur = client.read_area(area, dbnumber, start, amount)
print(struct.unpack('!c', mk_cur))
def test_mk_w201(client):
测试MW201,数据类型为word
:param client:
:return:
area = snap7.snap7types.areas.MK
dbnumber = 0
amount = 2
start = 201
print(u'初始值')
mk_data = client.read_area(area, dbnumber, start, amount)
print(struct.unpack('!h', mk_data))
print(u'置12')
client.write_area(area, dbnumber, start, b'\x00\x0C')
print(u'当前值')
mk_cur = client.read_area(area, dbnumber, start, amount)
print(struct.unpack('!h', mk_cur))
time.sleep(3)
print(u'置3')
client.write_area(area, dbnumber, start, b'\x00\x03')
print(u'当前值')
mk_cur = client.read_area(area, dbnumber, start, amount)
print(struct.unpack('!h', mk_cur))