2、使用PyQt6部署西门子PLC上位机-软件编写

一、目的

       生产现场机器人上位机软件很多IO都无法监测,同时厂家有封锁软件,故想通过自己设计上位机读取上位机信息并监测 

        在机器人电脑显示调漆间油漆输送状态,下图是连接前后状态

二、设计

1、画面设计

打开工具-外部工具-QTdesigner,这些是上一篇文章设置后的结果

画面根据自己喜好绘制,默认颜色可从样式修改

链接:https://pan.baidu.com/s/189cG53Rej27219qo5PFf1Q?pwd=1010 
提取码:1010 
视频连接如上,讲的精炼有效

画面生成后,转到pycharm点击pyUIC可生成对应的python文件

该文件会显示各个部件名称,方便对应操作

2、逻辑设计

(1)main,用于调用程序

import sys

from PyQt6.QtWidgets import QApplication

from ui.mainwindow import MainWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_widget = MainWidget()
    main_widget.show()
    sys.exit(app.exec())

(2)线程程序,主要存在两个问题

1、不要再线程里直接赋值标签颜色,会导致标签颜色加载闪烁,因为线程和主线程同时运行发生了冲突,花了我3天时间才搞定,用信号方式传递到主线程显示

2、Qthread程序要命名run,否则不会运行,纯恶心人的,找了半天原因

from PyQt6.QtCore import QThread, pyqtSignal
from PyQt6.QtWidgets import QApplication
import ui.var
import time
import snap7
import sys


class WorkThread(QThread):
    paint_sig1 = pyqtSignal(bool)
    paint_sig2 = pyqtSignal(bool)
    paint_sig3 = pyqtSignal(bool)
    paint_sig4 = pyqtSignal(bool)
    paint_sig5 = pyqtSignal(bool)

    solvent_sig1 = pyqtSignal(bool)
    solvent_sig2 = pyqtSignal(bool)

    def __init__(self, plc, paint1_label, paint2_label, paint3_label, paint4_label, paint5_label, parent=None):
        super(WorkThread, self).__init__(parent)
        self.plc = plc
        self.paint1_label = paint1_label
        self.paint2_label = paint2_label
        self.paint3_label = paint3_label
        self.paint4_label = paint4_label
        self.paint5_label = paint5_label

    def run(self):
        while True:
            if not ui.var.stop:
                ui.var.disconnect1 = False
                return
            else:
                prime_paint = self.plc.read_area(snap7.client.Areas.PE, 0, 3914, 1)
                prime_solvent = self.plc.read_area(snap7.client.Areas.PE, 0, 3930, 1)
                print(prime_paint)
                print("prime")
                print(prime_solvent)
                print("solvent")

                paint1 = bool.__bool__((prime_paint.__getitem__(0) >> 0) & 0b1)
                paint2 = bool.__bool__((prime_paint.__getitem__(0) >> 1) & 0b1)
                paint3 = bool.__bool__((prime_paint.__getitem__(0) >> 2) & 0b1)
                paint4 = bool.__bool__((prime_paint.__getitem__(0) >> 3) & 0b1)
                paint5 = bool.__bool__((prime_paint.__getitem__(0) >> 4) & 0b1)

                solvent1 = bool.__bool__((prime_solvent.__getitem__(0) >> 0) & 0b1)
                solvent2 = bool.__bool__((prime_solvent.__getitem__(0) >> 1) & 0b1)

                self.paint_sig1.emit(paint1)
                self.paint_sig2.emit(paint2)
                self.paint_sig3.emit(paint3)
                self.paint_sig4.emit(paint4)
                self.paint_sig5.emit(paint5)

                self.solvent_sig1.emit(solvent1)
                self.solvent_sig2.emit(solvent2)

                time.sleep(1)

(3)窗口程序,用于窗口显示内容和绑定槽和信号

import time

from PyQt6.QtWidgets import QWidget
import PyQt5
from ui.untitled import *
from ui.thread import WorkThread
import snap7
from PyQt6.QtWidgets import QApplication
import ui.var


