JZGKCHINA
工控技术分享平台
尊重原创 勿抄袭
勿私放其他平台
「人生苦短,我用 Python」
Python 诞生之初就被誉为最容易上手的编程语言。进入火热的 AI 人工智能时代后,它也逐渐取代 Java,成为编程界的头牌语言。
从1月21日,我们给剑指工控的网友们带来一个完全免费的福利——超简单 跟我学-Python,每周一期,由剑指工控大神剑思庭主讲哦!如今4个月过去了,课程已经接近尾声,同时,也迎来高潮:
Python在工控领域的应用
来吧!一起学起来!
01
安装Python
02
Python 解释器的交互模式
03
编写 Python 代码的工具
04
基础知识
05
运算符与表达式
06
控制流
07
函数
08
模块
09
数据结构
10
面向对象编程
11
异常
12
Python读写Modbus TCP
说明:
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))
if __name__ == "__main__":
client_fd = plc_connect('192.168.0.12')
test_mk10_1(client_fd)
test_mk10_1(client_fd)
plc_con_close(client_fd)
从代码可见,MW201,根据M确定area为MK,根据W确定数据amount为2Btye,根据201确定start为201,读出来的数据根据数据长度用struct进行unpack,写数据对应strcut的pack。
这里给出PLC变量类型和大小,这样对应确定读写的amount。
IT与OT不断融合的今天,应用简便、快捷的编程方式,实现多样的控制算法,已经成为每个工控人升职加薪必不可少的技能,而Python也为我们打开了一扇全新的门。
你正在使用Python吗?是否有很多疑惑?
来跟着剑神继续深入学习Python吧!
请留言给我们吧!说说你想学点什么?
期待你的留言,期待你的加入!
就这么简单,下周四见!
作者简介:
剑思庭,工业网络安全研究员,研究方向为工业网络渗透与防御建设,专注于红队攻击链打造。