DiagnosisLib.py 87 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955
  1. """
  2. @Time : 2024-03-04
  3. @Author : Wei
  4. @FileName: DiagnosisLib.py
  5. @Software: 故障诊断函数库
  6. """
  7. import numpy as np
  8. import matplotlib.pyplot as plt
  9. from math import pi
  10. from scipy import signal
  11. from scipy import interpolate
  12. import math
  13. # git外网使用
  14. # ddddd
  15. class DiagnosisLib:
  16. def __init__(self):
  17. pass
  18. ###############################################################################
  19. ###############################################################################
  20. # 半带滤波器系数
  21. def halfbandcoefficient(self):
  22. halfbandcoefficient = np.array([0.00000063557331607068,0,-0.00000627255234261115,0,0.00002474955105003003,0,\
  23. -0.00007140981582044673,0,0.00017237915446870680,0,-0.00036863887543283979,0,\
  24. 0.00072039609678193576,0,-0.00131147951710543810,0,0.00225360507770744260,0,\
  25. -0.00369069002024503300,0,0.00580407535380912750,0,-0.00882079299392407940,0,\
  26. 0.01302944110367636400,0,-0.01881320502983020000,0,0.02672090662754737100,0,\
  27. -0.03762627155576255700,0,0.05311294860790129200,0,-0.07653440360979835200,0,\
  28. 0.11663131038150232000,0,-0.20562506738991029000,0,0.63439761518650584000,1,\
  29. 0.63439761518650584000,0,-0.20562506738991029000,0,0.11663131038150232000,0,\
  30. -0.07653440360979835200,0,0.05311294860790129200,0,-0.03762627155576255700,0,\
  31. 0.02672090662754737100,0,-0.01881320502983020000,0,0.01302944110367636400,0,\
  32. -0.00882079299392407940,0,0.00580407535380912750,0,-0.00369069002024503300,0,\
  33. 0.00225360507770744260,0,-0.00131147951710543810,0,0.00072039609678193576,0,\
  34. -0.00036863887543283979,0,0.00017237915446870680,0,-0.00007140981582044673,0,\
  35. 0.00002474955105003003,0,-0.00000627255234261115,0,0.00000063557331607068])
  36. return halfbandcoefficient
  37. ###############################################################################
  38. ###############################################################################
  39. # 计算时域波形均值
  40. def Average(self,xTimeWave):
  41. return sum(xTimeWave) / len(xTimeWave)
  42. ###############################################################################
  43. ###############################################################################
  44. # 计算时域波形xTimeWave的频谱
  45. # fs是时域波形的采样频率,单位是Hz
  46. # 调用代码须保证输入时域波形xTimeWave的数据点数为2的N幂
  47. # 频谱计算默认采用汉宁窗
  48. # 输出为频谱的x轴freq即频率,单位是Hz, 和频谱的y轴,单位是时域波形的幅值单位
  49. # x轴和y轴的数据点数为输入时域波形xTimeWave数据点数的1/2.56倍+1,即1024点时域波形
  50. # 输出频谱的x轴和y轴分别有401点数据,2048点时域波形时,输出频谱的x轴和y轴分别有801点数据。
  51. def Spectrum(self,xTimeWave,fs):
  52. DataLen = len(xTimeWave)
  53. xSpec = abs(np.fft.fft((xTimeWave*np.hanning(DataLen))))/DataLen*4
  54. freq = np.arange(0, fs / 2.56 + fs / DataLen, fs / DataLen)
  55. return [freq, xSpec[0:int(DataLen/2.56)+1]]
  56. ###############################################################################
  57. ###############################################################################
  58. # 计算时域波形xTimeWave的幅值谱倒频谱
  59. # fs是时域波形的采样频率,单位是Hz
  60. # 调用代码须保证输入时域波形xTimeWave的数据点数为2的N幂
  61. # 输出为倒谱的x轴quefrency,单位是秒,倒谱的幅值单位是dB
  62. def Cepstrum(self,xTimeWave,fs):
  63. # cepstrum = np.abs(np.fft.ifft(np.log(np.absolute(np.fft.fft(xTimeWave)))))
  64. cepstrum = 20*np.log((np.abs(np.fft.ifft(np.log(np.abs(np.fft.fft(xTimeWave))))))/0.1)
  65. quefrency = np.array(range(len(xTimeWave)))/fs
  66. return [quefrency,cepstrum]
  67. ###############################################################################
  68. ###############################################################################
  69. # 计算频谱xSpec的固定频率特征值,xSpec是频谱的y轴数组,其数据点数为101,201,401,801,1601,3201,6401,12801
  70. # fMax是频谱的分析频宽,单位为Hz
  71. # fTarget是特征频率的目标值,单位为Hz。比如轴的转频,齿轮啮合频率,水泵叶片通过频率等等
  72. # fRange是特征频率的搜索范围,其输入值根据fRangeMode的不同值而不一样,
  73. # fRangeMode可以赋值0或1,默认值是0。当fRangeMode = 0时,fRange的值是xx%, 比如 2%(实际输入为0.02) ,
  74. # 此时搜索范围是 fTarge +/- fTarge*fRange/2。
  75. # 当fRangeMode = 1时,fRange的值是频率值,比如2Hz,
  76. # 此时的搜索范围就是 fTarge +/- fRange/2
  77. # Detection是特征值的峰值(此时输入0),有效值(输入1),峰峰值(输入2)
  78. # numHarmonics为谐波数,0代表不需要考虑谐波即只有特征频率的基频,1代表包括基频和2倍频,2代表包括基频和2、3倍频
  79. def FixedFreqFeature(self,xSpec, fMax, fTarget, fRange, fRangeMode, Detection, numHarmonics):
  80. if fRangeMode == '百分比':
  81. fRange = fRange*fTarget
  82. if fRangeMode == '数值':
  83. fRange = fRange
  84. # print(fRange)
  85. SpecResolution = fMax/(len(xSpec)-1)
  86. index_SearchRangeMax = int(math.ceil((fTarget + fRange/2)/SpecResolution))
  87. index_SearchRangeMin = int(math.floor((fTarget - fRange/2)/SpecResolution))
  88. if index_SearchRangeMin < 3:
  89. index_SearchRangeMin = 3
  90. index_SearchRange = index_SearchRangeMax - index_SearchRangeMin
  91. xArray = xSpec[index_SearchRangeMin:(index_SearchRangeMax+1)]
  92. while((int(np.argmax(xArray))==0) or (int(np.argmax(xArray))==len(xArray)-1)):
  93. index_SearchRangeMin = index_SearchRangeMin -1
  94. index_SearchRange = index_SearchRange + 1
  95. xArray = xSpec[int(index_SearchRangeMin-math.floor(index_SearchRange/2)):int(index_SearchRangeMin+math.ceil(index_SearchRange/2+1))]
  96. ActualTargetFreq = self.FundamentalFreqActualValue(xArray, SpecResolution,index_SearchRangeMin)
  97. # print(ActualTargetFreq)
  98. featureValue = self.FreqFeatureValue(xSpec, SpecResolution, ActualTargetFreq, index_SearchRange, Detection, numHarmonics)
  99. return featureValue
  100. ###############################################################################
  101. ###############################################################################
  102. # 该函数只用于内部调用,其调用函数为 FixedFreqFeature
  103. def FundamentalFreqActualValue(self,xArray, SpecResolution, index_SearchRangeMin):
  104. indexPeak = int(self.PeakFinderInArray(xArray))
  105. indexCenter = int(indexPeak + index_SearchRangeMin)
  106. ActualFundamentalFreq = self.FrequencyCompensation(indexCenter,xArray[indexPeak],xArray[indexPeak-1],xArray[indexPeak+1],SpecResolution)
  107. return ActualFundamentalFreq
  108. ###############################################################################
  109. ###############################################################################
  110. # 该函数只用于内部调用,其调用函数为 FundamentalFreqActualValue
  111. def PeakFinderInArray(self,xArray):
  112. NoElements = len(xArray)
  113. index_peak = int(np.argmin(xArray)) # initialize the peak index with the minimal value's index
  114. peak = xArray[index_peak] # initialize the peak value with the minimal value
  115. for i in range(0, NoElements-2):
  116. if (xArray[i+1] > xArray[i]) and (xArray[i+1] > xArray[i+2]) and (xArray[i+1] > peak):
  117. index_peak = i+1
  118. peak = xArray[i+1]
  119. return index_peak
  120. ###############################################################################
  121. ###############################################################################
  122. # 该函数只用于内部调用,其调用函数为 FundamentalFreqActualValue
  123. def FrequencyCompensation(self,indexCenter, AmpCenter, AmpLeft, AmpRight, xSpecResolution):
  124. if AmpRight >= AmpLeft:
  125. delta_k = (2*AmpRight-AmpCenter)/(AmpRight+AmpCenter)
  126. else:
  127. delta_k = (AmpCenter-2*AmpLeft)/(AmpLeft+AmpCenter)
  128. ActualFrequency = (indexCenter + delta_k)*xSpecResolution
  129. return ActualFrequency
  130. ###############################################################################
  131. ###############################################################################
  132. # 该函数只用于内部调用,其调用函数为 FixedFreqFeature
  133. def FreqFeatureValue(self,xSpec, SpecResolution, ActualTargetFreq, index_SearchRange, Detection, numHarmonics = 0):
  134. sumation = 0
  135. # print(ActualTargetFreq)
  136. featureValue = []
  137. featureValue = [0 for i in range(numHarmonics+1)]
  138. for i in range(0,numHarmonics+1):
  139. index_i = int(round((i+1)*ActualTargetFreq/SpecResolution))
  140. a = xSpec[int(index_i-math.floor(index_SearchRange/2)):int(index_i+math.ceil(index_SearchRange/2+1))]
  141. while((int(np.argmax(a))==0) or (int(np.argmax(a))==len(a)-1)):
  142. index_SearchRange = index_SearchRange + 2
  143. a = xSpec[int(index_i-math.floor(index_SearchRange/2)):int(index_i+math.ceil(index_SearchRange/2+1))]
  144. indexPeak = int(self.PeakFinderInArray(a) + index_i-math.floor(index_SearchRange/2))
  145. # print(int(index_i-math.floor(index_SearchRange/2)),indexPeak,int(index_i+math.ceil(index_SearchRange/2)))
  146. for j in range(indexPeak-2,indexPeak+2+1):
  147. sumation = sumation + xSpec[j]*xSpec[j]
  148. featureValue[i] = np.sqrt(sumation/1.5)
  149. sumation = 0
  150. # print(featureValue[i])
  151. if Detection == '峰值':
  152. pass
  153. if Detection == '有效值':
  154. featureValue = [x/math.sqrt(2) for x in featureValue]
  155. if Detection == '峰峰值':
  156. featureValue = [x*2 for x in featureValue]
  157. return featureValue
  158. ###############################################################################
  159. ###############################################################################
  160. # 计算频域积分
  161. # xSpecOrig需要对其计算积分的频谱数组,其长度为:101,201,401,801,1601,3201,6401,12801
  162. # fMax为频谱的分析频宽,单位为Hz
  163. # fCut为计算积分的低频截止频率,单位为Hz
  164. def FreqIntegration(self,xSpecOrig, fMax, fCut):
  165. nLine = len(xSpecOrig) - 1
  166. lineResolution = fMax / nLine
  167. iStarting = int(math.floor(fCut / lineResolution))
  168. if iStarting == 0:
  169. iStarting = 1
  170. xSpecOut = np.zeros(len(xSpecOrig))
  171. for i in range(iStarting, len(xSpecOrig)):
  172. xSpecOut[i] = xSpecOrig[i]/(2*pi*lineResolution*i)
  173. return xSpecOut
  174. ###############################################################################
  175. ###############################################################################
  176. # 巴特沃斯高通滤波
  177. # xTimeWave是时域波形数组, fs是采样频率,单位为Hz
  178. # fco 为高通截止频率,单位为Hz
  179. # Order为滤波器阶数,通常为偶数,2,4,6,8一般不超过8
  180. def HighPassButter(self,xTimeWave, fs, fco, Order):
  181. sos = signal.butter(Order, fco/(fs/2), 'hp', output='sos')
  182. filtered = signal.sosfilt(sos, xTimeWave)
  183. return filtered
  184. ###############################################################################
  185. ###############################################################################
  186. # 巴特沃斯低通滤波
  187. # xTimeWave是时域波形数组, fs是采样频率,单位为Hz
  188. # fco 为低通截止频率,单位为Hz
  189. # Order为滤波器阶数,通常为偶数,2,4,6,8一般不超过8
  190. def LowPassButter(self,xTimeWave, fs, fco, Order):
  191. sos = signal.butter(Order, fco/(fs/2), 'lp', output='sos')
  192. filtered = signal.sosfilt(sos, xTimeWave)
  193. return filtered
  194. ###############################################################################
  195. ###############################################################################
  196. # 计算包络
  197. # xTimeWave是时域波形数组
  198. # DownSampleRate是降采样率,调用函数需提供此数值,其计算公式为
  199. # 原始波形xTimeWave的分析频宽/包络后时域波形的分析频宽,比如原始波形分析频宽是10000Hz(采样频率是25600Hz),包络后时域
  200. # 波形的分析频宽是1000Hz,那 DownSampleRate = 10000/1000 = 10
  201. # Method是SKF的包络方法,还是PeakHold包络方法
  202. def EnvLopInTime(self,xTimeWave, DownSampleRate, Method = "SKF"):
  203. xOut = np.zeros(math.floor(len(xTimeWave)/DownSampleRate))
  204. if Method == "SKF":
  205. scale = 2.2
  206. xTimeWave = np.absolute(scale*xTimeWave)
  207. w = 1/(1.28*DownSampleRate)
  208. Order = 4
  209. sos = signal.butter(Order, w, 'lp', output='sos')
  210. xTimeWave = signal.sosfilt(sos, xTimeWave)
  211. xOut =xTimeWave[::DownSampleRate]
  212. if Method == "PeakHold":
  213. for i in range(0, len(xOut)):
  214. xOut[i] = np.amax(np.absolute(xTimeWave[i*DownSampleRate:((i+1)*DownSampleRate-1)]))
  215. return xOut - np.mean(xOut)
  216. ###############################################################################
  217. ###############################################################################
  218. # 内部调用函数
  219. def DownSampleBy2(self,xTimeWave):
  220. xTimeWave = signal.resample_poly(xTimeWave, 1, 2)
  221. return xTimeWave
  222. def DownSampleBy4(self,xTimeWave):
  223. xTimeWave = signal.resample_poly(xTimeWave,1,4)
  224. return xTimeWave
  225. def DownSampleBy5(self,xTimeWave):
  226. xTimeWave = signal.resample_poly(xTimeWave,1,5)
  227. return xTimeWave
  228. def DownSampleBy8(self,xTimeWave):
  229. xTimeWave = signal.resample_poly(xTimeWave,1,8)
  230. return xTimeWave
  231. def DownSampleBy10(self,xTimeWave):
  232. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  233. return xTimeWave
  234. def DownSampleBy20(self,xTimeWave):
  235. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  236. xTimeWave = signal.resample_poly(xTimeWave,1,2)
  237. return xTimeWave
  238. def DownSampleBy40(self,xTimeWave):
  239. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  240. xTimeWave = signal.resample_poly(xTimeWave,1,4)
  241. return xTimeWave
  242. def DownSampleBy50(self,xTimeWave):
  243. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  244. xTimeWave = signal.resample_poly(xTimeWave,1,5)
  245. return xTimeWave
  246. def DownSampleBy80(self,xTimeWave):
  247. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  248. xTimeWave = signal.resample_poly(xTimeWave,1,8)
  249. return xTimeWave
  250. def DownSampleBy100(self,xTimeWave):
  251. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  252. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  253. return xTimeWave
  254. def DownSampleBy200(self,xTimeWave):
  255. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  256. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  257. xTimeWave = signal.resample_poly(xTimeWave,1,2)
  258. return xTimeWave
  259. def DownSampleBy400(self,xTimeWave):
  260. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  261. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  262. xTimeWave = signal.resample_poly(xTimeWave,1,4)
  263. return xTimeWave
  264. def DownSampleBy500(self,xTimeWave):
  265. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  266. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  267. xTimeWave = signal.resample_poly(xTimeWave,1,5)
  268. return xTimeWave
  269. def DownSampleBy800(self,xTimeWave):
  270. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  271. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  272. xTimeWave = signal.resample_poly(xTimeWave,1,8)
  273. return xTimeWave
  274. def DownSampleBy1000(self,xTimeWave):
  275. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  276. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  277. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  278. return xTimeWave
  279. def DownSampleBy2000(self,xTimeWave):
  280. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  281. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  282. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  283. xTimeWave = signal.resample_poly(xTimeWave,1,2)
  284. return xTimeWave
  285. def DownSampleBy4000(self,xTimeWave):
  286. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  287. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  288. xTimeWave = signal.resample_poly(xTimeWave,1,10)
  289. xTimeWave = signal.resample_poly(xTimeWave,1,4)
  290. return xTimeWave
  291. def DownSample(self, xTimeWave, fsIn, fsOut, nPointIn, nPointOut):
  292. #输入: xTimeWave: 时域波形数据
  293. # Fs: xTimeWave波形数据的采样频率(Hz)
  294. # fs: 降采样后时域波形数据的采样频率(Hz)
  295. # nPointIn: 输入波形的数据点数
  296. # nPointOut: 返回的波形的数据点数
  297. #
  298. #返回: 返回一个长度为nPointOut的时域波形数组
  299. DownSampleRate = int(fsIn/fsOut)
  300. if int(nPointIn/nPointOut) < DownSampleRate:
  301. print('Input data length is not enough')
  302. return -1
  303. if DownSampleRate == 2:
  304. return self.DownSampleBy2(xTimeWave[0:int(nPointOut*2)])
  305. if DownSampleRate == 4:
  306. return self.DownSampleBy4(xTimeWave[0:int(nPointOut*4)])
  307. if DownSampleRate == 5:
  308. return self.DownSampleBy5(xTimeWave[0:int(nPointOut*5)])
  309. if DownSampleRate == 8:
  310. return self.DownSampleBy8(xTimeWave[0:int(nPointOut*8)])
  311. if DownSampleRate == 10:
  312. return self.DownSampleBy10(xTimeWave[0:int(nPointOut*10)])
  313. if DownSampleRate == 20:
  314. return self.DownSampleBy20(xTimeWave[0:int(nPointOut*20)])
  315. if DownSampleRate == 40:
  316. return self.DownSampleBy40(xTimeWave[0:int(nPointOut*40)])
  317. if DownSampleRate == 50:
  318. return self.DownSampleBy50(xTimeWave[0:int(nPointOut*50)])
  319. if DownSampleRate == 100:
  320. return self.DownSampleBy100(xTimeWave[0:int(nPointOut*100)])
  321. if DownSampleRate == 200:
  322. return self.DownSampleBy200(xTimeWave[0:int(nPointOut*200)])
  323. if DownSampleRate == 400:
  324. return self.DownSampleBy400(xTimeWave[0:int(nPointOut*400)])
  325. if DownSampleRate == 500:
  326. return self.DownSampleBy500(xTimeWave[0:int(nPointOut*500)])
  327. if DownSampleRate == 1000:
  328. return self.DownSampleBy1000(xTimeWave[0:int(nPointOut*1000)])
  329. if DownSampleRate == 2000:
  330. return self.DownSampleBy2000(xTimeWave[0:int(nPointOut*2000)])
  331. if DownSampleRate == 4000:
  332. return self.DownSampleBy4000(xTimeWave[0:int(nPointOut*4000)])
  333. ###############################################################################
  334. ###############################################################################
  335. def OrderAnalysis(self, xTimeWave, Fs, xTimeSpeedPulse, nPulsePerRev, nRev, nLine, TransLevel, TransLevelPara):
  336. #输入: xTimeWave: 时域波形数据
  337. # Fs: xTimeWave波形数据的采样频率(Hz)
  338. # xTimeSpeedPulse: 相邻转速脉冲信号的时间间隔(s)
  339. # nPulsePerRev: 每周的脉冲个数
  340. # nRev: 阶次分析整周数(整周数必须是2的N次幂,比如:4、8、16、32、64、128、256、512等等)
  341. # nLine: 阶次频谱的谱线数(谱线数可选项为:100、200、400、800、1600、3200、6400)
  342. # TransLevel: 阶次分析轴与转速测量轴的转速等级关系,
  343. # 0:表示阶次分析轴与转速分析轴是同一根轴
  344. # 1:表示阶次分析轴与转速分析轴不在同一根轴上,有1次转速比变化
  345. # 2:表示阶次分析轴与转速分析轴不在同一根轴上,有2次转速比变化
  346. # 3:表示阶次分析轴与转速分析轴不在同一根轴上,有3次转速比变化, 以此类推
  347. # TransLevelPara: 齿轮齿数数组,
  348. # 当 TransLevel == 0 时,这个数组只有1个元素,可以是[0]
  349. # 当 TransLevel == 1 时,有一对齿轮啮合,2根轴。这个数组有2个元素,第一个元素是转速测量轴(1轴)上的齿轮齿数,
  350. # 第二个元素是与转速测量轴啮合(2轴)的齿轮的齿数,
  351. # 当 TransLevel == 2 时,有二对齿轮啮合,3根轴。这个数组有4个元素,第一个元素是转速测量轴(2轴)上的齿轮齿数,
  352. # 第二个元素是与转速测量轴啮合(2轴)的齿轮的齿数,第三个元素是2轴与下一级(3轴)啮合的齿轮的齿数,
  353. # 第四个元素是3轴与2轴啮合的齿轮的齿数。
  354. #返回: 等角度采样的角度轴坐标,等角度采样的波形,阶次谱的阶次轴坐标,阶次谱的幅值
  355. nRevSpeedSensorShaft = int(len(xTimeSpeedPulse)/nPulsePerRev) # 计算转速测量轴的转速测量信号有多少个整周数
  356. xTimeSpeedPulse = xTimeSpeedPulse[0:0+int(nRevSpeedSensorShaft*nPulsePerRev)] # 整周数以外多余的脉冲信号去掉
  357. xTimeSpeedPerRevSpeedSensorShaft = np.sum(np.reshape(xTimeSpeedPulse,(nRevSpeedSensorShaft,nPulsePerRev)),axis = 1) # 计算转速测量轴每转一周的时间
  358. if TransLevel == 0:
  359. xTimeSpeedPerRevCurrentShaft = xTimeSpeedPerRevSpeedSensorShaft
  360. xTimeSpeedPerRevCurrentShaft_ave = np.average(xTimeSpeedPerRevCurrentShaft) # 当转速测量轴就是阶次分析的轴时,转速脉冲可以直接使用
  361. fMax_MAX = 1/xTimeSpeedPerRevCurrentShaft_ave*nLine/nRev
  362. else:
  363. xTemp = np.cumsum(xTimeSpeedPerRevSpeedSensorShaft) # 转速脉冲时间累积
  364. xTemp = np.append(0,xTemp) # 添加起始点 # 当转速测量轴不是阶次分析轴时,传输脉冲信号必须转换到阶次分析轴上
  365. for i in range (TransLevel):
  366. up = TransLevelPara[i] # 转速测量轴齿轮齿数
  367. down = TransLevelPara[i+1] # 啮合轴齿轮齿数
  368. dataLength = int(len(xTemp)*up) # 转速测量轴增采样后的数据长度
  369. flipelements = int(len(xTemp)*0.5) # 转速信号加长50%防止长度不够
  370. extention = np.zeros(flipelements)
  371. for j in range(flipelements): # 转速信号加长算法,以最后一点为对称中心
  372. extention[j] = xTemp[-1]-(xTemp[-1-j-1]-xTemp[-1])
  373. xTemp1 = np.append(xTemp,extention) # 转速信号加长后的转速脉冲时间累积
  374. xTemp2 = np.zeros(xTemp1.size*(up),xTemp1.dtype)
  375. xTemp2[::up] = xTemp1 # 脉冲时间累积信号增采样,增采样率为转速测量轴齿轮的齿数
  376. # plt.figure(30)
  377. # plt.plot(xTemp2)
  378. #==============================================================
  379. delta1 = 0.00000001
  380. delta2 = 0.0000001
  381. freq1 = 0.39/up
  382. freq2 = 0.61/up
  383. AA = np.matrix([[-4.278e-1,-4.761e-1,0],[-5.941e-1,7.114e-2,0],[-2.66e-3,5.309e-03,0]])
  384. d1 = np.log10(delta1)
  385. d2 = np.log10(delta2)
  386. D = np.array([1,d1,d1*d1])*AA*np.array([[1],[d2],[d2*d2]])
  387. bb = np.array([11.01217,0.51244])
  388. fK = np.dot(np.array([1.0,(d1-d2)]),bb)
  389. df = np.abs(freq2-freq1)
  390. N = int(D[0]/df-fK*df+1)
  391. if np.remainder(N,2) == 0:
  392. N = N+1
  393. upSampleFilterCoefficients = signal.remez(N, [0,0.39,0.61,up/2], [1,0],Hz = up,maxiter = 500)
  394. # [freq, response] = signal.freqz(upSampleFilterCoefficients)
  395. # ampl = np.abs(response)
  396. # plt.figure(31)
  397. # plt.plot(freq,ampl)
  398. #==============================================================
  399. groupDelay = int((len(upSampleFilterCoefficients)+1)/2)
  400. xTemp3 = signal.convolve(xTemp2,upSampleFilterCoefficients)
  401. xTemp4 = (xTemp3[groupDelay-1:groupDelay-1+dataLength])*up
  402. plt.figure(30)
  403. plt.plot(xTemp4)
  404. xTemp5 = xTemp4[0::down]
  405. xTimeSpeedPerRevCurrentShaft = np.diff(xTemp5)
  406. xTimeSpeedPerRevCurrentShaft_ave = np.average(xTimeSpeedPerRevCurrentShaft) # 当转速测量轴就是阶次分析的轴时,转速脉冲可以直接使用
  407. fMax_MAX = 1/xTimeSpeedPerRevCurrentShaft_ave*nLine/nRev
  408. xTimeSpeedPerRevCurrentShaft_min = np.min(xTimeSpeedPerRevCurrentShaft) # 计算轴转得最快的一周的时间
  409. fMax_MAX = 1/xTimeSpeedPerRevCurrentShaft_min*nLine/nRev # 根据最快的一周的时间得出阶次频谱最高分析频宽的频率
  410. Order = 6
  411. if fMax_MAX <= Fs/2.56:
  412. xTimeWave = self.LowPassButter(xTimeWave, Fs, fMax_MAX, Order) # 低通滤波消除大于fMax_MAX的信号,然后才能做阶次分析
  413. xTimeSpeedCurrentShaftCumulative = np.cumsum(xTimeSpeedPerRevCurrentShaft) # 计算轴每转一周所用时间的累积值
  414. nVibDataPoint = nLine*2.56 # 计算时域波形点数
  415. up = nVibDataPoint/nRev # 计算每周等角度采样点数
  416. # down = 1
  417. halfbandWeight = self.halfbandcoefficient()
  418. groupDelay = int((len(halfbandWeight)+1)/2)
  419. numIteration = int(np.log10(up)/np.log10(2))
  420. temp = np.append(0,xTimeSpeedCurrentShaftCumulative)
  421. flipelements = int(len(temp)*0.5)
  422. extention = np.zeros(flipelements)
  423. for i in range(numIteration):
  424. dataLength = int(len(temp)*2)
  425. for j in range(flipelements):
  426. extention[j] = temp[-1]-(temp[-1-j-1]-temp[-1])
  427. temp1 = np.append(temp,extention)
  428. temp2 = np.insert(temp1,np.arange(1,len(temp1),1),0)
  429. temp3 = np.append(temp2,0)
  430. temp4 = signal.convolve(temp3,halfbandWeight)
  431. temp = temp4[groupDelay-1:groupDelay-1+dataLength]
  432. xTimeNewSamplePoint = temp
  433. flipelements = int(len(xTimeWave)*0.25)
  434. extention = np.zeros(flipelements)
  435. for j in range(flipelements):
  436. extention[j] = xTimeWave[-1]-(xTimeWave[-1-j-1]-xTimeWave[-1])
  437. xTimeWave = np.append(xTimeWave,extention)
  438. xTimeSamplePoint = np.arange(0,len(xTimeWave)/Fs,1/Fs) # 计算输入波形的采样时间点
  439. # spl = UnivariateSpline(xTimeSamplePoint,xTimeWave)
  440. # Waveform = spl(xTimeNewSamplePoint)
  441. fx = interpolate.interp1d(xTimeSamplePoint,xTimeWave,kind= 'cubic')
  442. Waveform = fx(xTimeNewSamplePoint)
  443. OrderWaveform = Waveform[0:int(nLine*2.56)]
  444. ct = 360/(nLine*2.56/nRev)
  445. orderTimeLine = np.arange(0,nLine*2.56*ct,ct)
  446. fOT = nLine*2.56/nRev
  447. fMax = fOT/2.56
  448. fCut = 10*fMax/nLine
  449. WinType = 0
  450. AverageType = 0
  451. OverLapType = 0
  452. [f, xSpectrum, xSpectrumPhase] = self.Spectrum(OrderWaveform,nLine,fMax,fCut,WinType, AverageType ,OverLapType) # 计算插值函数
  453. len(OrderWaveform)
  454. return [orderTimeLine, OrderWaveform, f, xSpectrum]
  455. ###############################################################################
  456. ###############################################################################
  457. # 内部函数
  458. def halfBandDesign (self, filterLength, transitionBand ):
  459. invalidInput = False
  460. # check if integer
  461. if (np.abs(filterLength - int(filterLength)) > 1e-10):
  462. print('halfBandDesign.py: filterLength must be an integer')
  463. invalidInput = True
  464. # check if too small
  465. if (filterLength < 7):
  466. print('halfBandDesign.py: filterLength must be larger than 6')
  467. invalidInput = True
  468. # check if proper length
  469. if (np.mod(filterLength+1,4) != 0):
  470. print('halfBandDesign.py: filterLength+1 must be divisble by 4')
  471. invalidInput = True
  472. # check range for transition band
  473. if (transitionBand <= 0 or transitionBand >= 0.5):
  474. print('halfBandDesign.py: transitionBand must be greater than 0 and less than 0.5')
  475. invalidInput = True
  476. if (invalidInput):
  477. return []
  478. else:
  479. # design a half band filter with remez
  480. cutoff = 0.25
  481. fPass = cutoff - (transitionBand/2)
  482. fStop = cutoff + (transitionBand/2)
  483. fVec = [0, fPass, fStop, 0.5]
  484. aVec = [1, 0]
  485. weights = signal.remez(filterLength,fVec,aVec)
  486. # force zero weights
  487. zeroWeightIndicesHalf = np.arange(2,(filterLength-1)/2,2,dtype=int)
  488. zeroWeightIndicesNegative = np.concatenate((-zeroWeightIndicesHalf[::-1],zeroWeightIndicesHalf))
  489. zeroWeightIndices = zeroWeightIndicesNegative - zeroWeightIndicesNegative[0] + 1
  490. weights[zeroWeightIndices] = 0
  491. return weights
  492. ###############################################################################
  493. ###############################################################################
  494. # def Pk_Search_BW(self):
  495. # BW = 0.03
  496. # return BW
  497. ###############################################################################
  498. ###############################################################################
  499. # @staticmethod
  500. def gE_Bearing_Defect_HM_Threshhold(self,alert, danger, defectType):
  501. gE_Bearing_Defect_HM_alert = np.zeros(5)
  502. gE_Bearing_Defect_HM_danger = np.zeros(5)
  503. if defectType == 'BPFO' :
  504. gE_Bearing_Defect_HM_alert[0] = alert*0.167
  505. gE_Bearing_Defect_HM_alert[1] = alert*0.131
  506. gE_Bearing_Defect_HM_alert[2] = alert*0.098
  507. gE_Bearing_Defect_HM_alert[3] = alert*0.089
  508. gE_Bearing_Defect_HM_alert[4] = alert*0.082
  509. gE_Bearing_Defect_HM_danger[0] = danger*0.167
  510. gE_Bearing_Defect_HM_danger[1] = danger*0.131
  511. gE_Bearing_Defect_HM_danger[2] = danger*0.098
  512. gE_Bearing_Defect_HM_danger[3] = danger*0.089
  513. gE_Bearing_Defect_HM_danger[4] = danger*0.082
  514. return gE_Bearing_Defect_HM_alert, gE_Bearing_Defect_HM_danger
  515. if defectType == 'BPFI':
  516. gE_Bearing_Defect_HM_alert[0] = alert*0.088
  517. gE_Bearing_Defect_HM_alert[1] = alert*0.064
  518. gE_Bearing_Defect_HM_alert[2] = alert*0.056
  519. gE_Bearing_Defect_HM_alert[3] = alert*0.035
  520. gE_Bearing_Defect_HM_alert[4] = alert*0.024
  521. gE_Bearing_Defect_HM_danger[0] = danger*0.088
  522. gE_Bearing_Defect_HM_danger[1] = danger*0.064
  523. gE_Bearing_Defect_HM_danger[2] = danger*0.056
  524. gE_Bearing_Defect_HM_danger[3] = danger*0.035
  525. gE_Bearing_Defect_HM_danger[4] = danger*0.024
  526. return gE_Bearing_Defect_HM_alert, gE_Bearing_Defect_HM_danger
  527. if defectType == 'BSF':
  528. gE_Bearing_Defect_HM_alert[0] = alert*0.088
  529. gE_Bearing_Defect_HM_alert[1] = alert*0.064
  530. gE_Bearing_Defect_HM_alert[2] = alert*0.056
  531. gE_Bearing_Defect_HM_alert[3] = alert*0.035
  532. gE_Bearing_Defect_HM_alert[4] = alert*0.024
  533. gE_Bearing_Defect_HM_danger[0] = danger*0.088
  534. gE_Bearing_Defect_HM_danger[1] = danger*0.064
  535. gE_Bearing_Defect_HM_danger[2] = danger*0.056
  536. gE_Bearing_Defect_HM_danger[3] = danger*0.035
  537. gE_Bearing_Defect_HM_danger[4] = danger*0.024
  538. return gE_Bearing_Defect_HM_alert, gE_Bearing_Defect_HM_danger
  539. if defectType == 'FTF':
  540. gE_Bearing_Defect_HM_alert[0] = alert*0.088
  541. gE_Bearing_Defect_HM_alert[1] = alert*0.064
  542. gE_Bearing_Defect_HM_alert[2] = alert*0.056
  543. gE_Bearing_Defect_HM_alert[3] = alert*0.035
  544. gE_Bearing_Defect_HM_alert[4] = alert*0.024
  545. gE_Bearing_Defect_HM_danger[0] = danger*0.088
  546. gE_Bearing_Defect_HM_danger[1] = danger*0.064
  547. gE_Bearing_Defect_HM_danger[2] = danger*0.056
  548. gE_Bearing_Defect_HM_danger[3] = danger*0.035
  549. gE_Bearing_Defect_HM_danger[4] = danger*0.024
  550. return gE_Bearing_Defect_HM_alert, gE_Bearing_Defect_HM_danger
  551. ###############################################################################
  552. ###############################################################################
  553. # @staticmethod
  554. def Vel_Bearing_Defect_HM_Threshhold(self,alert, danger, defectType):
  555. Vel_Bearing_Defect_HM_alert = np.zeros(5)
  556. Vel_Bearing_Defect_HM_danger = np.zeros(5)
  557. if defectType == 'BPFO':
  558. Vel_Bearing_Defect_HM_alert[0] = alert*1.0
  559. Vel_Bearing_Defect_HM_alert[1] = alert*1.0
  560. Vel_Bearing_Defect_HM_alert[2] = alert*1.0
  561. Vel_Bearing_Defect_HM_alert[3] = alert*1.0
  562. Vel_Bearing_Defect_HM_danger[0] = danger*1.0
  563. Vel_Bearing_Defect_HM_danger[1] = danger*1.0
  564. Vel_Bearing_Defect_HM_danger[2] = danger*1.0
  565. Vel_Bearing_Defect_HM_danger[3] = danger*1.0
  566. return Vel_Bearing_Defect_HM_alert, Vel_Bearing_Defect_HM_danger
  567. if defectType == 'BPFI':
  568. Vel_Bearing_Defect_HM_alert[0] = alert*1.0
  569. Vel_Bearing_Defect_HM_alert[1] = alert*1.0
  570. Vel_Bearing_Defect_HM_alert[2] = alert*1.0
  571. Vel_Bearing_Defect_HM_alert[3] = alert*1.0
  572. Vel_Bearing_Defect_HM_danger[0] = danger*1.0
  573. Vel_Bearing_Defect_HM_danger[1] = danger*1.0
  574. Vel_Bearing_Defect_HM_danger[2] = danger*1.0
  575. Vel_Bearing_Defect_HM_danger[3] = danger*1.0
  576. return Vel_Bearing_Defect_HM_alert, Vel_Bearing_Defect_HM_danger
  577. if defectType == 'BSF':
  578. Vel_Bearing_Defect_HM_alert[0] = alert*1.0
  579. Vel_Bearing_Defect_HM_alert[1] = alert*0.5
  580. Vel_Bearing_Defect_HM_alert[2] = alert*0.5
  581. Vel_Bearing_Defect_HM_alert[3] = alert*0.5
  582. Vel_Bearing_Defect_HM_danger[0] = danger*1.0
  583. Vel_Bearing_Defect_HM_danger[1] = danger*0.5
  584. Vel_Bearing_Defect_HM_danger[2] = danger*0.5
  585. Vel_Bearing_Defect_HM_danger[3] = danger*0.5
  586. return Vel_Bearing_Defect_HM_alert, Vel_Bearing_Defect_HM_danger
  587. ###############################################################################
  588. ###############################################################################
  589. # @staticmethod
  590. def Vel_Bearing_RunningSpd_HM_Threshhold(self,alert, danger, defectType):
  591. Vel_Bearing_RunningSpd_HM_alert = np.zeros(5)
  592. Vel_Bearing_RunningSpd_HM_danger = np.zeros(5)
  593. if defectType == 'BSF':
  594. Vel_Bearing_RunningSpd_HM_alert[0] = alert*1.0
  595. Vel_Bearing_RunningSpd_HM_alert[1] = alert*0.5
  596. Vel_Bearing_RunningSpd_HM_alert[2] = alert*0.5
  597. Vel_Bearing_RunningSpd_HM_alert[3] = alert*0.5
  598. Vel_Bearing_RunningSpd_HM_alert[4] = alert*0.5
  599. Vel_Bearing_RunningSpd_HM_danger[0] = danger*1.0
  600. Vel_Bearing_RunningSpd_HM_danger[1] = danger*0.5
  601. Vel_Bearing_RunningSpd_HM_danger[2] = danger*0.5
  602. Vel_Bearing_RunningSpd_HM_danger[3] = danger*0.5
  603. Vel_Bearing_RunningSpd_HM_danger[4] = danger*0.5
  604. return Vel_Bearing_RunningSpd_HM_alert, Vel_Bearing_RunningSpd_HM_danger
  605. ###############################################################################
  606. ###############################################################################
  607. # @staticmethod
  608. def Vel_Unbalance_HM_Threshold(self,alert, danger):
  609. Vel_Unbalance_HM_alert = np.zeros(5)
  610. Vel_Unbalance_HM_danger = np.zeros(5)
  611. Vel_Unbalance_HM_alert[0] = alert*1.0
  612. Vel_Unbalance_HM_alert[1] = alert*0.5
  613. Vel_Unbalance_HM_alert[2] = alert*0.5
  614. Vel_Unbalance_HM_alert[3] = alert*0.5
  615. Vel_Unbalance_HM_alert[4] = alert*0.5
  616. Vel_Unbalance_HM_danger[0] = danger*1.0
  617. Vel_Unbalance_HM_danger[1] = danger*0.5
  618. Vel_Unbalance_HM_danger[2] = danger*0.5
  619. Vel_Unbalance_HM_danger[3] = danger*0.5
  620. Vel_Unbalance_HM_danger[4] = danger*0.5
  621. return Vel_Unbalance_HM_alert, Vel_Unbalance_HM_danger
  622. ###############################################################################
  623. ###############################################################################
  624. # @staticmethod
  625. def Vel_Misalignment_HM_Threshold(self,alert, danger):
  626. Vel_Misalignment_HM_alert = np.zeros(5)
  627. Vel_Misalignment_HM_danger = np.zeros(5)
  628. Vel_Misalignment_HM_alert[0] = alert*1.0
  629. Vel_Misalignment_HM_alert[1] = alert*0.5
  630. Vel_Misalignment_HM_alert[2] = alert*0.5
  631. Vel_Misalignment_HM_alert[3] = alert*0.5
  632. Vel_Misalignment_HM_alert[4] = alert*0.5
  633. Vel_Misalignment_HM_danger[0] = danger*1.0
  634. Vel_Misalignment_HM_danger[1] = danger*0.5
  635. Vel_Misalignment_HM_danger[2] = danger*0.5
  636. Vel_Misalignment_HM_danger[3] = danger*0.5
  637. Vel_Misalignment_HM_danger[4] = danger*0.5
  638. return Vel_Misalignment_HM_alert, Vel_Misalignment_HM_danger
  639. ###############################################################################
  640. ###############################################################################
  641. # @staticmethod
  642. def Vel_Looseness_HM_Threshold(self,alert, danger):
  643. Vel_Looseness_HM_alert = np.zeros(5)
  644. Vel_Looseness_HM_danger = np.zeros(5)
  645. Vel_Looseness_HM_alert[0] = alert*1.0
  646. Vel_Looseness_HM_alert[1] = alert*0.5
  647. Vel_Looseness_HM_alert[2] = alert*0.5
  648. Vel_Looseness_HM_alert[3] = alert*0.5
  649. Vel_Looseness_HM_alert[4] = alert*0.5
  650. Vel_Looseness_HM_danger[0] = danger*1.0
  651. Vel_Looseness_HM_danger[1] = danger*0.5
  652. Vel_Looseness_HM_danger[2] = danger*0.5
  653. Vel_Looseness_HM_danger[3] = danger*0.5
  654. Vel_Looseness_HM_danger[4] = danger*0.5
  655. return Vel_Looseness_HM_alert, Vel_Looseness_HM_danger
  656. ###############################################################################
  657. ###############################################################################
  658. # @staticmethod
  659. def gE_2XLF_HM_Threshhold(self,alert, danger):
  660. gE_2XLF_HM_alert = np.zeros(5)
  661. gE_2XLF_HM_danger = np.zeros(5)
  662. gE_2XLF_HM_alert[0] = alert*0.167
  663. gE_2XLF_HM_alert[1] = alert*0.131
  664. gE_2XLF_HM_alert[2] = alert*0.098
  665. gE_2XLF_HM_alert[3] = alert*0.089
  666. gE_2XLF_HM_alert[4] = alert*0.082
  667. gE_2XLF_HM_danger[0] = danger*0.167
  668. gE_2XLF_HM_danger[1] = danger*0.131
  669. gE_2XLF_HM_danger[2] = danger*0.098
  670. gE_2XLF_HM_danger[3] = danger*0.089
  671. gE_2XLF_HM_danger[4] = danger*0.082
  672. return gE_2XLF_HM_alert, gE_2XLF_HM_danger
  673. ###############################################################################
  674. ###############################################################################
  675. # @staticmethod
  676. def Vel_2XLF_HM_Threshhold(self,alert, danger):
  677. Vel_2XLF_HM_alert = np.zeros(1)
  678. Vel_2XLF_HM_danger = np.zeros(1)
  679. Vel_2XLF_HM_alert[0] = alert*1.0
  680. Vel_2XLF_HM_danger[0] = danger*1.0
  681. return Vel_2XLF_HM_alert, Vel_2XLF_HM_danger
  682. ###############################################################################
  683. ###############################################################################
  684. # @staticmethod
  685. def Acc_GMF_HM_Threshhold(self,alert, danger):
  686. Acc_GMF_HM_alert = np.zeros(3)
  687. Acc_GMF_HM_danger = np.zeros(3)
  688. Acc_GMF_HM_alert[0] = alert*1.0
  689. Acc_GMF_HM_alert[1] = alert*1.0
  690. Acc_GMF_HM_alert[2] = alert*1.0
  691. Acc_GMF_HM_danger[0] = danger*1.0
  692. Acc_GMF_HM_danger[1] = danger*1.0
  693. Acc_GMF_HM_danger[2] = danger*1.0
  694. return Acc_GMF_HM_alert, Acc_GMF_HM_danger
  695. ###############################################################################
  696. ###############################################################################
  697. # @staticmethod
  698. def Vel_GMF_HM_Threshhold(self,alert, danger):
  699. Vel_GMF_HM_alert = np.zeros(3)
  700. Vel_GMF_HM_danger = np.zeros(3)
  701. Vel_GMF_HM_alert[0] = alert*1.0
  702. Vel_GMF_HM_alert[1] = alert*1.0
  703. Vel_GMF_HM_alert[2] = alert*1.0
  704. Vel_GMF_HM_danger[0] = danger*1.0
  705. Vel_GMF_HM_danger[1] = danger*1.0
  706. Vel_GMF_HM_danger[2] = danger*1.0
  707. return Vel_GMF_HM_alert, Vel_GMF_HM_danger
  708. ###############################################################################
  709. ###############################################################################
  710. # @staticmethod
  711. def gE_GMF_HM_Threshhold(self,alert, danger):
  712. gE_GMF_HM_alert = np.zeros(3)
  713. gE_GMF_HM_danger = np.zeros(3)
  714. gE_GMF_HM_alert[0] = alert*0.167
  715. gE_GMF_HM_alert[1] = alert*0.131
  716. gE_GMF_HM_alert[2] = alert*0.098
  717. gE_GMF_HM_danger[0] = danger*0.167
  718. gE_GMF_HM_danger[1] = danger*0.131
  719. gE_GMF_HM_danger[2] = danger*0.098
  720. return gE_GMF_HM_alert, gE_GMF_HM_danger
  721. ###############################################################################
  722. ###############################################################################
  723. # @staticmethod
  724. def gE_GTIF_HM_Threshhold(self,alert, danger):
  725. gE_GTIF_HM_alert = np.zeros(5)
  726. gE_GTIF_HM_danger = np.zeros(5)
  727. gE_GTIF_HM_alert[0] = alert*0.167
  728. gE_GTIF_HM_alert[1] = alert*0.131
  729. gE_GTIF_HM_alert[2] = alert*0.098
  730. gE_GTIF_HM_alert[3] = alert*0.089
  731. gE_GTIF_HM_alert[4] = alert*0.082
  732. gE_GTIF_HM_danger[0] = danger*0.167
  733. gE_GTIF_HM_danger[1] = danger*0.131
  734. gE_GTIF_HM_danger[2] = danger*0.098
  735. gE_GTIF_HM_danger[3] = danger*0.089
  736. gE_GTIF_HM_danger[4] = danger*0.082
  737. return gE_GTIF_HM_alert, gE_GTIF_HM_danger
  738. ###############################################################################
  739. ###############################################################################
  740. # @staticmethod
  741. def Vel_VPF_HM_Threshhold(self,alert, danger):
  742. Vel_VPF_HM_alert = np.zeros(2)
  743. Vel_VPF_HM_danger = np.zeros(2)
  744. Vel_VPF_HM_alert[0] = alert*1.0
  745. Vel_VPF_HM_alert[1] = alert*1.0
  746. Vel_VPF_HM_danger[0] = danger*1.0
  747. Vel_VPF_HM_danger[1] = danger*1.0
  748. return Vel_VPF_HM_alert, Vel_VPF_HM_danger
  749. ###############################################################################
  750. ###############################################################################
  751. # @staticmethod
  752. def Vel_BTF_HM_Threshhold(self,alert, danger):
  753. Vel_BTF_HM_alert = np.zeros(2)
  754. Vel_BTF_HM_danger = np.zeros(2)
  755. Vel_BTF_HM_alert[0] = alert*1.0
  756. Vel_BTF_HM_alert[1] = alert*1.0
  757. Vel_BTF_HM_danger[0] = danger*1.0
  758. Vel_BTF_HM_danger[1] = danger*1.0
  759. return Vel_BTF_HM_alert, Vel_BTF_HM_danger
  760. ###############################################################################
  761. ###############################################################################
  762. # @staticmethod
  763. def Vel_SHF_HM_Threshhold(self,alert, danger):
  764. Vel_SHF_HM_alert = np.zeros(1)
  765. Vel_SHF_HM_danger = np.zeros(1)
  766. Vel_SHF_HM_alert[0] = alert*1.0
  767. Vel_SHF_HM_danger[0] = danger*1.0
  768. return Vel_SHF_HM_alert, Vel_SHF_HM_danger
  769. ###############################################################################
  770. ###############################################################################
  771. # @staticmethod
  772. def Vel_RBPF_HM_Threshhold(self,alert, danger):
  773. Vel_RBPF_HM_alert = np.zeros(1)
  774. Vel_RBPF_HM_danger = np.zeros(1)
  775. Vel_RBPF_HM_alert[0] = alert*1.0
  776. Vel_RBPF_HM_danger[0] = danger*1.0
  777. return Vel_RBPF_HM_alert, Vel_RBPF_HM_danger
  778. ###############################################################################
  779. ###############################################################################
  780. # @staticmethod
  781. def Acc_RBPF_HM_Threshhold(self,alert, danger):
  782. Acc_RBPF_HM_alert = np.zeros(1)
  783. Acc_RBPF_HM_danger = np.zeros(1)
  784. Acc_RBPF_HM_alert[0] = alert*1.0
  785. Acc_RBPF_HM_danger[0] = danger*1.0
  786. return Acc_RBPF_HM_alert, Acc_RBPF_HM_danger
  787. ###############################################################################
  788. ###############################################################################
  789. # @staticmethod
  790. def Bearing_Fault_Diag(self,gE_Bearing_Defect_HM, Vel_Bearing_Defect_HM, Vel_RunningSpd_HM, gE_alert, gE_danger, Vel_alert, Vel_danger, defectType):
  791. BrDefDetection = False
  792. BrDefSev = 0
  793. gE_Bearing_Defect_HM_alert = np.zeros(5)
  794. gE_Bearing_Defect_HM_danger = np.zeros(5)
  795. Vel_Bearing_Defect_HM_alert = np.zeros(5)
  796. Vel_Bearing_Defect_HM_danger = np.zeros(5)
  797. Vel_Bearing_RunningSpd_HM_alert = np.zeros(5)
  798. Vel_Bearing_RunningSpd_HM_danger = np.zeros(5)
  799. ###############################################################################
  800. # Check bearing outer race and inner race defect
  801. if (defectType == 'BPFO') or (defectType == 'BPFI'):
  802. [gE_Bearing_Defect_HM_alert, gE_Bearing_Defect_HM_danger] = self.gE_Bearing_Defect_HM_Threshhold(gE_alert, gE_danger, defectType)
  803. # [Vel_Bearing_RunningSpd_HM_alert, Vel_Bearing_RunningSpd_HM_danger] = self.Vel_Bearing_RunningSpd_HM_Threshhold(Vel_alert, Vel_danger, defectType)
  804. [Vel_Bearing_Defect_HM_alert, Vel_Bearing_Defect_HM_danger] = self.Vel_Bearing_Defect_HM_Threshhold(Vel_alert, Vel_danger, defectType)
  805. # Bearing outer race frequency, severe, confirmed by velocity spectrum, CF = 8, Severity = 10
  806. # AND
  807. # OR
  808. # ge_BPFO_1 >= Alert
  809. # ge_BPFO_2 >= Alert
  810. # OR
  811. # Vel_BPFO_1 >= Alert
  812. # Vel_BPFO_2 >= Alert
  813. #
  814. # above logics apply to BPFI as well
  815. if (gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_alert[0] or gE_Bearing_Defect_HM[1] >= gE_Bearing_Defect_HM_alert[1]) and \
  816. (Vel_Bearing_Defect_HM[0] >= Vel_Bearing_Defect_HM_alert[0] or Vel_Bearing_Defect_HM[1] >= Vel_Bearing_Defect_HM_alert[1]):
  817. BrDefDetection = True
  818. BrDefSev = 8
  819. return BrDefDetection, BrDefSev
  820. # Bearing outer race frequency, severe, no confirming by velocity spectrum, CF = 6, Severity = 10
  821. # AND
  822. # OR
  823. # AND
  824. # ge_BPFO_1 >= Danger
  825. # ge_BPFO_2 >= Alert
  826. # AND
  827. # gE_BPFO_1 >= Danger
  828. # gE_BPFO_3 >= Alert
  829. # AND
  830. # gE_BPFO_1 >= Danger
  831. # gE_BPFO_4 >= Alert
  832. # NOR
  833. # Vel_BPFO_1 >= Alert
  834. # Vel_BPFO_2 >= Alert
  835. #
  836. # above logics apply to BPFI as well
  837. else:
  838. if ((gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_danger[0] and gE_Bearing_Defect_HM[1] >= gE_Bearing_Defect_HM_alert[1]) or \
  839. (gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_danger[0] and gE_Bearing_Defect_HM[2] >= gE_Bearing_Defect_HM_alert[2]) or \
  840. (gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_danger[0] and gE_Bearing_Defect_HM[3] >= gE_Bearing_Defect_HM_alert[3])) and \
  841. (not(Vel_Bearing_Defect_HM[0] >= Vel_Bearing_Defect_HM_alert[0] or Vel_Bearing_Defect_HM[1] >= Vel_Bearing_Defect_HM_alert[1])):
  842. BrDefDetection = True
  843. BrDefSev = 6
  844. return BrDefDetection, BrDefSev
  845. # Bearing outer race frequency, severe, not confirmed by gE spectrum, CF = 6, Severity = 10
  846. # OR
  847. # Vel_BPFO_1 >= Alert
  848. # Vel_BPFO_2 >= Alert
  849. #
  850. # above logics apply to BPFI as well
  851. else:
  852. if (Vel_Bearing_Defect_HM[0] >= Vel_Bearing_Defect_HM_alert[0] or Vel_Bearing_Defect_HM[1] >= Vel_Bearing_Defect_HM_alert[1]):
  853. BrDefDetection = True
  854. BrDefSev = 6
  855. return BrDefDetection, BrDefSev
  856. # Bearing outer race frequency, moderate, several defect peaks, no confirming by velocity spectrum, CF = 5, Severity = 5
  857. # AND
  858. # OR
  859. # AND
  860. # ge_BPFO_1 >= Alert
  861. # ge_BPFO_2 >= Alert
  862. # AND
  863. # gE_BPFO_1 >= Alert
  864. # gE_BPFO_3 >= Alert
  865. # AND
  866. # gE_BPFO_1 >= Alert
  867. # gE_BPFO_4 >= Alert
  868. # NOR
  869. # Vel_BPFO_1 >= Alert
  870. # Vel_BPFO_2 >= Alert
  871. #
  872. # above logics apply to BPFI as well
  873. else:
  874. if ((gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_alert[0] and gE_Bearing_Defect_HM[1] >= gE_Bearing_Defect_HM_alert[1]) or \
  875. (gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_alert[0] and gE_Bearing_Defect_HM[2] >= gE_Bearing_Defect_HM_alert[2]) or \
  876. (gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_alert[0] and gE_Bearing_Defect_HM[3] >= gE_Bearing_Defect_HM_alert[3])) and \
  877. (not(Vel_Bearing_Defect_HM[0] >= Vel_Bearing_Defect_HM_alert[0] or Vel_Bearing_Defect_HM[1] >= Vel_Bearing_Defect_HM_alert[1])):
  878. BrDefDetection = True
  879. BrDefSev = 3
  880. return BrDefDetection, BrDefSev
  881. # Bearing outer race frequency, suspect, only 1x defect peak evaluated, CF = 3, Severity = 5
  882. # ge_BPFO_1 >= Alert
  883. #
  884. # above logics apply to BPFI as well
  885. else:
  886. if (gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_alert[0]):
  887. BrDefDetection = True
  888. BrDefSev = 1
  889. return BrDefDetection, BrDefSev
  890. return BrDefDetection, BrDefSev
  891. ###############################################################################
  892. # Check bearing rolling element defect
  893. if defectType == 'BSF':
  894. [gE_Bearing_Defect_HM_alert, gE_Bearing_Defect_HM_danger] = self.gE_Bearing_Defect_HM_Threshhold(gE_alert, gE_danger, defectType)
  895. [Vel_Bearing_RunningSpd_HM_alert, Vel_Bearing_RunningSpd_HM_danger] = self.Vel_Bearing_RunningSpd_HM_Threshhold(Vel_alert, Vel_danger, defectType)
  896. [Vel_Bearing_Defect_HM_alert, Vel_Bearing_Defect_HM_danger] = self.Vel_Bearing_Defect_HM_Threshhold(Vel_alert, Vel_danger, defectType)
  897. # print(Vel_Bearing_RunningSpd_HM_alert, Vel_Bearing_RunningSpd_HM_danger)
  898. # Bearing rolling element frequency, severe, CF = 9, Severity = 10
  899. # AND
  900. # AND
  901. # Vel_BSF_2 >= Alert
  902. # Vel_BSF_4 >= Alert
  903. # NOR
  904. # Vel_RS_2 >= Alert
  905. # Vel_RS_3 >= Alert
  906. # Vel_RS_4 >= Alert
  907. # Vel_RS_5 >= Alert
  908. if (Vel_Bearing_Defect_HM[1] >= Vel_Bearing_Defect_HM_alert[1] and Vel_Bearing_Defect_HM[3] >= Vel_Bearing_Defect_HM_alert[3]) and \
  909. (not(Vel_RunningSpd_HM[1] >= Vel_Bearing_RunningSpd_HM_alert[1] or Vel_RunningSpd_HM[2] >= Vel_Bearing_RunningSpd_HM_alert[2] or \
  910. Vel_RunningSpd_HM[3] >= Vel_Bearing_RunningSpd_HM_alert[3] or Vel_RunningSpd_HM[4] >= Vel_Bearing_RunningSpd_HM_alert[4])):
  911. BrDefDetection = True
  912. BrDefSev = 9
  913. return BrDefDetection, BrDefSev
  914. # Bearing rolling element frequency, moderate, CF = 9, Severity = 5
  915. # AND
  916. # AND
  917. # gE_BSF_1 >= Alert
  918. # NOR
  919. # Vel_BSF_2 >= Alert
  920. # Vel_BSF_4 >= Alert
  921. # Vel_RS_2 >= Alert
  922. # Vel_RS_3 >= Alert
  923. # Vel_RS_4 >= Alert
  924. # Vel_RS_5 >= Alert
  925. else:
  926. if gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_alert[0] and \
  927. (not(Vel_Bearing_Defect_HM[1] >= Vel_Bearing_Defect_HM_alert[1] or Vel_Bearing_Defect_HM[3] >= Vel_Bearing_Defect_HM_alert[3] or \
  928. Vel_RunningSpd_HM[1] >= Vel_Bearing_RunningSpd_HM_alert[1] or Vel_RunningSpd_HM[2] >= Vel_Bearing_RunningSpd_HM_alert[2] or \
  929. Vel_RunningSpd_HM[3] >= Vel_Bearing_RunningSpd_HM_alert[3] or Vel_RunningSpd_HM[4] >= Vel_Bearing_RunningSpd_HM_alert[4])):
  930. BrDefDetection = True
  931. BrDefSev = 5
  932. return BrDefDetection, BrDefSev
  933. # Bearing rolling element frequency, suspect, CF = 3, Severity = 5
  934. # AND
  935. # OR
  936. # gE_BSF_1 = Alert
  937. # gE_BSF_2 = Alert
  938. # gE_BSF_4 = Alert
  939. # NOR
  940. # gE_BSF_1 = Danger
  941. # gE_BSF_2 = Danger
  942. # gE_BSF_4 = Danger
  943. # Vel_BSF_2 >= Alert
  944. # Vel_BSF_4 >= Alert
  945. # Vel_RS_2 >= Alert
  946. # Vel_RS_3 >= Alert
  947. # Vel_RS_4 >= Alert
  948. # Vel_RS_5 >= Alert
  949. else:
  950. if ((gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_alert[0] and gE_Bearing_Defect_HM[0] < gE_Bearing_Defect_HM_danger[0]) or \
  951. (gE_Bearing_Defect_HM[1] >= gE_Bearing_Defect_HM_alert[1] and gE_Bearing_Defect_HM[1] < gE_Bearing_Defect_HM_danger[1]) or \
  952. (gE_Bearing_Defect_HM[3] >= gE_Bearing_Defect_HM_alert[3] and gE_Bearing_Defect_HM[3] < gE_Bearing_Defect_HM_danger[3] )) and \
  953. (not(gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_danger[0] or gE_Bearing_Defect_HM[1] >= gE_Bearing_Defect_HM_danger[1] or gE_Bearing_Defect_HM[3] >= gE_Bearing_Defect_HM_danger[3] or \
  954. Vel_Bearing_Defect_HM[0] >= Vel_Bearing_Defect_HM_alert[0] or Vel_Bearing_Defect_HM[1] >= Vel_Bearing_Defect_HM_alert[1] or \
  955. Vel_RunningSpd_HM[1] >= Vel_Bearing_RunningSpd_HM_alert[1] or Vel_RunningSpd_HM[2] >= Vel_Bearing_RunningSpd_HM_alert[2] or \
  956. Vel_RunningSpd_HM[3] >= Vel_Bearing_RunningSpd_HM_alert[3] or Vel_RunningSpd_HM[4] >= Vel_Bearing_RunningSpd_HM_alert[4])):
  957. BrDefDetection = True
  958. BrDefSev = 1
  959. return BrDefDetection, BrDefSev
  960. return BrDefDetection, BrDefSev
  961. ###############################################################################
  962. # Check bearing cage defect
  963. if defectType == 'FTF':
  964. [gE_Bearing_Defect_HM_alert, gE_Bearing_Defect_HM_danger] = self.gE_Bearing_Defect_HM_Threshhold(gE_alert, gE_danger, defectType)
  965. # Bearing cage frequency, severe, CF = 6, Severity = 10
  966. # OR
  967. # gE_CG_1 >= Danger
  968. # gE_CG_2 >= Danger
  969. if gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_danger[0] or gE_Bearing_Defect_HM[1] >= gE_Bearing_Defect_HM_danger[1]:
  970. BrDefDetection = True
  971. BrDefSev = 6
  972. return BrDefDetection, BrDefSev
  973. # Bearing cage frequency, moderate, CF = 5, Severity = 5
  974. # AND
  975. # OR
  976. # gE_CG_1 >= Alert
  977. # gE_CG_2 >= Alert
  978. # NOR
  979. # gE_CG_1 = Danger
  980. # gE_CG_2 = Danger
  981. else:
  982. if (gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_alert[0] or gE_Bearing_Defect_HM[1] >= gE_Bearing_Defect_HM_alert[1]) and \
  983. (not(gE_Bearing_Defect_HM[0] >= gE_Bearing_Defect_HM_danger[0] or gE_Bearing_Defect_HM[1] >= gE_Bearing_Defect_HM_danger[1])):
  984. BrDefDetection = True
  985. BrDefSev = 3
  986. return BrDefDetection, BrDefSev
  987. return BrDefDetection, BrDefSev
  988. ###############################################################################
  989. ###############################################################################
  990. # @staticmethod
  991. def RunningSpd_Symptom_Rule(self,Vel_RunningSpd_HM, Vel_RunningSpd_HM_alert, Vel_RunningSpd_HM_danger):
  992. RPM1_MOD = False
  993. RPM1_SEV = False
  994. RPM2_MOD = False
  995. RPM2_SEV = False
  996. RPM345_MOD = False
  997. RPM345_SEV = False
  998. # 1x RPM, Moderate, CF=8, Severity = 5
  999. # AND
  1000. # Vel_RS_1 = Alert
  1001. if Vel_RunningSpd_HM[0] >= Vel_RunningSpd_HM_alert[0] and Vel_RunningSpd_HM[0] < Vel_RunningSpd_HM_danger[0]:
  1002. RPM1_MOD = True
  1003. # 1x RPM, Severe, CF=8, Severity = 10
  1004. # AND
  1005. # Vel_RS_1 = Danger
  1006. if Vel_RunningSpd_HM[0] >= Vel_RunningSpd_HM_danger[0]:
  1007. RPM1_SEV = True
  1008. # 2x RPM, Moderate, CF=8, Severity = 5
  1009. # AND
  1010. # Vel_RS_2 = Alert
  1011. if Vel_RunningSpd_HM[1] >= Vel_RunningSpd_HM_alert[1] and Vel_RunningSpd_HM[1] < Vel_RunningSpd_HM_danger[1]:
  1012. RPM2_MOD = True
  1013. # 2x RPM, Severe, CF=8, Severity = 10
  1014. # AND
  1015. # Vel_RS_2 = Danger
  1016. if Vel_RunningSpd_HM[1] >= Vel_RunningSpd_HM_danger[1]:
  1017. RPM2_SEV = True
  1018. # 3x, 4x, 5x RPM, moderate, CF=8, Severity = 5
  1019. # AND
  1020. # OR
  1021. # Vel_RS_3 = Alert
  1022. # Vel_RS_4 = Alert
  1023. # Vel_RS_5 = Alert
  1024. # NOR
  1025. # Vel_RS_3 = Danger
  1026. # Vel_RS_4 = Danger
  1027. # Vel_RS_5 = Danger
  1028. if (Vel_RunningSpd_HM[2] >= Vel_RunningSpd_HM_alert[2] and Vel_RunningSpd_HM[2] < Vel_RunningSpd_HM_danger[2] or \
  1029. Vel_RunningSpd_HM[3] >= Vel_RunningSpd_HM_alert[3] and Vel_RunningSpd_HM[3] < Vel_RunningSpd_HM_danger[3] or \
  1030. Vel_RunningSpd_HM[4] >= Vel_RunningSpd_HM_alert[4] and Vel_RunningSpd_HM[4] < Vel_RunningSpd_HM_danger[4]) and \
  1031. (not(Vel_RunningSpd_HM[2] >= Vel_RunningSpd_HM_danger[2] or Vel_RunningSpd_HM[3] >= Vel_RunningSpd_HM_danger[3] or \
  1032. Vel_RunningSpd_HM[4] >= Vel_RunningSpd_HM_danger[4])):
  1033. RPM345_MOD = True
  1034. # 3x, 4x, 5x RPM, Sever, CF=8, Severity = 10
  1035. # OR
  1036. # Vel_RS_3 = Danger
  1037. # Vel_RS_4 = Danger
  1038. # Vel_RS_5 = Danger
  1039. if Vel_RunningSpd_HM[2] >= Vel_RunningSpd_HM_danger[2] or Vel_RunningSpd_HM[3] >= Vel_RunningSpd_HM_danger[3] or \
  1040. Vel_RunningSpd_HM[4] >= Vel_RunningSpd_HM_danger[4]:
  1041. RPM345_SEV = True
  1042. return RPM1_MOD, RPM1_SEV, RPM2_MOD, RPM2_SEV, RPM345_MOD, RPM345_SEV
  1043. ###############################################################################
  1044. ###############################################################################
  1045. # @staticmethod
  1046. # Note: The alert and danger threshold values (in mm/s RMS) are set according to ISO vibration standard for flexible mounting in group 3
  1047. def RunningSpd_Fault_Diag(self,Vel_RunningSpd_HM, Vel_alert = 7.1, Vel_danger = 11, defectType = 'Unbalance'):
  1048. RPM1_MOD = False
  1049. RPM1_SEV = False
  1050. RPM2_MOD = False
  1051. RPM2_SEV = False
  1052. RPM345_MOD = False
  1053. RPM345_SEV = False
  1054. UnbalanceDetection = False
  1055. UnbalanceSev = 0
  1056. MisalignmentDetction = False
  1057. MisalignmentSev = 0
  1058. LoosenessDetection = False
  1059. LoosenessSev = 0
  1060. Vel_Unbalance_HM_alert = np.zeros(5)
  1061. Vel_Unbalance_HM_danger = np.zeros(5)
  1062. Vel_Misalignment_HM_alert = np.zeros(5)
  1063. Vel_Misalignment_HM_danger = np.zeros(5)
  1064. Vel_Looseness_HM_alert = np.zeros(5)
  1065. Vel_Looseness_HM_danger = np.zeros(5)
  1066. ###############################################################################
  1067. # Check Unbalance
  1068. if defectType == 'Unbalance':
  1069. [Vel_Unbalance_HM_alert, Vel_Unbalance_HM_danger] = self.Vel_Unbalance_HM_Threshold(Vel_alert, Vel_danger)
  1070. [RPM1_MOD, RPM1_SEV, RPM2_MOD, RPM2_SEV, RPM345_MOD, RPM345_SEV] = self.RunningSpd_Symptom_Rule(Vel_RunningSpd_HM, Vel_Unbalance_HM_alert, Vel_Unbalance_HM_danger)
  1071. # print('RPM1_MOD,RPM1_SEV, RPM2_MOD, RPM2_SEV, RPM345_MOD, RPM345_SEV',' ',RPM1_MOD,' ', RPM1_SEV,' ', RPM2_MOD, ' ',RPM2_SEV, ' ',RPM345_MOD, ' ',RPM345_SEV)
  1072. # Unbalance, severe, rather confident, 1x RPM peak dominates, CF=8, Severity = 10
  1073. # AND
  1074. # RPM1_SEV == True
  1075. # NOR
  1076. # RPM2_MOD == True
  1077. # RPM2_SEV == True
  1078. # RPM345_MOD == True
  1079. # RPM345_SEV == True
  1080. if RPM1_SEV == True and (not (RPM2_MOD == True or RPM2_SEV == True or RPM345_MOD == True or RPM345_SEV == True )):
  1081. UnbalanceDetection = True
  1082. UnbalanceSev = 8
  1083. else:
  1084. # Unbalance, severe, somewhat confident 1x RPM peak dominates but low level of 2xRPM is possible, CF=6, Severity = 10
  1085. # AND
  1086. # RPM1_SEV == True
  1087. # NOR
  1088. # RPM2_SEV == True
  1089. # RPM345_MOD == True
  1090. # RPM345_SEV == True
  1091. if RPM1_SEV == True and (not(RPM2_SEV == True or RPM345_MOD == True or RPM345_SEV == True )):
  1092. UnbalanceDetection = True
  1093. UnbalanceSev = 6
  1094. else:
  1095. # Unbalance, moderate, rather confident since 1x RPM peak dominates, CF=8, Severity = 5
  1096. # AND
  1097. # RPM1_MOD == True
  1098. # NOR
  1099. # RPM2_MOD == True
  1100. # RPM2_SEV == True
  1101. # RPM345_MOD == True
  1102. # RPM345_SEV == True
  1103. if RPM1_MOD == True and (not(RPM2_MOD == True or RPM2_SEV == True or RPM345_MOD == True or RPM345_SEV == True )):
  1104. UnbalanceDetection = True
  1105. UnbalanceSev = 5
  1106. return UnbalanceDetection, UnbalanceSev
  1107. ###############################################################################
  1108. # Check Misalignment
  1109. if defectType == 'Misalignment':
  1110. [Vel_Misalignment_HM_alert, Vel_Misalignment_HM_danger] = self.Vel_Misalignment_HM_Threshold(Vel_alert, Vel_danger)
  1111. [RPM1_MOD, RPM1_SEV, RPM2_MOD, RPM2_SEV, RPM345_MOD, RPM345_SEV] = self.RunningSpd_Symptom_Rule(Vel_RunningSpd_HM, Vel_Misalignment_HM_alert, Vel_Misalignment_HM_danger)
  1112. # Misalignment, moderate CF = 8, Severity = 10
  1113. # AND
  1114. # RPM2_SEV == True
  1115. # OR
  1116. # RPM1_MOD == True
  1117. # RPM1_SEV == True
  1118. # RPM345_MOD == True
  1119. # NOR
  1120. # RPM345_SEV == True
  1121. if RPM2_SEV == True and (RPM1_MOD == True or RPM1_SEV == True or RPM345_MOD == True) and (not(RPM1_SEV == True)):
  1122. MisalignmentDetction = True
  1123. MisalignmentSev = 8
  1124. # Misalignment, moderate CF = 6, Severity 10
  1125. # AND
  1126. # RPM2_SEV == True
  1127. # NOR
  1128. # RPM1_MOD == True
  1129. # RPM1_SEV == True
  1130. # RPM345_MOD == True
  1131. # RPM345_SEV == True
  1132. else:
  1133. if RPM2_SEV == True and (not(RPM1_MOD == True or RPM1_SEV == True or RPM345_MOD == True or RPM345_SEV == True)):
  1134. MisalignmentDetction = True
  1135. MisalignmentSev = 6
  1136. # Misalignment, moderate CF = 8, Severity = 5
  1137. # AND
  1138. # RPM2_MOD == True
  1139. # OR
  1140. # RPM1_MOD == True
  1141. # RPM345_MOD == True
  1142. # NOR
  1143. # RPM1_SEV == True
  1144. # RPM345_SEV == True
  1145. else:
  1146. if RPM2_MOD == True and (RPM1_MOD == True or RPM345_MOD == True) and (not(RPM1_SEV == True or RPM345_SEV == True)):
  1147. MisalignmentDetction = True
  1148. MisalignmentSev = 5
  1149. # Misalignment, moderate CF = 6, Severity = 5
  1150. # AND
  1151. # RPM2_MOD == True
  1152. # NOR
  1153. # RPM1_MOD == True
  1154. # RPM1_SEV == True
  1155. # RPM345_MOD == True
  1156. # RPM345_SEV == True
  1157. else:
  1158. if RPM2_MOD == True and (not (RPM1_MOD == True or RPM1_SEV == True or RPM345_MOD == True or RPM345_SEV == True)):
  1159. MisalignmentDetction = True
  1160. MisalignmentSev = 4
  1161. return MisalignmentDetction, MisalignmentSev
  1162. ###############################################################################
  1163. # Check Looseness
  1164. if defectType == 'Looseness':
  1165. [Vel_Looseness_HM_alert, Vel_Looseness_HM_danger] = self.Vel_Looseness_HM_Threshold(Vel_alert, Vel_danger)
  1166. [RPM1_MOD, RPM1_SEV, RPM2_MOD, RPM2_SEV, RPM345_MOD, RPM345_SEV] = self.RunningSpd_Symptom_Rule(Vel_RunningSpd_HM, Vel_Looseness_HM_alert, Vel_Looseness_HM_danger)
  1167. # Mechanical looseness, sever CF = 8, Severity = 10
  1168. # OR
  1169. # AND
  1170. # RPM1_SEV == True
  1171. # OR
  1172. # RPM345_MOD == True
  1173. # RPM345_SEV == True
  1174. # AND
  1175. # RPM2_SEV == True
  1176. # OR
  1177. # RPM345_MOD == True
  1178. # RPM345_SEV == True
  1179. # AND
  1180. # RPM345_SEV == True
  1181. # OR
  1182. # RPM1_MOD == True
  1183. # RPM1_SEV == True
  1184. # AND
  1185. # RPM345_SEV == True
  1186. # OR
  1187. # RPM2_MOD == True
  1188. # RPM2_SEV == True
  1189. if (RPM1_SEV == True and (RPM345_MOD == True or RPM345_SEV == True )) or (RPM2_SEV == True and (RPM345_MOD == True or RPM345_SEV == True )) or \
  1190. (RPM345_SEV == True and (RPM1_MOD == True or RPM1_SEV == True )) or (RPM345_SEV == True and (RPM2_MOD == True or RPM2_SEV == True )):
  1191. LoosenessDetection = True
  1192. LoosenessSev = 8
  1193. # Mechanical looseness, sever CF = 6, Severity = 10
  1194. # AND
  1195. # RPM345_SEV == True
  1196. # NOR
  1197. # RPM1_MOD == True
  1198. # RPM1_SEV == True
  1199. # RPM2_MOD == True
  1200. # RPM2_SEV == True
  1201. else:
  1202. if RPM345_SEV == True and (not( RPM1_MOD == True or RPM1_SEV == True or RPM2_MOD == True or RPM2_SEV == True )):
  1203. LoosenessDetection = True
  1204. LoosenessSev = 6
  1205. # Mechanical looseness, moderate CF = 8, Severity = 5
  1206. # AND
  1207. # OR
  1208. # AND
  1209. # RPM1_MOD == True
  1210. # RPM345_MOD == True
  1211. # AND
  1212. # RPM2_MOD == True
  1213. # RPM345_MOD == True
  1214. # NOR
  1215. # RPM1_SEV == True
  1216. # RPM2_SEV == True
  1217. # RPM345_SEV == True
  1218. else:
  1219. if ((RPM1_MOD == True and RPM345_MOD == True )or(RPM2_MOD == True and RPM345_MOD == True))and\
  1220. (not(RPM1_SEV == True or RPM2_SEV == True or RPM345_SEV == True)):
  1221. LoosenessDetection = True
  1222. LoosenessSev = 5
  1223. # Mechanical looseness, moderate CF = 6, Severity = 5
  1224. # AND
  1225. # RPM345_MOD == True
  1226. # NOR
  1227. # RPM1_MOD == True
  1228. # RPM1_SEV == True
  1229. # RPM2_MOD == True
  1230. # RPM2_SEV == True
  1231. else:
  1232. if RPM345_MOD == True and (not( RPM1_MOD == True or RPM1_SEV == True or RPM2_MOD == True or \
  1233. RPM2_SEV == True )):
  1234. LoosenessDetection = True
  1235. LoosenessSev = 4
  1236. return LoosenessDetection, LoosenessSev
  1237. ###############################################################################
  1238. ###############################################################################
  1239. # @staticmethod
  1240. def GMF_GTIF_Symptom_Rule(self,Vel_GMF_HM, Acc_GMF_HM, gE_GMF_HM, gE_GTIF_HM, Vel_GMF_HM_alert, Vel_GMF_HM_danger, \
  1241. Acc_GMF_HM_alert, Acc_GMF_HM_danger, gE_GMF_HM_alert, gE_GMF_HM_danger, gE_GTIF_HM_alert, \
  1242. gE_GTIF_HM_danger):
  1243. GMF_MOD = False
  1244. GMF_SEV = False
  1245. GTIF = False
  1246. # Gear mesh frequency and harmonics, moderate, CF=8, Severity = 5
  1247. # AND
  1248. # OR
  1249. # Vel_GMF_1 = Alert
  1250. # Vel_GMF_2 = Alert
  1251. # Vel_GMF_3 = Alert
  1252. # Acc_GMF_1 = Alert
  1253. # Acc_GMF_2 = Alert
  1254. # Acc_GMF_3 = Alert
  1255. # gE_GMF_1 = Alert
  1256. # gE_GMF_2 = Alert
  1257. # gE_GMF_3 = Alert
  1258. # NOR
  1259. # Vel_GMF_1 = Danger
  1260. # Vel_GMF_2 = Danger
  1261. # Vel_GMF_3 = Danger
  1262. # Acc_GMF_1 = Danger
  1263. # Acc_GMF_2 = Danger
  1264. # Acc_GMF_3 = Danger
  1265. # gE_GMF_1 = Danger
  1266. # gE_GMF_2 = Danger
  1267. # gE_GMF_3 = Danger
  1268. if (Vel_GMF_HM[0] >= Vel_GMF_HM_alert[0] and Vel_GMF_HM[0] < Vel_GMF_HM_danger[0] or \
  1269. Vel_GMF_HM[1] >= Vel_GMF_HM_alert[1] and Vel_GMF_HM[1] < Vel_GMF_HM_danger[1] or \
  1270. Vel_GMF_HM[2] >= Vel_GMF_HM_alert[2] and Vel_GMF_HM[2] < Vel_GMF_HM_danger[2] or \
  1271. Acc_GMF_HM[0] >= Acc_GMF_HM_alert[0] and Acc_GMF_HM[0] < Acc_GMF_HM_danger[0] or \
  1272. Acc_GMF_HM[1] >= Acc_GMF_HM_alert[1] and Acc_GMF_HM[1] < Acc_GMF_HM_danger[1] or \
  1273. Acc_GMF_HM[2] >= Acc_GMF_HM_alert[2] and Acc_GMF_HM[2] < Acc_GMF_HM_danger[2] or \
  1274. gE_GMF_HM[0] >= gE_GMF_HM_alert[0] and gE_GMF_HM[0] < gE_GMF_HM_danger[0] or \
  1275. gE_GMF_HM[1] >= gE_GMF_HM_alert[1] and gE_GMF_HM[1] < gE_GMF_HM_danger[1] or \
  1276. gE_GMF_HM[2] >= gE_GMF_HM_alert[2] and gE_GMF_HM[2] < gE_GMF_HM_danger[2]) \
  1277. and \
  1278. (not(Vel_GMF_HM[0] >= Vel_GMF_HM_danger[0] or \
  1279. Vel_GMF_HM[1] >= Vel_GMF_HM_danger[1] or \
  1280. Vel_GMF_HM[2] >= Vel_GMF_HM_danger[2] or \
  1281. Acc_GMF_HM[0] >= Acc_GMF_HM_danger[0] or \
  1282. Acc_GMF_HM[1] >= Acc_GMF_HM_danger[1] or \
  1283. Acc_GMF_HM[2] >= Acc_GMF_HM_danger[2] or \
  1284. gE_GMF_HM[0] >= gE_GMF_HM_danger[0] or \
  1285. gE_GMF_HM[1] >= gE_GMF_HM_danger[1] or \
  1286. gE_GMF_HM[2] >= gE_GMF_HM_danger[2])):
  1287. GMF_MOD = True
  1288. # Gear mesh frequency and harmonics, sever, CF=8, Severity = 10
  1289. # OR
  1290. # Vel_GMF_1 = Danger
  1291. # Vel_GMF_2 = Danger
  1292. # Vel_GMF_3 = Danger
  1293. # Acc_GMF_1 = Danger
  1294. # Acc_GMF_2 = Danger
  1295. # Acc_GMF_3 = Danger
  1296. # gE_GMF_1 = Danger
  1297. # gE_GMF_2 = Danger
  1298. # gE_GMF_3 = Danger
  1299. if (Vel_GMF_HM[0] >= Vel_GMF_HM_danger[0] or \
  1300. Vel_GMF_HM[1] >= Vel_GMF_HM_danger[1] or \
  1301. Vel_GMF_HM[2] >= Vel_GMF_HM_danger[2] or \
  1302. Acc_GMF_HM[0] >= Acc_GMF_HM_danger[0] or \
  1303. Acc_GMF_HM[1] >= Acc_GMF_HM_danger[1] or \
  1304. Acc_GMF_HM[2] >= Acc_GMF_HM_danger[2] or \
  1305. gE_GMF_HM[0] >= gE_GMF_HM_danger[0] or \
  1306. gE_GMF_HM[1] >= gE_GMF_HM_danger[1] or \
  1307. gE_GMF_HM[2] >= gE_GMF_HM_danger[2]):
  1308. GMF_SEV = True
  1309. # Gear tooth impact frequency and harmonics, CF=8, Severity = 10
  1310. # OR
  1311. # gE_GTIF_1 >= Alert
  1312. # gE_GTIF_2 >= Alert
  1313. # gE_GTIF_3 >= Alert
  1314. # gE_GTIF_4 >= Alert
  1315. # gE_GTIF_5 >= Alert
  1316. if (gE_GTIF_HM[0] >= gE_GTIF_HM_alert[0] or \
  1317. gE_GTIF_HM[1] >= gE_GTIF_HM_alert[1] or \
  1318. gE_GTIF_HM[2] >= gE_GTIF_HM_alert[2] or \
  1319. gE_GTIF_HM[3] >= gE_GTIF_HM_alert[3] or \
  1320. gE_GTIF_HM[4] >= gE_GTIF_HM_alert[4]):
  1321. GTIF = True
  1322. return GMF_MOD, GMF_SEV, GTIF
  1323. ###############################################################################
  1324. ###############################################################################
  1325. # @staticmethod
  1326. def Gear_Fault_Diag(self,Acc_GMF_HM, Vel_GMF_HM, gE_GMF_HM, gE_GTIF_HM, Acc_GMF_alert_gPk = 0.299, Acc_GMF_danger_gPk = 0.344, \
  1327. Vel_GMF_alert_mmsRMS = 4.0, Vel_GMF_danger_mmsRMS = 8.0, gE_GMF_alert_gE = 3.0, \
  1328. gE_GMF_danger_gE = 6.0, gE_GTIF_alert_gE = 3.0, gE_GTIF_danger_gE = 6.0):
  1329. GMF_MOD = False
  1330. GMF_SEV = False
  1331. GTIF = False
  1332. Acc_GMF_HM_alert =[]
  1333. Acc_GMF_HM_danger = []
  1334. Vel_GMF_HM_alert =[]
  1335. Vel_GMF_HM_danger = []
  1336. gE_GMF_HM_alert = []
  1337. gE_GMF_HM_danger = []
  1338. gE_GTIF_HM_alert = []
  1339. gE_GTIF_HM_danger = []
  1340. GearToothWearDetection = False
  1341. GearToothWearSev = 0
  1342. GearToothCrackBrokenDetection = False
  1343. GearToothCrackBrokenSev = 0
  1344. [Acc_GMF_HM_alert, Acc_GMF_HM_danger] = self.Acc_GMF_HM_Threshhold(Acc_GMF_alert_gPk, Acc_GMF_danger_gPk)
  1345. [Vel_GMF_HM_alert, Vel_GMF_HM_danger] = self.Vel_GMF_HM_Threshhold(Vel_GMF_alert_mmsRMS, Vel_GMF_danger_mmsRMS)
  1346. [gE_GMF_HM_alert, gE_GMF_HM_danger] = self.gE_GMF_HM_Threshhold(gE_GMF_alert_gE, gE_GMF_danger_gE)
  1347. [gE_GTIF_HM_alert, gE_GTIF_HM_danger] = self.gE_GTIF_HM_Threshhold(gE_GTIF_alert_gE, gE_GTIF_danger_gE)
  1348. [GMF_MOD, GMF_SEV, GTIF] = self.GMF_GTIF_Symptom_Rule(Vel_GMF_HM, Acc_GMF_HM, gE_GMF_HM, gE_GTIF_HM, Vel_GMF_HM_alert, \
  1349. Vel_GMF_HM_danger, Acc_GMF_HM_alert, Acc_GMF_HM_danger, \
  1350. gE_GMF_HM_alert, gE_GMF_HM_danger, gE_GTIF_HM_alert, gE_GTIF_HM_danger)
  1351. # Gear wear, misalignment, or eccentricity, sever, CF = 8, severity = 10
  1352. # AND
  1353. # GMF_SEV = True
  1354. if GMF_SEV == True:
  1355. GearToothWearDetection = True
  1356. GearToothWearSev = 10
  1357. # Gear wear, misalignment, or eccentricity, moderate, CF = 8, severity = 5
  1358. # AND
  1359. # GMF_MOD = True
  1360. else:
  1361. if GMF_MOD == True:
  1362. GearToothWearDetection = True
  1363. GearToothWearSev = 5
  1364. # Gear tooth broken or cracked, CF = 8, severity = 5
  1365. # AND
  1366. # GTIF = True
  1367. # NOR
  1368. # GMF_MOD = True
  1369. # GMF_SEV = True
  1370. if GTIF == True and (not(GMF_MOD == True or GMF_SEV == True)):
  1371. GearToothCrackBrokenDetection = True
  1372. GearToothCrackBrokenSev = 5
  1373. return GearToothWearDetection, GearToothWearSev, GearToothCrackBrokenDetection, GearToothCrackBrokenSev
  1374. ###############################################################################
  1375. ###############################################################################
  1376. # @staticmethod
  1377. # Note: the default alert and danger threshold values (in mm/s RMS for velocity and g peak for acceleration) are set according a DSS AC motor model, it can be adjusted if necessary
  1378. def RBPF_Symptom_Rule(self,Vel_RBPF_HM, Acc_RBPF_HM, Vel_RBPF_HM_alert, Vel_RBPF_HM_danger, Acc_RBPF_HM_alert, \
  1379. Acc_RBPF_HM_danger):
  1380. RBPF_MOD = False
  1381. RBPF_SEV = False
  1382. # Rotorbar pass frequency, sever, CF=8, severity = 10
  1383. # OR
  1384. # Vel_RBPF_1 == Danger
  1385. # Acc_RBPF_1 == Danger
  1386. if (Vel_RBPF_HM[0] >= Vel_RBPF_HM_danger[0] or Acc_RBPF_HM[0] >= Acc_RBPF_HM_danger[0]):
  1387. RBPF_SEV = True
  1388. # Rotorbar pass frequency, moderate, CF=8, severity = 5
  1389. # OR
  1390. # Vel_RBPF_1 == Alert
  1391. # Acc_RBPF_1 == Alert
  1392. else:
  1393. if (Vel_RBPF_HM[0] >= Vel_RBPF_HM_alert[0] or Acc_RBPF_HM[0] >= Acc_RBPF_HM_alert[0]) and Vel_RBPF_HM[0] < Vel_RBPF_HM_danger[0] and Acc_RBPF_HM[0] < Acc_RBPF_HM_danger[0]:
  1394. RBPF_MOD = True
  1395. return RBPF_MOD, RBPF_SEV
  1396. ###############################################################################
  1397. ###############################################################################
  1398. # @staticmethod
  1399. # Note: the default alert and danger threshold values (in mm/s RMS for velocity and g peak for acceleration) are set according a DSS AC motor model, it can be adjusted if necessary
  1400. def Cracked_Rotorbar_Diag(self,Vel_RBPF_HM, Acc_RBPF_HM, Vel_RBPF_alert_mmsRMS = 0.064*25.4, \
  1401. Vel_RBPF_danger_mmsRMS = 0.127*25.4, Acc_RBPF_alert_gPk = 2.5, Acc_RBPF_danger_gPk = 3.75):
  1402. RBPF_MOD = False
  1403. RBPF_SEV = False
  1404. Vel_RBPF_HM_alert = []
  1405. Vel_RBPF_HM_danger = []
  1406. Acc_RBPF_HM_alert = []
  1407. Acc_RBPF_HM_danger = []
  1408. CrackedRotorbarDetection = False
  1409. CrackedRotorbarSev = 0
  1410. [Acc_RBPF_HM_alert, Acc_RBPF_HM_danger] = self.Acc_RBPF_HM_Threshhold(Acc_RBPF_alert_gPk, Acc_RBPF_danger_gPk)
  1411. [Vel_RBPF_HM_alert,Vel_RBPF_HM_danger] = self.Vel_RBPF_HM_Threshhold(Vel_RBPF_alert_mmsRMS, Vel_RBPF_danger_mmsRMS)
  1412. [RBPF_MOD, RBPF_SEV] = self.RBPF_Symptom_Rule(Vel_RBPF_HM, Acc_RBPF_HM, Vel_RBPF_HM_alert, Vel_RBPF_HM_danger, Acc_RBPF_HM_alert, Acc_RBPF_HM_danger)
  1413. # Cracked rotorbar, sever CF = 8, severity = 10
  1414. # AND
  1415. # RBPF_SEV = True
  1416. if RBPF_SEV == True:
  1417. CrackedRotorbarDetection = True
  1418. CrackedRotorbarSev = 8
  1419. # Cracked rotorbar, moderate CF = 8, severity = 5
  1420. # AND
  1421. # RBPF_MOD = True
  1422. # NOR
  1423. # RBPF_SEV = True
  1424. if RBPF_MOD == True and (not(RBPF_SEV == True)):
  1425. CrackedRotorbarDetection = True
  1426. CrackedRotorbarSev = 5
  1427. return CrackedRotorbarDetection, CrackedRotorbarSev
  1428. ###############################################################################
  1429. ###############################################################################
  1430. # @staticmethod
  1431. # Note: the default velocity alert and danger threshold (in mm/s RMS for velocity) is set according a DSS AC motor model, it can be adjusted if necessary
  1432. def LF2X_Symptom_Rule(self,Vel_2XLF_HM, gE_2XLF_HM, Vel_2XLF_HM_alert, Vel_2XLF_HM_danger, gE_2XLF_HM_alert, gE_2XLF_HM_danger):
  1433. LF2X_MOD = False
  1434. LF2X_SEV = False
  1435. # 2X line frequency, moderate, CF=8, severity = 5
  1436. # AND
  1437. # Vel_2XLF_1 = alert
  1438. if Vel_2XLF_HM[0] >= Vel_2XLF_HM_alert[0] and Vel_2XLF_HM[0] < Vel_2XLF_HM_danger[0]:
  1439. LF2X_MOD = True
  1440. # 2X line frequency, moderate, several defect peaks, no confirming velocity, CF=8, severity = 5
  1441. # AND
  1442. # OR
  1443. # AND
  1444. # gE_2XLF_1 = alert
  1445. # gE_2XLF_2 = alert
  1446. # AND
  1447. # gE_2XLF_1 = alert
  1448. # gE_2XLF_3 = alert
  1449. # AND
  1450. # gE_2XLF_1 = alert
  1451. # gE_2XLF_4 = alert
  1452. # AND
  1453. # gE_2XLF_1 = alert
  1454. # gE_2XLF_5 = alert
  1455. # NOR
  1456. # Vel_2XLF_1 >= alert
  1457. else:
  1458. if (((gE_2XLF_HM[0] >= gE_2XLF_HM_alert[0] and gE_2XLF_HM[0] < gE_2XLF_HM_danger[0]) and (gE_2XLF_HM[1] >= gE_2XLF_HM_alert[1] and gE_2XLF_HM[1] < gE_2XLF_HM_danger[1])) or \
  1459. ((gE_2XLF_HM[0] >= gE_2XLF_HM_alert[0] and gE_2XLF_HM[0] < gE_2XLF_HM_danger[0]) and (gE_2XLF_HM[2] >= gE_2XLF_HM_alert[2] and gE_2XLF_HM[2] < gE_2XLF_HM_danger[2])) or \
  1460. ((gE_2XLF_HM[0] >= gE_2XLF_HM_alert[0] and gE_2XLF_HM[0] < gE_2XLF_HM_danger[0]) and (gE_2XLF_HM[3] >= gE_2XLF_HM_alert[3] and gE_2XLF_HM[3] < gE_2XLF_HM_danger[3])) or \
  1461. ((gE_2XLF_HM[0] >= gE_2XLF_HM_alert[0] and gE_2XLF_HM[0] < gE_2XLF_HM_danger[0]) and (gE_2XLF_HM[4] >= gE_2XLF_HM_alert[4] and gE_2XLF_HM[4] < gE_2XLF_HM_danger[4]))) and \
  1462. (not(Vel_2XLF_HM[0] >= Vel_2XLF_HM_alert[0])):
  1463. LF2X_MOD = True
  1464. # 2X line frequency, severe, CF=8, severity = 10
  1465. # AND
  1466. # Vel_2XLF_1 = Danger
  1467. if Vel_2XLF_HM[0] >= Vel_2XLF_HM_danger[0]:
  1468. LF2X_SEV = True
  1469. # 2X line frequency, severe, several defect peaks, no confirming velocity, CF=8, severity = 10
  1470. # AND
  1471. # OR
  1472. # AND
  1473. # gE_2XLF_1 >= danger
  1474. # gE_2XLF_2 >= alert
  1475. # AND
  1476. # gE_2XLF_1 >= danger
  1477. # gE_2XLF_3 >= alert
  1478. # AND
  1479. # gE_2XLF_1 >= danger
  1480. # gE_2XLF_4 >= alert
  1481. # AND
  1482. # gE_2XLF_1 >= danger
  1483. # gE_2XLF_5 >= alert
  1484. # NOR
  1485. # Vel_2XLF_1 >= alert
  1486. else:
  1487. if (((gE_2XLF_HM[0] >= gE_2XLF_HM_danger[0]) and (gE_2XLF_HM[1] >= gE_2XLF_HM_alert[1])) or \
  1488. ((gE_2XLF_HM[0] >= gE_2XLF_HM_danger[0]) and (gE_2XLF_HM[2] >= gE_2XLF_HM_alert[2])) or \
  1489. ((gE_2XLF_HM[0] >= gE_2XLF_HM_danger[0]) and (gE_2XLF_HM[3] >= gE_2XLF_HM_alert[3])) or \
  1490. ((gE_2XLF_HM[0] >= gE_2XLF_HM_danger[0]) and (gE_2XLF_HM[4] >= gE_2XLF_HM_alert[4]))) and \
  1491. (not(Vel_2XLF_HM[0] < Vel_2XLF_HM_alert[0])):
  1492. LF2X_SEV = True
  1493. # 2X line frequency, severe, confirmed by velocity spectrum, CF=8, severity = 10
  1494. # AND
  1495. # OR
  1496. # gE_2XLF_1 >= Alert
  1497. # gE_2XLF_2 >= Alert
  1498. # OR
  1499. # Vel_2XLF_1 >= Alert
  1500. else:
  1501. if (gE_2XLF_HM[0] >= gE_2XLF_HM_alert[0] or gE_2XLF_HM[1] >= gE_2XLF_HM_alert[1]) and \
  1502. Vel_2XLF_HM[0] >= Vel_2XLF_HM_alert[0]:
  1503. LF2X_SEV = True
  1504. return LF2X_MOD, LF2X_SEV
  1505. ###############################################################################
  1506. ###############################################################################
  1507. # @staticmethod
  1508. def Variable_AirGap_Diag(self,Vel_2XLF_HM, gE_2XLF_HM, Vel_2XLF_alert = 0.064*25.4, Vel_2XLF_danger = 0.127*25.4, gE_2XLF_alert = 3, gE_2XLF_danger = 10):
  1509. LF2X_MOD = False
  1510. LF2X_SEV = False
  1511. gE_2XLF_HM_alert = []
  1512. gE_2XLF_HM_danger = []
  1513. Vel_2XLF_HM_alert = []
  1514. Vel_2XLF_HM_danger = []
  1515. VariableAirgapDetection = False
  1516. VariableAirgapSev = 0
  1517. [gE_2XLF_HM_alert,gE_2XLF_HM_danger] = self.gE_2XLF_HM_Threshhold(gE_2XLF_alert, gE_2XLF_danger)
  1518. [Vel_2XLF_HM_alert,Vel_2XLF_HM_danger] = self.Vel_2XLF_HM_Threshhold(Vel_2XLF_alert, Vel_2XLF_danger)
  1519. [LF2X_MOD, LF2X_SEV] = self.LF2X_Symptom_Rule(Vel_2XLF_HM, gE_2XLF_HM, Vel_2XLF_HM_alert, Vel_2XLF_HM_danger,gE_2XLF_HM_alert, gE_2XLF_HM_danger)
  1520. # Variable air gap, sever CF = 8, severity = 10
  1521. # AND
  1522. # LF2X_SEV = True
  1523. if LF2X_SEV == True:
  1524. VariableAirgapDetection = True
  1525. VariableAirgapSev = 8
  1526. # Variable air gap, moderate CF = 8, severity = 5
  1527. # AND
  1528. # LF2X_MOD = True
  1529. # NOR
  1530. # LF2X_SEV = True
  1531. else:
  1532. if LF2X_MOD == True and LF2X_SEV == False:
  1533. VariableAirgapDetection = True
  1534. VariableAirgapSev = 5
  1535. return VariableAirgapDetection, VariableAirgapSev
  1536. ###############################################################################
  1537. ###############################################################################
  1538. def VPF_Symptom_Rule(self,Vel_VPF_HM, Vel_VPF_HM_alert, Vel_VPF_HM_danger):
  1539. VAN_VPFH_MOD = False
  1540. VAN_VPFH_SEV = False
  1541. # Vane pass frequency and harmonics (VPFH), sever, CF=8, Severity = 10
  1542. # OR
  1543. # Vel_VPF_1 = Danger
  1544. # Vel_VPF_2 = Danger
  1545. if Vel_VPF_HM[0] >= Vel_VPF_HM_danger[0] or Vel_VPF_HM[1] >= Vel_VPF_HM_danger[1] :
  1546. VAN_VPFH_SEV = True
  1547. # Vane pass frequency and harmonics (VPFH), moderate, CF=8, Severity = 5
  1548. # AND
  1549. # OR
  1550. # Vel_VPF_1 = Alert
  1551. # Vel_VPF_2 = Alert
  1552. # NOR
  1553. # Vel_VPF_1 = Danger
  1554. # Vel_VPF_2 = Danger
  1555. if (Vel_VPF_HM[0] >= Vel_VPF_HM_alert[0] and Vel_VPF_HM[0] < Vel_VPF_HM_danger[0] or\
  1556. Vel_VPF_HM[1] >= Vel_VPF_HM_alert[1] and Vel_VPF_HM[1] < Vel_VPF_HM_danger[1]) and\
  1557. (not(Vel_VPF_HM[0] >= Vel_VPF_HM_danger[0] or Vel_VPF_HM[1] >= Vel_VPF_HM_danger[1])):
  1558. VAN_VPFH_MOD = True
  1559. return VAN_VPFH_MOD, VAN_VPFH_SEV
  1560. ###############################################################################
  1561. ###############################################################################
  1562. # @staticmethod
  1563. def Vane_WearDamage_Diag(self,Vel_VPF_HM, Vel_VPF_alert_mmsRMS = 0.159*25.4, \
  1564. Vel_VPF_danger_mmsRMS = 0.318*25.4):
  1565. VAN_VPFH_MOD = False
  1566. VAN_VPFH_SEV = False
  1567. Vel_VPF_HM_alert = []
  1568. Vel_VPF_HM_danger = []
  1569. VaneWearDamageDetection = False
  1570. VaneWearDamageSev = 0
  1571. [Vel_VPF_HM_alert,Vel_VPF_HM_danger] = self.Vel_VPF_HM_Threshhold(Vel_VPF_alert_mmsRMS, Vel_VPF_danger_mmsRMS)
  1572. [VAN_VPFH_MOD, VAN_VPFH_SEV] = self.VPF_Symptom_Rule(Vel_VPF_HM, Vel_VPF_HM_alert, Vel_VPF_HM_danger)
  1573. # Vane wear or damage, severe CF = 8, severity = 10
  1574. # OR
  1575. # VAN_VPFH_SEV= True
  1576. if VAN_VPFH_SEV == True:
  1577. VaneWearDamageDetection = True
  1578. VaneWearDamageSev = 10
  1579. # Vane wear or damage, moderate CF = 6, severity = 5
  1580. # OR
  1581. # VAN_VPFH_MOD= True
  1582. else:
  1583. if VAN_VPFH_MOD == True:
  1584. VaneWearDamageDetection = True
  1585. VaneWearDamageSev = 5
  1586. return VaneWearDamageDetection, VaneWearDamageSev
  1587. ###############################################################################
  1588. ###############################################################################
  1589. # 巴特沃斯带通滤波
  1590. # xTimeWave是时域波形数组, fs是采样频率,单位为Hz
  1591. # lowcut 为低截止频率,单位为Hz
  1592. # highcut 为高截止频率,单位为Hz
  1593. # Order为滤波器阶数,通常为偶数,2,4,6,8一般不超过8
  1594. def BandPassButter(self,xTimeWave, lowcut, highcut, fs, order):
  1595. low = lowcut * 2 / fs
  1596. high = highcut * 2 / fs
  1597. sos = signal.butter(order, [low, high], 'bandpass', output='sos')
  1598. filtered = signal.sosfilt(sos, xTimeWave)
  1599. return filtered