public Argument(Oscilloscope device, int recordLength, int averages, int measurementAverages) { this.device = device; this.recordLength = recordLength; this.averages = averages; this.measurementAverages = measurementAverages; }
public MainWindow() { InitializeComponent(); backgroundWorker = (BackgroundWorker)this.FindResource("backgroundWorker"); oscilloscope = new B380("192.168.255.148", 0x6871); //generator = new B330("192.168.255.143", 0x6871); }
public static void StartMeasurements(Oscilloscope device, int recordLength, int averages, int measurementAverages, System.ComponentModel.BackgroundWorker backgroundWorker) { int connectionThreshold = 0; DateTime begin = DateTime.Now; //Text.Text += Environment.NewLine + "Запуск измерения"; List<double> histCh1 = new List<double>(); List<double> histCh2 = new List<double>(); List<double> histCh3 = new List<double>(); List<double> histCh4 = new List<double>(); List<double> histArg = new List<double>(); while (true) { double[][] data = { new double[recordLength], new double[recordLength], new double[recordLength], new double[recordLength] }; device.StartMeasurement(); //Text.Text += Environment.NewLine + "Ожидание данных"; while (!device.IsDataReady()) { Task.Delay(1); connectionThreshold++; if (connectionThreshold > 5000) throw new Exception(); } connectionThreshold = 0; double[][] buffer = device.GetData(); //for (int j = 0; j < buffer.Length; j++) //{ // double mean = Mean(buffer[j]); // for (int k = 0; k < buffer[0].Length; k++) // { // buffer[j][k] -= mean; // } //} for (int j = 0; j < data.Length; j++) { for (int k = 0; k < data[0].Length; k++) { data[j][k] += buffer[j][k]; } } //for (int j = 0; j < data.Length; j++) //{ // double mean = Mean(data[j]); // for (int k = 0; k < data[0].Length; k++) // { // data[j][k] -= mean; // } //} DateTime end = DateTime.Now; //Text.Text += Environment.NewLine + "Результаты"; //for (int i = 0; i < data[0].Length; i++) //{ // Text.Text += Environment.NewLine + $"{i}; {data[0][i]}; {data[1][i]}; {data[2][i]}; {data[3][i]};"; //} //Text.Text += Environment.NewLine + $"Измерение завершено. Количество усреднений: {averages}"; ////Text.Text += Environment.NewLine + "RMS:"; //Text.Text += Environment.NewLine + // $"1-й канал: {Rms(data[0])}, 2-й канал: {Rms(data[1])}, 3-й канал: {Rms(data[2])}, 4-й канал: {Rms(data[3])},"; //var sb = new StringBuilder(8 * 1024); //sb.AppendLine("Результаты:"); //for (int i = 0; i < device.GetRecordLength(); i++) // sb.AppendLine(string.Format("{0}: {1}\t|\t{2}\t|\t{3}\t|\t{4}", i, buffer[0][i], buffer[1][i], buffer[2][i], buffer[3][i])); //sb.AppendLine("Завершили"); //Text.Text += Environment.NewLine + sb; TimeSpan result = end - begin; //Text.Text += Environment.NewLine + // $"Затрачено времени: {(result).Seconds.ToString()} с, {(result).Milliseconds.ToString()} мс"; //Text.ScrollToEnd(); if (histCh1.Count >= measurementAverages) { histCh1.RemoveAt(0); histCh1.Add(Rms(data[0])); } else histCh1.Add(Rms(data[0])); if (histCh2.Count >= measurementAverages) { histCh2.RemoveAt(0); histCh2.Add(Rms(data[1])); } else histCh2.Add(Rms(data[1])); if (histCh3.Count >= measurementAverages) { histCh3.RemoveAt(0); histCh3.Add(Rms(data[2])); } else histCh3.Add(Rms(data[2])); if (histCh4.Count >= measurementAverages) { histCh4.RemoveAt(0); histCh4.Add(Rms(data[3])); } else histCh4.Add(Rms(data[3])); if (histArg.Count >= measurementAverages) { histArg.RemoveAt(0); histArg.Add(Rms(data[2])/Rms(data[3])); } else histArg.Add(Rms(data[2])/Rms(data[3])); double[] avg = { histCh1.Sum()/histCh1.Count, histCh2.Sum() / histCh2.Count , histCh3.Sum() / histCh3.Count , histCh4.Sum() / histCh4.Count, histArg.Sum() / histArg.Count }; double[] max = {histCh1.Max(), histCh2.Max(), histCh3.Max(), histCh4.Max(), histArg.Max()}; double[] min = { histCh1.Min(), histCh2.Min(), histCh3.Min(), histCh4.Min(), histArg.Min()}; double[] instability = new double[5]; for (int i = 0; i < 5; i++) instability[i] = (max[i] - min[i])*100/avg[i]; if (backgroundWorker.CancellationPending) { // Возврат histCh1.Clear(); histCh2.Clear(); histCh3.Clear(); histCh4.Clear(); return; } if (backgroundWorker.WorkerReportsProgress) { //float progress = ((float)(i + 1)) / list.Length * 100; string report = $"1-й канал: rms: {Rms(data[0]):f6}; avg: {avg[0]:f6}; max: {max[0]:f6}; min: {min[0]:f6}; instability: {instability[0]} %; \n\n" + $"2-й канал: rms: {Rms(data[1]):f6}; avg: {avg[1]:f6}; max: {max[1]:f6}; min: {min[1]:f6}; instability: {instability[1]} %; \n\n" + $"3-й канал: rms: {Rms(data[2]):f6}; avg: {avg[2]:f6}; max: {max[2]:f6}; min: {min[2]:f6}; instability: {instability[2]} %; \n\n" + $"4-й канал: rms: {Rms(data[3]):f6}; avg: {avg[3]:f6}; max: {max[3]:f6}; min: {min[3]:f6}; instability: {instability[3]} %; \n\n" + $"аргумент: {Rms(data[2]) / Rms(data[3]):f6}; avg: {avg[4]:f6}; max: {max[4]:f6}; min: {min[4]:f6}; instability: {instability[4]} %; \n\n"; MainWindow.Answer ans = new MainWindow.Answer(report); backgroundWorker.ReportProgress(0, ans); //(int)Math.Round(progress)); } Task.Delay(50); } }