PYTHON在AB PLC报文截取中的应用

(整期优先)网络出版时间:2022-11-16
/ 2

PYTHON在AB PLC报文截取中的应用

邱彬

广州地铁运营四中心,广东广州,511365

摘要:本文从安全生产实际需求出发,针对广州地铁二十一号线BAS专业获取AB PLC报文数据的需求,利用PYTHON基于EtherNet/IP实时获取PLC 标签或寄存器状态并保存本地,达到故障处理时协助定位的目的。

关键词:环境与设备监控系统;Allen-Bradley;可编程逻辑控制器;PYTHON

0引言

PLC是一种专为在工业环境应用而设计的数字运算电子系统,它将计算机技术、自动控制技术和通讯技术融为一体,成为实现单机,车间,工厂自动化的核心设备,具有可靠性高,抗干扰能力强,组合灵活,编程简单,维修方便等优点。随着技术的进步,其控制功能由简单的逻辑控制,顺序控制发展为复杂的连续控制和过程控制,成为自动化领域的三大技术支柱[1-3]

1项目背景

1.1技术背景

广州地铁二十一号线环境与设备监控系统(以下简称BAS)使用Allen-Bradley(以下简称AB)1756-L71可编程逻辑控制器(以下简称PLC),PLC机架的以太网通信模块基于EtherNet/IP协议与综合监控进行通信。EtherNet/IP是由罗克韦尔自动化公司开发的工业应用层协议。图1给出了BAS网络系统架构。

1 BAS网络系统架构

1.2实际需求

广州地铁二十一号线曾发生综合监控日志记录设备控制指令已下发到BAS,但是BAS未执行的情况,由于综合监控仅记录指令是否下发,无法确认BAS是否已收,因此需要监控对应标签数值变化情况,检查是否实际收到指令。

通过编写PYTHON脚本,部署在BAS维修工作站,实时监视关键标签值的变化,并将变化情况记录在本地Excel文件中,故障后查询对应事件记录来确认执行情况。

1.3整体情况

脚本涉及二十一号线全线21个车站,每个车站一台工作站,根据每个站点表中标签的名字,进行查询记录。

2改造过程

程序编写底层与PLC通信使用Burt Peterson开发的pylogix包,该包基于socket开发,允许通过标签名对标签状态进行查询。图2给出了PLC标签列表。

C:\Users\qiubin1\AppData\Local\Temp\WeChat Files\e66276c35b3d19bd05ba7ce7c69ae86.jpg

2 PLC标签列表

使用Pycharm作为开发软件,使用PYTHON包主要有pylogix、PyQt5、openpyxl,pylogix负责与PLC交互,获取寄存器数值,PyQt5用于人机交互界面设计,openpyxl负责Excel数据交互,将查询到的数据存储在Excel文件中,方便存档和历史查询。图3给出了软件工作流程图。

3 软件工作流程图

关键程序代码:以记录扶梯故障代码为例

with PLC() as comm:
    comm.IPAddress = '192.168.1.103'
    while True:
        """本地文件处理"""
        if self.record:
            try:
                wb = load_workbook('E:\\扶梯故障代码记录.xlsx')
                ws = wb.active
            except:
                wb = Workbook('E:\\扶梯故障代码记录.xlsx')
                wb.save('E:\\扶梯故障代码记录.xlsx')
                wb = load_workbook('E:\\扶梯故障代码记录.xlsx')
                ws = wb.active
                ws.cell(1, 1).value = '日期'
                ws.cell(1, 2).value = '编号'
                ws.cell(1, 3).value = '故障代码'
            for escalator in escalators[self.comboBox.currentText()]:
                QApplication.processEvents()
                ret = comm.Read(escalator)
                if ret.Value != 0:
                    # print(ret.TagName, ret.Value)
row_xlsx = ws.max_row + 1
                    ws.cell(row_xlsx, 1).value = time.strftime('%Y-%m-%d %H:%M:%S')
                    ws.cell(row_xlsx, 2).value = ret.TagName


                    ws.cell(row_xlsx, 3).value = hex(ret.Value)[2:]
                    self.tableWidget_1.setRowCount(begin_row+1)
                    self.tableWidget_1.setItem(begin_row, 0,                                              QtWidgets.QTableWidgetItem(time.strftime('%Y-%m-%d %H:%M:%S')))
                    self.tableWidget_1.setItem(begin_row, 1,                                               QtWidgets.QTableWidgetItem(ret.TagName))
                    self.tableWidget_1.setItem(begin_row, 2,                                            QtWidgets.QTableWidgetItem(hex(ret.Value)[2:]))
            time.sleep(2)  # 时间间隔
wb.save('E:\\扶梯故障代码记录.xlsx')
        else:
            return

测试结果如图4所示。

4 测试记录图

3结束语

本文主要讨论PYTHON在AB PLC标签报文截取上的应用,基从安全生产实际需求出发,针对广州地铁二十一号线BAS专业获取AB PLC报文数据的需求,利用PYTHON基于EtherNet/IP实时获取PLC 标签或寄存器状态并保存本地,达到故障处理时协助定位的目的。

参考文献:

[1]王文.基于AB PLC的长输油气管道SCADA站控系统的实现[J].化工设计通讯,2022,48(07):19-21.

[2]海军,马见功,白海燕.AB PLCESSER火灾报警系统程序设计和应用[J].自动化技术与应用,2022,41(03):96-100.

[3]蒋磊.基于AB PLC的除尘控制系统设计[J].有色金属加工,2021,50(06):57-60.