コード例 #1
0
ファイル: AlarmOperation.cs プロジェクト: alirex1/openXDA
        private ChannelAlarmSummaryRow CreateSummaryRow(ChannelAlarmSummaryDataTable channelAlarmSummaryTable, int channelID, int alarmTypeID, DateTime date, int alarmPoints)
        {
            ChannelAlarmSummaryRow row = channelAlarmSummaryTable.NewChannelAlarmSummaryRow();

            row.ChannelID   = channelID;
            row.AlarmTypeID = alarmTypeID;
            row.Date        = date;
            row.AlarmPoints = alarmPoints;
            return(row);
        }
コード例 #2
0
ファイル: AlarmOperation.cs プロジェクト: alirex1/openXDA
        private void LoadRangeLimits(MeterDataSet meterDataSet)
        {
            MeterAlarmSummaryTableAdapter   meterAlarmSummaryAdapter;
            ChannelAlarmSummaryTableAdapter channelAlarmSummaryAdapter;
            HourOfWeekLimitTableAdapter     hourlyLimitAdapter;

            MeterAlarmSummaryDataTable   meterAlarmSummaryTable;
            ChannelAlarmSummaryDataTable channelAlarmSummaryTable;

            Dictionary <Channel, List <DataGroup> > trendingGroups;

            DateTime startTime;
            DateTime endTime;
            int      days;

            meterAlarmSummaryAdapter   = m_dbAdapterContainer.GetAdapter <MeterAlarmSummaryTableAdapter>();
            channelAlarmSummaryAdapter = m_dbAdapterContainer.GetAdapter <ChannelAlarmSummaryTableAdapter>();
            hourlyLimitAdapter         = m_dbAdapterContainer.GetAdapter <HourOfWeekLimitTableAdapter>();

            meterAlarmSummaryTable   = new MeterAlarmSummaryDataTable();
            channelAlarmSummaryTable = new ChannelAlarmSummaryDataTable();

            trendingGroups = meterDataSet.GetResource <TrendingGroupsResource>().TrendingGroups;

            startTime = trendingGroups
                        .SelectMany(kvp => kvp.Value)
                        .Select(dataGroup => dataGroup.StartTime)
                        .DefaultIfEmpty(DateTime.MaxValue)
                        .Min().Date;

            endTime = trendingGroups
                      .SelectMany(kvp => kvp.Value)
                      .Select(dataGroup => dataGroup.EndTime)
                      .DefaultIfEmpty(DateTime.MinValue)
                      .Max();

            if (endTime != endTime.Date)
            {
                endTime = endTime.Date.AddDays(1.0D);
            }

            days = (int)Math.Ceiling((endTime - startTime).TotalDays);

            if (days < 0)
            {
                return;
            }

            using (Historian historian = new Historian(m_historianSettings.Server, m_historianSettings.InstanceName))
            {
                for (int i = 0; i < days; i++)
                {
                    DateTime queryStart = startTime.AddDays(i);
                    DateTime queryEnd   = queryStart.AddDays(1.0D).AddTicks(-1L);

                    List <ChannelAlarmSummaryRow> channelAlarmSummaries = historian.Read(meterDataSet.Meter.Channels.Select(channel => channel.ID), queryStart, queryEnd)
                                                                          .Where(trendingPoint => trendingPoint.SeriesID == SeriesID.Average)
                                                                          .GroupBy(trendingPoint => trendingPoint.ChannelID)
                                                                          .SelectMany(channelGroup =>
                    {
                        Channel channel = m_dbAdapterContainer.GetAdapter <MeterInfoDataContext>().Channels.Single(ch => ch.ID == channelGroup.Key);
                        AlarmRangeLimitDataTable rangeLimitTable = InitializeRangeLimitTable(channel);

                        return(channelGroup
                               .SelectMany(TrendingPoint => rangeLimitTable.Where(rangeLimit => rangeLimit.Enabled != 0).Select(RangeLimit => new { TrendingPoint, RangeLimit }))
                               .Where(obj => CheckAlarm(channel, obj.TrendingPoint, obj.RangeLimit))
                               .GroupBy(obj => obj.RangeLimit.AlarmTypeID)
                               .Select(alarmTypeGroup => CreateSummaryRow(channelAlarmSummaryTable, channelGroup.Key, alarmTypeGroup.Key, queryStart, alarmTypeGroup.Count())));
                    })
                                                                          .ToList();

                    IEnumerable <MeterAlarmSummaryRow> meterAlarmSummaries = channelAlarmSummaries
                                                                             .GroupBy(channelAlarmSummary => channelAlarmSummary.AlarmTypeID)
                                                                             .Select(channelSummaryGroup => CreateSummaryRow(meterAlarmSummaryTable, meterDataSet.Meter.ID, channelSummaryGroup.Key, queryStart, channelSummaryGroup.Sum(channelAlarmSummary => channelAlarmSummary.AlarmPoints)));

                    foreach (MeterAlarmSummaryRow meterAlarmSummary in meterAlarmSummaries)
                    {
                        meterAlarmSummaryAdapter.Upsert(meterAlarmSummary);
                    }

                    foreach (ChannelAlarmSummaryRow channelAlarmSummary in channelAlarmSummaries)
                    {
                        channelAlarmSummaryAdapter.Upsert(channelAlarmSummary);
                    }
                }
            }
        }