autodiag_class.py 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130
  1. import numpy as np
  2. import pandas as pd
  3. from DiagnosisLib import DiagnosisLib
  4. from typing import List, Dict, Optional
  5. import json
  6. from sqlalchemy import create_engine, text
  7. import math
  8. class Auto_diag:
  9. def __init__(self, ids: List[int], wind_code: str, engine_code: str):
  10. """
  11. 初始化诊断类
  12. 参数:
  13. ids: 数据ID列表
  14. wind_code: 风场编号
  15. engine_code: 风机编号
  16. """
  17. self.ids = ids
  18. self.wind_code = wind_code
  19. self.engine_code = engine_code
  20. self.myDiagnosisLib = DiagnosisLib()
  21. self.diagnosis_results = [] # 存储所有诊断结果
  22. self.bearing_frequencies = {} # 存储特征频率
  23. self.teeth_count={} #存储齿数
  24. # 从数据库加载振动数据
  25. self.load_vibration_data()
  26. # 计算转速传动比
  27. self.calculate_speed_ratio()
  28. # 提取轴承参数、齿轮参数 计算特征频率
  29. self.Characteristic_Frequency()
  30. # 计算频谱
  31. self.calculate_spectrums()
  32. def load_vibration_data(self):
  33. """从数据库中获取振动加速度数据"""
  34. try:
  35. engine = create_engine('mysql+pymysql://root:admin123456@192.168.50.235:30306/energy_data_prod')
  36. #engine = create_engine('mysql+pymysql://root:admin123456@106.120.102.238:10336/energy_data_prod')
  37. with engine.connect() as conn:
  38. table_name = self.wind_code + '_wave'
  39. # 将所有id拼接到SQL语句中,一次性查询所有数据
  40. ids_str = ','.join(map(str, self.ids))
  41. sql = f"SELECT * FROM {table_name} WHERE id IN ({ids_str})"
  42. df = pd.read_sql(sql, conn)
  43. self.df_data = df
  44. # 提取公共参数
  45. self.fspd = self.df_data['rotational_speed'].astype(float).values # 转速
  46. self.fs_acc = self.df_data['sampling_frequency'].astype(float).values # 采样频率
  47. self.mesure_point_names = self.df_data['mesure_point_name'].values
  48. # 处理加速度数据
  49. self.Acc = []
  50. self.t_acc = []
  51. for i, row in self.df_data.iterrows():
  52. measure_data_str = row['mesure_data']
  53. try:
  54. measure_data_list = json.loads(measure_data_str)
  55. acc_data = np.array(measure_data_list, dtype=np.float32)
  56. except json.JSONDecodeError:
  57. stripped_str = measure_data_str.strip('[]')
  58. measure_data_list = [float(x.strip()) for x in stripped_str.split(',') if x.strip()]
  59. acc_data = np.array(measure_data_list, dtype=np.float32)
  60. self.Acc.append(acc_data)
  61. # 使用转换后的数值类型计算时间轴
  62. self.t_acc.append(np.arange(0, len(acc_data)/self.fs_acc[i], 1/self.fs_acc[i]))
  63. except Exception as e:
  64. raise Exception(f"Failed to load vibration data: {str(e)}")
  65. finally:
  66. engine.dispose()
  67. def calculate_spectrums(self):
  68. """计算各种频谱"""
  69. print("计算频谱")
  70. self.fAcc = []
  71. self.AccSpec = []
  72. self.VelSpec = []
  73. self.gE_10 = []
  74. self.fAcc_gE = []
  75. self.gESpec_10 = []
  76. if self.fs_acc[0] < 12800:
  77. print("当前采集频率不适合进行诊断分析")
  78. raise ValueError("当前采集频率不适合进行诊断分析")
  79. for i, acc in enumerate(self.Acc):
  80. # 获取当前 id 对应的采样频率
  81. fs_acc = self.fs_acc[i]
  82. fmax_acc =fs_acc/2.56
  83. print(fs_acc)
  84. print(acc)
  85. lowcut = 500 #最低值是固定的 /51.2
  86. highcut =fs_acc /2.56
  87. # 计算振动加速度频谱
  88. [f, spec] = self.myDiagnosisLib.Spectrum(acc, fs_acc)
  89. self.fAcc.append(f)
  90. self.AccSpec.append(spec)
  91. # 计算振动速度频谱
  92. fCut = 0.1
  93. vel_spec = self.myDiagnosisLib.FreqIntegration(spec, fmax_acc, fCut)
  94. self.VelSpec.append(vel_spec)
  95. # 计算加速度包络频谱
  96. order = 6
  97. acc_band = self.myDiagnosisLib.BandPassButter(acc, lowcut, highcut, fs_acc, order)
  98. fmax_gE_10 =1000
  99. DownSampleRate =int(fs_acc /2.56/fmax_gE_10 ) #降采样
  100. gE = self.myDiagnosisLib.EnvLopInTime(acc_band, DownSampleRate, Method="SKF")
  101. self.gE_10.append(gE)
  102. fs_gE_10 = 2.56 * fmax_gE_10
  103. [f, spec] = self.myDiagnosisLib.Spectrum(gE, fs_gE_10)
  104. self.fAcc_gE.append(f)
  105. self.gESpec_10.append(spec)
  106. def Unbalance_diag(self):
  107. """不平衡诊断"""
  108. print("不平衡诊断")
  109. status_codes = []
  110. for i in range(len(self.ids)):
  111. ShaftSpd = self.fspd[i]*self.speed_ratio
  112. if ShaftSpd ==0:
  113. status_codes.append(-1)
  114. continue
  115. try:
  116. fs_acc = self.fs_acc[i]
  117. fmax_vel = 1000
  118. # fmax_vel =max(1000,fs_acc/2.56)
  119. print('ShaftSpd',ShaftSpd)
  120. fTarget = ShaftSpd /60
  121. print('fTarget',fTarget)
  122. numHarmonics = 4
  123. fRange = 0.05
  124. fRangeMode = "Per"
  125. Detection = "RMS"
  126. print(self.VelSpec[i])
  127. try:
  128. Vel_RunningSpd_HM = self.myDiagnosisLib.FixedFreqFeature(
  129. self.VelSpec[i], fmax_vel, fTarget, fRange, fRangeMode, Detection, numHarmonics
  130. )
  131. except Exception as e:
  132. # print(f"计算 Vel_RunningSpd_HM 时出错: {e}")
  133. Vel_RunningSpd_HM = [0] * (numHarmonics + 1)
  134. print('Vel_RunningSpd_HM',Vel_RunningSpd_HM)
  135. Vel_alert_mmsRMS = 4 # 速度报警阈值
  136. Vel_danger_mmsRMS = 7 # 速度危险阈值
  137. defectType = 'Unbalance'
  138. try:
  139. detection, severity = self.myDiagnosisLib.RunningSpd_Fault_Diag(
  140. Vel_RunningSpd_HM, Vel_alert_mmsRMS, Vel_danger_mmsRMS, defectType
  141. )
  142. except Exception as e:
  143. detection =False
  144. severity =0
  145. print("severity",severity)
  146. if not detection:
  147. status_code = 0
  148. elif severity < 6:
  149. status_code = 1
  150. else:
  151. status_code = 2
  152. except Exception as e:
  153. status_code =0
  154. status_codes.append(status_code)
  155. print("status_code",status_code)
  156. # 返回结果和统计信息
  157. return {
  158. "type": "Unbalance",
  159. "results": status_codes,
  160. "statistics": {
  161. "max_status": max(status_codes),
  162. "count_0": status_codes.count(0),
  163. "count_1": status_codes.count(1),
  164. "count_2": status_codes.count(2)
  165. }
  166. }
  167. def Misalignment_diag(self):
  168. """不对中诊断"""
  169. status_codes = []
  170. print("不对中诊断")
  171. for i in range(len(self.ids)):
  172. ShaftSpd = self.fspd[i]*self.speed_ratio
  173. if ShaftSpd ==0:
  174. status_codes.append(-1)
  175. continue
  176. try:
  177. fs_acc = self.fs_acc[i]
  178. fmax_vel = 1000
  179. # fmax_vel =max(1000,fs_acc/2.56)
  180. fTarget = ShaftSpd /60
  181. numHarmonics = 4
  182. fRange = 0.05
  183. fRangeMode = "Per"
  184. Detection = "RMS"
  185. print('ShaftSpd',ShaftSpd)
  186. print('fTarget',fTarget)
  187. try:
  188. Vel_RunningSpd_HM = self.myDiagnosisLib.FixedFreqFeature(
  189. self.VelSpec[i], fmax_vel, fTarget, fRange, fRangeMode, Detection, numHarmonics
  190. )
  191. except Exception as e:
  192. # print(f"计算 Vel_RunningSpd_HM 时出错: {e}")
  193. Vel_RunningSpd_HM = [0] * (numHarmonics + 1)
  194. print('Vel_RunningSpd_HM',Vel_RunningSpd_HM)
  195. Vel_alert_mmsRMS = 4 # 速度报警阈值
  196. Vel_danger_mmsRMS = 7 # 速度危险阈值
  197. try:
  198. defectType = 'Misalignment'
  199. detection, severity = self.myDiagnosisLib.RunningSpd_Fault_Diag(
  200. Vel_RunningSpd_HM, Vel_alert_mmsRMS, Vel_danger_mmsRMS, defectType
  201. )
  202. except Exception as e:
  203. detection = False
  204. severity =0
  205. print('severity',severity)
  206. if not detection:
  207. status_code = 0
  208. elif severity < 6:
  209. status_code = 1
  210. else:
  211. status_code = 2
  212. except Exception as e:
  213. status_code =0
  214. status_codes.append(status_code)
  215. return {
  216. "type": "Misalignment",
  217. "results": status_codes,
  218. "statistics": {
  219. "max_status": max(status_codes),
  220. "count_0": status_codes.count(0),
  221. "count_1": status_codes.count(1),
  222. "count_2": status_codes.count(2)
  223. }
  224. }
  225. def Looseness_diag(self):
  226. """松动诊断"""
  227. status_codes = []
  228. print("松动诊断")
  229. for i in range(len(self.ids)):
  230. ShaftSpd = self.fspd[i]*self.speed_ratio
  231. if ShaftSpd ==0:
  232. status_codes.append(-1)
  233. continue
  234. try:
  235. fs_acc = self.fs_acc[i]
  236. fmax_vel = 1000
  237. # fmax_vel =max(1000,fs_acc/2.56)
  238. fTarget = ShaftSpd /60
  239. numHarmonics = 4
  240. fRange = 0.05
  241. fRangeMode = "Per"
  242. Detection = "RMS"
  243. print('ShaftSpd',ShaftSpd)
  244. print('fTarget',fTarget)
  245. try:
  246. Vel_RunningSpd_HM = self.myDiagnosisLib.FixedFreqFeature(
  247. self.VelSpec[i], fmax_vel, fTarget, fRange, fRangeMode, Detection, numHarmonics
  248. )
  249. except Exception as e:
  250. # print(f"计算 Vel_RunningSpd_HM 时出错: {e}")
  251. Vel_RunningSpd_HM = [0] * (numHarmonics + 1)
  252. print('Vel_RunningSpd_HM',Vel_RunningSpd_HM)
  253. Vel_alert_mmsRMS = 4 # 速度报警阈值
  254. Vel_danger_mmsRMS = 7 # 速度危险阈值
  255. try:
  256. defectType = 'Looseness'
  257. detection, severity = self.myDiagnosisLib.RunningSpd_Fault_Diag(
  258. Vel_RunningSpd_HM, Vel_alert_mmsRMS, Vel_danger_mmsRMS, defectType
  259. )
  260. except Exception as e:
  261. detection =False
  262. severity =0
  263. print('severity',severity)
  264. if not detection:
  265. status_code = 0
  266. elif severity < 6:
  267. status_code = 1
  268. else:
  269. status_code = 2
  270. except Exception as e:
  271. status_code =0
  272. status_codes.append(status_code)
  273. return {
  274. "type": "Looseness",
  275. "results": status_codes,
  276. "statistics": {
  277. "max_status": max(status_codes),
  278. "count_0": status_codes.count(0),
  279. "count_1": status_codes.count(1),
  280. "count_2": status_codes.count(2)
  281. }
  282. }
  283. def Bearing_diag(self):
  284. """轴承诊断"""
  285. print("轴承诊断")
  286. # Vel_RunningSpd_HM,生成转频的1X-5X的倍频值
  287. # VelSpec,振动速度频谱
  288. # fmax_vel,最大分析频率
  289. # fTarget,目标频率为转频
  290. Vel_alert_mmsRMS = 4 # 速度总值预警阈值 (mm/s 有效值)
  291. Vel_danger_mmsRMS = 7 # 速度总值报警阈值 (mm/s 有效值)
  292. gE_alert = 3 # 包络总值预警阈值(gE)
  293. gE_danger = 10 # 包络总值报警阈值(gE)
  294. results = {
  295. "BPFO": {"status_codes": []},
  296. "BPFI": {"status_codes": []},
  297. "BSF": {"status_codes": []},
  298. "FTF": {"status_codes": []}
  299. }
  300. # 获取第一个id的特征频率(所有id相同)
  301. id = self.ids[0]
  302. bearing_freq = self.bearing_frequencies.get(id, {})
  303. BPFO = bearing_freq.get("BPFO", 0)
  304. BPFI = bearing_freq.get("BPFI", 0)
  305. BSF = bearing_freq.get("BSF", 0)
  306. FTF = bearing_freq.get("FTF", 0)
  307. for i in range(len(self.ids)):
  308. ShaftSpd = self.fspd[i] * self.speed_ratio
  309. if ShaftSpd ==0:
  310. results["BPFO"]["status_codes"].append(-1)
  311. results["BPFI"]["status_codes"].append(-1)
  312. results["BSF"]["status_codes"].append(-1)
  313. results["FTF"]["status_codes"].append(-1)
  314. continue
  315. fs_acc = self.fs_acc[i]
  316. # fmax_vel =1000
  317. #fmax_vel如果直接取1000 还是会出现目标范围落不到搜寻范围的现象
  318. fmax_vel = max(1000,fs_acc/2.56)
  319. fRange = 0.05
  320. fmax_gE_10 = 1000
  321. try:
  322. """外圈故障诊断"""
  323. print("外圈")
  324. fbr_BPFO = BPFO
  325. fTarget = fbr_BPFO #在计算轴承特征频率的函数中已经乘过转速
  326. if self.wind_code == 'WOF091200030':
  327. if fTarget >100:
  328. fmax_gE_10 =10000
  329. elif fTarget <1:
  330. fmax_gE_10 =10
  331. fmax_vel=min(1000,fs_acc/2.56)
  332. else:
  333. fmax_gE_10 =1000
  334. else:
  335. if fTarget >100:
  336. fmax_gE_10 =10000
  337. elif fTarget <10:
  338. fmax_gE_10 =100
  339. fmax_vel=min(1000,fs_acc/2.56)
  340. else:
  341. fmax_gE_10 =1000
  342. numHarmonics = 4
  343. fRangeMode = "Per"
  344. Detection = "RMS"
  345. print('BPFO',BPFO)
  346. print('ShaftSpd',ShaftSpd)
  347. print('speed_ratio',self.speed_ratio)
  348. print('fTarget',fTarget)
  349. print('VelSpec',self.VelSpec[i])
  350. print('gESpec_10',self.gESpec_10[i])
  351. try:
  352. Vel_RunningSpd_HM = self.myDiagnosisLib.FixedFreqFeature(self.VelSpec[i], fmax_vel, fTarget, fRange, \
  353. fRangeMode, Detection, numHarmonics)
  354. except Exception as e:
  355. # print(f"计算 Vel_RunningSpd_HM 时出错: {e}")
  356. Vel_RunningSpd_HM = [0] * (numHarmonics + 1)
  357. print('Vel_RunningSpd_HM\n',Vel_RunningSpd_HM)
  358. # 速度频谱特征
  359. try:
  360. Vel_Bearing_Defect_HM = self.myDiagnosisLib.FixedFreqFeature(
  361. self.VelSpec[i], fmax_vel, fTarget, fRange, fRangeMode, Detection, numHarmonics
  362. )
  363. except Exception as e:
  364. #print(f"计算 Vel_Bearing_Defect_HM 时出错: {e}")
  365. Vel_Bearing_Defect_HM = [0] * (numHarmonics + 1)
  366. print('Vel_Bearing_Defect_HM\n',Vel_Bearing_Defect_HM)
  367. try:
  368. # 包络频谱特征
  369. Detection = "Peak"
  370. gE_Bearing_Defect_HM = self.myDiagnosisLib.FixedFreqFeature(
  371. self.gESpec_10[i], fmax_gE_10, fTarget, fRange, fRangeMode, Detection, numHarmonics
  372. )
  373. except Exception as e:
  374. #print(f"计算 gE_Bearing_Defect_HM 时出错: {e}")
  375. gE_Bearing_Defect_HM = [0] * (numHarmonics + 1)
  376. print('gE_Bearing_Defect_HM\n',gE_Bearing_Defect_HM)
  377. try:
  378. # 诊断外圈故障
  379. BPFOdetection, BPFOseverity = self.myDiagnosisLib.Bearing_Fault_Diag(
  380. gE_Bearing_Defect_HM, Vel_Bearing_Defect_HM, Vel_RunningSpd_HM, gE_alert, gE_danger,
  381. Vel_alert_mmsRMS, Vel_danger_mmsRMS, 'BPFO'
  382. )
  383. except Exception as e:
  384. BPFOdetection = False
  385. BPFOseverity = 0
  386. print("BPFOseverity",BPFOseverity)
  387. if not BPFOdetection:
  388. BPFOStatusCode = 0
  389. elif BPFOseverity < 6:
  390. BPFOStatusCode = 1
  391. else:
  392. BPFOStatusCode = 2
  393. except Exception as e:
  394. BPFOStatusCode = 0
  395. results["BPFO"]["status_codes"].append(BPFOStatusCode)
  396. try:
  397. """内圈故障诊断"""
  398. print("内圈")
  399. fbr_BPFI = BPFI
  400. #fbr_BPFI = ShaftSpd * BPFI
  401. fTarget = fbr_BPFI
  402. if self.wind_code == 'WOF091200030':
  403. if fTarget >100:
  404. fmax_gE_10 =10000
  405. elif fTarget <1:
  406. fmax_gE_10 =10
  407. fmax_vel=min(1000,fs_acc/2.56)
  408. else:
  409. fmax_gE_10 =1000
  410. else:
  411. if fTarget >100:
  412. fmax_gE_10 =10000
  413. elif fTarget <10:
  414. fmax_gE_10 =100
  415. fmax_vel=min(1000,fs_acc/2.56)
  416. else:
  417. fmax_gE_10 =1000
  418. numHarmonics = 4
  419. fRangeMode = "Per"
  420. Detection = "RMS"
  421. print('BPFI',BPFI)
  422. print('ShaftSpd',ShaftSpd)
  423. print('fTarget',fTarget)
  424. try:
  425. Vel_RunningSpd_HM = self.myDiagnosisLib.FixedFreqFeature(self.VelSpec[i], fmax_vel, fTarget, fRange, \
  426. fRangeMode, Detection, numHarmonics)
  427. except Exception as e:
  428. #print(f"计算 Vel_RunningSpd_HM 时出错: {e}")
  429. Vel_RunningSpd_HM = [0] * (numHarmonics + 1)
  430. print('Vel_RunningSpd_HM\n',Vel_RunningSpd_HM)
  431. # 速度频谱特征
  432. try:
  433. Vel_Bearing_Defect_HM = self.myDiagnosisLib.FixedFreqFeature(
  434. self.VelSpec[i], fmax_vel, fTarget, fRange, fRangeMode, Detection, numHarmonics
  435. )
  436. except Exception as e:
  437. # print(f"计算 Vel_Bearing_Defect_HM 时出错: {e}")
  438. Vel_Bearing_Defect_HM = [0] * (numHarmonics + 1)
  439. print('Vel_Bearing_Defect_HM\n',Vel_Bearing_Defect_HM)
  440. # 包络频谱特征
  441. try:
  442. Detection = "Peak"
  443. gE_Bearing_Defect_HM = self.myDiagnosisLib.FixedFreqFeature(
  444. self.gESpec_10[i], fmax_gE_10, fTarget, fRange, fRangeMode, Detection, numHarmonics
  445. )
  446. except Exception as e:
  447. #print(f"计算 gE_Bearing_Defect_HM 时出错: {e}")
  448. gE_Bearing_Defect_HM = [0] * (numHarmonics + 1)
  449. print('gE_Bearing_Defect_HM\n',gE_Bearing_Defect_HM)
  450. try:
  451. # 诊断内圈故障
  452. BPFIdetection, BPFIseverity = self.myDiagnosisLib.Bearing_Fault_Diag(
  453. gE_Bearing_Defect_HM, Vel_Bearing_Defect_HM, Vel_RunningSpd_HM, gE_alert, gE_danger,
  454. Vel_alert_mmsRMS, Vel_danger_mmsRMS, 'BPFI'
  455. )
  456. except Exception as e:
  457. BPFIdetection =False
  458. BPFIseverity =0
  459. if not BPFIdetection:
  460. BPFIStatusCode = 0
  461. elif BPFIseverity < 6:
  462. BPFIStatusCode = 1
  463. else:
  464. BPFIStatusCode = 2
  465. except Exception as e:
  466. #print(f"处理内圈故障时发生未捕获的异常: {e}")
  467. BPFIStatusCode = 0
  468. results["BPFI"]["status_codes"].append(BPFIStatusCode)
  469. try:
  470. """滚动体故障诊断"""
  471. print("滚动体")
  472. fbr_BSF = BSF
  473. if self.wind_code == 'WOF091200030':
  474. if fTarget >100:
  475. fmax_gE_10 =10000
  476. elif fTarget <1:
  477. fmax_gE_10 =10
  478. fmax_vel=min(1000,fs_acc/2.56)
  479. else:
  480. fmax_gE_10 =1000
  481. else:
  482. if fTarget >100:
  483. fmax_gE_10 =10000
  484. elif fTarget <10:
  485. fmax_gE_10 =100
  486. fmax_vel=min(1000,fs_acc/2.56)
  487. else:
  488. fmax_gE_10 =1000
  489. numHarmonics = 4
  490. fTarget = fbr_BSF
  491. fRangeMode = "Per"
  492. Detection = "RMS"
  493. print('BSF',BSF)
  494. print('ShaftSpd',ShaftSpd)
  495. print('fTarget',fTarget)
  496. try:
  497. Vel_RunningSpd_HM = self.myDiagnosisLib.FixedFreqFeature(self.VelSpec[i], fmax_vel, fTarget, fRange, \
  498. fRangeMode, Detection, numHarmonics)
  499. except Exception as e:
  500. # print(f"计算 Vel_RunningSpd_HM 时出错: {e}")
  501. Vel_RunningSpd_HM = [0] * (numHarmonics + 1)
  502. print('Vel_RunningSpd_HM\n',Vel_RunningSpd_HM)
  503. try:
  504. # 速度频谱特征
  505. Vel_Bearing_Defect_HM = self.myDiagnosisLib.FixedFreqFeature(
  506. self.VelSpec[i], fmax_vel, fTarget, fRange, fRangeMode, Detection, numHarmonics
  507. )
  508. except Exception as e:
  509. #print(f"计算 Vel_Bearing_Defect_HM 时出错: {e}")
  510. Vel_Bearing_Defect_HM = [0] * (numHarmonics + 1)
  511. print('Vel_Bearing_Defect_HM\n',Vel_Bearing_Defect_HM)
  512. try:
  513. # 包络频谱特征S
  514. Detection = "Peak"
  515. gE_Bearing_Defect_HM = self.myDiagnosisLib.FixedFreqFeature(
  516. self.gESpec_10[i], fmax_gE_10, fTarget, fRange, fRangeMode, Detection, numHarmonics
  517. )
  518. except Exception as e:
  519. #print(f"计算 gE_Bearing_Defect_HM 时出错: {e}")
  520. gE_Bearing_Defect_HM = [0] * (numHarmonics + 1)
  521. print('gE_Bearing_Defect_HM\n',gE_Bearing_Defect_HM)
  522. try:
  523. # 诊断滚动体故障
  524. BSFdetection, BSFseverity = self.myDiagnosisLib.Bearing_Fault_Diag(
  525. gE_Bearing_Defect_HM, Vel_Bearing_Defect_HM, Vel_RunningSpd_HM, gE_alert, gE_danger,
  526. Vel_alert_mmsRMS, Vel_danger_mmsRMS, 'BSF'
  527. )
  528. except Exception as e:
  529. BSFdetection=False
  530. BSFseverity=0
  531. if not BSFdetection:
  532. BSFStatusCode = 0
  533. elif BSFseverity < 6:
  534. BSFStatusCode = 1
  535. else:
  536. BSFStatusCode = 2
  537. except Exception as e:
  538. #print(f"处理滚动体故障时发生未捕获的异常: {e}")
  539. BSFStatusCode = 0
  540. results["BSF"]["status_codes"].append(BSFStatusCode)
  541. try:
  542. """保持架故障诊断"""
  543. print("保持架")
  544. fbr_FTF = FTF
  545. fTarget = fbr_FTF
  546. if self.wind_code == 'WOF091200030':
  547. if fTarget >100:
  548. fmax_gE_10 =10000
  549. elif fTarget <1:
  550. fmax_gE_10 =10
  551. fmax_vel=min(1000,fs_acc/2.56)
  552. else:
  553. fmax_gE_10 =1000
  554. else:
  555. if fTarget >100:
  556. fmax_gE_10 =10000
  557. # elif fTarget <1:
  558. # fmax_gE_10 =0.001
  559. # fmax_vel=min(1000,fs_acc/2.56)
  560. elif fTarget <10:
  561. fmax_gE_10 =10
  562. fmax_vel=min(1000,fs_acc/2.56)
  563. else:
  564. fmax_gE_10 =1000
  565. numHarmonics = 4
  566. fRangeMode = "Per"
  567. Detection = "RMS"
  568. print('FTF',FTF)
  569. print('ShaftSpd',ShaftSpd)
  570. print('fTarget',fTarget)
  571. try:
  572. Vel_RunningSpd_HM = self.myDiagnosisLib.FixedFreqFeature(self.VelSpec[i], fmax_vel, fTarget, fRange, \
  573. fRangeMode, Detection, numHarmonics)
  574. except Exception as e:
  575. #print(f"计算 Vel_RunningSpd_HM 时出错: {e}")
  576. Vel_RunningSpd_HM = [0] * (numHarmonics + 1)
  577. print('Vel_RunningSpd_HM\n',Vel_RunningSpd_HM)
  578. try:
  579. # 速度频谱特征
  580. Vel_Bearing_Defect_HM = self.myDiagnosisLib.FixedFreqFeature(
  581. self.VelSpec[i], fmax_vel, fTarget, fRange, fRangeMode, Detection, numHarmonics
  582. )
  583. except Exception as e:
  584. #print(f"计算 Vel_Bearing_Defect_HM 时出错: {e}")
  585. Vel_Bearing_Defect_HM = [0] * (numHarmonics + 1)
  586. print('Vel_Bearing_Defect_HM\n',Vel_Bearing_Defect_HM)
  587. try:
  588. # 包络频谱特征
  589. Detection = "Peak"
  590. gE_Bearing_Defect_HM = self.myDiagnosisLib.FixedFreqFeature(
  591. self.gESpec_10[i], fmax_gE_10, fTarget, fRange, fRangeMode, Detection, numHarmonics
  592. )
  593. except Exception as e:
  594. #print(f"计算 gE_Bearing_Defect_HM 时出错: {e}")
  595. gE_Bearing_Defect_HM = [0] * (numHarmonics + 1)
  596. print('gE_Bearing_Defect_HM\n',gE_Bearing_Defect_HM)
  597. try:
  598. # 诊断保持架故障
  599. FTFdetection, FTFseverity = self.myDiagnosisLib.Bearing_Fault_Diag(
  600. gE_Bearing_Defect_HM, Vel_Bearing_Defect_HM, Vel_RunningSpd_HM, gE_alert, gE_danger,
  601. Vel_alert_mmsRMS, Vel_danger_mmsRMS, 'FTF'
  602. )
  603. except Exception as e:
  604. FTFdetection =False
  605. FTFseverity =0
  606. if not FTFdetection:
  607. FTFStatusCode = 0
  608. elif FTFseverity < 6:
  609. FTFStatusCode = 1
  610. else:
  611. FTFStatusCode = 2
  612. except Exception as e:
  613. #print(f"处理保持架故障时发生未捕获的异常: {e}")
  614. FTFStatusCode = 0
  615. results["FTF"]["status_codes"].append(FTFStatusCode)
  616. # 计算统计信息
  617. status_counts = {"count_0": 0, "count_1": 0, "count_2": 0}
  618. for fault_type in results:
  619. status_codes = results[fault_type]["status_codes"]
  620. results[fault_type]["max_status"] = max(status_codes)
  621. # 累加状态计数
  622. status_counts["count_0"] += status_codes.count(0)
  623. status_counts["count_1"] += status_codes.count(1)
  624. status_counts["count_2"] += status_codes.count(2)
  625. return {
  626. "type": "Bearing",
  627. "results": results,
  628. "statistics": status_counts
  629. }
  630. def Gear_diag(self):
  631. """齿轮诊断"""
  632. print('齿轮诊断')
  633. mesure_point_name = self.mesure_point_names[0].lower()
  634. if 'gearbox' not in mesure_point_name:
  635. print("Can not perform gearbox diagnosis")
  636. raise ValueError("Can not perform gearbox diagnosis")
  637. results = {
  638. "wear": {"status_codes": []},
  639. "crack": {"status_codes": []}
  640. }
  641. id =self.ids[0]
  642. numTeeth = int(self.teeth_count.get(id,0))
  643. print(numTeeth)
  644. for i in range(len(self.ids)):
  645. ShaftSpd =self.fspd[i] *self.speed_ratio
  646. if ShaftSpd ==0:
  647. results["wear"]["status_codes"].append(-1)
  648. results["crack"]["status_codes"].append(-1)
  649. print('speed_ratio',self.speed_ratio)
  650. print('ShaftSpd',ShaftSpd)
  651. try:
  652. GMF = ShaftSpd * numTeeth / 60
  653. fTarget = GMF
  654. print('fTarget',fTarget)
  655. #numHarmonics = 2
  656. numHarmonics = 2
  657. fRange = 0.05
  658. fmax_gE_10 =1000
  659. fs_acc = self.fs_acc[i]
  660. fmax_vel = max(1000,fs_acc/2.56)
  661. if fTarget >100:
  662. fmax_gE_10 =10000
  663. elif fTarget <0.1:
  664. fmax_gE_10 =10
  665. elif fTarget <1:
  666. fmax_gE_10 =100
  667. fmax_vel=min(1000,fs_acc/2.56)
  668. else:
  669. fmax_gE_10 =1000
  670. fmax_acc =fs_acc /2.56
  671. try:
  672. Vel_GMF_HM = self.myDiagnosisLib.FixedFreqFeature(
  673. self.VelSpec[i], fmax_vel, fTarget, fRange, "Per", "RMS", numHarmonics
  674. )
  675. except Exception as e:
  676. #print(f"计算 Vel_GMF_HM 时出错: {e}")
  677. Vel_GMF_HM = [0] * (numHarmonics + 1)
  678. print('Vel_GMF_HM',Vel_GMF_HM)
  679. try:
  680. Acc_GMF_HM = self.myDiagnosisLib.FixedFreqFeature(
  681. self.AccSpec[i], fmax_acc, fTarget,fRange, "Per", "Peak", numHarmonics
  682. )
  683. except Exception as e:
  684. #print(f"计算 Acc_GMF_HM 时出错: {e}")
  685. Acc_GMF_HM = [0] * (numHarmonics + 1)
  686. print('Acc_GMF_HM',Acc_GMF_HM)
  687. try:
  688. gE_GMF_HM = self.myDiagnosisLib.FixedFreqFeature(
  689. self.gESpec_10[i], fmax_gE_10, fTarget, fRange, "Per", "Peak", numHarmonics
  690. )
  691. except Exception as e:
  692. #print(f"计算 gE_GMF_HM 时出错: {e}")
  693. gE_GMF_HM = [0] * (numHarmonics + 1)
  694. print('gE_GMF_HM',gE_GMF_HM)
  695. fTarget =ShaftSpd /60
  696. print('fTarget',fTarget)
  697. if fTarget >100:
  698. fmax_gE_10 =10000
  699. elif fTarget <0.1:
  700. fmax_gE_10 =10
  701. elif fTarget <1:
  702. fmax_gE_10 =100
  703. fmax_vel=min(1000,fs_acc/2.56)
  704. else:
  705. fmax_gE_10 =1000
  706. numHarmonics = 4
  707. try:
  708. gE_GTIF_HM = self.myDiagnosisLib.FixedFreqFeature(
  709. self.gESpec_10[i], fmax_gE_10, fTarget, fRange, "Per", "Peak", numHarmonics
  710. )
  711. except Exception as e:
  712. #print(f"计算 gE_GTIF_HM 时出错: {e}")
  713. gE_GTIF_HM = [0] * (numHarmonics + 1)
  714. print('gE_GTIF_HM',gE_GTIF_HM)
  715. Acc_GMF_alert_gPk = 0.3 # 齿轮缺陷加速度预警阈值 (g 峰值)
  716. Acc_GMF_danger_gPk = 0.5 # 齿轮缺陷加速度报警阈值 (g 峰值)
  717. Vel_GMF_alert_mmsRMS = 4.0 # 速度总值预警阈值 (mm/s 有效值)
  718. Vel_GMF_danger_mmsRMS = 7.0 # 速度总值报警阈值 (mm/s 有效值)
  719. gE_GMF_alert_gE = 3.0 # 齿轮磨损缺陷加速度包络预警阈值 (gE 峰值)
  720. gE_GMF_danger_gE = 10.0 # 齿轮磨损缺陷加速度包络报警阈值 (gE 峰值)
  721. gE_GTIF_alert_gE = 3.0 # 齿轮断齿缺陷加速度包络预警阈值 (gE 峰值)
  722. gE_GTIF_danger_gE = 10.0 # 齿轮断齿缺陷加速度包络报警阈值 (gE 峰值)
  723. try:
  724. # 诊断齿轮故障
  725. (GearToothWearDetection, GearToothWearSev, GearToothCrackBrokenDetection, GearToothCrackBrokenSev) = \
  726. self.myDiagnosisLib.Gear_Fault_Diag(Acc_GMF_HM, Vel_GMF_HM, gE_GMF_HM, gE_GTIF_HM, Acc_GMF_alert_gPk, \
  727. Acc_GMF_danger_gPk, Vel_GMF_alert_mmsRMS, Vel_GMF_danger_mmsRMS, gE_GMF_alert_gE,
  728. gE_GMF_danger_gE, \
  729. gE_GTIF_alert_gE, gE_GTIF_danger_gE)
  730. except Exception as e:
  731. GearToothWearDetection =False
  732. GearToothCrackBrokenDetection =False
  733. GearToothWearSev =0
  734. GearToothCrackBrokenSev =0
  735. print('齿轮磨损', GearToothWearSev, '齿轮断齿', GearToothCrackBrokenSev)
  736. # 处理磨损状态码
  737. if not GearToothWearDetection:
  738. wear_status = 0
  739. elif GearToothWearSev < 6:
  740. wear_status = 1
  741. else:
  742. wear_status = 2
  743. # 处理裂纹状态码
  744. if not GearToothCrackBrokenDetection:
  745. crack_status = 0
  746. elif GearToothCrackBrokenSev < 6:
  747. crack_status = 1
  748. else:
  749. crack_status = 2
  750. except Exception as e:
  751. wear_status=0
  752. crack_status=0
  753. results["wear"]["status_codes"].append(wear_status)
  754. results["crack"]["status_codes"].append(crack_status)
  755. # 计算统计信息
  756. status_counts = {"count_0": 0, "count_1": 0, "count_2": 0}
  757. for fault_type in results:
  758. status_codes = results[fault_type]["status_codes"]
  759. results[fault_type]["max_status"] = max(status_codes)
  760. # 累加状态计数
  761. status_counts["count_0"] += status_codes.count(0)
  762. status_counts["count_1"] += status_codes.count(1)
  763. status_counts["count_2"] += status_codes.count(2)
  764. return {
  765. "type": "Gear",
  766. "results": results,
  767. "statistics": status_counts
  768. }
  769. def Characteristic_Frequency(self):
  770. """提取轴承、齿轮等参数"""
  771. #前端给的ids所对应的轴承参数、齿轮参数是一致的 计算一次即可
  772. if not self.bearing_frequencies:
  773. id = self.ids[0] # 取第一个id计算
  774. mesure_point_name = self.mesure_point_names[0]
  775. rpm = self.fspd[0] * self.speed_ratio # 应用转速传动比
  776. # 1、从测点名称中提取部件名称(计算特征频率的部件)
  777. str1 = mesure_point_name
  778. print(str1)
  779. # 2、连接233的数据库'energy_show',从表'wind_engine_group'查找风机编号'engine_code'对应的机型编号'mill_type_code'
  780. engine_code = self.engine_code
  781. print(engine_code)
  782. Engine = create_engine('mysql+pymysql://admin:admin123456@192.168.50.233:3306/energy_show')
  783. #Engine = create_engine('mysql+pymysql://admin:admin123456@106.120.102.238:16306/energy_show')
  784. df_sql2 = f"SELECT * FROM wind_engine_group WHERE engine_code = '{engine_code}'"
  785. df2 = pd.read_sql(df_sql2, Engine)
  786. mill_type_code = df2['mill_type_code'].iloc[0]
  787. print(mill_type_code)
  788. # 3、从相关的表中通过机型编号'mill_type_code'或者齿轮箱编号gearbox_code查找部件'brand'、'model'的参数信息
  789. #unit_bearings主轴承参数表 关键词"main_bearing"
  790. if 'main_bearing' in str1:
  791. print("main_bearing")
  792. # df_sql3 = f"SELECT * FROM {'unit_bearings'} where mill_type_code = {'mill_type_code'} "
  793. df_sql3 = f"SELECT * FROM unit_bearings WHERE mill_type_code = '{mill_type_code}' "
  794. df3 = pd.read_sql(df_sql3, Engine)
  795. if df3.empty:
  796. print("警告: 没有找到有效的机型信息")
  797. if 'front' in str1:
  798. brand = 'front_bearing' + '_brand'
  799. model = 'front_bearing' + '_model'
  800. front_has_value = not pd.isna(df3[brand].iloc[0]) and not pd.isna(df3[model].iloc[0])
  801. if not front_has_value:
  802. print("警告: 没有找到有效的品牌信息")
  803. elif 'rear' in str1:
  804. brand = 'rear_bearing' + '_brand'
  805. model = 'rear_bearing' + '_model'
  806. end_has_value = not pd.isna(df3[brand].iloc[0]) and not pd.isna(df3[model].iloc[0])
  807. if not end_has_value:
  808. print("警告: 没有找到有效的品牌信息")
  809. else:
  810. # 当没有指定 front 或 end 时,自动选择有值的轴承信息
  811. front_brand_col = 'front_bearing_brand'
  812. front_model_col = 'front_bearing_model'
  813. rear_brand_col = 'rear_bearing_brand'
  814. rear_model_col = 'rear_bearing_model'
  815. # 检查 front_bearing 是否有值
  816. front_has_value = not pd.isna(df3[front_brand_col].iloc[0]) and not pd.isna(df3[front_model_col].iloc[0])
  817. # 检查 end_bearing 是否有值
  818. end_has_value = not pd.isna(df3[rear_brand_col].iloc[0]) and not pd.isna(df3[rear_model_col].iloc[0])
  819. # 根据检查结果选择合适的列
  820. if front_has_value and end_has_value:
  821. # 如果两者都有值,默认选择 front
  822. brand = front_brand_col
  823. model = front_model_col
  824. elif front_has_value:
  825. brand = front_brand_col
  826. model = front_model_col
  827. elif end_has_value:
  828. brand = rear_brand_col
  829. model = rear_model_col
  830. else:
  831. # 如果两者都没有有效值,设置默认值或抛出异常
  832. print("警告: 没有找到有效的轴承信息")
  833. brand = front_brand_col # 默认使用 front
  834. model = front_model_col # 默认使用 front
  835. print(brand)
  836. _brand = df3[brand].iloc[0]
  837. _model = df3[model].iloc[0]
  838. print(_brand)
  839. print(_model)
  840. #unit_dynamo 发电机参数表 关键词generator stator
  841. elif 'generator'in str1 or 'stator' in str1:
  842. print("generator or 'stator'")
  843. # df_sql3 = f"SELECT * FROM {'unit_dynamo'} where mill_type_code = {'mill_type_code'} "
  844. df_sql3 = f"SELECT * FROM unit_dynamo WHERE mill_type_code = '{mill_type_code}' "
  845. df3 = pd.read_sql(df_sql3, Engine)
  846. if 'non' in str1:
  847. brand = 'non_drive_end_bearing' + '_brand'
  848. model = 'non_drive_end_bearing' + '_model'
  849. else:
  850. brand = 'drive_end_bearing' + '_brand'
  851. model = 'drive_end_bearing' + '_model'
  852. print(brand)
  853. _brand = df3[brand].iloc[0]
  854. _model = df3[model].iloc[0]
  855. print(_brand)
  856. print(_model)
  857. #齿轮箱区分行星轮/平行轮 和 轴承两个表
  858. elif 'gearbox' in str1:
  859. print("gearbox")
  860. #根据mill_type_code从unit_gearbox表中获得gearbox_code
  861. df_sql3 = f"SELECT * FROM unit_gearbox WHERE mill_type_code = '{mill_type_code}' "
  862. df3 = pd.read_sql(df_sql3, Engine)
  863. gearbox_code =df3['code'].iloc[0]
  864. print(gearbox_code)
  865. #如果是行星轮/平行轮 则从unit_gearbox_structure 表中取数据
  866. if 'planet'in str1 or 'sun' in str1:
  867. print("'planet' or 'sun' ")
  868. gearbox_structure =1 if 'planet'in str1 else 2
  869. planetary_gear_grade =1
  870. if 'first' in str1:
  871. planetary_gear_grade =1
  872. elif 'second'in str1:
  873. planetary_gear_grade =2
  874. elif 'third'in str1:
  875. planetary_gear_grade =3
  876. # df_sql33 = f"SELECT * FROM unit_gearbox_structure WHERE gearbox_code = '{gearbox_code}' "
  877. df_sql33 = f"""
  878. SELECT bearing_brand, bearing_model,gear_ring_teeth_count
  879. FROM unit_gearbox_structure
  880. WHERE gearbox_code = '{gearbox_code}'
  881. AND gearbox_structure = '{gearbox_structure}'
  882. AND planetary_gear_grade = '{planetary_gear_grade}'
  883. """
  884. df33 = pd.read_sql(df_sql33, Engine)
  885. if df33.empty:
  886. print("unit_gearbox_structure没有该测点的参数")
  887. else:
  888. brand = 'bearing' + '_brand'
  889. model = 'bearing' + '_model'
  890. teeth_count= df33['gear_ring_teeth_count'].iloc[0]
  891. print('teeth_count',teeth_count)
  892. print(brand)
  893. _brand = df33[brand].iloc[0]
  894. _model = df33[model].iloc[0]
  895. has_value = not pd.isna(df33[brand].iloc[0]) and not pd.isna(df33[model].iloc[0])
  896. if has_value:
  897. print(_brand)
  898. print(_model)
  899. else:
  900. print("警告: 没有找到有效的轴承信息")
  901. #如果是齿轮箱轴承 则从unit_gearbox_bearings 表中取数据
  902. elif 'shaft' in str1 or'input' in str1:
  903. print("'shaft'or'input'")
  904. #高速轴 低速中间轴 取bearing_rs/gs均可
  905. parallel_wheel_grade=1
  906. if 'low_speed' in str1:
  907. parallel_wheel_grade =1
  908. elif 'low_speed_intermediate' in str1:
  909. parallel_wheel_grade =2
  910. elif 'high_speed' in str1:
  911. parallel_wheel_grade =3
  912. # df_sql33 = f"SELECT * FROM unit_gearbox_bearings WHERE gearbox_code = '{gearbox_code}' "
  913. df_sql33 = f"""
  914. SELECT bearing_rs_brand, bearing_rs_model, bearing_gs_brand, bearing_gs_model,gear_ring_teeth_count
  915. FROM unit_gearbox_bearings
  916. WHERE gearbox_code = '{gearbox_code}'
  917. AND parallel_wheel_grade = '{parallel_wheel_grade}'
  918. """
  919. df33 = pd.read_sql(df_sql33, Engine)
  920. if not df33.empty:
  921. if 'high_speed' in str1 or 'low_speed_intermediate' in str1:
  922. rs_brand = 'bearing_rs' + '_brand'
  923. rs_model = 'bearing_rs' + '_model'
  924. gs_brand = 'bearing_gs' + '_brand'
  925. gs_model = 'bearing_gs' + '_model'
  926. rs_has_value = not pd.isna(df33[rs_brand].iloc[0]) and not pd.isna(df33[rs_model].iloc[0])
  927. gs_has_value = not pd.isna(df33[gs_brand].iloc[0]) and not pd.isna(df33[gs_model].iloc[0])
  928. if rs_has_value and gs_has_value:
  929. brand = rs_brand
  930. model = rs_model
  931. elif rs_has_value:
  932. brand = rs_brand
  933. model = rs_model
  934. elif gs_has_value:
  935. brand = gs_brand
  936. model = gs_model
  937. else:
  938. print("警告: 没有找到有效的品牌信息")
  939. brand = rs_brand
  940. model = rs_model
  941. #低速轴 取bearing_model
  942. elif 'low_speed'in str1:
  943. brand = 'bearing' + '_brand'
  944. model = 'bearing' + '_model'
  945. else:
  946. print("警告: 没有找到有效的轴承信息")
  947. if not df33.empty:
  948. if 'high_speed' in str1:
  949. teeth_count= df33['gear_ring_teeth_count'].iloc[0]
  950. print('teeth_count',teeth_count)
  951. print(brand)
  952. _brand = df33[brand].iloc[0]
  953. _model = df33[model].iloc[0]
  954. print(_brand)
  955. print(_model)
  956. # 4、从表'unit_dict_brand_model'中通过'_brand'、'_model'查找部件的参数信息
  957. df_sql4 = f"SELECT * FROM unit_dict_brand_model where manufacture = %s AND model_number = %s"
  958. params = [(_brand, _model)]
  959. df4 = pd.read_sql(df_sql4, Engine, params=params)
  960. n_rolls = df4['rolls_number'].iloc[0]
  961. d_rolls = df4['rolls_diameter'].iloc[0]
  962. D_diameter = df4['circle_diameter'].iloc[0]
  963. theta_deg = df4['theta_deg'].iloc[0]
  964. # 计算特征频率
  965. bearing_freq = self.calculate_bearing_frequencies(n_rolls, d_rolls, D_diameter, theta_deg, rpm)
  966. print(bearing_freq)
  967. # 将结果赋给所有id
  968. for id in self.ids:
  969. self.bearing_frequencies[id] = bearing_freq
  970. print('aaaa')
  971. if 'gearbox' in str1:
  972. self.teeth_count[id] =teeth_count
  973. def calculate_bearing_frequencies(self, n, d, D, theta_deg, rpm):
  974. """
  975. 计算轴承各部件特征频率
  976. 参数:
  977. n (int): 滚动体数量
  978. d (float): 滚动体直径(单位:mm)
  979. D (float): 轴承节圆直径(滚动体中心圆直径,单位:mm)
  980. theta_deg (float): 接触角(单位:度)
  981. rpm (float): 转速(转/分钟)
  982. 返回:
  983. dict: 包含各特征频率的字典(单位:Hz)
  984. """
  985. # 转换角度为弧度
  986. theta = math.radians(theta_deg)
  987. # 转换直径单位为米(保持单位一致性,实际计算中比值抵消单位影响)
  988. # 注意:由于公式中使用的是比值,单位可以保持mm不需要转换
  989. ratio = d / D
  990. # 基础频率计算(转/秒)
  991. # f_r = rpm
  992. f_r = rpm / 60.0
  993. # 计算各特征频率
  994. BPFI = (n / 2) * (1 + ratio * math.cos(theta)) * f_r # 内圈故障频率
  995. BPFO = (n / 2) * (1 - ratio * math.cos(theta)) * f_r # 外圈故障频率
  996. BSF = (D / (2 * d)) * (1 - (ratio ** 2) * (math.cos(theta) ** 2)) * f_r # 滚动体故障频率
  997. FTF = 0.5 * (1 - ratio * math.cos(theta)) * f_r # 保持架故障频率
  998. return {
  999. "BPFI": round(BPFI, 2),
  1000. "BPFO": round(BPFO, 2),
  1001. "BSF": round(BSF, 2),
  1002. "FTF": round(FTF, 2),
  1003. }
  1004. def calculate_speed_ratio(self):
  1005. """
  1006. 根据风场编号和测点名称计算转速传动比
  1007. """
  1008. # 默认传动比为1
  1009. self.speed_ratio = 1.0
  1010. # WOF046400029风场 七台河需要特殊处理
  1011. if self.wind_code == "WOF046400029":
  1012. # 获取第一个测点名称
  1013. mesure_point_name = self.mesure_point_names[0]
  1014. if "gearbox" in mesure_point_name:
  1015. if "high_speed" in mesure_point_name:
  1016. # 高速轴输出端
  1017. self.speed_ratio = 1
  1018. elif "first" in mesure_point_name:
  1019. # 一级行星级
  1020. self.speed_ratio = 1 /(5.3 * 5.5 * 3.8)
  1021. elif "second" in mesure_point_name:
  1022. # 二级行星级
  1023. self.speed_ratio = 1 / (5.5 * 3.8)
  1024. if "generator" in mesure_point_name:
  1025. self.speed_ratio =1
  1026. else:
  1027. # 非齿轮箱测点
  1028. self.speed_ratio = 1 / (5.3 * 5.5 * 3.8)