/// <summary> /// Конструктор класса "Ошибки (отклонения)" /// </summary> /// <param name="generators">данные по генераторам</param> public Errors(GeneratorsData generators) { var coi = GetCenterOfInertia(generators); Type myType = typeof(Errors); var fault = myType.GetField("_fault", BindingFlags.NonPublic | BindingFlags.Instance); var time = myType.GetField("_time", BindingFlags.NonPublic | BindingFlags.Instance); time.SetValue(this, generators.Time); for (int i = 1; i <= generators.generatorsData.Count; i++) { var tuple = errors[i]; var power = float.Parse(generators.GetType(). GetProperty(tuple.Item2).GetValue(generators).ToString()); var difference = power - coi; FieldInfo error = myType.GetField(tuple.Item1, BindingFlags.NonPublic | BindingFlags.Instance); error.SetValue(this, difference); if (Math.Abs(difference) >= LIMIT) { fault.SetValue(this, true); } } }
/// <summary> /// Возвращает центра инерции COI /// </summary> /// <param name="generators">данные по генераторам</param> /// <returns>центр инерции COI</returns> private float GetCenterOfInertia(GeneratorsData generators) { float numerator = 0; float denominator = 0; for (int i = 1; i <= generators.generatorsData.Count; i++) { var tuple = generators.generatorsData[i]; var power = float.Parse(generators.GetType(). GetProperty(tuple.Item1).GetValue(generators).ToString()); var angle = float.Parse(generators.GetType(). GetProperty(tuple.Item2).GetValue(generators).ToString()); numerator += power * angle; denominator += power; } return(numerator / denominator); }