基于Python的罗克韦尔语音报警系统设计与实现
2024-10-31江海涛
摘 要:随着现代工厂生产规模的不断扩大,操作岗位监控的HMI画面也越来越多。面对大量的操作终端,除正常生产操作外,操作人员对重点报警的及时了解与跟踪处理显得尤为重要。文章以实现罗克韦尔语音报警系统为出发点,基于Python开发环境,利用PySide2、Pylogix、win32com等第三方生态模块,旨在设计一套能根据罗克韦尔PLC实时标签值自动播放语音报警的智能系统。
关键词:Python;PySide2;Pylogix;win32com;罗克韦尔;语音报警
中图分类号:TP311 文献标识码:A 文章编号:2096-4706(2024)17-0169-05
0 引 言
在一个基于罗克韦尔的工业自动化控制系统中,传统的语音报警实现方式是在HMI系统上进行开发,当PLC变量值满足触发条件时,通过VBA脚本自动播放特定的声音文件,一条报警内容对应一个声音文件。
在工程应用实践后,作者发现这种方式存在以下弊端:
1)此方式基于HMI系统进行开发,为保证操作终端内容的一致性,相关终端均需同步实施。在后期使用中,如果要增、删、改配置,需要到各HMI操作终端中修改组态画面,工作量烦琐。
2)播放的声音文件需提前录制,并存放于计算机中。一旦要更改语音播放内容,需重新录制声音文件并替换,不够灵活。
3)系统长时间运行后,HMI通过VBA脚本播放声音文件会造成操作画面卡顿,不利于正常生产,关键时刻甚至存在安全隐患。
本文中,作者以解决上述弊端为出发点,利用主流编程语言Python及其第三方模块,实现一款灵活、友好、智能的罗克韦尔语音报警系统。
1 系统设计与开发
主要过程如下:
1)系统启动后,加载UI界面、读取Excel配置文件并将配置信息显示到UI界面。
2)检查系统配置是否正常,如IP数量与槽号数量是否一致、IP地址是否有效等。如果系统配置不正常则退出系统运行。
3)从本地磁盘读取历史报警记录文件并显示到前端UI界面。
4)定周期采集PLC变量值。如果有新的报警产生,则修改实时数据图中变量对应的当前值、背景色,语音播放报警内容,将报警信息显示到历史报警表格并保存到历史报警文件中。
5)如果系统配置不正常或人工点击“关闭”按钮,则系统退出。
6)人机接口程序根据信号、槽函数自动触发。
系统运行流程如图1所示。
1.1 系统配置表格设计
该表格用于保存系统配置信息,包括标签所在CPU的IP地址、CPU槽号、Tag地址及对应语音报警内容。系统配置如表1所示。
在后续使用中,如果要增加、减少、修改报警点或更改语音报警内容,只需修改本配置表格即可,程序无须改动,使得系统应用非常灵活、方便。
1.2 前端UI界面开发
基于PySide2模块开发前端UI界面,内容包括实时数据区、历史数据区、状态栏区、公共操作区,用于系统配置信息、实时及历史报警数据的可视化显示及人机操作。
系统运行后,实时数据界面及历史数据界面分别如图2、图3所示。
1)实时数据区。通过点击软件顶部“实时数据”按钮进行切换,用于显示本软件名称、开发作者、适用系统、Excel文件配置的Tag名称、报警内容、系统采集的当前值等信息。
2)历史数据区。通过点击软件顶部“历史数据”按钮进行切换,用于显示配置统计信息(CPU总数、Tag总数、报名总数)、报警查询窗口、显示全部按钮、清空报警按钮、历史报警信息(报警时间、报警IP、报警Tag、报警内容)。
3)状态栏区。位于软件底部左半部分,用于显示与软件相关的状态信息(如:配置是否异常、软件授权状态等)。
4)公共操作区。位于软件底部右半部分,包括:“声音测试”按钮,用于测试系统音频状态;“关于作者”按钮,点击后弹出作者信息窗口;“总在最前”复选框,用于选择本软件是否显示在桌面最前端。
1.3 报警记录生成
当新的语音报警产生时,报警总数加1,在历史报警表的最后生成一条新的记录,并同时与之前产生的历史报警合并成一个报警日志文件保存到电脑硬盘中。包含报警产生的日期、时间、CPU的IP、报警Tag、报警内容。后期可根据需要调用该历史记录进行筛选、查询。
2 系统配置表格解析及可视化显示
首先,基于第三方模块openpyxl读取Excel配置表格,获取系统配置信息;然后,进一步对配置内容进行解析和整合,如总共配置了多少套PLC、每套PLC的CPU IP地址、CPU槽号、Tag地址等;最后,将数据推送至前端UI界面中,关键实现代码如下:
# ------将读到的数据写到tablewidget------
def write_to_ui_tab1_tw(self):
# 设置TableWidget
# 设置列数
self.ui.tab1_tw.setColumnCount(3)
# 设置列数
self.ui.tab1_tw.horizontalHeader().setStyleSheet("::section{Background-color:rgb(255,228,225)}")
# 设置单元选中
self.ui.tab1_tw.setSelectionBehavior(QAbstractItemView.SelectItems)
# Tag名称
self.ui.tab1_tw.setHorizontalHeaderItem(0,QTableWidgetItem('Tag名称'))
# 报警内容
self.ui.tab1_tw.setHorizontalHeaderItem(1,QTableWidgetItem('报警内容'))
# 当前值
self.ui.tab1_tw.setHorizontalHeaderItem(2,QTableWidgetItem('当前值'))
# Tag名称
self.ui.tab1_tw.setColumnWidth(0,334)
# 报警内容
self.ui.tab1_tw.setColumnWidth(1,399)
# 当前值
self.ui.tab1_tw.setColumnWidth(2,65)
for i in range(len(self.excel_tag_address_list)):
self.ui.tab1_tw.insertRow(i)
# Tag名称
self.ui.tab1_tw.setItem(i,0,QTableWidgetItem(self.excel_tag_address_list[i]))
# 报警内容
self.ui.tab1_tw.setItem(i,1,QTableWidgetItem(self.excel_voice_alarm_content_list[i]))
# 当前值
self.ui.tab1_tw.setItem(i,2,QTableWidgetItem(' '))
3 PLC数据采集及语音报警实现
基于第三方模块pylogix,根据系统配置的CPU数量、槽号、IP地址,通过以太网,定周期从各PLC中读取标签数值,并判断是否满足语音报警触发条件。当标签值满足语音报警条件后,利用第三方模块win32com,调用系统API接口,播放标签对应的语音报警内容,播放三次后自动停止。如表1中标签BOOL[1]满足上升沿条件后,则会通过电脑音频播放“M1胶带机故障”。若同一个扫描周期有多个标签满足语音报警条件,则依次按序播放。
PLC数据采集及语音报警实现的关键代码为:
# ------读取PLC变量值------
def read_plc_job(self):
# 变量值列表
tag_read_content_list = []
try:
# 遍历IP列表
for index in range(len(self.excel_ip_list)):
with PLC() as com:
# IP
com.IPAddress = self.excel_ip_list[index]
# 槽号
com.ProcessorSlot = self.excel_slot_list[index]
# 批量读取单个PLC变量
tag_read_content_temp = com.Read(self.excel_per_cpu_tag_address_list[index])
# 将变量值存放在value_list列表中
tag_read_content_list += tag_read_content_temp
except:
pass
# ------判断标签上升沿并报警------
for index,item in enumerate(tag_read_content_list):
value = item.Value
value_item = self.tablewidgetitem(value)
# 更新前台表中value列的值
self.ui.tab1_tw.setItem(index,2,QTableWidgetItem(value_item))
if value == True and (self.tag_value_ons_list[index] == False):
# 报警时间
alarm_time = str(datetime.datetime.now())[:-7]
# 报警IP
alarm_ip = self.excel_ip_fill_list[index]
# 报警标签
alarm_tag = self.excel_tag_address_list[index]
# 报警内容
alarm_content = self.excel_voice_alarm_content_list[index]
# 报警信息推送到UI
insert_row_num = self.ui.tab2_tw.rowCount()
self.ui.tab2_tw.insertRow(insert_row_num)
# 报警时间
self.ui.tab2_tw.setItem(insert_row_num,0,QTableWidgetItem(alarm_time))
# 报警IP
self.ui.tab2_tw.setItem(insert_row_num,1,QTableWidgetItem(alarm_ip))
# 报警Tag
self.ui.tab2_tw.setItem(insert_row_num,2,QTableWidgetItem(alarm_tag))
# 报警内容
self.ui.tab2_tw.setItem(insert_row_num,3,QTableWidgetItem(alarm_content))
# 累计报警总数
self.alarm_num = self.ui.tab2_tw.rowCount()
self.tab2_alarm_num_signal.set_text.emit(self.ui.tab2_alarm_num,str(self.alarm_num))
# 保存历史报警到本地文件
# 将UI数据保存到csv文件中
self.download_job()
# 播放语音报警
self.speaker.Speak(self.excel_voice_alarm_content_list[index])
self.speaker.Speak(self.excel_voice_alarm_content_list[index])
self.speaker.Speak(self.excel_voice_alarm_content_list[index])
self.tag_value_ons_list[index] = value
4 UI接口程序实现
UI接口程序主要用于实现人机交互功能:
1)实时数据显示:将Excel表格中配置的Tag名称、报警内容、PLC当前值推送到前端UI界面。其中,当前值状态的定义如下。
标签值为0时,文本内容显示False,背景色为绿色,颜色代码#99CC33;
标签值为1时,文本内容显示True,背景色为浅红色,颜色代码#FF9999;
标签值读取错误(配置的CPU信息错误或标签地址错误等)时,文本内容显示None,背景色为黄色,颜色代码#FFFF00。
2)配置信息显示。程序启动之初,读取Excel配置文件,获取CPU总数、Tag总数,推送至配置信息表中;从历史报警文件中统计历史报警总数,推送至配置信息表中。
3)历史数据“报警查询”。获取“选择报警内容”下拉菜单的操作选项(下拉菜单选择Al3l或某一项报警内容),通过历史数据查询,将结果显示在历史报警表格中。
4)历史数据“显示全部”。获取“显示全部”按钮的操作信号,将系统产生的所有报警记录显示在下部的历史报警表格中。
5)历史数据“清空报警”。获取“清空报警”按钮的操作信号,清空历史报警表格内容及硬盘中的历史记录文件。
6)“声音测试”。获取“声音测试”按钮的操作信号,发出音频“声音测试”,用于测试主机声卡、扬声器等是否正常,音量大小是否合适。
7)“关于作者”。获取“关于作者”按钮的操作信号,弹出关于作者信息的UI界面,方便使用人员与作者进行技术沟通和交流。
8)“总在最前”。获取“总在最前”复选框的当前状态,用于控制该软件是否总是显示在桌面最前端。
5 结 论
由于本系统具有优秀的通用性及良好的扩展性,在罗克韦尔工程应用中仅通过修改Excel配置文件即可满足各种项目需求,大大节省了后期开发过程中的人工成本;同时,该系统独立于原有HMI系统,在开发、应用过程中不会对原有HMI产生影响,更可靠、更安全。
参考文献:
[1] 王维波,栗宝鹃,张晓东.Python Qt GUI与数据可视化编程 [M].北京:人民邮电出版社,2019:12-16.
[2] 韦斯·麦金尼.利用Python进行数据分析 [M].徐敬,译.北京:机械工业出版社,2018:168-184.
[3] 李庆辉.深入浅出Pandas:利用Python进行数据处理与分析 [M].北京:机械工业出版社,2021:89-105.
[4] 詹卡洛·扎克内. Python并行编程实战:第2版 [M].苏钰涵,译.北京:中国电力出版社,2020:33-37.
[5] 布拉德利.Python数据结构与算法分析:第3版 [M].吕能,刁寿钧,译.北京:人民邮电出版社,2023:91-103.
[6] 宋勇江,巩伟.RSView32利用VBA实现报警历史查询 [J].自动化技术与应用,2014,33(4):85-87+94.
[7] 张蕾,王婧博,李晓丹.基于S7-200 PLC的步进电机运动控制系统设计 [J].自动化技术与应用,2024,43(2):9-12.
[8] 王鹏.Pylogix与Rockwell系列PLC通信的研究 [J].自动化应用,s97STBw7wiwDIikkLzyftalIvIGOe+H6c/4Lk59Au7o=2024,65(1):44-46+49.
[9] 郭星涛,彭莲香.基于Python的电子像控点点之记程序设计与实现[J].工业控制计算机,2024,37(3):75-77.
[10] 蔡文乐,秦立静.基于Python爬虫的招聘数据可视化分析 [J].物联网技术,2024,14(1):102-105.
DOI:10.19850/j.cnki.2096-4706.2024.17.033
作者简介:江海涛(1983—),男,汉族,江苏南京人,电子信息工程师,本科,研究方向:钢铁行业自动化、数字化和智能化应用。
收稿日期:2024-03-29
Design and Implementation of Rockwell Voice Alarm System Based on Python
JIANG Haitao
(Baosight Software (Nanjing) Co., Ltd., Nanjing 210039, China)
Abstract: With the continuous expansion of modern factory production scale, the HMI screens for monitoring operation positions are also increasing. Faced with a large number of operating terminals, in addition to normal production operations, timely understanding and tracking processing of key alarms by operators is particularly important. Based on the Python development environment, this paper takes the implementation of the Rockwell voice alarm system as the starting point, and uses third-party ecological modules such as PySide2, Pylogix, and win32com, aiming to design an intelligent system that can automatically play voice alarms according to the real-time tag values of the Rockwell PLC.
Keywords: Python; PySide2; Pylogix; win32com; Rockwell; voice alarm