.NET 开源框架在工业生产中的应用

一、背景

       当前国家大力推行工业化与信息化融合,在此良好的环境下“两化融合”得到高速发展。

        过去十几年.NET技术在煤矿工业化进程中起到了重要作用,尤其是煤矿各类安全生产辅助系统几乎都是.NET产品,稳定运行十多年少出错,默默为煤矿安全发展保驾护航。不同于互联网产品,煤矿产品追求安全、稳定、少迭代、易用性和维护简单。当前liunx服务器的使用呈现爆炸势增长,煤矿也不例外。

       .NET Core框架具有高性能、跨平台、部署灵活、兼容性好和微软维护等特性。加上2014年开源至今,6年的时间里.NET Core各种优秀的开源框架不断补齐.NET在各种技术场景,生态不断完善。因此,选用.NET Core框架作业煤矿业务系统的开发,正好满足各类需求。

       2020年病毒肆虐的一年,也是信息化技术空前需要的一年。  这一年对于我们团队来说也是挑战的一年,接到了本专业的数据项目。带着兴奋与挑战,我们使用纯.NET技术成功研发了成套的AI数据分析产品,得到了各方的肯定、中国煤矿工业协会奖项和论文发表,为我们坚持.NET技术,坚定了信心。

二、客户需求

       XXX公司2018年采购了一套监控系统,监控作点的环境数据。探头数量500-700个左右。XXX公司要求每1分钟对数据进行采集、入库,提供日数据查询并生成曲线和1小时时序预测,部门产生的报表也需要上传。同时,根据行业标准,将部分探头数据配合上传的报表转化为标准数据,制作日、周、月报表和一周AI数据预测报告。系统产生的实时数据、历史数据和预测数据要求收集可以查看。

三、业务分析

      根据客户需求,我们处理系统的重点是:大量数据存储、数据转化ETL、实时、周期数据查询和AI数据分析。那么我们业务模型也就清晰了,业务流程如下图。     

       将大量的探头历史数据分库分表存到历史数据库中,报表数据存到业务系统数据中,根据探头历史数据和报表数据的关系ETL到数据仓库中。数据仓库根据数据分析需求通过sql生成分析数据集,利用.NET的AI分析库ML.NET和TensorFlow.NET提供算法进行AI预测,最后将AI预测结果写到业务系统的数据库中。

四、技术选型    

       1、xml文件处理

       原监控系统中有专门的数据交换软件,生成交换数据格式为xml。我们只需要根据对方提供的协议文档即可正确的解析数据。xml数据主要为2个文件,一个是设备基本信息称文件带时间戳(SBM202012291653.XML),一个是设备数据值文件带时间戳(SJZ202012291653.XML)。

       1)xml数据处理,我采用解析完就删除的策略。先扫描文件,按照文件头归类文件,先删除时间戳复制到另外一个文件夹,在根据时间戳先后写入,数据写完立即删除。

       2)备基本信息xml文件,由于备基本信息xml文件变化频率较低故采用覆盖式存储方式(表中永远是最新的数据)。

       3)设备数据值xml文件,则按照时序进行存储。

       2、历史数据存储

       数据量按照数据值文件来计算为60分钟*24小时*800个(比XXX公司给的探头数多出100个)= 1152000条数据,大概是一天115万条数据。我这里的采用的是日分表、月分库、年分文件夹的策略进行存储。选用新生团队开源的NewLife.XCode数据库中间件进行分库分表数据存储操作。NewLife.XCode同时支持Fx和Core,数据库支持支持 Oracle、SqlServer、MySql、SQLite等主流关系型数据库。我这里采用的是sqlite进行历史数据存储。将数据采集做成Windows服务,设置服务为自动启动和自动重启。传送门:XCode GitHub源码库。传送门2:XCode 使用教程博客。

       1)分库规则:DataBaseName_yyyyMM命名方式进行分库操作。

       2)分表规则:TableName_yyyyMMdd命名方式进行分表操作。

       3)设备数据值日表:按照当日实际采集的数据进行累加写入。

       4)设备基本信息日表:则按照最新的设备信息井下覆盖写入。

       5)设备数据值临时表:仅存放2-3天的探头值数据。

  

       3、业务、报表数据存储

       业务系统中含Excel数据采集,以及考虑读写分离,因此我们选用WTM框架进行构建业务系统。WTM框架,支持一键生成增删改查,导入导出,批量操作代码、支持分离(React+AntD,Vue+Element)和不分离(LayUI)两种模式、提供了用户,角色,用户组,菜单,日志等常用模块、支持读写分离和数据库分库。我们这里采用Sql server作为业务系统的主数据库。传送门3:WTM Github源码库。 传送门4:WTM使用文档。

       1)表设计尽量按照对方原有的Excel的样式进行模型设计,利用WTM的代码生成器自动生成CURD页面、带报错信息的Excel导入页面和导出,如果报表复杂,用WTM内置的Excel处理库进行处理。

       2)在appsettings.json的ConnectionStrings根据WTM的数据库配置规则,配置SQL server的读写分离。 传送门5:SQL server订阅分发配置。

       3)WTM提供的cookie和JWT混合身份认证机制,swagger等帮助大家快速开发。

       4、数据ETL

       我理解的ETL就是数据转化,根据业务的事情情况把别的表中的数据抽到数据仓中,然后按照一定的条件重新拼成一张新表。新表的特点就是相比之前的业务表,字段明显多了。例如以前的业务员表可能就只有一个部门的数据,经过ETL之后新的表中就按条件汇集了多了单位的数据,甚至部分数据的值也重新计算改变。这里ETL我采用了蚂蚁调度AntJob框架。AntJob .NET框架分布式任务调度系统。AntJob的核心是蚂蚁算法把任意大数据拆分成为小块,采用蚂蚁搬家策略计算每一块!纯.NET打造的重量级大数据实时计算平台。传送门6:AntJob Github源码库。 传送门7:AntJob 使用教程

      

