123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- import numpy as np
- from scipy.signal import hilbert
- from scipy.fft import ifft
- import plotly.graph_objs as go
- import pandas as pd
- import pymysql
- from sqlalchemy import create_engine, text
- import math
- # 与志亮的数据库连接
- #1、定义从235数据库中通过“windcode”风场编号和'ids'id号来查找波形数据记录
- def _get_by_id(windcode, ids):
- df_res = []
- engine = create_engine('mysql+pymysql://root:admin123456@192.168.50.235:30306/energy_data_prod')
- for id in ids:
- table_name = windcode + '_wave'
- lastday_df_sql = f"SELECT * FROM {table_name} where id = {id} "
- # print(lastday_df_sql)
- df = pd.read_sql(lastday_df_sql, engine)
- df_res.append(df)
- return df_res
- #2、找到波形记录提取特定的列值
- datas = _get_by_id('WOF091200030', [115041])
- datas = [df[['mesure_data','time_stamp','sampling_frequency', 'wind_turbine_number', 'rotational_speed', 'mesure_point_name']] for df in datas]
- data_filter = datas[0]
- rpm_Gen = data_filter['rotational_speed'].iloc[0]
- wind_code = data_filter['wind_turbine_number'].iloc[0]
- mesure_point_name = data_filter['mesure_point_name'].iloc[0]
- fs = int(data_filter['sampling_frequency'].iloc[0])
- print(wind_code)
- print(fs)
- print(rpm_Gen)
- #3、从测点名称中提取部件名称(计算特征频率的部件)
- str1 = mesure_point_name
- str2 = ["main_bearing", "front_main_bearing", "rear_main_bearing", "generator_non_drive_end"]
- for str in str2:
- if str in str1:
- parts = str
- if parts == "front_main_bearing":
- parts = "front_bearing"
- elif parts == "rear_main_bearing":
- parts = "rear_bearing"
- print(parts)
- #4、连接233的数据库'energy_show',从表'wind_engine_group'查找风机编号'engine_code'对应的机型编号'mill_type_code'
- engine_code = wind_code
- Engine2 = create_engine('mysql+pymysql://admin:admin123456@192.168.50.233:3306/energy_show')
- df_sql2 = f"SELECT * FROM {'wind_engine_group'} where engine_code = {'engine_code'} "
- df2 = pd.read_sql(df_sql2, Engine2)
- mill_type_code = df2['mill_type_code'].iloc[0]
- print(mill_type_code)
- #5、从表'unit_bearings'中通过机型编号'mill_type_code'查找部件'brand'、'model'的参数信息
- Engine3 = create_engine('mysql+pymysql://admin:admin123456@192.168.50.233:3306/energy_show')
- df_sql3 = f"SELECT * FROM {'unit_bearings'} where mill_type_code = {'mill_type_code'} "
- df3 = pd.read_sql(df_sql3, Engine3)
- brand = parts+'_brand' # parts代替'front_bearing'
- model = parts +'_model' # parts代替'front_bearing'
- print(brand)
- _brand = df3[brand].iloc[0]
- _model = df3[model].iloc[0]
- print(_brand)
- print(_model)
- #6、从表'unit_dict_brand_model'中通过'_brand'、'_model'查找部件的参数信息
- Engine4 = create_engine('mysql+pymysql://admin:admin123456@192.168.50.233:3306/energy_show')
- df_sql4 = f"SELECT * FROM unit_dict_brand_model where manufacture = %s AND model_number = %s"
- params = [(_brand, _model)]
- df4 = pd.read_sql(df_sql4, Engine4, params=params)
- if 'bearing' in parts:
- n_rolls = df4['rolls_number'].iloc[0]
- d_rolls = df4['rolls_diameter'].iloc[0]
- D_diameter = df4['circle_diameter'].iloc[0]
- theta_deg = df4['theta_deg'].iloc[0]
- print(n_rolls)
- print(d_rolls)
- print(D_diameter)
- print(theta_deg)
- def calculate_bearing_frequencies(n, d, D, theta_deg, rpm):
- """
- 计算轴承各部件特征频率
- 参数:
- n (int): 滚动体数量
- d (float): 滚动体直径(单位:mm)
- D (float): 轴承节圆直径(滚动体中心圆直径,单位:mm)
- theta_deg (float): 接触角(单位:度)
- rpm (float): 转速(转/分钟)
- 返回:
- dict: 包含各特征频率的字典(单位:Hz)
- """
- # 转换角度为弧度
- theta = math.radians(theta_deg)
- # 转换直径单位为米(保持单位一致性,实际计算中比值抵消单位影响)
- # 注意:由于公式中使用的是比值,单位可以保持mm不需要转换
- ratio = d / D
- # 基础频率计算(转/秒)
- f_r = rpm / 60.0
- # 计算各特征频率
- BPFI = n / 2 * (1 + ratio * math.cos(theta)) * f_r # 内圈故障频率
- BPFO = n / 2 * (1 - ratio * math.cos(theta)) * f_r # 外圈故障频率
- BSF = (D / (2 * d)) * (1 - (ratio ** 2) * (math.cos(theta) ** 2)) * f_r # 滚动体故障频率
- FTF = 0.5 * (1 - ratio * math.cos(theta)) * f_r # 保持架故障频率
- return {
- "BPFI": BPFI,
- "BPFO": BPFO,
- "BSF": BSF,
- "FTF": FTF
- }
- # 示例使用(6208深沟球轴承参数)
- if __name__ == "__main__":
- # 轴承参数
- n = n_rolls # 滚动体数量
- d = d_rolls # 滚动体直径(mm)
- D = D_diameter # 节圆直径(mm)
- theta_deg = theta_deg # 接触角(度)
- rpm = rpm_Gen # 转速
- frequencies = calculate_bearing_frequencies(n, d, D, theta_deg, rpm)
- print("轴承特征频率(Hz):")
- print(f"内圈故障频率 (BPFI): {frequencies['BPFI']:.2f} Hz")
- print(f"外圈故障频率 (BPFO): {frequencies['BPFO']:.2f} Hz")
- print(f"滚动体故障频率 (BSF): {frequencies['BSF']:.2f} Hz")
- print(f"保持架故障频率 (FTF): {frequencies['FTF']:.2f} Hz")
- """
- # 建立数据库连接
- connection = pymysql.connect(
- host='192.168.50.233', # 数据库地址
- user='admin', # 用户名
- password='admin123456', # 密码
- database='energy_show', # 数据库名
- port=3306, # 端口号(默认3306)
- charset='utf8mb4' # 字符编码
- )
- try:
- with connection.cursor() as cursor:
- # 编写 SQL 查询
- sql = "select\
- ub.mill_type_code,\
- ub.front_bearing_brand,\
- ub.front_bearing_model,\
- udbm.rolls_number,\
- udbm.rolls_diameter,\
- udbm.circle_diameter,\
- udbm.theta_deg,\
- rub.rear_bearing_brand,\
- rub.rear_bearing_model,\
- rub.rrollsNumber,\
- rub.rrollsDiameter,\
- rub.rcircleDiameter,\
- rub.thetaDeg\
- from\
- unit_bearings ub\
- inner join unit_dict_brand_model udbm\
- on ub.front_bearing_brand= udbm.manufacture and ub.front_bearing_model= udbm.model_number\
- inner join\
- (select\
- ub.mill_type_code,\
- ub.rear_bearing_brand,\
- ub.rear_bearing_model,\
- udbm.rolls_number as rrollsNumber,\
- udbm.rolls_diameter as rrollsDiameter,\
- udbm.circle_diameter as rcircleDiameter,\
- udbm.theta_deg as thetaDeg\
- from\
- unit_bearings ub\
- inner join unit_dict_brand_model udbm\
- on ub.rear_bearing_brand = udbm.manufacture and ub.rear_bearing_model= udbm.model_number\
- where\
- ub.mill_type_code = 'WEM00001') rub\
- on ub.mill_type_code = rub.mill_type_code\
- where\
- ub.mill_type_code = 'WEM00001'"
- cursor.execute(sql) # 参数化查询防止 SQL 注入
- # 读取数据
- # result = cursor.fetchone() # 获取单条数据
- result = cursor.fetchall() # 获取所有数据
- print(result)
- finally:
- connection.close() # 关闭数据库连接
- """
|