python通过S7协议读取西门子200smart数据

这篇具有很好参考价值的文章主要介绍了python通过S7协议读取西门子200smart数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

发现网上很多关于python通过s7协议控制200smart的代码都失败,我猜应该是版本的问题。自己捣鼓了半天,终于测试成功


from snap7 import util,client

my_plc = client.Client()  #建立一个客户端对象
my_plc.set_connection_type(3) #如果是200smart,必须有此段代码。1200,1500可以不写。
my_plc.connect("192.168.11.9",0,1)  #连接plc,参数分别为ip ,卡号,槽号。200smart为0和1

state=my_plc.get_connected() #用来判读是否连接成功 返回值为true 和false
# print(state)


 #注意,这里的参数有坑,最新的sanp7协议是这样写,后面1代表V区,0代表起始地址,10代表字节数量
 #注意,这里0对应VB0,1对应vb1以此类推。
data=my_plc.read_area(client.Areas.DB,1,0,10)


my_data = util.get_byte(data,5)

m=util.get_word(data,0) #相当于vw0
m2=util.get_word(data,2)  #相当于vw2
m3=util.get_word(data,4)  #相当于vw4
m4=util.get_word(data,6)  #相当于vw6



print(m)
print(m2)
print(m3)
print(m4)

my_plc.disconnect() #断开连接
my_plc.destroy() #销毁客户端对象

python与200smart通讯,python通信,python基础学习,python,开发语言

 python与200smart通讯,python通信,python基础学习,python,开发语言

from HslCommunication import SiemensS7Net
from HslCommunication import SiemensPLCS





#bool read write test


def printReadResult(result):
    if result.IsSuccess:
        print(result.Connect)
    else:
        print('failed'+result.Message)

def printWriteReslut(result):
    if result.IsSuccess:
        print('sucess')
    else:
        print('failed' + result.Message)

if __name__ == '__main__':
    siemens = SiemensS7Net(SiemensPLCS.S200Smart,'192.168.12.10')
    # '''连接服务器,也可放在窗口的Load方法中,一般建议使用长连接,速度更快,又是线程安全(下面使用了长连接),如果不连接,直接读取,就是短连接'''
    if siemens.ConnectServer().IsSuccess==False:
        print('connect failed')
    else:
        #bool read write test
        siemens.WriteBool("M80.6",True)
        printWriteReslut(siemens.ReadBool("M80.6"))

        #byte read write test
        siemens.WriteByte("M100",58)
        printWriteReslut(siemens.ReadByte("M100"))

        #int16 read write test
        siemens.WriteInt16("M102",12358)
        printWriteReslut(siemens.ReadInt16("M102"))

        data = siemens.ReadByte("V100").Content #读取v100的值
        print(data)

        # 断开连接
        # siemens.ConnectClose()
from snap7 import util, client

my_plc = client.Client()  # 建立一个客户端对象
my_plc.set_connection_type(3)  # 如果是200smart,必须有此段代码。1200,1500可以不写。
my_plc.connect("192.168.11.9", 0, 1)

class plcData(QThread):
    def __init__(self,plc):
        super(plcData, self).__init__()
        self.plc=plc


    def run(self):
        self.check_plc_state()

    def check_plc_state(self):
        short_data=None
        QThread.sleep(100)
        end_data=None
        if short_data==end_data:
            print('通讯异常')
            self.plc.close()





class PlcThread(QThread):
    def __init__(self,plc):
        super(PlcThread, self).__init__()
        self.plc=plc

    def run(self):
        while True:
            if self.plc.get_connected()==False:

                try:
                    self.plc.connect("192.168.11.9", 0, 1)
                except Exception as e:
                    pass
            else:
                #读取数据
                try:
                    # da=#
                    # 区
                    print('数据读取')
                except Exception as e:
                    pass







class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("的学习")
        self.resize(500,500)
        self.setup_ui()

        self.plc = my_plc = client.Client()  # 建立一个客户端对象 单独开个线程去处理
        self.plc.set_connection_type(3)  # 如果是200smart,必须有此段代码。1200,1500可以不写。


        self.t = PlcThread()


    def setup_ui(self):
        self.btn=QPushButton('btn',self)
        self.btn.clicked.connect(self.btn_cick)

    def btn_click(self):
        self.plc.connect("192.168.11.9", 0, 1)
        self.plc.get_connected()
        #d读取数据,用一个线程






if __name__ == '__main__':
    import sys
    app=QApplication(sys.argv)

    win=Window()
    win.show()





    sys.exit(app.exec_())

