private void CalculateMissingLLVoltageChannels() { Meter meter; DataSeries missingSeries; //Do this for every Voltage set for (int i = 0; i < m_vIndices.Count(); i++) { // If all line voltages are already present or there are not // atleast 2 lines we will not perform line to line calculations if (m_vIndices[i].DefinedLineVoltages == 3 || m_vIndices[i].DefinedNeutralVoltages < 2) { return; } // Get the meter associated with the channels in this data group DataSeries VA = m_dataGroup[m_vIndices[i].Va]; DataSeries VB = m_dataGroup[m_vIndices[i].Vb]; DataSeries VC = m_dataGroup[m_vIndices[i].Vc]; meter = (VA ?? VB ?? VC).SeriesInfo.Channel.Meter; if (m_vIndices[i].Vab == -1 && VA != null && VB != null) { // Calculate VAB = VA - VB missingSeries = VA.Add(VB.Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meter, m_dataGroup, "Voltage", "AB", VA.SeriesInfo.Channel.AssetID); missingSeries.Calculated = true; m_vIndices[i].Vab = m_dataGroup.DataSeries.Count; m_dataGroup.Add(missingSeries); } if (m_vIndices[i].Vbc == -1 && VB != null && VC != null) { // Calculate VBC = VB - VC missingSeries = VB.Add(VC.Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meter, m_dataGroup, "Voltage", "BC", VB.SeriesInfo.Channel.AssetID); missingSeries.Calculated = true; m_vIndices[i].Vbc = m_dataGroup.DataSeries.Count; m_dataGroup.Add(missingSeries); } if (m_vIndices[i].Vca == -1 && VC != null && VA != null) { // Calculate VCA = VC - VA missingSeries = VC.Add(VA.Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meter, m_dataGroup, "Voltage", "CA", VC.SeriesInfo.Channel.AssetID); missingSeries.Calculated = true; m_vIndices[i].Vca = m_dataGroup.DataSeries.Count; m_dataGroup.Add(missingSeries); } } }
// Static Methods public static DataSeries AddMissingCurrentSeries(MeterInfoDataContext meterInfo, Meter meter, DataGroup dataGroup) { DataSeries missingSeries = null; // Get all necessary voltage and current channels in the proper order List <DataSeries> viSeriesList = Enumerable.Range(VAIndex, IRIndex + 1) .GroupJoin(dataGroup.DataSeries.Where(IsInstantaneous), i => i, GetIndex, (i, series) => series.FirstOrDefault()) .ToList(); // Validate that no more than one current channel is missing if (viSeriesList.Count(series => (object)series == null) > 1) { return(null); } // Attempt to fill in missing current channels // based on the relation IR = IA + IB + IC if ((object)viSeriesList[IAIndex] == null) { missingSeries = viSeriesList[IRIndex]; missingSeries = missingSeries.Add(viSeriesList[IBIndex].Negate()); missingSeries = missingSeries.Add(viSeriesList[ICIndex].Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meterInfo, meter, dataGroup, IAIndex); missingSeries.SeriesInfo.Channel.Line = viSeriesList[IBIndex].SeriesInfo.Channel.Line; viSeriesList[IAIndex] = missingSeries; } else if ((object)viSeriesList[IBIndex] == null) { missingSeries = viSeriesList[IRIndex]; missingSeries = missingSeries.Add(viSeriesList[IAIndex].Negate()); missingSeries = missingSeries.Add(viSeriesList[ICIndex].Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meterInfo, meter, dataGroup, IBIndex); missingSeries.SeriesInfo.Channel.Line = viSeriesList[IAIndex].SeriesInfo.Channel.Line; viSeriesList[IBIndex] = missingSeries; } else if ((object)viSeriesList[ICIndex] == null) { missingSeries = viSeriesList[IRIndex]; missingSeries = missingSeries.Add(viSeriesList[IAIndex].Negate()); missingSeries = missingSeries.Add(viSeriesList[IBIndex].Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meterInfo, meter, dataGroup, ICIndex); missingSeries.SeriesInfo.Channel.Line = viSeriesList[IAIndex].SeriesInfo.Channel.Line; viSeriesList[ICIndex] = missingSeries; } else if ((object)viSeriesList[IRIndex] == null) { missingSeries = viSeriesList[IAIndex]; missingSeries = missingSeries.Add(viSeriesList[IBIndex]); missingSeries = missingSeries.Add(viSeriesList[ICIndex]); missingSeries.SeriesInfo = GetSeriesInfo(meterInfo, meter, dataGroup, IRIndex); missingSeries.SeriesInfo.Channel.Line = viSeriesList[IAIndex].SeriesInfo.Channel.Line; viSeriesList[IRIndex] = missingSeries; } if ((object)missingSeries != null) { dataGroup.Add(missingSeries); } return(missingSeries); }