pyqt实现星三角减压启动

news2025/2/8 14:27:52

这个对于plc上实现是非常容易得。它本来就是逻辑控制器,如果用代码实现它,该怎么做呢?这个实现起来看似简单,实则是有不少坑的(大神除外)。我一直想用类来封装,让它继承QObject,为啥非要继承QObject,而不集成python自己的object,因为在Qobject里有自己的定时器,这样就容易实现定时功能啦。开始我想把这个类都放在一个大定时器里或线程里,发现这个会不停地执行,如果要去处理,又有加入不少逻辑,看起来很不爽。解决方案是界面里放个定时器,它的功能就是监控状态,并对状态做出处理,如更新界面,对下位机做出处理。先设计两个类Input,InOut两个类,InPut类用来接受,比如启动,停止,设置时间间隔等,Inout类用来对plc进行输出控制,代码如下:

输入类:

class InPut:
    __slots__=["start","stop","fault","interval"]
    def __init__(self,start:bool=None,stop:bool=None,fault:bool=None,timeflag:bool = None,interval:int = 3000):
        self.start: bool = start
        self.stop: bool = stop
        self.fault: bool = fault
        self.interval: bool = interval

输入输出类:

class InOut:
    def __init__(self,mainout,starout,tranout,byte:bytearray):
        '''
           :param mainout:
           :param starout:
           :param tranout:
           :param byte:
        '''
        self.__mainout = mainout
        self.__starout = starout
        self.__tranout = tranout
        self.__byte = byte
    def main_out_state(self):return self.get_bool(self.__byte,self.__mainout//8,self.__mainout%8)
    def star_out_state(self):return self.get_bool(self.__byte,self.__starout//8,self.__starout%8)
    def tran_out_state(self):return self.get_bool(self.__byte,self.__tranout//8,self.__tranout%8)

    def set_main_out(self,val):self.set_bool(self.__byte,self.__mainout//8,self.__mainout%8,val)
    def set_star_out(self,val):self.set_bool(self.__byte,self.__starout//8,self.__starout%8,val)
    def set_tran_out(self,val):self.set_bool(self.__byte,self.__tranout//8,self.__tranout%8,val)
    @staticmethod
    def get_bool(bytearray_: bytearray, byte_index: int, bool_index: int) -> bool:
        index_value = 1 << bool_index
        byte_value = bytearray_[byte_index]
        current_value = byte_value & index_value
        return current_value == index_value
    @classmethod
    def set_bool(cls,bytearray_: bytearray, byte_index: int, bool_index: int, value: bool):
        if value not in {0, 1, True, False}:
            raise TypeError(f"Value value:{value} is not a boolean expression.")
        current_value = cls.get_bool(bytearray_, byte_index, bool_index)
        index_value = 1 << bool_index

        # check if bool already has correct value
        if current_value == value:
            return
        if value:
            # make sure index_v is IN current byte
            bytearray_[byte_index] += index_value
        else:
            # make sure index_v is NOT in current byte
            bytearray_[byte_index] -= index_value

下面是降压启动类;


class Motor(QObject):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.flag = False

    def startStop(self,input:InPut,inout: InOut):
        if input.start:
            print("启动条件满足",not inout.main_out_state(),not inout.star_out_state(),not input.fault)
            if all([not inout.main_out_state(),not inout.star_out_state(),not inout.tran_out_state(),not input.fault]):
                inout.set_main_out(True)
                inout.set_star_out(True)
                inout.set_tran_out(False)
                print("星启动")

            if inout.main_out_state() and inout.star_out_state():
                self.time_id = self.startTimer(input.interval)
                self.flag = True
                print("定时器启动")
        if input.stop:
            if self.flag:
                self.killTimer(self.time_id)
            inout.set_main_out(False)
            inout.set_star_out(False)
            inout.set_tran_out(False)
            print("停止")
        self.inout = inout

    def checkState(self,input:InPut,inout: InOut):
        if input.fault:
            inout.set_main_out(False)
            inout.set_star_out(False)
            inout.set_tran_out(False)
            print("故障停止")



    def timerEvent(self, event):
        self.inout.set_star_out(False)
        self.inout.set_tran_out(True)
        self.killTimer(self.time_id)
        self.flag = False
        print("三角启动")

下面是对该类进行测试:



from PySide6.QtWidgets import *
from PySide6.QtCore import *
from snap7 import util



class Ui_Form(object):
    def setupUi(self, Form):
        if not Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(848, 447)
        self.btn_start = QPushButton(Form)
        self.btn_start.setObjectName(u"btn_start")
        self.btn_start.setGeometry(QRect(70, 50, 75, 23))
        self.btn_stop = QPushButton(Form)
        self.btn_stop.setObjectName(u"btn_stop")
        self.btn_stop.setGeometry(QRect(70, 90, 75, 23))
        self.formLayoutWidget = QWidget(Form)
        self.formLayoutWidget.setObjectName(u"formLayoutWidget")
        self.formLayoutWidget.setGeometry(QRect(420, 30, 211, 211))
        self.formLayout = QFormLayout(self.formLayoutWidget)
        self.formLayout.setObjectName(u"formLayout")
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.lab1 = QLabel(self.formLayoutWidget)
        self.lab1.setObjectName(u"lab1")

        self.formLayout.setWidget(0, QFormLayout.FieldRole, self.lab1)

        self.lab2 = QLabel(self.formLayoutWidget)
        self.lab2.setObjectName(u"lab2")

        self.formLayout.setWidget(1, QFormLayout.FieldRole, self.lab2)

        self.lab3 = QLabel(self.formLayoutWidget)
        self.lab3.setObjectName(u"lab3")

        self.formLayout.setWidget(2, QFormLayout.FieldRole, self.lab3)

        self.lab4 = QLabel(self.formLayoutWidget)
        self.lab4.setObjectName(u"lab4")

        self.formLayout.setWidget(3, QFormLayout.FieldRole, self.lab4)


        self.retranslateUi(Form)
        self.btn_start.clicked["bool"].connect(Form.btn_start_click)
        self.btn_stop.clicked.connect(Form.btn_stop_click)

        QMetaObject.connectSlotsByName(Form)
    # setupUi

    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
        self.btn_start.setText(QCoreApplication.translate("Form", u"START", None))
        self.btn_stop.setText(QCoreApplication.translate("Form", u"STOP", None))
        self.lab1.setText(QCoreApplication.translate("Form", u"TextLabel", None))
        self.lab2.setText(QCoreApplication.translate("Form", u"TextLabel", None))
        self.lab3.setText(QCoreApplication.translate("Form", u"TextLabel", None))
        self.lab4.setText(QCoreApplication.translate("Form", u"TextLabel", None))
    # retranslateUi


class Ui(QWidget,Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.bytes = bytearray(1)
        self.input = InPut()
        self.inout = InOut(0,1,2,self.bytes)
        self.motor = Motor()
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.on_timer)
        self.timer.start(200)

    def on_timer(self):
        self.motor.checkState(self.input,self.inout)

        tex1="主接触器启动" if self.inout.main_out_state() else "主接触器停止"
        self.lab1.setText(tex1)

        tex2 = "星接触器启动" if self.inout.star_out_state() else "星接触器停止"
        self.lab2.setText(tex2)

        tex3 = "三角接触器启动" if self.inout.tran_out_state() else "三角接触器停止"
        self.lab3.setText(tex3)

        tex4 = "设备正常" if not self.input.fault else "设备故障"
        self.lab4.setText(tex4)

        print(self.bytes)


    def btn_start_click(self):
        self.input.start = True
        self.input.stop = False
        self.motor.startStop(self.input,self.inout)


    def btn_stop_click(self):
        self.input.start = False
        self.input.stop = True
        self.motor.startStop(self.input, self.inout)

    def btn_main_click(self,state):
        util.set_bool(self.bytes,0,0,state)
        print("main",state)

    def btn_star_click(self,state):
        util.set_bool(self.bytes, 0, 1, state)
        self.input.timeflag = state
        print("star", state)

    def btn_tran_click(self,state):
        util.set_bool(self.bytes, 0, 2, state)
        print("tran", state)
    def le_enter_event(self):
        ...
    def btn_fault_click(self,state):
        self.input.fault=state
        print("fault",state)


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

    win = Ui()
    win.show()

    sys.exit(app.exec())





 运行结果:

上面代的motor类再次优化一下,这样更简洁。代码复制后可以直接测试

from PySide6.QtCore import QObject
class InOut:
    def __init__(self,mainout,starout,tranout,byte:bytearray):
        '''
           :param mainout:
           :param starout:
           :param tranout:
           :param byte:
        '''
        self.__mainout = mainout
        self.__starout = starout
        self.__tranout = tranout
        self.__byte = byte
    def main_out_state(self):return self.get_bool(self.__byte,self.__mainout//8,self.__mainout%8)
    def star_out_state(self):return self.get_bool(self.__byte,self.__starout//8,self.__starout%8)
    def tran_out_state(self):return self.get_bool(self.__byte,self.__tranout//8,self.__tranout%8)

    def set_main_out(self,val):self.set_bool(self.__byte,self.__mainout//8,self.__mainout%8,val)
    def set_star_out(self,val):self.set_bool(self.__byte,self.__starout//8,self.__starout%8,val)
    def set_tran_out(self,val):self.set_bool(self.__byte,self.__tranout//8,self.__tranout%8,val)
    @staticmethod
    def get_bool(bytearray_: bytearray, byte_index: int, bool_index: int) -> bool:
        index_value = 1 << bool_index
        byte_value = bytearray_[byte_index]
        current_value = byte_value & index_value
        return current_value == index_value
    @classmethod
    def set_bool(cls,bytearray_: bytearray, byte_index: int, bool_index: int, value: bool):
        if value not in {0, 1, True, False}:
            raise TypeError(f"Value value:{value} is not a boolean expression.")
        current_value = cls.get_bool(bytearray_, byte_index, bool_index)
        index_value = 1 << bool_index

        # check if bool already has correct value
        if current_value == value:
            return
        if value:
            # make sure index_v is IN current byte
            bytearray_[byte_index] += index_value
        else:
            # make sure index_v is NOT in current byte
            bytearray_[byte_index] -= index_value

class InPut:
    __slots__=["start","stop","fault","interval"]
    def __init__(self,start:bool=None,stop:bool=None,fault:bool=None,timeflag:bool = None,interval:int = 3000):
        self.start: bool = start
        self.stop: bool = stop
        self.fault: bool = fault
        self.interval: bool = interval


class Motor(QObject):
    def __init__(self,intput:InPut=None,inout:InOut=None,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.flag = False
        self.input: InPut = intput
        self.inout: InOut = inout

    def startStop(self):
        if self.input.start:
            print("启动条件满足",not self.inout.main_out_state(),not self.inout.star_out_state(),not self.input.fault)
            if all([not self.inout.main_out_state(),not self.inout.star_out_state(),not self.inout.tran_out_state(),not self.input.fault]):
                self.inout.set_main_out(True)
                self.inout.set_star_out(True)
                self.inout.set_tran_out(False)
                print("星启动")

            if self.inout.main_out_state() and self.inout.star_out_state():
                self.time_id = self.startTimer(self.input.interval)
                self.flag = True
                print("定时器启动")
        if self.input.stop:
            if self.flag:
                self.killTimer(self.time_id)
            self.inout.set_main_out(False)
            self.inout.set_star_out(False)
            self.inout.set_tran_out(False)
            print("停止")


    def checkState(self):
        if self.input.fault:
            self.inout.set_main_out(False)
            self.inout.set_star_out(False)
            self.inout.set_tran_out(False)
            print("故障停止")

    def timerEvent(self, event):
        self.inout.set_star_out(False)
        self.inout.set_tran_out(True)
        self.killTimer(self.time_id)
        self.flag = False
        print("三角启动")



from PySide6.QtWidgets import *
from PySide6.QtCore import *
from snap7 import util



class Ui_Form(object):
    def setupUi(self, Form):
        if not Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(848, 447)
        self.btn_start = QPushButton(Form)
        self.btn_start.setObjectName(u"btn_start")
        self.btn_start.setGeometry(QRect(70, 50, 75, 23))
        self.btn_stop = QPushButton(Form)
        self.btn_stop.setObjectName(u"btn_stop")
        self.btn_stop.setGeometry(QRect(70, 90, 75, 23))
        self.formLayoutWidget = QWidget(Form)
        self.formLayoutWidget.setObjectName(u"formLayoutWidget")
        self.formLayoutWidget.setGeometry(QRect(420, 30, 211, 211))
        self.formLayout = QFormLayout(self.formLayoutWidget)
        self.formLayout.setObjectName(u"formLayout")
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.lab1 = QLabel(self.formLayoutWidget)
        self.lab1.setObjectName(u"lab1")

        self.formLayout.setWidget(0, QFormLayout.FieldRole, self.lab1)

        self.lab2 = QLabel(self.formLayoutWidget)
        self.lab2.setObjectName(u"lab2")

        self.formLayout.setWidget(1, QFormLayout.FieldRole, self.lab2)

        self.lab3 = QLabel(self.formLayoutWidget)
        self.lab3.setObjectName(u"lab3")

        self.formLayout.setWidget(2, QFormLayout.FieldRole, self.lab3)

        self.lab4 = QLabel(self.formLayoutWidget)
        self.lab4.setObjectName(u"lab4")

        self.formLayout.setWidget(3, QFormLayout.FieldRole, self.lab4)


        self.retranslateUi(Form)
        self.btn_start.clicked["bool"].connect(Form.btn_start_click)
        self.btn_stop.clicked.connect(Form.btn_stop_click)

        QMetaObject.connectSlotsByName(Form)
    # setupUi

    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
        self.btn_start.setText(QCoreApplication.translate("Form", u"START", None))
        self.btn_stop.setText(QCoreApplication.translate("Form", u"STOP", None))
        self.lab1.setText(QCoreApplication.translate("Form", u"TextLabel", None))
        self.lab2.setText(QCoreApplication.translate("Form", u"TextLabel", None))
        self.lab3.setText(QCoreApplication.translate("Form", u"TextLabel", None))
        self.lab4.setText(QCoreApplication.translate("Form", u"TextLabel", None))
    # retranslateUi


class Ui(QWidget,Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.btn_fault = QPushButton("故障测试",self)
        self.btn_fault.setCheckable(True)
        self.btn_fault.move(100,200)
        self.btn_fault.clicked[bool].connect(self.btn_fault_click)

        self.bytes = bytearray(1)
        input = InPut()
        inout = InOut(0,1,2,self.bytes)
        self.motor = Motor(input,inout)
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.on_timer)
        self.timer.start(200)

    def on_timer(self):
        self.motor.checkState()

        tex1="主接触器启动" if self.motor.inout.main_out_state() else "主接触器停止"
        self.lab1.setText(tex1)

        tex2 = "星接触器启动" if self.motor.inout.star_out_state() else "星接触器停止"
        self.lab2.setText(tex2)

        tex3 = "三角接触器启动" if self.motor.inout.tran_out_state() else "三角接触器停止"
        self.lab3.setText(tex3)

        tex4 = "设备正常" if not self.motor.input.fault else "设备故障"
        self.lab4.setText(tex4)

        print(self.bytes)


    def btn_start_click(self):
        self.motor.input.start = True
        self.motor.input.stop = False
        self.motor.startStop()


    def btn_stop_click(self):
        self.motor.input.start = False
        self.motor.input.stop = True
        self.motor.startStop()




    def btn_fault_click(self,state):
        self.motor.input.fault=state
        print("fault",state)






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

    win = Ui()
    win.show()

    sys.exit(app.exec())





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1598069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电信网络如何异地共享文件?

电信异地共享文件是指在不同地区的电信网络下&#xff0c;通过使用特定技术实现文件的共享和传输。在传统的网络环境中&#xff0c;由于网络限制和复杂的网络设置&#xff0c;实现跨地区的文件共享是一个具有挑战性的任务。随着技术的不断进步&#xff0c;现在可以利用电信异地…

Spring Boot | SpringBoot对 “SpringMVC“的 “整合支持“、SpringMVC“功能拓展实现“

目录: SpringMVC 的 “整合支持” ( 引入"Web依赖启动器"&#xff0c;几乎可以在无任何额外的配置的情况下进行"Web开发")1.SpringMVC "自动配置" 介绍 ( 引入Web依赖启动器"后&#xff0c;SpringBoot会自动进行一些“自动配置”&#xff0…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《应用图论建模输电网的电力现货市场出清模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【cuda\cudnn安装教程】以及环境变量设置(以cuda11.8为例)

【cuda\cudnn安装教程】以cuda11.8为例 cuda11.8安装 安装的时候一切都是按默认安装就好&#xff0c;地址也是默认路径 cudnn安装 下载需要登陆&#xff0c;按要求注册就好 将cudnn压缩包中的内容复制到cuda的安装路径中&#xff0c;进行替换&#xff0c;如下图 验证cuda是否…

可视化报表Superset

文章目录 一、Superset入门与安装1、Superset概述2、安装Python环境2.1 安装Miniconda2.2 创建Python3.7环境 3、Superset部署3.1 安装Superset3.2 启动Supterset3.3 superset启停脚本 4、docker部署 二、Superset使用与实战1、对接MySQL数据源2、制作仪表盘与图表 一、Superse…

【Canvas与艺术】绘制斜置黄色三角biohazard标志

【关键点】 径向渐变色和文字按角度偏转。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用Html5/Canvas绘制…

2024蓝桥A组E题

成绩统计 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序难度等级 问题描述 题目有问题方差定义那加平方&#xff08;vi-v&#xff09; 格式输入 输入的第一行包含三个正整数n,k,T &#xff0c;相邻整数之间使用一个空格分隔。 第二行包含n个正整数…

使用go和消息队列优化投票功能

文章目录 1、优化方案与主要实现代码1.1、原系统的技术架构1.2、新系统的技术架构1.3、查看和投票接口实现1.4、数据入库MySQL协程实现1.5、路由配置1.6、启动程序入口实现 2、压测结果2.1、设置Jmeter线程组2.2、Jmeter聚合报告结果&#xff0c;支持11240/秒吞吐量2.3、Jmeter…

2022年电赛F题23年电赛D题-信号调制度测量装置说明中提到带通采样定律。

2022年电赛F题-信号调制度测量装置说明中提到带通采样定律。 23年电赛D题十分相似&#xff0c;但是22年载波达到了10M&#xff0c;根据奈奎斯特采样定理&#xff0c;我们知道想要分析出频谱不混叠的频谱图&#xff0c;采样率必须大于最大谐波的二倍。那么就意味着AD采样率要大…

2023年图灵奖揭晓,你怎么看?

Avi Wigderson——理论计算机科学的先锋&#xff0c;荣获2023年图灵奖 在科技界&#xff0c;图灵奖堪称与诺贝尔奖齐名的崇高荣誉&#xff0c;它每年授予对计算机行业的贡献达到重大突破的个人或团队。今年&#xff0c;这一声誉卓著的奖项被授予了普林斯顿大学的数学教授 Avi …

【攻防世界】lottery

弱比较代码审计 本题已提供源码&#xff0c;如果没提供&#xff0c;输入/robots.txt&#xff0c;发现/.git function buy($req){require_registered();require_min_money(2);$money $_SESSION[money];//接受用户原有money$numbers $req[numbers];//接受输入的数字$win_num…

面试八股——JVM★

类加载 类加载器的定义 类加载器的类别 类装载的执行过程 类的装载过程&#xff1a; 加载&#xff1a; 验证&#xff1a; 准备&#xff1a; 这里设置初始值并不是传统意义的设置初始值&#xff08;那个过程在初始化阶段&#xff09;。 解析&#xff1a; 初始化&#xff1a; …

树莓派安装Nginx服务结合内网穿透实现无公网IP远程访问

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

【BlueDroid】Android BLE 蓝牙开发入门

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【精讲蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#…

在线视频下载工具lux(原annie)安装及使用教程

安装教程 下载ffmpeg&#xff0c;参考这篇文章&#xff1a;Python——Windows下载ffmpeg由于博主的系统为windows&#xff0c;所以选择不安装lux&#xff0c;直接下载.exe文件&#xff0c;进入lux的github网站后&#xff0c;选择右侧的Releases&#xff0c;下载下图的windows …

Maven:<dependencyManagement>:依赖集中管理

dependencyManagement Maven &#xff1c;dependencyManagement&#xff1e;&#xff0c;请介绍一下 在Apache Maven构建工具中&#xff0c;<dependencyManagement> 是一个非常重要的元素&#xff0c;用于在一个项目或一组项目的顶级POM&#xff08;Project Object Model…

MapReduce原理简介

MapReduce 是一种用于处理大规模数据集的编程模型和计算框架&#xff0c;最初由 Google 提出&#xff0c;并被 Hadoop 等开源项目广泛应用。它主要包括两个阶段&#xff1a;Map 阶段和 Reduce 阶段。下面是 MapReduce 的基本原理&#xff1a; 图示不错 MapReduce 的基本原理&…

HarmonyOS4-网络连接-http请求数据

使用Axios发送请求&#xff1a; 详细资料来源于官方文档。

消息队列RabbitMQ入门学习

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.收发消息 2.1.1.交换机 2.1.2.队列 2.1.3.绑定关系 2.1.4.发送消息 3.SpringAMQP 3.1WorkQueues模型 3.1.1消息接收 3.1.2测试 3.1.3.能者多劳 3.1.3.总结 3.2.交换机类型 3.3.Fanout交…

Linux学习之路 -- 进程篇 -- PCB介绍 -- 进程的孤儿和僵尸状态

前面介绍了进程的各种状态&#xff0c;下面介绍比较特殊的两种状态 -- 孤儿和僵尸&#xff08;僵死&#xff09;。 一、僵尸状态 我们创建进程的目的其实就是想要进程帮我们执行一些任务&#xff0c;当任务被执行完后&#xff0c;进程的使命其实就已经完成了。此时我们就需要…