public ActionResult Index(ExcursionType type) { ViewData["ExcursionType"] = type; var exType = (int) type; using (var context = new ContentStorage()) { var excursionList = context.Excursion.Where(e => e.ExcursionType == exType || exType == 0).Select(e => e).OrderBy(e => e.SortOrder).ToList(); return View(excursionList); } }
public async Task <bool> ExcursionTypeCreate(ExcursionTypeCreateInputModel model) { var excursionTypeToAdd = new ExcursionType() { Name = model.Name }; await context.ExcursionTypes.AddAsync(excursionTypeToAdd); await context.SaveChangesAsync(); return(true); }
private void OutputFrequencyWarning(DateTime timestamp, double delta, ExcursionType typeOfExcursion, double totalAmount) { OnStatusMessage(MessageLevel.Info, $"Frequency excursion detected!\r\n Time = {timestamp:dd-MMM-yyyy HH:mm:ss.fff}\r\n Delta = {delta}\r\n Type = {typeOfExcursion}\r\n Estimated Size = {totalAmount:0.00}MW\r\n"); }
/// <summary> /// Publishes the <see cref="IFrame"/> of time-aligned collection of <see cref="IMeasurement"/> values that arrived within the /// adapter's defined <see cref="ConcentratorBase.LagTime"/>. /// </summary> /// <param name="frame"><see cref="IFrame"/> of measurements with the same timestamp that arrived within <see cref="ConcentratorBase.LagTime"/> that are ready for processing.</param> /// <param name="index">Index of <see cref="IFrame"/> within a second ranging from zero to <c><see cref="ConcentratorBase.FramesPerSecond"/> - 1</c>.</param> protected override void PublishFrame(IFrame frame, int index) { double averageFrequency = double.NaN; // Increment frame counter m_count++; if (m_alarmProhibitCounter > 0) { m_alarmProhibitCounter--; } // Calculate the average of all the frequencies that arrived in this frame if (frame.Measurements.Count > 0) { averageFrequency = frame.Measurements.Select(m => m.Value.AdjustedValue).Average(); } // Track new frequency and its timestamp m_frequencies.Add(averageFrequency); m_timeStamps.Add(frame.Timestamp); // Maintain analysis window size while (m_frequencies.Count > m_analysisWindowSize) { m_frequencies.RemoveAt(0); m_timeStamps.RemoveAt(0); } if (m_count % m_analysisInterval == 0 && m_frequencies.Count == m_analysisWindowSize) { double frequency1 = m_frequencies[0]; double frequency2 = m_frequencies[m_analysisWindowSize - 1]; double frequencyDelta = 0.0D, estimatedSize = 0.0D; ExcursionType typeofExcursion = ExcursionType.GenerationTrip; bool warningSignaled = false; if (!double.IsNaN(frequency1) && !double.IsNaN(frequency2)) { frequencyDelta = frequency2 - frequency1; if (Math.Abs(frequencyDelta) > m_estimateTriggerThreshold) { m_detectedExcursions++; } else { m_detectedExcursions = 0; } if (m_detectedExcursions >= m_consecutiveDetections) { typeofExcursion = (frequency1 > frequency2 ? ExcursionType.GenerationTrip : ExcursionType.LoadTrip); estimatedSize = Math.Abs(frequencyDelta) * m_powerEstimateRatio; // Display frequency excursion detection warning if (m_alarmProhibitCounter == 0) { OutputFrequencyWarning(m_timeStamps[0], frequencyDelta, typeofExcursion, estimatedSize); m_alarmProhibitCounter = m_alarmProhibitPeriod; } warningSignaled = true; } } // Expose output measurement values IMeasurement[] outputMeasurements = OutputMeasurements; OnNewMeasurements(new IMeasurement[] { Measurement.Clone(outputMeasurements[(int)Output.WarningSignal], warningSignaled ? 1.0D : 0.0D, frame.Timestamp), Measurement.Clone(outputMeasurements[(int)Output.FrequencyDelta], frequencyDelta, frame.Timestamp), Measurement.Clone(outputMeasurements[(int)Output.TypeOfExcursion], (int)typeofExcursion, frame.Timestamp), Measurement.Clone(outputMeasurements[(int)Output.EstimatedSize], estimatedSize, frame.Timestamp) }); } }
private void OutputFrequencyWarning(DateTime timestamp, double delta, ExcursionType typeOfExcursion, double totalAmount) { OnStatusMessage("WARNING: Frequency excursion detected!\r\n Time = {0}\r\n Delta = {1}\r\n Type = {2}\r\n Estimated Size = {3}MW\r\n", timestamp.ToString("dd-MMM-yyyy HH:mm:ss.fff"), delta, typeOfExcursion, totalAmount.ToString("0.00")); }
public override ITimeSeriesValue[] Compute(IFrame frame, IFrame[] previousFrames, IFrame[] future) { List <AdaptEvent> result = new List <AdaptEvent>(); double value = frame.Measurements["Signal"].Value; double prevValue = previousFrames.FirstOrDefault()?.Measurements["Signal"].Value ?? double.NaN; if (double.IsNaN(value)) { return(result.ToArray()); } if (m_settings.excursionType == ExcursionType.Lower || m_settings.excursionType == ExcursionType.UpperAndLower) { // On switch from Ok to in Alarm if (value < m_settings.lower && (prevValue >= m_settings.lower || double.IsNaN(prevValue))) { m_lastCrossing = frame.Timestamp; m_differenceLower = m_settings.lower - value; m_currentExcursion = ExcursionType.Lower; } // On switch from in Alarm to OK else if (value > m_settings.lower && (prevValue <= m_settings.lower)) { double length = frame.Timestamp - m_lastCrossing; if (length > m_settings.minDur * Gemstone.Ticks.PerSecond) { result.Add(new AdaptEvent("Excursion Detected", m_lastCrossing, length, new KeyValuePair <string, double>("Deviation", m_settings.lower - m_differenceLower))); } m_currentExcursion = ExcursionType.UpperAndLower; } if ((m_settings.lower - value) > m_differenceLower) { m_differenceLower = (m_settings.lower - value); } } if (m_settings.excursionType == ExcursionType.Upper || m_settings.excursionType == ExcursionType.UpperAndLower) { // On switch from Ok to in Alarm if (value > m_settings.upper && (prevValue <= m_settings.upper || double.IsNaN(prevValue))) { m_lastCrossing = frame.Timestamp; m_differenceUpper = value - m_settings.upper; m_currentExcursion = ExcursionType.Upper; } // On switch from in Alarm to OK else if (value < m_settings.upper && (prevValue >= m_settings.upper)) { double length = frame.Timestamp - m_lastCrossing; if (length > m_settings.minDur * Gemstone.Ticks.PerSecond) { result.Add(new AdaptEvent("Excursion Detected", m_lastCrossing, length, new KeyValuePair <string, double>("Deviation", m_settings.upper + m_differenceUpper))); } m_currentExcursion = ExcursionType.UpperAndLower; } if ((value - m_settings.upper) > m_differenceUpper) { m_differenceUpper = (value - m_settings.upper); } } return(result.ToArray()); }