connect mysql.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import numpy as np
  2. from scipy.signal import hilbert
  3. from scipy.fft import ifft
  4. import plotly.graph_objs as go
  5. import pandas as pd
  6. import pymysql
  7. from sqlalchemy import create_engine, text
  8. import math
  9. # 与志亮的数据库连接
  10. #1、定义从235数据库中通过“windcode”风场编号和'ids'id号来查找波形数据记录
  11. def _get_by_id(windcode, ids):
  12. df_res = []
  13. engine = create_engine('mysql+pymysql://root:admin123456@192.168.50.235:30306/energy_data_prod')
  14. for id in ids:
  15. table_name = windcode + '_wave'
  16. lastday_df_sql = f"SELECT * FROM {table_name} where id = {id} "
  17. # print(lastday_df_sql)
  18. df = pd.read_sql(lastday_df_sql, engine)
  19. df_res.append(df)
  20. return df_res
  21. #2、找到波形记录提取特定的列值
  22. datas = _get_by_id('WOF091200030', [115041])
  23. datas = [df[['mesure_data','time_stamp','sampling_frequency', 'wind_turbine_number', 'rotational_speed', 'mesure_point_name']] for df in datas]
  24. data_filter = datas[0]
  25. rpm_Gen = data_filter['rotational_speed'].iloc[0]
  26. wind_code = data_filter['wind_turbine_number'].iloc[0]
  27. mesure_point_name = data_filter['mesure_point_name'].iloc[0]
  28. fs = int(data_filter['sampling_frequency'].iloc[0])
  29. print(wind_code)
  30. print(fs)
  31. print(rpm_Gen)
  32. #3、从测点名称中提取部件名称(计算特征频率的部件)
  33. str1 = mesure_point_name
  34. str2 = ["main_bearing", "front_main_bearing", "rear_main_bearing", "generator_non_drive_end"]
  35. for str in str2:
  36. if str in str1:
  37. parts = str
  38. if parts == "front_main_bearing":
  39. parts = "front_bearing"
  40. elif parts == "rear_main_bearing":
  41. parts = "rear_bearing"
  42. print(parts)
  43. #4、连接233的数据库'energy_show',从表'wind_engine_group'查找风机编号'engine_code'对应的机型编号'mill_type_code'
  44. engine_code = wind_code
  45. Engine2 = create_engine('mysql+pymysql://admin:admin123456@192.168.50.233:3306/energy_show')
  46. df_sql2 = f"SELECT * FROM {'wind_engine_group'} where engine_code = {'engine_code'} "
  47. df2 = pd.read_sql(df_sql2, Engine2)
  48. mill_type_code = df2['mill_type_code'].iloc[0]
  49. print(mill_type_code)
  50. #5、从表'unit_bearings'中通过机型编号'mill_type_code'查找部件'brand'、'model'的参数信息
  51. Engine3 = create_engine('mysql+pymysql://admin:admin123456@192.168.50.233:3306/energy_show')
  52. df_sql3 = f"SELECT * FROM {'unit_bearings'} where mill_type_code = {'mill_type_code'} "
  53. df3 = pd.read_sql(df_sql3, Engine3)
  54. brand = parts+'_brand' # parts代替'front_bearing'
  55. model = parts +'_model' # parts代替'front_bearing'
  56. print(brand)
  57. _brand = df3[brand].iloc[0]
  58. _model = df3[model].iloc[0]
  59. print(_brand)
  60. print(_model)
  61. #6、从表'unit_dict_brand_model'中通过'_brand'、'_model'查找部件的参数信息
  62. Engine4 = create_engine('mysql+pymysql://admin:admin123456@192.168.50.233:3306/energy_show')
  63. df_sql4 = f"SELECT * FROM unit_dict_brand_model where manufacture = %s AND model_number = %s"
  64. params = [(_brand, _model)]
  65. df4 = pd.read_sql(df_sql4, Engine4, params=params)
  66. if 'bearing' in parts:
  67. n_rolls = df4['rolls_number'].iloc[0]
  68. d_rolls = df4['rolls_diameter'].iloc[0]
  69. D_diameter = df4['circle_diameter'].iloc[0]
  70. theta_deg = df4['theta_deg'].iloc[0]
  71. print(n_rolls)
  72. print(d_rolls)
  73. print(D_diameter)
  74. print(theta_deg)
  75. def calculate_bearing_frequencies(n, d, D, theta_deg, rpm):
  76. """
  77. 计算轴承各部件特征频率
  78. 参数:
  79. n (int): 滚动体数量
  80. d (float): 滚动体直径(单位:mm)
  81. D (float): 轴承节圆直径(滚动体中心圆直径,单位:mm)
  82. theta_deg (float): 接触角(单位:度)
  83. rpm (float): 转速(转/分钟)
  84. 返回:
  85. dict: 包含各特征频率的字典(单位:Hz)
  86. """
  87. # 转换角度为弧度
  88. theta = math.radians(theta_deg)
  89. # 转换直径单位为米(保持单位一致性,实际计算中比值抵消单位影响)
  90. # 注意:由于公式中使用的是比值,单位可以保持mm不需要转换
  91. ratio = d / D
  92. # 基础频率计算(转/秒)
  93. f_r = rpm / 60.0
  94. # 计算各特征频率
  95. BPFI = n / 2 * (1 + ratio * math.cos(theta)) * f_r # 内圈故障频率
  96. BPFO = n / 2 * (1 - ratio * math.cos(theta)) * f_r # 外圈故障频率
  97. BSF = (D / (2 * d)) * (1 - (ratio ** 2) * (math.cos(theta) ** 2)) * f_r # 滚动体故障频率
  98. FTF = 0.5 * (1 - ratio * math.cos(theta)) * f_r # 保持架故障频率
  99. return {
  100. "BPFI": BPFI,
  101. "BPFO": BPFO,
  102. "BSF": BSF,
  103. "FTF": FTF
  104. }
  105. # 示例使用(6208深沟球轴承参数)
  106. if __name__ == "__main__":
  107. # 轴承参数
  108. n = n_rolls # 滚动体数量
  109. d = d_rolls # 滚动体直径(mm)
  110. D = D_diameter # 节圆直径(mm)
  111. theta_deg = theta_deg # 接触角(度)
  112. rpm = rpm_Gen # 转速
  113. frequencies = calculate_bearing_frequencies(n, d, D, theta_deg, rpm)
  114. print("轴承特征频率(Hz):")
  115. print(f"内圈故障频率 (BPFI): {frequencies['BPFI']:.2f} Hz")
  116. print(f"外圈故障频率 (BPFO): {frequencies['BPFO']:.2f} Hz")
  117. print(f"滚动体故障频率 (BSF): {frequencies['BSF']:.2f} Hz")
  118. print(f"保持架故障频率 (FTF): {frequencies['FTF']:.2f} Hz")
  119. """
  120. # 建立数据库连接
  121. connection = pymysql.connect(
  122. host='192.168.50.233', # 数据库地址
  123. user='admin', # 用户名
  124. password='admin123456', # 密码
  125. database='energy_show', # 数据库名
  126. port=3306, # 端口号(默认3306)
  127. charset='utf8mb4' # 字符编码
  128. )
  129. try:
  130. with connection.cursor() as cursor:
  131. # 编写 SQL 查询
  132. sql = "select\
  133. ub.mill_type_code,\
  134. ub.front_bearing_brand,\
  135. ub.front_bearing_model,\
  136. udbm.rolls_number,\
  137. udbm.rolls_diameter,\
  138. udbm.circle_diameter,\
  139. udbm.theta_deg,\
  140. rub.rear_bearing_brand,\
  141. rub.rear_bearing_model,\
  142. rub.rrollsNumber,\
  143. rub.rrollsDiameter,\
  144. rub.rcircleDiameter,\
  145. rub.thetaDeg\
  146. from\
  147. unit_bearings ub\
  148. inner join unit_dict_brand_model udbm\
  149. on ub.front_bearing_brand= udbm.manufacture and ub.front_bearing_model= udbm.model_number\
  150. inner join\
  151. (select\
  152. ub.mill_type_code,\
  153. ub.rear_bearing_brand,\
  154. ub.rear_bearing_model,\
  155. udbm.rolls_number as rrollsNumber,\
  156. udbm.rolls_diameter as rrollsDiameter,\
  157. udbm.circle_diameter as rcircleDiameter,\
  158. udbm.theta_deg as thetaDeg\
  159. from\
  160. unit_bearings ub\
  161. inner join unit_dict_brand_model udbm\
  162. on ub.rear_bearing_brand = udbm.manufacture and ub.rear_bearing_model= udbm.model_number\
  163. where\
  164. ub.mill_type_code = 'WEM00001') rub\
  165. on ub.mill_type_code = rub.mill_type_code\
  166. where\
  167. ub.mill_type_code = 'WEM00001'"
  168. cursor.execute(sql) # 参数化查询防止 SQL 注入
  169. # 读取数据
  170. # result = cursor.fetchone() # 获取单条数据
  171. result = cursor.fetchall() # 获取所有数据
  172. print(result)
  173. finally:
  174. connection.close() # 关闭数据库连接
  175. """