class MainWidget(QWidget, Ui_widget):
    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)
        self.setupUi(self)
        self.plc = snap7.client.Client()

        self.conn_butt.clicked.connect(self.conn_PLC)
        self.pushButton.clicked.connect(self.plc_disconnect)

    def conn_PLC(self):
        ui.var.stop = True
        ui.var.disconnect1 = True
        self.plc = snap7.client.Client()
        net = str(self.net_addr.text())
        rack1 = int(self.rack_combo.currentText())
        slot1 = int(self.slot_combo.currentText())
        self.plc.connect(net, rack1, slot1)
        plc_status = self.plc.get_connected()

        print(f"connect:{self.plc.get_connected()}")
        if plc_status:
            self.con_status.setText("已连接")
            self.con_status.setStyleSheet("background-color: rgb(2,247,2) ")

        self.thread1 = WorkThread(self.plc, self.paint1, self.paint2, self.paint3, self.paint4, self.paint5, )
        self.thread1.paint_sig1.connect(self.paint1_back)
        self.thread1.paint_sig2.connect(self.paint2_back)
        self.thread1.paint_sig3.connect(self.paint3_back)
        self.thread1.paint_sig4.connect(self.paint4_back)
        self.thread1.paint_sig5.connect(self.paint5_back)
        self.thread1.solvent_sig1.connect(self.solvent1_back)
        self.thread1.solvent_sig2.connect(self.solvent2_back)
        self.thread1.start()
        print("dff")

    def paint1_back(self, msg):
        if msg:
            self.paint1.setText("工作")
            self.paint1.setStyleSheet("background-color: rgb(2,247,2)")
        else:
            self.paint1.setText("停泵")
            self.paint1.setStyleSheet("background-color: rgb(243,69,19) ")
        QApplication.processEvents()

    def paint2_back(self, msg):
        if msg:
            self.paint2.setText("工作")
            self.paint2.setStyleSheet("background-color: rgb(2,247,2)")
        else:
            self.paint2.setText("停泵")
            self.paint2.setStyleSheet("background-color: rgb(243,69,19) ")
        QApplication.processEvents()

    def paint3_back(self, msg):
        if msg:
            self.paint3.setText("工作")
            self.paint3.setStyleSheet("background-color: rgb(2,247,2)")
        else:
            self.paint3.setText("停泵")
            self.paint3.setStyleSheet("background-color: rgb(243,69,19) ")
        QApplication.processEvents()

    def paint4_back(self, msg):
        if msg:
            self.paint4.setText("工作")
            self.paint4.setStyleSheet("background-color: rgb(2,247,2)")
        else:
            self.paint4.setText("停泵")
            self.paint4.setStyleSheet("background-color: rgb(243,69,19) ")
        QApplication.processEvents()

    def paint5_back(self, msg):
        if msg:
            self.paint5.setText("工作")
            self.paint5.setStyleSheet("background-color: rgb(2,247,2)")
        else:
            self.paint5.setText("停泵")
            self.paint5.setStyleSheet("background-color: rgb(243,69,19) ")
        QApplication.processEvents()

    def solvent1_back(self, msg):
        if msg:
            self.solvent1.setText("工作")
            self.solvent1.setStyleSheet("background-color: rgb(2,247,2)")
        else:
            self.solvent1.setText("停泵")
            self.solvent1.setStyleSheet("background-color: rgb(243,69,19) ")
        QApplication.processEvents()

    def solvent2_back(self, msg):
        if msg:
            self.solvent2.setText("工作")
            self.solvent2.setStyleSheet("background-color: rgb(2,247,2)")
        else:
            self.solvent2.setText("停泵")
            self.solvent2.setStyleSheet("background-color: rgb(243,69,19) ")
        QApplication.processEvents()

    def plc_disconnect(self):
        ui.var.stop = False
        if not ui.var.disconnect1:
            self.paint1.setText("失联")
            self.paint2.setText("失联")
            self.paint3.setText("失联")
            self.paint4.setText("失联")
            self.paint5.setText("失联")

            self.solvent1.setText("失联")
            self.solvent2.setText("失联")

            self.con_status.setText("失联")
            self.con_status.setStyleSheet("background-color: rgb(243,69,19) ")

            QApplication.processEvents()

        # self.plc.disconnect()

(4)变量,用于存放各文件间的调用全局变量

stop = None
disconnect1 = None

3、测试和打包exe

可运行后,输入正确的IP地址测试

在终端下运行pyinstaller --noconsole main.py

不要用-F,会产生终端后台,用这个指令可以屏蔽终端后台

三、连接

将程序拷贝到上位机上,输入正确网址即可,最好全部复制粘贴,之前出现ui不显示的问题

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5是一个Python绑定Qt库的工具包,可以用于创建桌面应用程序。Qt Designer是一个用于创建Qt界面的可视化工具,可以方便地创建GUI界面并导出为.ui文件。 要使用Qt Designer编写PyQt5界面,可以按照以下步骤进行操作: 1. 安装PyQt5和Qt Designer 如果你还没有安装PyQt5和Qt Designer,可以使用以下命令进行安装: ``` pip install PyQt5 pyqt5-tools ``` 2. 创建Qt Designer界面 打开Qt Designer,创建一个新的界面。 3. 设计界面 在Qt Designer中,你可以从工具箱中拖拽控件到界面中,设置控件的属性,布局等。 4. 保存界面 在Qt Designer中,选择“文件”->“保存”,将界面保存为.ui文件。 5. 将.ui文件转换为.py文件 使用以下命令将.ui文件转换为.py文件: ``` pyuic5 -o ui_filename.py ui_filename.ui ``` 其中,ui_filename是你的.ui文件名。这将生成一个.py文件,其中包含Qt Designer界面的Python代码。 6. 编写程序 在Python代码中导入生成的.py文件,然后使用它来创建GUI界面。 下面是一个简单的示例程序: ```python from PyQt5 import QtWidgets, uic class MainWindow(QtWidgets.QMainWindow): def __init__(self): super(MainWindow, self).__init__() # Load the ui file uic.loadUi('ui_filename.ui', self) if __name__ == '__main__': app = QtWidgets.QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在此示例中,我们使用`uic.loadUi`方法将.ui文件加载到`MainWindow`类中,然后创建`QApplication`和`MainWindow`实例,并将窗口显示出来。 以上就是使用Qt Designer编写PyQt5界面的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值