public static string GetDiagnosticInfo(string devicename, byte[] bytes, double SampleFre, int SamplePoint, float RPM, out string DiagnosticInfo, out string DiagnosticAdvice) { double[] Waveform = ByteToSingle(bytes); if (Waveform == null || SampleFre == 0 || SamplePoint == 0) { DiagnosticInfo = devicename + "没有诊断波形"; DiagnosticAdvice = null; return(DiagnosticInfo + "\r\n" + DiagnosticAdvice); } if (RPM == 0) { DiagnosticInfo = devicename + "没有上传转速"; DiagnosticAdvice = null; return(DiagnosticInfo + "\r\n" + DiagnosticAdvice); } double[] Frequency; double[] Amplitude; //频率间隔 double frequencyInterval = SampleFre / SamplePoint; int length = (int)(SamplePoint / 2.56) + 1; Frequency = new double[length]; for (int i = 0; i < length; i++) { Frequency[i] = frequencyInterval * i; } var output = D2FFT(Waveform, SamplePoint); if (output != null) { Amplitude = output.Take(length).ToArray(); } else { DiagnosticInfo = devicename + "没有频域波形"; DiagnosticAdvice = null; return(DiagnosticInfo + "\r\n" + DiagnosticAdvice); } //频率 double frequency = RPM / 60; double e1, e2, e3, e4, e5; double m1, m2, m3, m4, m5; GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 1, out e1, out m1); GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 2, out e2, out m2); GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 3, out e3, out m3); GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 4, out e4, out m4); GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 5, out e5, out m5); //求时域有效值 var paras = CalculatePara(Waveform); var rms = paras[0]; //最大幅值 var mMax = Amplitude.Max(); if (m1 >= mMax && m1 >= (rms * 0.1 * Math.Sqrt(2)) && m1 > m2 && m3 <= (rms * 0.1 * Math.Sqrt(2))) { DiagnosticInfo = devicename + "不平衡"; DiagnosticAdvice = "建议:怀疑轴系的动平衡情况,请检查转子是否存在弯曲或临时弯曲、转子零部件掉块、转子偏磨或结垢、轴承间隙大、设备底板结构松动等故障,如是皮带驱动,可能是皮带轮偏心引起。\r\n"; double probability = e1 * 100.0 / rms; DiagnosticAdvice += "概率:" + probability.ToString("0") + "%"; } else if (m2 >= mMax && m2 >= (rms * 0.1 * Math.Sqrt(2)) && m1 >= (rms * 0.1 * Math.Sqrt(2)) && m3 >= (rms * 0.1 * Math.Sqrt(2))) { DiagnosticInfo = devicename + "不对中"; DiagnosticAdvice = "建议:(1)请检查相关轴系的对中情况,如轴与轴的对中不良、同一轴的几个轴承安装同心或轴承间隙不等、 轴承座热膨胀不均、机壳变形或移位、 地基不均匀下沉。\r\n"; DiagnosticAdvice += " (2)另外,可能以下原因也表现为不对中现象:I.由于质量偏心而引起的动平衡不良(此时转子呈弓形弯曲),也可能造成对中不良,如果此时静态条件下对中良好,可以先解决动平衡不良故障,对中不良故障将随即消除. II.由于受热、负载过大等原因导致轴弯曲;\r\n"; DiagnosticAdvice += " (3).由于内环或外环安装不合适,导致轴承偏翘(翘曲). III.轴承座松动。\r\n"; double probability = e2 * 100.0 / rms; DiagnosticAdvice += "概率:" + probability.ToString("0") + "%"; } else if (m1 >= (rms * 0.1 * Math.Sqrt(2)) && m2 >= (rms * 0.1 * Math.Sqrt(2)) && m3 >= (rms * 0.1 * Math.Sqrt(2)) && m4 >= (rms * 0.1 * Math.Sqrt(2)) && m5 >= (rms * 0.1 * Math.Sqrt(2))) { DiagnosticInfo = devicename + "轴承座松动、轴承松动、(基础)松动等"; DiagnosticAdvice = "建议:(1)请检查相关轴系的润滑、基础的紧固、相关轴系的轴承、轴承座安装情况.\r\n"; DiagnosticAdvice += " (2)受热、负载过大等原因导致轴弯曲;\r\n"; DiagnosticAdvice += " (3)内环或外环安装不合适,导致轴承偏翘(翘曲)。"; } else if (mMax >= (rms * 0.3 * Math.Sqrt(2))) { double fMax = 0; for (int i = 0; i < Amplitude.Length; i++) { if (Amplitude[i] == mMax) { fMax = Frequency[i]; break; } } DiagnosticInfo = devicename + "频谱上有占能量很大比率的频率" + fMax.ToString("0.000") + "没有找到合适的故障原因"; DiagnosticAdvice = "建议:(1)没有设备结构模型,比如齿轮齿数、设置轴承型号等,不能确定故障的部位。\r\n"; DiagnosticAdvice += " (2)转速设置是否正确。"; } else { DiagnosticInfo = devicename + "没有找到合适的故障原因, 请进一步观察。"; DiagnosticAdvice = null; } return(DiagnosticInfo + "\r\n" + DiagnosticAdvice); }
public static NetWorkIO GetDiagnosticInfo(BaseWaveSignal vSg) { int classify = 0; vSg.DiagnosticGrade = vSg.AlarmGrade; vSg.DiagnosticResult = vSg.Result; vSg.DiagnosticTime = vSg.ACQDatetime; vSg.DiagnosticUnit = vSg.Unit; if (vSg.Waveform == null || vSg.SampleFre == 0 || vSg.SamplePoint == 0) { vSg.DiagnosticInfo = "没有诊断波形"; vSg.DiagnosticAdvice = null; return(null); } if (vSg.RPM == 0) { vSg.DiagnosticInfo = "没有上传转速"; vSg.DiagnosticAdvice = null; return(null); } if (vSg.AlarmGrade == AlarmGrade.Invalid || vSg.AlarmGrade == AlarmGrade.Normal || vSg.AlarmGrade == AlarmGrade.DisConnect) { vSg.DiagnosticInfo = "没有发现故障"; vSg.DiagnosticAdvice = null; return(null); } try { double[] Frequency; double[] Amplitude; //频率间隔 double frequencyInterval = vSg.SampleFre / vSg.SamplePoint; int length = (int)(vSg.SamplePoint / 2.56) + 1; Frequency = new double[length]; for (int i = 0; i < length; i++) { Frequency[i] = frequencyInterval * i; } var output = Algorithm.Instance.FFT2AndPhaseAction(vSg.Waveform, vSg.SamplePoint); if (output != null) { Amplitude = output[0].Take(length).ToArray(); } else { vSg.DiagnosticInfo = "没有频域波形"; vSg.DiagnosticAdvice = null; return(null); } //频率 double frequency = vSg.RPM / 60; double e1, e2, e3, e4, e5; double m1, m2, m3, m4, m5; GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 1, out e1, out m1); GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 2, out e2, out m2); GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 3, out e3, out m3); GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 4, out e4, out m4); GetEnergy(Frequency, Amplitude, frequency, frequencyInterval, 5, out e5, out m5); //求时域有效值 var paras = Algorithm.CalculatePara(vSg.Waveform); var rms = paras[0]; //最大幅值 var mMax = Amplitude.Max(); if (m1 >= mMax && m1 >= (rms * 0.1 * Math.Sqrt(2)) && m1 > m2 && m3 <= (rms * 0.1 * Math.Sqrt(2))) { vSg.DiagnosticInfo = "不平衡"; vSg.DiagnosticAdvice = "建议:怀疑轴系的动平衡情况,请检查转子是否存在弯曲或临时弯曲、转子零部件掉块、转子偏磨或结垢、轴承间隙大、设备底板结构松动等故障,如是皮带驱动,可能是皮带轮偏心引起。\r\n"; double probability = e1 * 100.0 / rms; vSg.DiagnosticAdvice += "概率:" + probability.ToString("0") + "%"; classify = 1; } else if (m2 >= mMax && m2 >= (rms * 0.1 * Math.Sqrt(2)) && m1 >= (rms * 0.1 * Math.Sqrt(2)) && m3 >= (rms * 0.1 * Math.Sqrt(2))) { vSg.DiagnosticInfo = "不对中"; vSg.DiagnosticAdvice = "建议:(1)请检查相关轴系的对中情况,如轴与轴的对中不良、同一轴的几个轴承安装同心或轴承间隙不等、 轴承座热膨胀不均、机壳变形或移位、 地基不均匀下沉。\r\n"; vSg.DiagnosticAdvice += " (2)另外,可能以下原因也表现为不对中现象:I.由于质量偏心而引起的动平衡不良(此时转子呈弓形弯曲),也可能造成对中不良,如果此时静态条件下对中良好,可以先解决动平衡不良故障,对中不良故障将随即消除. II.由于受热、负载过大等原因导致轴弯曲;\r\n"; vSg.DiagnosticAdvice += " (3).由于内环或外环安装不合适,导致轴承偏翘(翘曲). III.轴承座松动。\r\n"; double probability = e2 * 100.0 / rms; vSg.DiagnosticAdvice += "概率:" + probability.ToString("0") + "%"; classify = 2; } else if (m1 >= (rms * 0.1 * Math.Sqrt(2)) && m2 >= (rms * 0.1 * Math.Sqrt(2)) && m3 >= (rms * 0.1 * Math.Sqrt(2)) && m4 >= (rms * 0.1 * Math.Sqrt(2)) && m5 >= (rms * 0.1 * Math.Sqrt(2))) { vSg.DiagnosticInfo = "轴承座松动、轴承松动、(基础)松动等"; vSg.DiagnosticAdvice = "建议:(1)请检查相关轴系的润滑、基础的紧固、相关轴系的轴承、轴承座安装情况.\r\n"; vSg.DiagnosticAdvice += " (2)受热、负载过大等原因导致轴弯曲;\r\n"; vSg.DiagnosticAdvice += " (3)内环或外环安装不合适,导致轴承偏翘(翘曲)。"; classify = 3; } else if (mMax >= (rms * 0.3 * Math.Sqrt(2))) { double fMax = 0; for (int i = 0; i < Amplitude.Length; i++) { if (Amplitude[i] == mMax) { fMax = Frequency[i]; break; } } vSg.DiagnosticInfo = "频谱上有占能量很大比率的频率" + fMax.ToString("0.000") + "没有找到合适的故障原因"; vSg.DiagnosticAdvice = "建议:(1)没有设备结构模型,比如齿轮齿数、设置轴承型号等,不能确定故障的部位。\r\n"; vSg.DiagnosticAdvice += " (2)转速设置是否正确。"; classify = 4; } else { vSg.DiagnosticInfo = "没有找到合适的故障原因, 请进一步观察。"; vSg.DiagnosticAdvice = null; classify = 5; } NetWorkIO io = new DiagnosticModels.NetWorkIO(); io.Input = new double[] { e1, e2, e3, e4, e5 }; io.Output = DecToBinArray(classify); return(io); } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("诊断异常", ex)); } return(null); }