public override ClockResult ExecuteCommand() { Result = new ClockResult(); StendDLLCommands stend = new StendDLLCommands(); try { stend.ErrorClear(StendSettings.ComPort); stend.AdjustUI(Phase, Rated_Volt, Rated_Curr, Rated_Freq, PhaseSrequence, IsRevers, Volt_Per, Curr_Per, IABC, CosP, StendSettings.SModel, StendSettings.ComPort); for (int j = 0; j < StendSettings.ActivePlaces.Count; j++) { //По идее эта команда тут не обязательна, но на всякий случай stend.setPulseChannel(StendSettings.ActivePlaces[j], (byte)(2 * (IsActiveEnergy == 1 ? 0 : 1) + IsRevers), StendSettings.ComPort); Result[StendSettings.ActivePlaces[j]] = ""; } stend.SetRefClockStend(1, StendSettings.ComPort); for (int k = 0; k < Amount; k++) { for (int j = 0; j < StendSettings.ActivePlaces.Count; j++) { stend.ClockErrorStart(StendSettings.ActivePlaces[j], Frequency, Impulse, StendSettings.ComPort); } Stopwatch sw = new Stopwatch(); //Время одного измерения double timeMeasurement = (Frequency * Impulse + Frequency) * 1000; sw.Start(); //Для приращения прогресс бара и ожидания когда, компаратор получит все импульсы от счётчика для подсчета while (sw.ElapsedMilliseconds < (int)timeMeasurement && !Cancel) { Progress = ProgressMaxValue * (sw.ElapsedMilliseconds + timeMeasurement * k) / (int)(timeMeasurement * Amount); Thread.Sleep(100); } //Получение результатов с компаратора for (int j = 0; j < StendSettings.ActivePlaces.Count && !Cancel; j++) { string result = ""; stend.ClockErrorRead(ref result, Frequency, 0, StendSettings.ActivePlaces[j], StendSettings.ComPort); result = string.Format("{0:f7}", (double.Parse(result) - Frequency)); Result[StendSettings.ActivePlaces[j]] += result + '\n'; } } Progress = ProgressMaxValue; } catch { Progress = ProgressMinValue; throw; } finally { try { stend.ErrorClear(StendSettings.ComPort); stend.PowerOff(StendSettings.ComPort); //Если ошибка связана с COM портом, то просто игнорю т.к. первая ошибка на это укажет }catch (StendConnectionException) {} } return(Result); }