我的焊接监控系统web开发之路(一)

2019-07-14 12:56发布

一.焊接监控系统web

1.1 功能概览

决定将现有的监控与质量分析系统web端做成如下架构,其中包括了系统概览,设备管理,工作站实时监控,故障诊断,历史查询以及报表分析等功能。为突出实时监控功能这一重点,没有将更高层级的人员,库存,物流管理等纳入进来,之后考虑调用焊接WPS(焊接工艺规程)数据库接口给焊接过程提供规范数值。

1.2 开发环境

win10 教育版Pycharm,Anaconda3(Pyhton 3.6) ,Flask 0.12.2数据库:SQL Server2014前端开源框架 AdminLTE  https://adminlte.io/

二. 数据库

2.1 焊接监控系统业务部分ER图


设计了如下数据表以实现监控系统的业务部分,包括了设备,工艺,焊接过程(生产统计),焊接参数,焊接质量等部分具体而言,焊接设备部分涉及了工作站和工件,工作站又包括了机器人和焊机,其状态和报警信息需要分别记录;工艺部分包括了焊接工件及其对应的焊接规范(从焊接标准中导出,为不同工件设定焊接规范数值上下界);焊接过程表将记录每一条焊道的工作站,工件及起始结束时间,而焊接过程参数记录表记录每一焊道具体的参数信息;焊接质量部分导入由焊接质量分析模型表中模型地址对应的模型文件,对参数实现评价并记录结果在质量预测表中。

2.2 具体的数据库表结构



三. 功能实现

3.1 参数监控实时显示

该功能通过AJAX轮询实现,使用了highcharts提供的画图插件。<script src="/static/scripts/highstock.js">script> <script src="/static/scripts/exporting.js">script>以电压采集为例后台:@app.route('/test/1/main/data2') def data2(): global tmp_time if tmp_time >0: sql = 'select SJ,DY from dbo.UPP3 where SJ>{0}'.format(tmp_time/1000)//查询数据库 else: sql = 'select SJ,DY from dbo.UPP3' cur.execute(sql) arr = [] n = 0 for i in cur.fetchall(): n += 1 if n % 1 == 0: sj_process = str(i[0]) timeArray = time.strptime(sj_process, "%Y%m%d%H%M%S")//这里的格式化是由于数据库中时间并不是时间戳,而highcharts需要时间戳 timestamp = time.mktime(timeArray) arr.append([timestamp * 1000, int(i[1])]) if len(arr)>0: tmp_time = arr[-1][0] return json.dumps(arr)//返回电压及对应的时间信息json包前端JS部分:
$(function () { // 使用当前时区,否则东八区会差八个小时 Highcharts.setOptions({ global: { useUTC: false } }); $.getJSON('/test/1/main/data2', function (data2) { // Create the chart $('#container2').highcharts('StockChart', { chart: { events: { load: function () { var series2 = this.series[0] setInterval(function () { $.getJSON('/test/1/main/data2', function (res) { $.each(res, function (a, b) { series2.addPoint(b) }) }) }, 1000) } } }, rangeSelector: { selected: 1 }, title: { text: '' }, series: [{ name: '电压', data2: data2, tooltip: { valueDecimals: 2 } }] }); }); });

3.2 历史记录查询

后台:import pandas as pd @app.route('/history') def show_history(): con = mssql.connect(host='DESKTOP-6C68JFJSQLEXPRESS', user='chenkai123', password='abcd123', database='ussb', timeout=2) con.autocommit(True) cur = con.cursor() sql = 'SELECT * FROM dbo.UPP3' cur.execute(sql) sbh =[] time = [] dl = [] dy= [] bj = [] for i in cur.fetchall(): sbh.append(i[1]) time.append(i[2]) dy.append(i[3]) dl.append(i[4]) bj.append('i[5]') df =pd.DataFrame(columns=['设备号','时间','电流','电压','报警信息']) df['设备号']= sbh df['时间']=time df['电压']=dy df['电流']=dl df['报警信息']=bj return render_template( 'index.html',df = df.to_html(classes='frame')//这里用到了pandas的to_html函数,可以将一个DataFrame对象直接封装起来。 )对应的html模板: Title

焊接历史

{{ df|safe }}
>

3.3 质量预测功能

质量预测这部分应用了机器学习训练得到的数个持久化模型,导入后可以对输入的参数进行焊穿,尺寸等预测分析。from flask import Flask,render_template,request def Width_Get(current,weldspeed): from sklearn.externals import joblib clf= joblib.load('E:\clf_I-v-w.model') width= clf.predict([current,weldspeed]) return width[0] def Width_Back_Get(width): if width > 4.654: width_back = 1.889 * width - 8.793 else: width_back = 0 return width_back def Height_Back_Get(width_back): if width_back>0.142: height_back = 0.3656 * width_back - 0.05193 else: height_back = 0 return height_back def Burnthrough(): import numpy as np import pandas as pd test = pd.read_excel('E:\160A170A\divided_train.xlsx') selected_features = ['Current_AVG', 'Voltage_AVG', 'EI_AVG'] X_test = test[selected_features] y_test = test['Result'] # Step2 Reuse Model from sklearn.externals import joblib RF = joblib.load('E:\rf-divided.model') predictions = RF.predict(X_test) # Step3 Decorate the Results return predictions @app.route('/predict',methods=['GET','POST']) #show the predicted results def predict(): #Step1 READ CURRENT AND WELDSPEED if request.method == 'POST': current = request.form['Setting_Current'] weldspeed = request.form['Weld_Speed'] #Step2 Burnthrough predictions = Burnthrough() #Step3 Calculation with model width = Width_Get(current,weldspeed) width_back = Width_Back_Get(width) height_back = Height_Back_Get(width_back) #Step4 Return the results return render_template( 'main.html', current = current, weldspeed = weldspeed, width = float('%.2f'% width), width_back = float('%.2f'% width_back), height_back = float('%.2f'% height_back), predictions = predictions )对应的HTML Weldingquality

2mm低碳钢薄板堆焊焊接质量监测


设定焊接电流(A):
设定焊接速度(mm/s):
{% if current %}

焊接参数:

  • 设定焊接电流: {{ current }}A
  • 设定焊接速度: {{ weldspeed }}mm/s

焊穿监测:

  • {{ predictions }}

2mm薄板堆焊焊道尺寸预测结果:

  • 正面熔宽:{{ width }}mm
  • 背面熔宽:{{ width_back }}mm
  • 背面余高:{{ height_back }}mm
{% endif %}

四.感想

整个项目仍然一点一点在完善,包括机器人的状态,报警信息采集获取等。在这个过程中,我从一个从未接触web开发的新人,逐渐熟悉了Python web开发流程,这包括了Flask框架,前端的部分,数据库,以及基于python pandas的数据处理,基于sklearn的机器学习建模方方面面。感谢过程中所有学习资源和开源代码的提供者。下面还要继续学习前端部分,完成界面优化;完成局域网的部署等。全部完成后可以再整理一下。