image.png

         5、AI预测

        这里我分别选用了ML.NET、和TensorFlow.NET用于提供AI算法模型。 传送门8:ML.NET 使用教程。  传送门9:TensorFlow.NET Github源码库。 传送门10:TensorFlow.NET 使用教程。  我这里的AI计算场景是2种不同的数值预测,一种是对探头的数据进行时序预测,一种对多条件分析(多个条件为计算、分析某一列的数)。

        1)时序预测:这个很好理解,数据只有时间和值2个维度。这里探头值的大小如果在正常情况下受不同时间的作业情况影响。因此如果不是特殊的数据情况,前面设计的临时表用于存放2-3天的探头历史数据就起了作用了,利用时序算法对探头进行时序预测。不过这种算法,个人觉得准确度有点低。

        2)神经网络/多元回归:这2种算法都可以用于做值预测,具体用那种看测试的时候算法模型评估的均方根误差和拟合后的数据误差情况。一般是均方根误差越小越好,但是实际情况存在过拟合的现象。因此,模型做好后,用测试数据做一下实测数据和预测数据拟合,看2条曲线的总体走势和计算最大、最小和平均误差。选好算法之后,利用任务框架按照周期在凌晨以后进行离线计算。

       2.1)每次计算都重新评估模型,指标达标则使用该模型,不达标则重新计算。计算设置上限次数,如果计算次数达到上限则记录失败记录,利用人工干预调整模型。

       2.2)计算的结果直接写到业务系统数据库中,预测数据以二进制方式存储Json字符串。方便业务系统渲染展示数据预测结果。

       2.3)可以采用ML.NET AutoML进行自动算法调优或自动选择算法。

       2.4)提供数据集选择和自助上传预测环境数据集功能页面,用户可根据自身需求在线做AI计算。

      在2个多月的运行时间里,系统自动进行8次AI任务(每周一次),为30多个作业地点进行值预测,误差率在0.2~9.8%之间,满足客户需求。仅出现了2次较大的误差。这2次误差在系统提供的重算功能中,都是重算后满足了预测计算要求。

     

五、总结    

       本次系统研发,从数据采集、数据ETL、业务系统构建以及AI分析,.NET Core都有对应技术栈,供开发者使用,而且由于是约定大于配置,节省了十分多的学习时间,使用C#语言轻松进行开发。遇到业务问题,我们也在.NET的技术群中询问,一般都有热心的群友出来解决,实在难解决的大佬出来提供解决问题的思路或者帮忙debug,个人找到思路的归属感,最终完成这次系统的研发。目前,.NET Core已经可以运行在龙芯CPU,未来全国产化的进程正在一步步靠近。拥抱.NET投入国产化运营。

猜你喜欢

转载自blog.csdn.net/sxy_student/article/details/111924227
今日推荐