pyqt5上位机开发框架

该博客介绍了如何结合PyQt5 GUI库和Modbus TCP库来实现设备状态监控。通过创建一个窗口应用,利用Qt的信号槽机制,实现实时读取并显示PLC设备的两个通道状态,当通道状态改变时,相应地更新界面上的指示灯颜色。此外,还展示了如何处理连接和通信错误,确保稳定的数据读取。
摘要由CSDN通过智能技术生成

from PyQt5.Qt import *
from resources.ui_main import Ui_MainWindow
from tool import TOOL


class Window(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton_1.setCheckable(True)
        #初始化label状态
        for i in range(4):
            self.change_label_color(f'light_{i}',status='init')
    def event_btn_clicked(self,checked):
        sender=self.sender()
        # 单例启动
        TOOL.start(self,sender,self.call_back_light_color)

    def change_label_color(self,label_name,status='init'):
        '''

        :param label_name: objectName
        :param status:
        :return:
        '''
        color={'init':'#616161','green':'#00ff00','red':'#ff0000'}[status]
        style="""
                min-width:20px;
                min-heigth:20px;
                max-width:20px;
                max-heigth:20px;
                border-radius:10px;
                border:1px solid #f3f379;
                background-color:{};
        """.format(color)
        self.__getattribute__(label_name).setStyleSheet(style)

    def call_back_light_color(self,a,b):
        self.change_label_color('light_0','green')if a==1 else self.change_label_color('light_0','red')
        self.change_label_color('light_1','green')if b==1 else self.change_label_color('light_1','red')


if __name__=="__main__":
    import sys
    app=QApplication(sys.argv)
    win=Window()
    win.show()
    sys.exit(app.exec_())
from PyQt5.QtCore import QObject, QTimer, pyqtSignal
import threading
from siemens_modbus_tcp import Plc




class Tool(QObject):
    singal_lights=pyqtSignal(int,int)
    def __init__(self):
        super().__init__()
        self.parent=None
        self.sender= None
        #实例化Plc对象
        self.plc=Plc('192.168.5.100')
    def start(self,parent,sender,func):

        self.singal_lights.connect(func)
        t=threading.Thread(target=self.show_I)
        t.start()
    def show_I(self):
        import time
        while True:
            self.singal_lights.emit(self.plc.read_plc(0),self.plc.read_plc(1))

            time.sleep(1)




TOOL=Tool()#实例化一个对象,单例模式


import time
import modbus_tk
import modbus_tk.defines as cts
import modbus_tk.modbus_tcp as modbus_tcp

class Plc(object):
    def __init__(self,host):
        try:
            self.master=modbus_tcp.TcpMaster(host=host)
        except Exception as e:
            print("连接失败",e)
    def read_plc(self,address):
        try:
            data=self.master.execute(1,cts.READ_COILS,address,1)
            return data[0]
        except Exception as e:
            time.sleep(0.03)
            self.read_plc(self.master,address)
    def write_plc(self,address,value):
        try:
            self.master.execute(1,cts.WRITE_SINGLE_COIL,address,output_value=value)
        except Exception as e:
            time.sleep(0.003)
            self.write_plc(self.master,address,value)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值