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

2021-11-06
JZGKCHINA
工控技术分享平台

尊重原创 勿抄袭

勿私放其他平台

「人生苦短,我用 Python」
Python 诞生之初就被誉为最容易上手的编程语言。进入火热的 AI 人工智能时代后,它也逐渐取代 Java,成为编程界的头牌语言。

从1月21日,我们给剑指工控的网友们带来一个完全免费的福利——超简单 跟我学-Python,每周一期,由剑指工控大神剑思庭主讲哦!如今4个月过去了,课程已经接近尾声,同时,也迎来高潮:

 Python在工控领域的应用 

来吧!一起学起来!

01

安装                     




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'01)
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吧!

请留言给我们吧!说说你想学点什么?

期待你的留言,期待你的加入!

就这么简单,下周四见!




作者简介:

剑思庭,工业网络安全研究员,研究方向为工业网络渗透与防御建设,专注于红队攻击链打造。




往期精选


人气推荐

more+


1.Smart200&V90伺服系统:已更新15课

2.贝加莱直播课程:已更新16课

3.力控科技产品培训:已更新5课

4.剑指工控经典公开课:已更新22课
5.新品推荐:已更新3课

6.专家课堂:已更新12课

相关文章

Python入门到放弃(完结篇) | 打包exe程序

2021-11-06
至此Python从入门到放弃系列全部完毕,还有很多群友问起,怎么没有GUI开发的介绍,在这里解释一下,Python本身有一个TK界面但...

给小白的Python入门教程丨知识星球

2021-11-06
中的《如何七天入门 Python》课在一片 Python 课中脱颖而出,现在已有 2000 位星友.很多星友在星球内,顺利学会了 Python.如下...

一本书搞定Python入门到实践

2021-11-06
题图:Photo by Aaron Burden on Unsplash上周介绍了几本Python从入门到进阶书籍,今天推荐一本入门好书《Python编程:从入门到...

500多页,覆盖AI,Python入门,Python全栈的资料,我尽力了!

2021-11-06
Python全栈工程师,本资料都可以满足你的论文需求.长按识别下方二维码,备注相应关键字,获取适合你的论文资料.本号仅限100...

菜鸟学Python入门教程大盘点|7个多月的心血总结

2021-11-06
如何用Python获取知乎头条精选| XML处理实战运用4).关于Excel表格如何处理|这篇最用心Python入门教程大盘点就先总结到这里,几...

送python入门书

2021-11-06
送资料 长按下方二维码↓↓↓回复 6562免费获取超级适合入门,我就看它入门python

Python入门之数据处理——12种有用的Pandas技巧

2021-11-06
布尔索引 如果你想根据另一列的条件来筛选某一列的值,你会怎么做?例如...Apply函数 Apply是一个常用函数...填补缺失值 'fillna()'可以一次性解决:以整列的平均数或众数或中位数来替换缺失值.让我们基于...

用Python入门不明觉厉的马尔可夫链蒙特卡罗(附案例代码)

2021-11-06
这篇文章介绍了马尔可夫链蒙特卡洛在Python中入门级的应用操作,这个实际应用最终也使我学会使用这个强大的建模分析工具.此项...

Python入门系列:如何在Python中读写文件

2021-11-06
Python编程可以处理两种类型的文件.它们是文本文件和二进制文件.本教程描述了如何在Python编程中读写文本文件.文件访问模式...

Python入门到放弃 | 超简单 跟我学(四)

2021-11-06
JZGKCHINA工控技术分享平台尊重原创 勿抄袭勿私放其他平台「人生苦短,我用 Python」Python 诞生之初就被誉为最容易上手的编...

随机推荐