Python pylogix系列文章目录
一、Python Pylogix 读写Rockwell AB PLC变量数据
二、Python pylogix 读写AB PLC常用方法实例
三、Python pylogix 对AB PLC进行数据采集的思路总结
四、Python PyQt5+pylogix制作上位操作画面与AB PLC进行数据交互
文章目录
Python PyQt5+pylogix制作上位操作画面与AB PLC进行数据交互
前言
Python PyQt5介绍
PyQt5是一个用于创建桌面应用程序的Python库,它可以让开发者使用Python语言来创建功能强大的图形用户界面(GUI)应用程序。PyQt5提供了丰富的功能和工具,使得开发者能够轻松地设计和开发各种类型的应用程序,包括窗口应用程序、工具栏应用程序、游戏和多媒体应用程序等。
Python Pylogix介绍
Pylogix是一个基于Python的库,它提供了一组用于与Rockwell PLC通信的API。它支持多种通信协议,包括Ethernet/IP和ControlLogix,因此可以与多种不同类型的Rockwell PLC进行通信。
Rockwell AB PLC实例
以下PLC程序逻辑为,按下启停按钮后变频器以设定频率及时间控制电动机正、反向往复运转,直至再次按下启停按钮,电动机停止运行。
本文将介绍使用Python PyQt5制作一个上位操作画面,基于pylogix通信API接口与AB PLC进行通信,实现对变频器启动\停止控制及运行数据展示等功能。
效果预览
PyQt5 上位画面制作
在PyQt5中,我们可以使用Qt Designer来设计界面。Qt Designer是一个可视化的界面设计工具,可以帮助我们快速创建界面。我们可以添加按钮、标签、输入框等控件,并设置它们的属性和布局。
操作画面布局
Top部分
用于PLC时间显示、画面标题、通信设置。
运行数据
实时显示Armorstart变频器运行时频率、电流、功率、电压、模式等数据。
状态
实时显示Armorstart变频器准备就绪、故障、跳闸、正反转等信号点状态。
操作
控制Armorstart变频器启动\停止,频率、正反转时间设置等操作。
操作记录
记录与PLC建立连接,控制Armorstart变频器的启停的记录等。
上位画面交互逻辑编写
在Qt Designer中将界面设计完成后,使用pyuic工具将.ui文件转换为.py文件。然后,我们可以在生成的.py文件中添加按钮、标签、输入框等控件逻辑代码,实现与PLC交互的具体功能。
添加程序入口
import sys
#程序入口,程序从此处启动PyQt设计的窗口
if __name__ =='__main__' :
app =QtWidgets.QApplication(sys.argv)
MainWindow=QtWidgets.QMainWindow() #创建窗口
ui=Ui_MainWindow() #创建PyQt设计的窗口
ui.setupUi(MainWindow) #初始化设置
MainWindow.show() #显示窗口
sys.exit(app.exec_()) #程序关闭时退出进程
通信设置逻辑
输入PLC通信IP地址后,点击连接按钮检测到通信正常,每500ms采集一次PLC时间、信号状态、运行数据等tag值,并在画面中刷新。
连接按钮映射
'-----------------------连接按钮设置-----------------------------------'
self.pushButton_3 = QtWidgets.QPushButton(self.groupBox_4)
self.pushButton_3.setGeometry(QtCore.QRect(120, 20, 60, 25))
self.pushButton_3.setStyleSheet("background-color: rgb(238, 238, 238);")
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_3.clicked.connect(self.connect_to_PLC)
连接按钮具体方法
数据采集在后台进行,避免主线程占用后,其他按钮无法正常操作
def connect_to_PLC(self):
IP = self.lineEdit_2.text()
self.refreshParaValue(IP)
if self.pushButton_3.text()=='连接':
self.thread1.is_on = True
self.thread1.IP = IP
self.lineEdit_2.setReadOnly(True)
self.pushButton_3.setText('断开连接')
self.printf("--" + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " 连接成功--")
print("--线程开启--")
self.thread1.start()
elif self.pushButton_3.text()=='断开连接':
self.thread1.is_on = False
self.pushButton_3.setText('连接')
self.lineEdit_2.setReadOnly(False)
self.clearAllStatus()
else:
msg_box = QMessageBox(QMessageBox.Information, "错误", "无效操作!")
msg_box.exec_()
后台采集数据线程配置
'-----------------------线程配置-----------------------------------'
self.thread1 = Thread1()
self.thread1.signal1.connect(self.printf)#连接至操作记录
self.thread1.signal2.connect(self.refreshVFDStatusValue)#连接至刷新PLC时间、信号状态、运行数据方法
线程逻辑
class Thread1(QThread):
signal1 = pyqtSignal(str)
signal2 = pyqtSignal(