写PLC

写PLC用到的方法为 write_area(area,dbnumber,start,data)

说明如下:area表示往哪个区去写,如:plc.write_area(client.Areas.DB,1,2,bytes)

                dbnumber:如果是smart200plc,要填1,1200/1500填0

                start 开始的地址,指字节,如上面的2,代表vb2

                bytes 代表长度,如果写一个位,就用一个字节

具体分三步:

1,bty_arrays = read_area()或bty_arrays = bytearay(变量类型所占的大小)

2.用snap7.util类来更改字节数组,bool类型用1个字节,word用2个字节等例如

set_bool(_bytearray,byte_index,bit,value)字节数组,字节索引,位索引,要写入的值

3.通过write_area(area,dbnumber,start,data)写入到plc相对应的区

    def connect_200smart(ip,plc_mode=3,rack=0,slot=1):

        my_plc = client.Client()
        my_plc.set_connection_type(plc_mode) #200smart 要设置
        my_plc.connect(ip,rack,slot)

        return my_plc



    plc=connect_200smart("192.168.2.1")

    print(plc.get_connected())

    bytes=plc.read_area(client.Areas.DB,1,0,10)#说明 smart200 的V区要填写1,0代表VB0
   



    util.set_bool(bytes, 0, 0, 0)
    plc.write_area(client.Areas.DB,1,0,bytes)  #说明 smart200 的V区要填写1,0代表VB0

    util.set_bool(bytes,0,1,0)
    plc.write_area(client.Areas.DB,1,1,bytes)

    util.set_bool(bytes,0,3,0)
    plc.write_area(client.Areas.DB,1,2,bytes)


#用一个字节数组,因为对位操作,一个字节够了
    buf=bytearray(1) #第一步,创建一个字节数组
  
    util.set_bool(buf,0,1,0) #第二步,把该字节的第一个位设为TRUE
    plc.write_area(client.Areas.DB,1,0,buf) #第三步把更改的字节放到V区,vb0里。

        文章来源地址https://www.toymoban.com/news/detail-824233.html

import threading
import time
from PyQt5.Qt import *
from snap7 import client,util


class PlcData():
    def __init__(self):
        self.db_dd12 :float = None
        self.db_d24:float = None

    def checkConnectState(self,plc):
        self.t = threading.Thread(target=self.run_thread,args=(plc,),daemon=True)
        self.t.start()

    def run_thread(self,plc):
        while True:
            start=self.db_d24
            time.sleep(1000)
            end = self.db_d24
            print(f"start={start}--end={end}")

            if start==end:
                QMessageBox.warning(self,"waringing","通讯异常")
                plc.disconnect()







class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("的学习")
        self.resize(500,500)
        self.setup_ui()


    def setup_ui(self):
        self.label = QLabel('info',self)
        self.label.move(100,50)

        self.btn=QPushButton('start',self)
        self.btn.move(100,200)
        self.btn.clicked.connect(self.btn_click)

        self.plc = client.Client()
        self.plc.set_connection_type(3)
        self.plcdata = PlcData()

    def btn_click(self):
        try:
            self.plc.connect("192.168.2.20",0,1)
            self.t=threading.Thread(target=self.getdata)
            self.plcdata.checkConnectState(self.plc)
        except:
            pass


    def getdata(self):
        while True:
            print('11111')
            if not self.plc.get_connected():
                try:
                    self.plc.connect('192.168.2.20',0,1)
                except Exception as e:
                    print(e)
                else:
                    #成功直接读数据
                    try:
                        bytearray = self.plc.db_read(1, 0, 2)
                        self.plcdata.db_d24 = util.get_word(bytearray,0)
                        self.label.setText(str(self.plcdata.db_d24))
                    except Exception as e:
                        print(e)














if __name__ == '__main__':
    import sys
    app=QApplication(sys.argv)

    win=Window()
    win.show()





    sys.exit(app.exec_())










