机床生产状态监测系统 (Python语言) - 实时监控、数据可视化和故障预警
机床生产状态监测系统 (Python语言)
需求
系统采用 BS 架构,具备以下功能:
- 机床管理: 数据在前端的增删改查可以反应到数据库里。
- 实时机床状态显示: 显示机床的实时温度、电流、震动等数据。
- 历史数据查询: 查询机床的历史监测数据。
- 数据可视化:
- 饼图: 例如:机床监测数据指标(温度,电流,震动)异常时间所占比例和正常时间所占比例。
- 折线图: 例如:机床的各个监测指标随时间的变化。
- 登录模块: 用户登录系统进行操作。
- 故障预警: 当监测数据超过一定阈值时,会发出报警。
数据库设计
由于题目中没有明确给出每张表的具体需求,以下是一个可能的表设计,仅供参考:
-
用户表 user
- id: 用户ID,主键
- username: 用户名
- password: 密码
- role: 用户角色(管理员或普通用户)
-
机床表 machine
- id: 机床ID,主键
- name: 机床名称
- type: 机床类型
- location: 机床位置
-
监测数据表 data
- id: 数据ID,主键
- machine_id: 机床ID,外键
- time: 监测时间
- temperature: 温度
- current: 电流
- vibration: 震动
-
报警记录表 alarm
- id: 报警ID,主键
- machine_id: 机床ID,外键
- time: 报警时间
- type: 报警类型(温度、电流或震动)
- value: 报警数值
-
日志表 log
- id: 日志ID,主键
- user_id: 用户ID,外键
- time: 操作时间
- operation: 操作内容
代码实现
# 导入相关模块
from flask import Flask, render_template, request, redirect, url_for
from flask_mysqldb import MySQL
import matplotlib.pyplot as plt
# 创建 Flask 应用
app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'machine_monitor'
mysql = MySQL(app)
# 登录页面
@app.route('/')
def login():
return render_template('login.html')
# 登录验证
@app.route('/submit_login', methods=['POST'])
def submit_login():
username = request.form['username']
password = request.form['password']
cur = mysql.connection.cursor()
cur.execute("SELECT id, role FROM user WHERE username=%s AND password=%s", (username, password))
user = cur.fetchone()
if user:
if user['role'] == 'admin':
return redirect(url_for('admin_home'))
else:
return redirect(url_for('user_home'))
else:
return redirect(url_for('login'))
# 管理员首页
@app.route('/admin_home')
def admin_home():
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM machine")
machines = cur.fetchall()
return render_template('admin_home.html', machines=machines)
# 添加机床页面
@app.route('/add_machine')
def add_machine():
return render_template('add_machine.html')
# 添加机床
@app.route('/submit_machine', methods=['POST'])
def submit_machine():
name = request.form['name']
type = request.form['type']
location = request.form['location']
cur = mysql.connection.cursor()
cur.execute("INSERT INTO machine (name, type, location) VALUES (%s, %s, %s)", (name, type, location))
mysql.connection.commit()
return redirect(url_for('admin_home'))
# 编辑机床页面
@app.route('/edit_machine/<int:machine_id>')
def edit_machine(machine_id):
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM machine WHERE id=%s", (machine_id,))
machine = cur.fetchone()
return render_template('edit_machine.html', machine=machine)
# 编辑机床
@app.route('/submit_edit_machine/<int:machine_id>', methods=['POST'])
def submit_edit_machine(machine_id):
name = request.form['name']
type = request.form['type']
location = request.form['location']
cur = mysql.connection.cursor()
cur.execute("UPDATE machine SET name=%s, type=%s, location=%s WHERE id=%s", (name, type, location, machine_id))
mysql.connection.commit()
return redirect(url_for('admin_home'))
# 删除机床
@app.route('/delete_machine/<int:machine_id>')
def delete_machine(machine_id):
cur = mysql.connection.cursor()
cur.execute("DELETE FROM machine WHERE id=%s", (machine_id,))
mysql.connection.commit()
return redirect(url_for('admin_home'))
# 用户首页
@app.route('/user_home')
def user_home():
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM machine")
machines = cur.fetchall()
return render_template('user_home.html', machines=machines)
# 实时监测页面
@app.route('/monitor/<int:machine_id>')
def monitor(machine_id):
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM machine WHERE id=%s", (machine_id,))
machine = cur.fetchone()
cur.execute("SELECT * FROM data WHERE machine_id=%s ORDER BY time DESC LIMIT 1", (machine_id,))
latest_data = cur.fetchone()
return render_template('monitor.html', machine=machine, latest_data=latest_data)
# 历史数据页面
@app.route('/data/<int:machine_id>')
def data(machine_id):
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM machine WHERE id=%s", (machine_id,))
machine = cur.fetchone()
cur.execute("SELECT * FROM data WHERE machine_id=%s ORDER BY time DESC", (machine_id,))
data = cur.fetchall()
return render_template('data.html', machine=machine, data=data)
# 饼图页面
@app.route('/pie_chart/<int:machine_id>')
def pie_chart(machine_id):
cur = mysql.connection.cursor()
cur.execute("SELECT COUNT(*) AS count FROM data WHERE machine_id=%s AND (temperature>50 OR current>10 OR vibration>5)", (machine_id,))
abnormal_count = cur.fetchone()['count']
cur.execute("SELECT COUNT(*) AS count FROM data WHERE machine_id=%s AND (temperature<=50 AND current<=10 AND vibration<=5)", (machine_id,))
normal_count = cur.fetchone()['count']
plt.pie([abnormal_count, normal_count], labels=['异常时间', '正常时间'])
plt.title('机床监测数据指标异常时间所占比例')
plt.savefig('static/pie_chart.png')
return render_template('pie_chart.html')
# 折线图页面
@app.route('/line_chart/<int:machine_id>')
def line_chart(machine_id):
cur = mysql.connection.cursor()
cur.execute("SELECT time, temperature, current, vibration FROM data WHERE machine_id=%s ORDER BY time", (machine_id,))
data = cur.fetchall()
time = [d['time'] for d in data]
temperature = [d['temperature'] for d in data]
current = [d['current'] for d in data]
vibration = [d['vibration'] for d in data]
plt.plot(time, temperature, label='温度')
plt.plot(time, current, label='电流')
plt.plot(time, vibration, label='震动')
plt.legend()
plt.title('机床监测数据指标随时间的变化')
plt.savefig('static/line_chart.png')
return render_template('line_chart.html')
if __name__ == '__main__':
app.run()
注意:
- 以上代码只是一个示例,实际实现中可能需要根据具体需求进行调整。
- 代码中的
static/pie_chart.png和static/line_chart.png文件路径需要根据实际情况进行修改。 - 系统中还需添加前端页面,具体内容可以根据实际需求进行设计。
- 为了方便测试,代码中使用了默认的用户名和密码,实际使用中需要进行修改。
- 代码中的阈值 50, 10, 5 是示例值,需要根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/nxOO 著作权归作者所有。请勿转载和采集!