刘 诗,李焕奇,李振新
(国网吉林供电公司,吉林 吉林 132011)
在地区电网调度的日常工作中,夜间需要收集地区内所辖发电厂和大用户前一日相关调度数据,并经一系列计算后制作调度日报表进行上报和发布。这些调度数据既包括发电厂发电量、厂用电量、上网电量、负荷率、厂用率等,又包括大用户用电量、自备电厂自发自用电量及水电厂的水文信息和地区间交换电量等信息。在传统调度工作中,这些用于制作调度日报表的数据都是发电厂或大用户监控值班人员通过电话报送给调度,调度员通过手工记录、整理与计算形成报表[1]。
近年来,随着调度自动化水平不断提高,已有大部分数据已实现自动采集到调度端[2-4],但由于设备老旧、资金不足等原因,仍有部分数据目前没有合理可行的方案来实现自动采集,只能通过调度电话等方式进行人工报送,并手动录入,使调度日报表不能实现完全自动生成等流程。为打通电网调度日报表全自动化的最后环节,本文通过微信(或i国网)报送固定格式键值对的方式,利用文字识别和机器人流程自动化技术开发了自动接收与整合程序,来实现完整调度日报表自动生成的流程。
自动接收与整合程序利用按键精灵2014制作,程序在安装微信(或i国网)PC版和WPS2019的Windows7或Windows10操作系统上调试。按键精灵是可以模拟鼠标和键盘动作的应用程序开发工具,通过编写脚本,能让开发的程序自动执行预定的动作完成功能,且能编译生成脱离开发环境运行的可执行文件[5]。使用按键精灵调用大漠插件,可以实现图片查找和文字识别;调用LazyOffice办公插件,可以实现对WPS表格的各种自动操作。微信(或i国网)PC版用于接收各发电厂和大用户发送来的信息。WPS表格用于存储接收的数据和设置信息。
本系统正常运行时屏幕局部效果如图1所示。左侧为PC版微信,右侧为自动接收与整合程序的运行界面。当微信中有新的信息时,在头像右上角会显示1个内含数字的红色圆圈,程序按给定秒数循环自动查找图片来发现这一信息,并通过OCR文字识别到该信息发送者,并遍历设置表中的用户数组逐一对比,判断信息的发出者是否为本系统特定用户。如果不是,便放过此信息;如果是,则通过一系列模拟鼠标键盘操作抓取这一信息,并将其按事先规定的字符分割后生成键值对。根据事先预定的一系列规则对信息格式及正确性进行逻辑验证。如未通过验证,则让微信自动回复令其重报;如果通过验证,则将该信息“值”进行编码加密,利用LazyOffice办公插件功能,将其存储在“数据文件.xlsx”特定单元格中。当设置中的所有用户当日全部发过信息并均正确接收后,程序自动将当日“数据文件.xlsx”转换成“传递文件.dat”。最后将“传递文件.dat”拷贝到U盘。
图1 系统运行情况
本系统在电脑硬盘中建有1个工作文件夹,文件夹名称须与设置中“工作目录”保持一致,文件夹中有3个文件,分别为设置文件.xlsx、数据文件.xlsx和传递文件.dat。设置文件中保存的是发电厂或大用户群名、编号和运行状态,其编号指定了所报数据在数据文件表中存放行的位置。数据文件用于存放各发电厂或大用户每日所报数据编码后的密文。传递文件是由完整的数据文件转换而成的用于在内外网电脑间传输数据的纯文本文件,是1个由二维数组转换而来的密文Json字符串[6-7]。系统还设置1个用来保存程序中断时各变量值的中断数据保存文件,以使监控程序再次启动时进程能够顺利接续。
本系统包含系统设置、自动监测与回复、启动微信PC版、数据集中读取、传递文件生成和传递文件拷入U盘等功能模块。其中,设置模块独占选项卡的“设置”页,其他5个功能模块设计在选项卡的“应用”页上,功能均可通过单选钮和启停按钮启动和停止,见图1右侧。自动监测与回复模块是本系统最主要的功能模块,用于实现电网调度数据随报随收和自动整合;启动微信PC版模块用于自动启动Windows版微信;数据集中读取模块用于实现数据的一次性全部读取,即当自动监测与回复模块异常导致数据随报随收进程中断或有遗漏时,可用其一次性将数据全部收集齐全;传递文件生成模块用于将收集齐全的数据文件转换成纯文本的传递文件;传递文件拷入U盘模块用于将传递文件自动拷贝到内网U盘中。
设置页面提供1个修改设置内容的交互界面,不但能对工作目录、日期变更点、监测频度、定时启动时间、U盘信息及用户群的存放区域等进行方便设置,还能对微信应用的安装路径以及是明文或密文存储与传递数据进行设置。设置内容保存在Config.W文件中,设置页面及设置内容如图2所示。
图2 系统设置页面及设置内容
按照设置文件中保存的发电厂或大用户名称,在微信应用里创建与之对应的微信群,并把调度报送数据的人全部设置为群员。原来每天报送习惯仍保留,但报送方式改为在微信群中发送信息。
发送信息的格式须分行排列,各行名称与数值间用冒号分隔;首行为日期,日期为8位数字,作为信息的标识;其他各行为报送数据键值对。如测试用户2022年8月18日电量为168 168 kWh,其在微信群中发送的信息应为
日期:20220818
电量:168168
又如测试电厂2022年9月28日发电:442 450 kWh;上网:338 976 kWh;最大:21 000 kW;最小:15 930 kW;负荷率:87.78%,其在微信群中发送的信息应为
日期:20220928
发电:442450
上网:338976
最大:21000
最小:15930
负荷率:87.78
在接收程序中,对日期标识进行多种容错格式设置,当无法识别时,会自动向该群回复信息,令其重新报送。
程序开始后首先读取中断数据保存文件上次中断时已报用户名称及中断时刻,判断当前距上次中断时的时长,如果已超过8 h,则清空数据文件,按新的一天重新开始,否则接着上次断点继续运行。若按新的一天重新开始,则须用脚本先启动微信(或i国网)应用使其正常运行,并调整运行窗口大小和位置,为信息的正常监测与接收做好准备,同时将随报随收程序运行窗口移动到屏幕右侧。
如图3所示,将新收信息群名识别、信息验证和密文编码与存储3个子程序顺序置于定时刷新的循环中,其刷新频率可以设置,默认为20 s刷新一次,直至全部读取完毕或人为终止才跳出循环。程序通过循环检查聊天列表区域新出现的红色圆圈图片,得到微信新接收的信息,再用大漠OCR[8-9]识别群名序号,进而判断出新收信息群名;若新收信息确为本系统用户群所发,则对最新新收信息进行验证,若通过格式和逻辑验证,则进行信息分割与解读,否则自动回复验证失败并令其重发。对新收信息进行加密后保存,再向“运行信息”窗口输出显示本次读取成功的数据和已成功读取的群名集合及尚未报送信息的群名集合。
图3 信息监测与接收流程
本模块的功能是在微信聊天列表区域发现新收信息,并识别发送该信息的群名编号,进而得知群名。具体实现方法是用循环等待图片出现命令查找屏幕上聊天列表区域中的红色圆圈图片,找到后用大漠OCR命令识别该群名编号,进而得知该信息是否为本系统用户所发。如果是本系统用户所发,则用大漠OCR命令识别所发信息的日期与目标日期进行对比,判断该信息是否为目标信息,如果对比成功,则将该信息用行分隔符进行分割后,再用键值对分隔符分割,得到该信息的全部有效键值对。
本模块的功能是在微信窗口的搜索栏中搜索发电厂或大用户群名,从而在对话窗口中得到该群的近期对话信息进行读取。模块先根据设置得到要读取数据的目标日期,再用大漠OCR命令识别信息的日期进行对比。若对比失败,程序会自动回复,使该群重新发送;如果信息日期与目标日期一致,程序则模拟鼠标双击对话窗口中最新的目标日期,全选到目标文本;然后模拟复制粘贴剪贴板内容,将目标文本赋值给1个变量,用行分隔符对其进行分割,再用键值对分隔符对分得的各行进行分割得到键值对,并将其“值”经编码函数运算进行加密,再将其写入由群编号确定行位置的数据文件中,并将该群名标记为数据已读取。
电网企业的信息外网和信息内网间相互隔离,为保证数据安全且不带病毒,本系统的数据传递采用KVM+企业内网U盘为载体,用纯文本密文传递文件为媒介的策略。对存储在信息外网电脑上的数据文件设置密码进行保护,并采用加密存储机制,且传递文件采用纯文本文件格式。
从设置文件中读取日期变更时间变量的值,并与当前日期运算生成编码密钥;用LazyOffice办公插件命令读取数据文件中传递数据区域并将其转换成二维数组;用事先做好的编码函数遍历该二维数组,并将其数值部分逐一转换为ASCII码后再与密钥运算生成新的编码[10];将其改写为Json字符串后写入传递文件;经传递文件拷入U盘模块自动将其拷贝到信息内网电脑。
在企业信息内网电脑上,首先从设置文件中读取日期变更时间变量的值,并与当前日期运算生成解码密钥;其次将传递文件内容赋值给字符串后进行分割得到二维数组;然后遍历该二维数组并将其数值部分与解码密钥逐一运算,将ASCII码转换回数字;最后用LazyOffice办公插件命令将解密后的二维数组写入数据文件数据表的数据区域完成解码。
本系统将地区电网调度传统方式改为用微信(或i国网)报送,并通过RPA程序自动随时接收与整合的方式,实现调度零散数据随报随收的全自动化。地区电网调度员每个夜班减少接听电话80多次,减少手工记录数据260余条,既减少了基层员工的工作量,又提高了数据的准确性和调度日报的制作效率。