栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

Python基于Snap7与PLC建立连接并读写数据

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python基于Snap7与PLC建立连接并读写数据

       最近偶尔在网上看到可以用Python通过snap7与PLC建立连接并读写数据,好多小伙伴没有现成的PLC,这里介绍一个电脑模拟PLC与python通讯。效果与实际情况一样的。这里是以SIEMENS的PLC为例,通过Pycharm与TIA V17建立连接,对其DB块、M区、Q区、I区读写数据。

一、安装Snap7安装包

1、在下载的1.4.2文件夹中找到文件

2、将这两个文件拷贝到python的安装目录include中

3、cmd中输入 pip install python-snap7,打开pycharm查看snap7是否安装成功,然后导入snap7包

二、安装SIEMEN的编程软件TIA V17

按照参考链接打开TIA V17仿真,建立好变量连接在线:

三、西门子PLC连接工具NetToPLCsim,修改IP地址和端口

4、以管理员身份打开NetToPLCsim软件,如果102端口被占用,会提示重新获取102端口,在弹窗里点击【是】。

等待端口修改成功。

点击【Add】,填写电脑和PLC设备的IP地址,电脑和PLC设备的IP地址最好一样。

填写完毕后点击【Start Server】。

四、测试程序

运行程序就可以测试是否可以读取PLC中数据和写入PLC数据,以下是测试代码,在参考文章中读写都是用区域代码,但是实际测试无法匹配到区域代码。还有读写DB块和M区、Q区、I区的方法稍有不同需要注意。

import snap7
from snap7.util import *

plc = snap7.client.Client()


# 定义Plc连接
def plc_connect(ip, rack, slot):
    plc.connect(ip, rack, slot)
    if plc.get_connected():
        print("连接成功")


# PLC断开连接
def plc_disconnect():
    plc.disconnect()


# DB块的读操作
def dbRead(dbnum, dblength):
    data = plc.read_area(snap7.types.Areas.DB, dbnum, 0, dblength)
    print(get_int(data, 0))
    print(get_bool(data, 2, 0))
    print(get_dword(data, 4))
    print(get_real(data, 8))
    print(get_bool(data, 0, 0))
    print(get_byte(data, 2))


# DB块的写操作
def dbWrite(dbnum, dblength):
    data = plc.read_area(snap7.types.Areas.DB, dbnum, 0, dblength)
    # set_int(data, 0, 20)
    # set_bool(data, 2, 0, False)
    # set_dword(data, 4, 1000)
    # set_real(data, 8, 11.3)
    # set_int(data, 12, 99)
    set_bool(data, 0, 0, False)
    # set_byte(data, 2, 2)
    # set_int(data, 4, 100)

    plc.write_area(snap7.types.Areas.DB, dbnum, 0, data)
    print('写入成功!!!')


# M区的读操作--------bool
def mRead(byte, bit):
    data = plc.read_area(snap7.types.Areas.MK, 0, byte, 1)
    print(get_bool(data, 0, bit))


# M区的读操作--------int/word/dint/dword
def mRead(byte):
    data = plc.read_area(snap7.types.Areas.MK, 0, byte, 2)
    print(get_int(data, 0))


# M块的写操作---------bool
def mWrite(byte, bit, value):
    data = plc.read_area(snap7.types.Areas.MK, 0, byte, 1)
    set_bool(data, 0, bit, value)
    plc.write_area(snap7.types.Areas.MK, 0, byte, data)

# M块的写操作---------int/word/dint/dword
def mWrite(byte, value):
    data = plc.read_area(snap7.types.Areas.MK, 0, byte, 4)
    # set_int(data, 0, value)
    set_dint(data, 0, value)
    plc.write_area(snap7.types.Areas.MK, 0, byte, data)


# Q区的读操作-------------bool
def qRead(byte, bit):
    data = plc.read_area(snap7.types.Areas.PA, 0, byte, 1)
    print(get_bool(data, 0, bit))


# Q区的读操作-------------int/word/dint/dword
def qRead(byte):
    data = plc.read_area(snap7.types.Areas.PA, 0, byte, 2)
    print(get_int(data, 0))


# Q区的写操作----------bool
def qWrite(byte, bit, value):
    data = plc.read_area(snap7.types.Areas.PA, 0, byte, 1)  # read_area的SIZE参数,这里默认位一个字节
    set_bool(data, 0, bit, value)
    plc.write_area(snap7.types.Areas.PA, 0, byte, data)


# Q区的写操作----------int/word/dint/dword
def qWrite(byte, value):
    data = plc.read_area(snap7.types.Areas.PA, 0, byte, 2)  # read_area的SIZE参数,这里默认位一个字节
    set_int(data, 0, value)
    plc.write_area(snap7.types.Areas.PA, 0, byte, data)


#  输入映象区的读操作-------bool
def iRead(byte, bit):
    data = plc.read_area(snap7.types.Areas.PE, 0, byte, 1)  # Size参数,这里我们定义为1个字节的长度
    print(get_bool(data, 0, bit))

#  输入映象区的读操作-------int/word/dint/dword
def iRead(byte):
    data = plc.read_area(snap7.types.Areas.PE, 0, byte, 2)  # Size参数,这里我们定义为1个字节的长度
    print(get_int(data, 0))


if __name__ == '__main__':
    plc_connect('192.168.1.10', 0, 1)
    dbRead(1, 4)
    dbWrite(1, 4)
    mRead(20, 2)
    mRead(100)
    mWrite(20, 6, True)
    mWrite(22, 100)
    qRead(100, 5)
    qRead(200)
    qWrite(100, 5)
    iRead(99, 7)
    iRead(122)
    plc_disconnect()

TIA V17 链接:https://pan.baidu.com/s/1vfzzDhqKLy49pl9V0AINsA    提取码:hmn8

西门子PLC连接工具 ,NetToPLCsim;NetToPLCSim download | SourceForge.net

Snap7 链接: https://pan.baidu.com/s/1--Zhwj1gs417rpLrpV1QKQ     提取码: qtnm

参考:通讯测试工具和博图仿真机的连接教程

           Python读写PLC

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1038731.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号