0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 通过S7协议读取PLC数据

虹喵小仙女 来源:jf_40637039 作者:jf_40637039 2023-05-28 09:23 次阅读

python下载snap7模块

pip3 install python-snap7

测试程序

demo.py

import snap7
import s7_utils
​
​
def connectPLC():
    s7_utils.S7_200_Connect('192.168.1.2', 3, 0, 1, "1#PLC")
    s7_utils.S7_200_Connect('192.168.1.3', 3, 0, 1, "2#PLC")
    s7_utils.S7_200_Connect('192.168.1.4', 3, 0, 1, "3#PLC")
    s7_utils.S7_200_Connect('192.168.1.5', 3, 0, 1, "4#PLC")
    s7_utils.S7_200_Connect('192.168.1.6', 3, 0, 1, "5#PLC")
​
def getAllPLCData():
    for bzplc in s7_utils.PLCArray:
        plcobj = bzplc["plcObj"]
        ## 读取DB块
        V = s7_utils.dbRead(plcobj, bool, 1, 200, 0, 4, 1)
        PV = s7_utils.dbRead(plcobj, float, 1, 300, 0, 4, 0)、
        ## 读取M区
        bj1 = s7_utils.mReadBool(plcobj,1,4)
        bj2 = s7_utils.mReadBool(plcobj,1,3)
        bj3 = s7_utils.mReadBool(plcobj,1,2)
        bj4 = s7_utils.mReadBool(plcobj,1,1)
​
        print(bzplc["name"]+"\\n","电压:",V,"频率",PV,"报警1",bj1,"报警2",bj2,"报警3",bj3,"报警4",bj4)
​
connectPLC()
getAllPLCData()
​
s7_utils.S7_200_DisconnectAll()

S7协议工具类

s7_utils.py

import snap7
from snap7.util import *
​
PLCArray = []
​
## 连接PLC 加入数组
def S7_200_Connect(ip, type, rack, slot, name):
    plcObj = snap7.client.Client()
    plcObj.disconnect()
    plcObj.set_connection_type(type)
​
​
    try:
        plcObj.connect(ip, rack, slot)
    except:
        print(f"连接状态: {ip} 连接失败")
        return 0
    
    print(f"连接状态:{plcObj.get_connected()}{ip} 连接成功")
​
    saveData = {
        "plcObj": plcObj,
        "name": name,
        "ip": ip
    }
​
    PLCArray.append(saveData)
    return 1def S7_200_getplcObj(ip):
    for plc in PLCArray:
        if plc["ip"] == ip:
            return plc["plcObj"]
    
    return 1## 关闭所有PLC连接
def S7_200_DisconnectAll():
    for plc in PLCArray:
        # print(plc)
        if plc["plcObj"] != None:
            plc["plcObj"].disconnect()
    
    return 1## 读取DB块
def dbRead(plcObj, type, dbnum, startAddress, address, dblength, boolX):
    """
    DB块的读操作;如果是200smart系列的将dbnum设置为0
    :param dbnum: DB1
    :param dblength: 
    :return:
    """
    data = plcObj.read_area(snap7.types.Areas.DB, dbnum, startAddress, dblength)
​
    # print(data)if type == int:
        return get_int(data, address)
    elif type == bool:
        return get_bool(data, address, boolX)
    elif type == str:
        return get_dword(data, address)
    elif type == float:
        return get_real(data, address)
    elif type == bytes:
        return get_byte(data, address)
    else:
        return None
    
## 写DB块
def dbWrite(plcObj, type, data, dbnum, startAddress, dblength, address):
    """
    DB块的写操作;如果是200smart系列的将dbnum设置为0
    :param dbnum: DB块的序号
    :param dblength:
    :return: 字节长度,根据需要设定
    """
    data = plcObj.read_area(snap7.types.Areas.DB, dbnum, startAddress, dblength)
​
    if type == int:
        set_int(data, address, data)
    elif type == bool:
        set_bool(data, address, 0, data)
    elif type == str:
        set_dword(data, address, data)
    elif type == float:
        set_real(data, address, data)
    elif type == bytes:
        set_byte(data, address, data)
    else:
        return None
    
    plcObj.write_area(snap7.types.Areas.DB, dbnum, startAddress, data)
​
def mReadBool(plcObj, num, bit):
    """
    M区的读操作--------bool
    :param num:
    :param bit:
    :return:
    """
    data = plcObj.read_area(snap7.types.Areas.MK, 0, num, 1)
​
    # print(data)return get_bool(data, 0, bit)


def mRead(plcObj, type, num):
    """
    M区的读操作--------int/word/dint/dword
    :param num:
    :return:
    """
    data = plcObj.read_area(snap7.types.Areas.MK, 0, num, 2)
​
​
    if type == int:
        get_int(data, 0)
    elif type == bool:
        get_byte(data, 0)
    elif type == "dint":
        get_dint(data, 0)
    else:
        return None


def mWriteBool(plcObj, byte, bit, value):
    """
    M块的写操作---------bool
    :param byte:
    :param bit:
    :param value:
    :return:
    """
    data = plcObj.read_area(snap7.types.Areas.MK, 0, byte, 1)
    set_bool(data, 0, bit, value)
    plcObj.write_area(snap7.types.Areas.MK, 0, byte, data)


def mWrite2(plcObj, byte, value):
    """
    M块的写操作---------int/word/dint/dword
    :param byte:
    :param value:
    :return:
    """
    data = plcObj.read_area(snap7.types.Areas.MK, 0, byte, 4)
    # set_int(data, 0, value)
    set_dint(data, 0, value)
    plcObj.write_area(snap7.types.Areas.MK, 0, byte, data)
