前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python入门到放弃(十三) | 西门子PLC变量读写

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

作者头像
剑指工控
发布2021-11-09 15:45:07
1.7K0
发布2021-11-09 15:45:07
举报
文章被收录于专栏:剑指工控

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安装即可。

代码语言:javascript
复制
$ pip install python-snap7

经过上面两步,环境就算搭建好了,通过一个连接测试代码试试,判断下环境是否搭建正常。

代码语言:javascript
复制
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的对应存储地址。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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吧!

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

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

就这么简单,下周四见!

作者简介:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 剑指工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档