作为一个工控专业的技术人员,编程只是份外的一个附属技能,不可能学得全面、系统和特别深入。所以怎样在付出最少的前提下解决一些实际问题,就很重要。原则上是用到哪学到哪,尽量不去碰一些高深的理论和功能,以免陷进去无法自拔,毕竟每天有大量的事情需要去做,精力有限。
scada软件是工控人经常需要用到的,我一直用的最多的是WINCC系列,不得不说西门子在功能和稳定性方面确实是顶尖的,唯一不爽的是价格,盗版的话心里又不舒服。所以最近关注和尝试了很多款免费和号称免费的scada软件,目前为止还没有找到一款合适的。有的是只有部分功能免费,有的是功能太简单,有的是稳定性太差,有的缺乏教程资料,所以萌生一个想法,能不能从零开始,边学边干,做一个自己够用的上位机?
从头开始,记录一下整个过程,但愿不会烂尾。(这一版最终还是烂尾了,不过在制作过程中还是积累了大量的宝贵经验)
一、功能规划:
1、多画面切换
2、用户管理
3、PLC通信和操作变量
4、使用QTdesigner作为主要的布局手段,建立简单的自定义库,拖放布置,尽量减少手写代码量
5、历史数据的存储和数据可视化呈现
6、报警功能
7、多媒体的连接和呈现
目前能想到的就这么多了。
二、话不多说,开干。
1、创建基础画面。
常驻的画面有两个,左侧和顶部,分别在QTdesigner里面创建并保存。顶部为W_t.ui,左侧存为W_0.ui。
顶部的
左侧的
建立一个Widget,每创建一个新的部件,都把部件扔进去,作为自己的库,以后用的时候直接ctrl拖动就是了。
2、编写代码,调用和显示画面。
#这个是主函数 import sys, time from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5 import uic, QtCore from ClockPulse import Clocker #自定义的周期脉冲函数,默认参数下周期为1s import logos #导入图像资源 timer_1s = Clocker() # 定义全局1s的周期定时器 timer_05s = Clocker(500) # 定义全局500ms的周期定时器 class UiObject(QObject): # 定义一个Object # 信号的定义必须在函数体之前,否则会报错以下内容: # 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect' # forms = [] # 窗口实体的列表,方便集中控制和管理 def __init__(self, parent=None): super(UiObject, self).__init__(parent) self.w_t = uic.loadUi('w_t.ui') #常驻的顶窗体 self. to_do_t(self.w_t) # 初始化 self.w_0 = uic.loadUi('w_0.ui') # 常驻的左窗体 self.to_do_0(self.w_0) # 初始化 def to_do_t(self, in_form): # 顶窗体初始化 in_form.setWindowFlags(Qt.FramelessWindowHint) # 关掉边框 in_form.move(0, 0) # 定位窗体在屏幕的位置 def to_do_0(self, in_form): # 左窗体初始化 in_form.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) # 关掉边框,始终最前 in_form.move(0, 0) # 定位窗体在屏幕的位置 if __name__ == '__main__': app = QApplication(sys.argv) ui = UiObject() # object的本地实体化 ui.w_0.show() # 显示窗体 ui.w_t.show() sys.exit(app.exec_()) 初步的框架已建立,运行效果如下:
用到的资源在这里:https://download.csdn.net/download/xulibo5828/87545279