一、目的
生产现场机器人上位机软件很多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不显示的问题