public override CounterResult ExecuteCommand() { Result = new CounterResult(); StendDLLCommands stend = new StendDLLCommands(); try { stend.SetRefClockStend(0, StendSettings.ComPort); //Если стенд не оборудован блоком точности хода часов } catch (StendConnectionException) { } try { stend.ErrorClear(StendSettings.ComPort); //Если стенд однофазный и у него две токовые цепи, то выбираю первую цепь (A) if (StendSettings.OnePhaseTwoCircuits) { stend.SelectCurrentCircuit(0, StendSettings.ComPort); } stend.SetReviseMode(3); //Подаю напряжение на счетчики stend.AdjustUI(Phase, Rated_Volt, 0, Rated_Freq, PhaseSrequence, IsRevers, Volt_Per, Curr_Per, IABC, CosP, StendSettings.SModel, StendSettings.ComPort); //Даю время запуститься счетчикам Thread.Sleep(5000); if (IsActiveEnergy == 1) { StendSettings.Constant = StendSettings.ConstantAP; } else { StendSettings.Constant = StendSettings.ConstantRP; } //Запускаю тест for (int j = 0; j < StendSettings.ActivePlaces.Count; j++) { stend.setPulseChannel(StendSettings.ActivePlaces[j], (byte)(2 * (IsActiveEnergy == 1 ? 0 : 1) + IsRevers), StendSettings.ComPort); stend.ConstTestStart(StendSettings.ActivePlaces[j], StendSettings.Constant, StendSettings.ComPort); } //Подаю ток, который выставлен для испытания stend.AdjustUI(Phase, Rated_Volt, Rated_Curr, Rated_Freq, PhaseSrequence, IsRevers, Volt_Per, Curr_Per, IABC, CosP, StendSettings.SModel, StendSettings.ComPort); bool[] result = new bool[StendSettings.ActivePlaces.Count]; while (!Cancel) { double count = 0; for (int j = 0; j < StendSettings.ActivePlaces.Count; j++) { if (result[j]) { continue; } stend.ConstPulseRead(out double meter_kW, out double std_kW, StendSettings.Constant, StendSettings.ActivePlaces[j], StendSettings.ComPort); //Amount тут используется как количество энергии, которое должно поступить для окончания испытаний count += std_kW > Amount ? Amount : std_kW; result[j] = std_kW >= Amount; //Высчитываю процент погрешности между энергией, которую накрутил счётчик и которую посчитал эталонный счетчик установки if (result[j]) { Result[StendSettings.ActivePlaces[j]] = string.Format("{0:f5}", (100 * (1.0 - (meter_kW / std_kW)))) + "%"; } } Progress = ProgressMaxValue * count / (Amount * StendSettings.ActivePlaces.Count); //Дожидаюсь пока получу готовность подсчета всех счетчиков bool exit = true; for (int j = 0; j < StendSettings.ActivePlaces.Count; j++) { exit &= result[j]; } if (exit) { break; } Thread.Sleep(400); } Progress = ProgressMaxValue; } catch { Progress = ProgressMinValue; throw; } finally { stend.ErrorClear(StendSettings.ComPort); stend.PowerOff(StendSettings.ComPort); } return(Result); }