到了这里,关于python通过S7协议读取西门子200smart数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 西门子S7-200 SMART控制步进电机(二)

    目录 一、开环运动控制方法 二、运动轴概述 三、配置运动控制向导        S7-200 SMART CPU提供三种开环运动控制的方法:        1、脉冲宽度调制(PWM):内置于CPU中,用于速度、位置或占空比的控制        2、脉冲串输出(PTO):内置于CPU中,用于指定长度脉冲或指定距

    2024年02月04日
    浏览(27)
  • 基于西门子S7-200smart作为客户端的modbustcp通讯

    具体PLC实施及排配和上位机modbustcp对应地址关系 1.启动按钮—I0.0 -------modbus地址:2000 2.停止按钮—I0.1 -------modbus地址:2001 3.急停按钮—I0.2 -------modbus地址:2002 4.进料感应器—I0.3 -------modbus地址:2010 5.出料感应器—I0.4 -------modbus地址:2015 6.电机运行—Q0.0 -------modbus地址:2

    2024年02月03日
    浏览(56)
  • 【自用】西门子s7-200连接显示屏和物联网盒子完整配置过程

    1.PLC配置 2.显示屏配置 3.物联网盒子配置 1.连接PLC软件 STEP-7MicroWIN V4.0 SP9完整版 链接:https://pan.baidu.com/s/17LMEXnbkQZMPI8Bte24Eug?pwd=jsi3 提取码:jsi3 2.PLC配置 打开 PLC 上面的小盖子,把红色按钮扳到另一端(ON),打开数据收集 使用网线连接 PC 和 PLC 3.配置网络、下载程序 设置网络

    2024年02月09日
    浏览(35)
  • 西门子PLC S7-200SMART Modbus TCP通讯的步骤和要点

    Modbus TCP是一个非常传统,应用广泛的通讯协议,很多智能设备都支持该协议。西门子S7-200SMART及1200、1500系列都免费支持(300和400还是要高昂收费),并且做成了标准库,使用起来非常方便,下面简单介绍一下客户端的配置步骤,服务器的配置更加简单,可以自行摸索: 1、引

    2023年04月09日
    浏览(31)
  • C# 读取西门子S7系列PLC教程及源码

    若要创建驱动程序的实例,需要使用此构造函数: CPU:这指定您要连接到的  CPU 。支持的 CPU 包括: ip :指定 CPU 或外部以太网卡的 IP 地址 机架:它包含PLC的 机架 ,您可以在Step7的硬件配置中找到 插槽 :这是CPU的插槽,您可以在Step7的硬件配置中找到 例: 此代码为 IP 地

    2024年02月08日
    浏览(35)
  • C#与西门子PLC通讯——手搓S7通讯协议

    本文将尝试从源码角度,使用Tcp/Ip的方式直接与西门子PLC进行交互通讯。 往期博客参考 C#与西门子PLC通讯——新手快速入门 C#与西门子PLC通讯——熟手快速入门 建议先看一下这两篇,了解预设背景。 知其然,知其所以然。 这篇文章,我们就尝试重复造一个轮子。通过对通讯

    2024年02月04日
    浏览(29)
  • PLC实验—西门子S7 1200读取旋转编码器数据并计算电机转速

    注意PTO控制步进电机实验博途软件需要V14版本,不然没有PTO功能块 软件的下载请点击下方百度网盘的链接 链接:https://pan.baidu.com/s/11mQFVnaQxrUy4W9nGIk8Jw 提取码:6lva 详细的操作指导视频已经放到了B站上 Simens S7-1200读取增量式编码器数据 Simens S7-1200根据编码器数据计算电机转速

    2024年02月05日
    浏览(42)
  • C#通过S7.NET库与西门子PLC数据交互

    拉了换一个简单的界面 我新建了一个DB数据块【DB1】,右键【DB1】,点击【属性】项,【优化的块访问】默认是勾选,要想显示数据块中地址偏移量,需要把【优化的块访问】勾选取消 1、右键项目名,选择图中【管理NuGet程序包】 2、在搜索框输入【S7netplus】,我安装的是第

    2024年02月12日
    浏览(29)
  • .net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型

    注:.net中通过TCP/IP方式通过S7.net.dll动态库,连接到西门子PLC,西门子程序中许勾选优化块,程序读取需要 db块号+偏移量 一。使用VS项目,在项目中添加S7.net动态库 代码中引用S7.net动态库 using S7.Net; 实例化PLC服务名 /// /// 实例化PLC /// Plc S71500; 连接PLC按钮时间编写: 以上代码

    2023年04月15日
    浏览(68)
  • 西门子S7-1200组态PROFINET

    1、首先参照官方给的帮助文档,里面有各种情况下的处理方式和组态教程 S7-1200PROFINET通信 2、如果要组态第三方的 PROFINET gateway,比如PROFINET转RS485网关,就需要按照如下的方法进行操作 以sibotech的TS-181为例 通用串口(两个) / PROFINET网关TS-181 上海泗博自动化 网关厂家会提供

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包