Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        public static NetWorkIO GetEnergyInfo(BaseWaveSignal vSg)
        {
            if (vSg.Waveform == null || vSg.SampleFre == 0 || vSg.SamplePoint == 0)
            {
                return(null);
            }

            if (vSg.RPM == 0)
            {
                return(null);
            }

            if (vSg.AlarmGrade == AlarmGrade.Invalid || vSg.AlarmGrade == AlarmGrade.Normal || vSg.AlarmGrade == AlarmGrade.DisConnect)
            {
                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);

                NetWorkIO io = new DiagnosticModels.NetWorkIO();
                io.Input = new double[] { e1, e2, e3, e4, e5 };
                return(io);
            }
            catch (Exception ex)
            {
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("诊断异常", ex));
            }
            return(null);
        }