基于PyQt与S7-1200的交通灯系统 2020-11-18

基于PyQt与S7-1200的交通灯系统

制作一个交通灯上位机程序,可通过S7协议读取S7-1200 I Q寄存器内容。
PLC IO分配:
输入 启动按钮:I0.0
输出 南北红灯:Q0.0 东西红灯:Q0.3
南北黄灯:Q0.1 东西黄灯:Q0.4
南北绿灯:Q0.2 东西绿灯:Q0.5
基于PyQt与S7-1200的交通灯系统 2020-11-18_第1张图片

1.系统结构
系统结构图
上位机程序内容要求:
1.必要的文字与图片显示
2.可以对PLC ip地址进行设置
3.PLC通信状态显示
4.每个交通灯根据PLC Q寄存器状态改变颜色
5.程序打包成exe,能在其他电脑上安装使用。
2.实现方法
环境:Python3.6-32+PyQt5+Python-snap7
注意事项:要使用32位的python,还得添加snap7.lib文件。我是直接放到C:\Windows\System32就好了。下载地址和具体解决方法.

基于PyQt与S7-1200的交通灯系统 2020-11-18_第2张图片
使用qt designer 设计布局,添加元件,添加图片和文字。图片从资源里添加,不然程序打包会比较麻烦。【这里是qt designer工具 ,资源文件转py文件工具pyrcc ,ui布局转py文件工具 pyuic ,程序打包工具 pyinstaller的添加】.以及【如何使用资源文件】.
基于PyQt与S7-1200的交通灯系统 2020-11-18_第3张图片UI布局中字符输入、固定的图片和文字部分都是比较容易做的。而需要变化的交通灯可以用label来做,切StyleSheet里的图片就能改变颜色啦。还有一个方法是方法是用pixmap在label上画出对应的图片。
最难的点在于:
1.要不停的获取PLC数据停,要么通过定时器实现,要么再开一个线程,在线程内循环读取。
2。获得的PLC数据怎样和QT的信号、槽建立关系

我这里是新开了个新线程
'''
开一个新线程,用作将PLC数据通过自定义信号发送
'''

class Thread(QThread):
    #自定义信号
    led1_name = pyqtSignal(str)
    led1_contest = pyqtSignal(bool)
    led2_name = pyqtSignal(str)
    led2_contest = pyqtSignal(bool)
    led3_name = pyqtSignal(str)
    led3_contest = pyqtSignal(bool)
    led4_name = pyqtSignal(str)
    led4_contest = pyqtSignal(bool)
    led5_name = pyqtSignal(str)
    led5_contest = pyqtSignal(bool)
    led6_name = pyqtSignal(str)
    led6_contest = pyqtSignal(bool)

    led7_name = pyqtSignal(str)
    led7_contest = pyqtSignal(bool)

    led8_name = pyqtSignal(str)
    led8_contest = pyqtSignal(bool)

    button1_name = pyqtSignal(str)
    button1_contest = pyqtSignal(bool)


    def __init__(self):
        super(Thread,self).__init__()


    def run(self):

        myplc = PLC()
        while True:

            if (myplc.get_connected() == True):

                myplc.read_from_plc()
                    # 发送信号
                self.led1_name.emit('LED_1')
                self.led1_contest.emit(QB0[0])

                self.led2_name.emit('LED_2')
                self.led2_contest.emit(QB0[1])

                self.led3_name.emit('LED_3')
                self.led3_contest.emit(QB0[2])

                self.led4_name.emit('LED_4')
                self.led4_contest.emit(QB0[3])

                self.led5_name.emit('LED_5')
                self.led5_contest.emit(QB0[4])

                self.led6_name.emit('LED_6')
                self.led6_contest.emit(QB0[5])

                self.led7_name.emit('LED_7')
                self.led7_contest.emit(QB0[6])

                self.led8_name.emit('LED_8')
                self.led8_contest.emit(QB0[7])

                myplc.write_to_plc()


                print(MB0[0])
                myplc.disconnect()


            else:
                try:
                    IP = ui.lineEdit.text()
                    INFO=myplc.tongxin(IP)

                except:
                    myplc.disconnect()



                if INFO == '通信断开':

                    ui.label_16.setStyleSheet("color:red")
                else:
                    ui.label_16.setStyleSheet("color:green")

                ui.label_16.setText(INFO)

pyqtSignal()可以用来自定义信号,这里将每个灯都定义了一个名字和状态信号,把信号名字内容’LED_X’和状态内容QB0[X],发送emit。

self.myThread.led1_name.connect(self.huaShui)
self.myThread.led1_contest.connect(self.huaRED)

在UI类里,连接定义好的信号与槽。
槽函数’huaShui’定义了画哪个label。
槽函数’huaRed’定义了根据状态画亮红色还是暗红色。

至于如何通过Snap7读写PLC推荐看这篇文章.
文章中提到I区无法写的问题,只是当然的,I区仅作为物理输入的检测,无法通过上位机写操作。(仅在TIA博图里可以强制写)

3.效果演示
基于PyQt与S7-1200的交通灯系统 2020-11-18_第4张图片
基于PyQt与S7-1200的交通灯系统 2020-11-18_第5张图片
PLC里随便写了点程序,每个灯都能根据Q0.X状态改变。PLC地址不对,通信就会断开。

4.程序打包
记得资源.py也要一起打包,不然图片就没了。ICON可以用这个网站制作。基于PyQt与S7-1200的交通灯系统 2020-11-18_第6张图片
在别的电脑上用的时候记得也要为其添加snap7.dll。如果开发应用电脑和使用应用的分辨率不同,窗口可能大小不合适,需要注意。


-这里是我的邮箱:1147683785@qq.com


你可能感兴趣的:(上位机与PLC,python,pyqt5,pyqt)