​
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 西门子
    +关注

    关注

    92

    文章

    2911

    浏览量

    114290
  • 鸿蒙
    +关注

    关注

    55

    文章

    2168

    浏览量

    42290
收藏 人收藏

    评论

    相关推荐

    S7 PLC TCP/IP协议参考LABVIEW实例

    通过以太网与S7-300系列PLC通信,不需要适配器。该示例提供了一个API,用于读取/写入PLC上的寄存器。[tr]据我所知,西门子从未公
    发表于 02-15 23:51

    S7通信协议详解

    这是S7-1200与S7-200 Smart系列PLCS7通信教程的第1篇文章。本章我们打算和大家聊聊西门子的S7通信
    发表于 12-30 07:47

    基于S7-1500的S7通信编程

    S7 协议是SIEMENS S7 系列产品之间通讯使用的标准协议,其优点是通信双方无论是在同- -MPI 总线上、同一PROFIBUS 总线上或同- 工业以太网中,都可
    发表于 09-26 17:53 39次下载
    基于<b class='flag-5'>S7</b>-1500的<b class='flag-5'>S7</b>通信编程

    S7通讯的功能及特点

    S7通讯(S7-communication)主要英语S7-400/400、S7-400/300 PLC之间的通讯,是
    发表于 09-29 15:16 19次下载
    <b class='flag-5'>S7</b>通讯的功能及特点

    通过MPI建立OPC服务器与S7-200 PLC集成口的S7连接

    通过MPI建立OPC服务器与S7-200 PLC集成口的S7连接方式说明。
    发表于 05-07 09:24 5次下载

    西门子S7协议转Modbus协议网关

    西门子S7协议转Modbus协议网关
    发表于 11-13 15:03 1606次阅读

    基于PROFIBUS总线的S7单边通信

    S7协议是SIEMENS S7系列产品之间通讯使用的标准协议 ,其优点是通信双方无论是在同一MPI总线上、同一PROFIBUS总线上或同一工业以太网中,都可
    的头像 发表于 08-10 10:06 1873次阅读
    基于PROFIBUS总线的<b class='flag-5'>S7</b>单边通信

    S7-400基于PROFIBUS总线的S7单边通信的组态步骤

    S7协议是SIEMENS S7系列产品之间通讯使用的标准协议 ,其优点是通信双方无论是在同一MPI总线上、同一PROFIBUS总线上或同一工业以太网中,都可
    的头像 发表于 08-10 10:11 3060次阅读

    Python Snap7实现S7-1200 PLC通信控制

    Snap7 是一个基于以太网与S7系列的西门子PLC通讯的开源库,支持包括S7系列的S7-200、S7
    发表于 04-17 14:19 1次下载
    <b class='flag-5'>Python</b> Snap<b class='flag-5'>7</b>实现<b class='flag-5'>S7</b>-1200 <b class='flag-5'>PLC</b>通信控制

    C#使用西门子S7协议读写PLC DB块

    是我们上位机要读写的DB  3. 根据西门子S7 协议文档读取DB块的方式有很多种,直接根据该DB的偏移量进行读写也行,但读或写数据都需要进行对应的
    发表于 04-19 10:05 19次下载
    C#使用西门子<b class='flag-5'>S7</b><b class='flag-5'>协议</b>读写<b class='flag-5'>PLC</b> DB块

    python使用Snap7读写西门子S7系列PLC

    Snap7是一个基于s7通信协议的开源软件包,作者是Davide Nardella,该软件包封装了S7通信的底层协议,可使用普通电脑
    发表于 04-20 10:45 4次下载
    <b class='flag-5'>python</b>使用Snap<b class='flag-5'>7</b>读写西门子<b class='flag-5'>S7</b>系列<b class='flag-5'>PLC</b>

    S7通信协议介绍 s7协议和profinet协议区别

    S7协议和Profinet协议都是工业自动化领域中常用的通信协议,其中S7协议是传统的工控领域常
    发表于 05-08 16:19 2.2w次阅读

    干货分享:宏集物联网HMI通过S7 MPI协议采集西门子400PLC数据

    宏集物联网HMI集成了多个驱动来适配西门子200、300、400、1200、1500、LOGO等系列PLC,本文主要介绍宏集HMI通过S7 MPI协议采集西门子400
    的头像 发表于 06-13 13:39 144次阅读
    干货分享:宏集物联网HMI<b class='flag-5'>通过</b><b class='flag-5'>S7</b> MPI<b class='flag-5'>协议</b>采集西门子400<b class='flag-5'>PLC</b><b class='flag-5'>数据</b>

    西门子S7协议与TCP协议的区别

    在工业自动化领域,通信协议的选择对于确保设备间的顺畅通信和数据的可靠传输至关重要。西门子S7协议和TCP协议作为两种常用的通信
    的头像 发表于 06-19 15:54 242次阅读

    宏集物联网工控屏通过 S7 ETH 协议采集西门子 1200 PLC 数据

    上周我们分享了宏集HMI通过S7 MPI协议采集西门子400 PLC数据的操作步骤。本周,我们将继续带来干货,重点介绍宏集HMI如何
    的头像 发表于 06-21 16:02 161次阅读
    宏集物联网工控屏<b class='flag-5'>通过</b> <b class='flag-5'>S7</b> ETH <b class='flag-5'>协议</b>采集西门子 1200 <b class='flag-5'>PLC</b> <b class='flag-5'>数据</b>