static void PrintInterpolated(AFDatabase database, string meterName, string startTime, string endTime, TimeSpan timeSpan)
        {
            Console.WriteLine(string.Format("Print Interpolated Values - Meter: {0}, Start: {1}, End: {2}", meterName, startTime, endTime));

            AFAttribute attr = AFAttribute.FindAttribute(@"\Meters\" + meterName + @"|Energy Usage", database);

            AFTime      start     = new AFTime(startTime);
            AFTime      end       = new AFTime(endTime);
            AFTimeRange timeRange = new AFTimeRange(start, end);

            AFTimeSpan interval = new AFTimeSpan(timeSpan);

            AFValues vals = attr.Data.InterpolatedValues(
                timeRange: timeRange,
                interval: interval,
                desiredUOM: null,
                filterExpression: null,
                includeFilteredValues: false);

            foreach (AFValue val in vals)
            {
                Console.WriteLine("Timestamp (Local): {0}, Value: {1:0.00} {2}", val.Timestamp.LocalTime, val.Value, val?.UOM.Abbreviation);
            }
            Console.WriteLine();
        }
示例#2
0
        public AFInterpolatedAttributeRetrievalClass(
            AFAttribute attribute,
            AFTimeRange timeRange,
            AFTimeSpan timeSpan,
            string outputDirectory,
            PIRandomFunctionsUtil.TimeResolution timeResolution,
            int numYears,
            int pageSize  = 200000,
            Logger logger = null)
        {
            this.attribute = attribute;
            this.tag       = attribute.PIPoint;
            if (tag == null)
            {
                throw new ArgumentException($"attribute PIPoint must be not null");
            }
            this.desiredUOM = attribute.DefaultUOM;

            this.timeRange       = timeRange;
            this.timeSpan        = timeSpan;
            this.outputDirectory = outputDirectory;
            this.timeResolution  = timeResolution;
            this.numYears        = numYears;
            this.pageSize        = pageSize;
            this.nextStartTime   = timeRange.StartTime;
            if (logger == null)
            {
                logger = new Logger();
            }
            this.logger = logger;
        }
示例#3
0
        //Gets the array
        private void composeArray()
        {
            this.aFTimeRange = new AFTimeRange(this.startDateTime, this.endDateTime);
            //this.interval = new TimeSpan(0, 5, 0);
            this.span = new AFTimeSpan(this.samplingInterval);

            foreach (String windNodeTag in windNodePotentialTags)
            {
                PIPoint pi_point = PIPoint.FindPIPoint(this.piServer, windNodeTag);
                //tagList.Add(pi_point.RecordedValues(aFTimeRange, OSIsoft.AF.Data.AFBoundaryType.Inside, "", false).ToString());
                AFValues interpolated = pi_point.InterpolatedValues(this.aFTimeRange, this.span, "", false);

                foreach (AFValue value in interpolated)
                {
                    String[] temp = { windNodeTag, value.Value.ToString(), value.Timestamp.ToString() };
                    //Temp 0: Name of Wind Node Tag
                    //Temp 1: Value of the tag
                    //Temp 2: Time Stamp of the tag
                    Console.WriteLine(temp[0] + ", " + temp[1] + ", " + temp[2]);
                    this.valueList.Add(temp);
                }
                //this.rtu.setArray(this.valueList);
            }
            //this.rtu.sendToRTU();
        }
        static void PrintInterpolated(AFDatabase database, string meterName, string startTime, string endTime, TimeSpan timeSpan)
        {
            Console.WriteLine(string.Format("Print Interpolated Values - Meter: {0}, Start: {1}, End: {2}", meterName, startTime, endTime));

            AFAttribute attr = AFAttribute.FindAttribute(@"\Meters\" + meterName + @"|Energy Usage", database);

            AFTime start = new AFTime(startTime);
            AFTime end = new AFTime(endTime);
            AFTimeRange timeRange = new AFTimeRange(start, end);

            AFTimeSpan interval = new AFTimeSpan(timeSpan);

            AFValues vals = attr.Data.InterpolatedValues(
                timeRange: timeRange,
                interval: interval,
                desiredUOM: null,
                filterExpression: null,
                includeFilteredValues: false);

            foreach (AFValue val in vals)
            {
                Console.WriteLine("Timestamp (Local): {0}, Value (kWh): {1}", val.Timestamp.LocalTime, val.Value);
            }
            Console.WriteLine();
        }
示例#5
0
        public PIValues GetInterpolatedValues(int i, string starttime, string endtime, string interval)
        {
            AFTime      startTime = new AFTime(starttime);
            AFTime      endTime   = new AFTime(endtime);
            AFTimeRange timeRange = new AFTimeRange(startTime, endTime);
            AFTimeSpan  timeSpan  = AFTimeSpan.Parse(interval);
            AFValues    myAFValues;

            if (i == 1)
            {
                myAFValues = MyAtrbTag1.Data.InterpolatedValues(timeRange, timeSpan, null, null, false);
            }
            else if (i == 2)
            {
                myAFValues = MyAtrbTag2.Data.InterpolatedValues(timeRange, timeSpan, null, null, false);
            }
            else if (i == 3)
            {
                myAFValues = MyAtrbTag3.Data.InterpolatedValues(timeRange, timeSpan, null, null, false);
            }
            else if (i == 4)
            {
                myAFValues = MyAtrbTag4.Data.InterpolatedValues(timeRange, timeSpan, null, null, false);
            }
            else
            {
                myAFValues = MyAtrbTag5.Data.InterpolatedValues(timeRange, timeSpan, null, null, false);
            }
            return(ConvertToPIValues(myAFValues));
        }
示例#6
0
        static void PrintInterpolated(AFDatabase database, string meterName, string start, string end, TimeSpan interval)
        {
            AFTime      startTime = new AFTime(start);
            AFTime      endTime   = new AFTime(end);
            AFTimeRange timeRange = new AFTimeRange(startTime, endTime);

            AFAttribute att         = AFAttribute.FindAttribute(@"\Meters\" + meterName + @"|Energy Usage", database);
            AFTimeSpan  intervalNew = new AFTimeSpan(interval);
            AFValues    values      = att.Data.InterpolatedValues(timeRange: timeRange, interval: intervalNew, desiredUOM: null, filterExpression: null, includeFilteredValues: false);
        }
        public PIValuesList GetInterpolatedValues(string startTime, string endTime, string interval)
        {
            AFTime                 start        = new AFTime(startTime);
            AFTime                 end          = new AFTime(endTime);
            AFTimeRange            timeRange    = new AFTimeRange(start, end);
            AFTimeSpan             timeSpan     = AFTimeSpan.Parse(interval);
            IEnumerable <AFValues> valueResults = pointList.InterpolatedValues(timeRange, timeSpan, string.Empty, false, new PIPagingConfiguration(PIPageType.TagCount, 100));

            return(new PIValuesList(valueResults));
        }
        static void Main(string[] args)
        {
            var AFServerName   = "SKYPI05";
            var AFDatabaseName = "MBMC";
            var user           = @"skypi\lbowling";
            var password       = @"OFNxBKOZmG1w";

            NetworkCredential credential = new NetworkCredential(user, password);
            var piSystem = (new PISystems())[AFServerName];

            piSystem.Connect(credential);
            var afdb = piSystem.Databases[AFDatabaseName];


            foreach (var item in afdb.Elements)
            {
                Console.WriteLine(item.Name);
            }

            var selectedElementName = "Element1";
            var selectedElement     = afdb.Elements[selectedElementName];

            Console.WriteLine("Attributes for " + selectedElementName);

            foreach (var attribute in selectedElement.Attributes)
            {
                Console.WriteLine(attribute.Name);
            }

            var selectedAttributeName = "Attribute1";
            var selectedAttribute     = selectedElement.Attributes[selectedAttributeName];


            var start     = DateTime.Today.AddDays(-1);
            var end       = start.AddDays(1);
            var timeRange = new AFTimeRange(start, end);
            var span      = AFTimeSpan.Parse("1h");


            //var afValues = selectedAttribute.Data.PlotValues(timeRange, 24, null);
            //var afValues = selectedAttribute.Data.InterpolatedValues(timeRange, span, null, null, false);
            var afValues = selectedAttribute.Data.RecordedValues(timeRange, OSIsoft.AF.Data.AFBoundaryType.Inside, null, null, false);


            foreach (var afValue in afValues)
            {
                Console.WriteLine("Time: {0} \t Value: {1} \t", afValue.Timestamp, afValue.Value.ToString());
            }

            Console.WriteLine("Count: " + afValues.Count);



            Console.ReadKey();
        }
        public static IDictionary<AFAttribute, AFValues> GetTotalsAsync(AFDatabase afDb)
        {
            AFAttributeList attributeList = GetAttributes(afDb);

            // Beginning of current month to beginning of today.
            Dictionary<AFAttribute, AFValues> totals = new Dictionary<AFAttribute, AFValues>();
            AFTimeRange timeRange = new AFTimeRange(new AFTime(string.Format("{0}-{1}-01", DateTime.Now.Year, DateTime.Now.Month)), new AFTime("T"));
            AFTimeSpan dayInterval = new AFTimeSpan(0, 0, 1);
            List<Task<IDictionary<AFSummaryTypes, AFValues>>> processingList = new List<Task<IDictionary<AFSummaryTypes, AFValues>>>();
            foreach (AFAttribute attribute in attributeList)
            {
                // Do not make the call if async is not supported
                if ((attribute.SupportedDataMethods & AFDataMethods.Asynchronous) == 0)
                    continue;

                try
                {
                    processingList.Add(
                    attribute.Data.SummariesAsync(timeRange, dayInterval, AFSummaryTypes.Total, AFCalculationBasis.TimeWeighted, AFTimestampCalculation.Auto));

                    // periodically evaluate
                    if (processingList.Count > Environment.ProcessorCount * 2)
                    {
                        Task.WhenAll(processingList.ToArray());
                        foreach (var item in processingList)
                        {
                            WriteSummaryItem(item.Result[AFSummaryTypes.Total]);
                        }

                        processingList = new List<Task<IDictionary<AFSummaryTypes, AFValues>>>();
                    }
                }
                catch (AggregateException ae)
                {
                    //if (ae.Flatten().InnerExceptions.Count == 1)
                    Console.WriteLine("{0}: {1}", attribute.Name, ae.Flatten().InnerException.Message);
                }
            }

            if (processingList.Count > 0)
            {
                Task.WhenAll(processingList.ToArray());
                foreach (var item in processingList)
                {
                    WriteSummaryItem(item.Result[AFSummaryTypes.Total]);
                }
            }

            return totals;
        }
        public static IDictionary<AFAttribute, AFValues> GetTotalsBulk(AFDatabase afDb)
        {
            AFAttributeList attributeList = GetAttributes(afDb);

            Dictionary<AFAttribute, AFValues> totals = new Dictionary<AFAttribute, AFValues>();
            AFTimeRange timeRange = new AFTimeRange(new AFTime(string.Format("{0}-{1}-01", DateTime.Now.Year, DateTime.Now.Month)), new AFTime("T"));
            AFTimeSpan dayInterval = new AFTimeSpan(0, 0, 1);

            PIPagingConfiguration pageConfig = new PIPagingConfiguration(PIPageType.TagCount, Environment.ProcessorCount * 2);
            foreach (var item in attributeList.Data.Summaries(timeRange, dayInterval, AFSummaryTypes.Total, AFCalculationBasis.TimeWeighted, AFTimestampCalculation.Auto,
                pageConfig))
            {
                WriteSummaryItem(item[AFSummaryTypes.Total]);
            }

            return totals;
        }
示例#11
0
        public void GetPIData(string[] paths, string startTime, string endTime, string interval)
        {
            string[] correctPaths = paths.Select(m => m.Substring(3)).ToArray();
            AFKeyedResults <string, AFAttribute> results = AFAttribute.FindAttributesByPath(correctPaths, null);
            AFAttributeList attributeList = new AFAttributeList();

            foreach (AFAttribute attribute in results)
            {
                attributeList.Add(attribute);
            }

            AFTime                 start        = new AFTime(startTime);
            AFTime                 end          = new AFTime(endTime);
            AFTimeRange            timeRange    = new AFTimeRange(start, end);
            AFTimeSpan             timeSpan     = AFTimeSpan.Parse(interval);
            IEnumerable <AFValues> valueResults = attributeList.Data.InterpolatedValues(timeRange, timeSpan, string.Empty, false, new PIPagingConfiguration(PIPageType.TagCount, 100));

            piValuesList = new PIValuesList(valueResults);
        }
        private void btnRetrieveData_Click(object sender, EventArgs e)
        {
            try
            {
                lbData.Items.Clear();
                AFAttribute selectedAttribute = lbAttributes.SelectedItem as AFAttribute;
                AFTimeRange timeRange = new AFTimeRange(tbStartTime.Text, tbEndTime.Text);
                AFValues vals = null;
                switch (cbDataMethod.Text)
                {
                    case "Recorded Values":
                        vals = selectedAttribute.Data.RecordedValues(timeRange, OSIsoft.AF.Data.AFBoundaryType.Inside, null, String.Empty, false, 0);
                        break;
                    case "Interpolated Values":
                        var interval = new AFTimeSpan();
                        AFTimeSpan.TryParse(tbInterval.Text, out interval);
                        vals = selectedAttribute.Data.InterpolatedValues(timeRange, interval, null, String.Empty, false);
                        break;
                    case "Snapshot":
                        vals = new AFValues();
                        vals.Add(selectedAttribute.Data.EndOfStream(null));
                        break;
                    default:
                        throw new InvalidExpressionException();

                }

                var valStrings = vals.Select(afv => String.Format("{0}\t{1}\t{2}\t{3}"
                    , afv.Attribute.Name
                    , afv.Timestamp.LocalTime
                    , afv.Value
                    , afv.UOM == null ? string.Empty : afv.UOM.Name));

                lbData.Items.AddRange(valStrings.ToArray());
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error getting PI Data: " + ex.Message);
            }
        }
示例#13
0
        public void GetPIData(string piDataArchiveName, string piPointName1, string piPointName2, string piPointName3, string startTime, string endTime, string interval)
        {
            IEnumerable <string> piPointNames = new List <string> {
                piPointName1, piPointName2, piPointName3
            };
            PIServer piServer = new PIServers()[piDataArchiveName];

            if (piServer == null)
            {
                return;
            }
            IList <PIPoint> points    = PIPoint.FindPIPoints(piServer, piPointNames);
            PIPointList     pointList = new PIPointList(points);
            AFTimeRange     timeRange = new AFTimeRange(new AFTime(startTime), new AFTime(endTime));
            AFTimeSpan      timeSpan;
            bool            result = AFTimeSpan.TryParse(interval, out timeSpan);

            if (result == false)
            {
                AFTimeSpan.TryParse("1h", out timeSpan);
            }
            IEnumerable <AFValues> valuesList = pointList.InterpolatedValues(timeRange, timeSpan, string.Empty, false, new PIPagingConfiguration(PIPageType.TagCount, 100));

            foreach (AFValues values in valuesList)
            {
                if (values.PIPoint.Name == piPointName1)
                {
                    values1 = values.Where(m => m.ValueTypeCode == TypeCode.Single || m.ValueTypeCode == TypeCode.Double).Select(m => m.ValueAsDouble()).ToArray();
                }
                else if (values.PIPoint.Name == piPointName2)
                {
                    values2 = values.Where(m => m.ValueTypeCode == TypeCode.Single || m.ValueTypeCode == TypeCode.Double).Select(m => m.ValueAsDouble()).ToArray();
                }
                else if (values.PIPoint.Name == piPointName3)
                {
                    values3 = values.Where(m => m.ValueTypeCode == TypeCode.Single || m.ValueTypeCode == TypeCode.Double).Select(m => m.ValueAsDouble()).ToArray();
                }
            }
        }
示例#14
0
        public static IList <IDictionary <AFSummaryTypes, AFValues> > GetSummariesSync(AFAttributeList attributeList)
        {
            Console.WriteLine("Calling GetSummariesSync\n");
            PIPagingConfiguration config = new PIPagingConfiguration(PIPageType.TagCount, 100);

            try
            {
                AFSummaryTypes mySummaries = AFSummaryTypes.Minimum | AFSummaryTypes.Maximum | AFSummaryTypes.Average | AFSummaryTypes.Total;
                AFTimeRange    timeRange   = new AFTimeRange(new AFTime("*-1d"), new AFTime("*"));
                AFTimeSpan     span        = new AFTimeSpan(days: 1);
                return(attributeList.Data.Summaries(timeRange, span,
                                                    mySummaries,
                                                    AFCalculationBasis.TimeWeighted,
                                                    AFTimestampCalculation.Auto,
                                                    config).ToList());
            }
            catch (AggregateException ae)
            {
                Console.WriteLine("{0}: {1}", attributeList.Count, ae.Flatten().InnerException.Message);
                return(null);
            }
        }
        public void GetInterpolatedTest()
        {
            // TODO uncomment below to test the method and replace null with proper value
            string startTime = Constants.TIME_START;
            string endTime   = Constants.TIME_END;
            string timeZone  = null;

            string interval              = Constants.TIME_INTERVAL;
            string desiredUnits          = null;
            string filterExpression      = null;
            bool   includeFilteredValues = true;
            string selectedFields        = null;
            var    response              = instance.GetInterpolated(webId, startTime: startTime, endTime: endTime, timeZone: timeZone, interval: interval, desiredUnits: desiredUnits, filterExpression: filterExpression, includeFilteredValues: includeFilteredValues, selectedFields: selectedFields);

            Assert.IsInstanceOf <PITimedValues>(response, "response is PITimedValues");

            AFTimeRange timeRange = new AFTimeRange(new AFTime(Constants.TIME_START), new AFTime(Constants.TIME_END));
            AFTimeSpan  timeSpan  = AFTimeSpan.Parse(interval);
            AFValues    values    = point.InterpolatedValues(timeRange, timeSpan, filterExpression, includeFilteredValues);

            Assert.IsTrue(response.Items.Count > 10);
            Assert.IsTrue(response.Items.Count == values.Count);
        }
        static void Main(string[] args)
        {
            NetworkCredential credential = new NetworkCredential(connectionInfo.user, connectionInfo.password);
            var piSystem = (new PISystems())[connectionInfo.AFServerName];

            Console.WriteLine($"connecting to : {connectionInfo.AFServerName} - {connectionInfo.AFDatabaseName}");
            piSystem.Connect(credential);
            var afdb = piSystem.Databases[connectionInfo.AFDatabaseName];

            Console.WriteLine("connected");

            var query  = "Template:'Antimatter Relay' Name:T001";
            var search = new AFElementSearch(afdb, "Relay Search", query);
            var relay  = search.FindElements(0, true, 1).FirstOrDefault();

            if (relay != null)
            {
                var now = DateTime.Now;

                //this will not work, the kind propery is not set and it treated as UTC
                //var end = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0);

                //the correct way to do it
                var end   = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0, DateTimeKind.Local);
                var start = end.AddDays(-1);

                AFTimeRange range  = new AFTimeRange(start, end);
                AFTimeSpan  span   = AFTimeSpan.Parse("1h");
                var         values = relay.Attributes["Ion Charge"].Data.InterpolatedValues(range, span, null, "", false);
                foreach (var value in values)
                {
                    Console.WriteLine($"value: {value.ValueAsDouble()} time: {value.Timestamp.ToString()}");
                }
            }
            Console.WriteLine("completed execution");
            Console.ReadKey();
        }
示例#17
0
 public PIInterpolatedPointRetrievalClass(
     PIPoint tag,
     AFTimeRange timeRange,
     AFTimeSpan timeSpan,
     string outputDirectory,
     PIRandomFunctionsUtil.TimeResolution timeResolution,
     int numYears,
     int pageSize  = 200000,
     Logger logger = null)
 {
     this.tag             = tag;
     this.timeRange       = timeRange;
     this.timeSpan        = timeSpan;
     this.nextStartTime   = timeRange.StartTime;
     this.outputDirectory = outputDirectory;
     this.timeResolution  = timeResolution;
     this.numYears        = numYears;
     this.pageSize        = pageSize;
     if (logger == null)
     {
         logger = new Logger();
     }
     this.logger = logger;
 }
        public override AFValue GetValue(object context, object timeContext, AFAttributeList inputAttributes, AFValues inputValues)
        {
            // Declare Variables
            AFTimeRange timeRange = new AFTimeRange();
            AFTimeSpan  span      = new AFTimeSpan();
            AFTime      timeVal   = new AFTime();
            AFValue     result    = new AFValue();
            //AFAttribute targetAttr = null;

            AFAttribute targetAttr = inputAttributes[0];


            bool useRecordedValue = false;

            if (string.IsNullOrEmpty(ConfigString))
            {
                throw new Exception("ConfigString cannot be null or empty");
            }

            // ---------------------------------------------------------------------------------------------
            // Parse the Time Context
            // ---------------------------------------------------------------------------------------------
            // Mimic AF Poi Point behaviour
            // if TimeMethod is TimeRange, then apply the RelativeTime setting if the client supplys a single time (not a time range)
            // If TimeMethod is TimeRangeOverride, then apply the relativeTime always
            // If TimeMethod is NotSupported, then return an error message if the client sends a time instead of a timerange
            //_timeMethod
            switch (_timeMethod)
            {
            case RetrievalMethods.TimeRange:
                if (timeContext is AFTime)
                {
                    timeRange.EndTime = (AFTime)timeContext;
                    timeRange         = ParseTimeRange(timeRange, _relativeTimeResolved);
                }
                else if (timeContext == null)
                {
                    timeRange.EndTime = DateTime.Now;
                    timeRange         = ParseTimeRange(timeRange, _relativeTimeResolved);
                }
                else
                {
                    timeRange = (AFTimeRange)timeContext;
                }
                break;

            case RetrievalMethods.TimeRangeOverride:
                if (timeContext is AFTime)
                {
                    timeRange.EndTime = (AFTime)timeContext;
                }
                else if (timeContext == null)
                {
                    timeRange.EndTime = DateTime.Now;
                }
                else
                {
                    // We use the end time of the time range and override the span.
                    timeRange.EndTime = ((AFTimeRange)timeContext).EndTime;
                }

                timeRange = ParseTimeRange(timeRange, _relativeTimeResolved);
                break;

            case RetrievalMethods.NotSupported:
                if (timeContext is AFTime || timeContext == null)
                {
                    throw new Exception("Not Supported");
                }
                else
                {
                    timeRange = (AFTimeRange)timeContext;
                }
                break;

            default:
                // This is not a time range query. Just use recordedvalue
                useRecordedValue = true;
                if (timeContext is AFTime)
                {
                    timeRange.EndTime = (AFTime)timeContext;
                }
                else if (timeContext == null)
                {
                    timeRange.EndTime = DateTime.Now;
                }
                else
                {
                    timeRange.EndTime = ((AFTimeRange)timeContext).EndTime;
                }
                break;
            }
            //------------------------------------------------------------------------------------------
            //Query the archive
            //------------------------------------------------------------------------------------------
            if (useRecordedValue)
            {
                result = targetAttr.Data.RecordedValue(timeRange.EndTime, (AFRetrievalMode)_timeMethod, targetAttr.DefaultUOM);
            }
            else
            {
                //IDictionary<AFSummaryTypes, AFValue> value = targetAttr.Data.Summary(timeRange, AFSummaryTypes.All, _timeRangeBasis, _timestampCalculation);
                IDictionary <AFSummaryTypes, AFValue> value = targetAttr.Data.Summary(timeRange, _timeRangeMethod | AFSummaryTypes.PercentGood, _timeRangeBasis, _timestampCalculation);

                if (value[_timeRangeMethod].IsGood)
                {
                    //Check the quality meets the min percent good rule
                    if (value[AFSummaryTypes.PercentGood].ValueAsSingle() >= _timeRangeMinPercentGood)
                    {
                        result = value[_timeRangeMethod];
                        //rate conversion for totals
                        if ((_timeRangeMethod == AFSummaryTypes.Total || _timeRangeMethod == AFSummaryTypes.TotalWithUOM) && _rateConversion != string.Empty)
                        {
                            result.Value = targetAttr.PISystem.UOMDatabase.UOMs[_rateConversion].Convert(value[_timeRangeMethod].ValueAsDouble(), targetAttr.PISystem.UOMDatabase.UOMs["day"]);
                        }
                    }
                    else
                    {
                        throw new Exception(String.Format("Value does not have the required percent good ({0}) over the time range in {1}|{2}. Parameter name: minPercentGood", _timeRangeMinPercentGood, this.Attribute.Element.Name, this.Attribute.Name));
                    }
                }
                else
                {
                    throw new Exception((string)value[_timeRangeMethod].Value.ToString());
                }
            }

            return(result);
        }
        public static int UpdateAttributeData(AFDatabase database)
        {
            AFAttributeList attributeList = GetAttributes(database);

            AFTimeRange timeRange = new AFTimeRange(new AFTime(string.Format("{0}-{1}-01", DateTime.Now.Year, DateTime.Now.Month)), new AFTime("T"));
            AFTimeSpan hourInterval = new AFTimeSpan(0, 0, 0, 1);

            // Question: What risk is run by the following code?
            List<Task<AFErrors<AFValue>>> processWrites = new List<Task<AFErrors<AFValue>>>();
            foreach (AFAttribute attribute in attributeList)
            {
                AFValues vals = GenerateValueSequence(attribute, timeRange.StartTime, timeRange.EndTime, hourInterval);
                processWrites.Add(attribute.Data.UpdateValuesAsync(vals, AFUpdateOption.Insert, AFBufferOption.DoNotBuffer));
            }

            int errorcount = 0;
            try
            {
                Task.WaitAll(processWrites.ToArray());
                foreach (var item in processWrites)
                {
                    AFErrors<AFValue> errors = item.Result;
                    // Count PIPoint errors
                    if (errors != null && errors.HasErrors)
                        errorcount += errors.Errors.Count;

                    // Report PI Server, AF Server errors
                }
            }
            catch (AggregateException ae)
            {
            }

            return errorcount;
        }
示例#20
0
        private void btnGetData(object sender, EventArgs e)
        {
            AFAttribute SelectedAttribute = lbAttributes.SelectedItem as AFAttribute;

            AFTime      starTime  = new AFTime(tbStart.Text);
            AFTime      endTime   = new AFTime(tbEnd.Text);
            AFTimeRange timeRange = new AFTimeRange(starTime, endTime);


            // get values from specified time range
            UOM desiredUOM = cbUOM.SelectedItem as UOM;



            // The desired consiulting mode
            AFValues values;

            switch (cbDataMethod.Text)
            {
            case "Recorded Values":

                values = SelectedAttribute.Data.RecordedValues(timeRange
                                                               , AFBoundaryType.Interpolated
                                                               , desiredUOM
                                                               , null
                                                               , true);

                break;

            case "Interpolated Values":

                values = SelectedAttribute.Data.InterpolatedValues(timeRange
                                                                   , AFTimeSpan.Parse("5m")
                                                                   , desiredUOM
                                                                   , null
                                                                   , true);

                break;

            case "Plot Values":
                values = SelectedAttribute.Data.PlotValues(timeRange
                                                           , 300
                                                           , desiredUOM);
                break;

            default:

                values = new AFValues();
                break;
            }

            //AFValues Values = SelectedAttribute.GetValues(timeRange, 0, desiredUOM);

            lbValues.Items.Clear();

            if (values != null)
            {
                foreach (AFValue value in values)
                {
                    String myStr = string.Format("{0} \t {1}, {2}"
                                                 , value.Timestamp.LocalTime
                                                 , value.Value
                                                 , value.UOM != null ? value.UOM.Abbreviation : null);

                    lbValues.Items.Add(myStr);
                }
            }
        }
        private static AFValues GenerateValueSequence(AFAttribute attribute, AFTime start, AFTime end, AFTimeSpan interval)
        {
            float zero = 100.0F;
            float span = 360.0F;
            AFValues values = new AFValues();
            AFTime timestamp = start;
            Random rnd = new Random((int)DateTime.Now.Ticks % 86400);
            int idx = 1;
            while (timestamp <= end)
            {
                values.Add(new AFValue(attribute, zero + (float)rnd.NextDouble() * span, timestamp));
                timestamp = interval.Multiply(start, idx++);
            }

            return values;
        }
        public static List <AbstractRetrievePoints> LoadAttributeClassesInterpolated(
            String inputFilePath,
            String outputDirectory,
            String timeResolution,
            int numYears,
            int pageSize,
            PIServer piServer,
            PISystem piSystem,
            AFDatabase database,
            int numParallelTasks,
            Logger logger)
        {
            var inputLines = new List <String[]>();

            using (var inputStreamReader = new StreamReader(inputFilePath))
            {
                while (!inputStreamReader.EndOfStream)
                {
                    inputLines.Add(inputStreamReader.ReadLine().Split(','));
                }
            }

            List <AbstractRetrievePoints> tagClasses = new List <AbstractRetrievePoints>();

            Parallel.ForEach(
                inputLines,
                new ParallelOptions {
                MaxDegreeOfParallelism = numParallelTasks
            },
                (String[] line) =>
            {
                string tagName         = line[0];
                string startTimeString = line[1];
                string endTimeString   = line[2];
                string intervalString  = line[3];

                PIPoint tag;
                try
                {
                    AFAttribute attribute = AFUtil.FindAttribute(database, tagName);
                    tag = attribute.PIPoint;

                    AFTime startTime = new AFTime(startTimeString);
                    AFTime nextTime  = AFQueryUtil.GetNextRecordedValue(tag, startTime).Timestamp;
                    if (nextTime > startTime)
                    {
                        startTime = new AFTime(nextTime.UtcTime.Date);
                    }
                    AFTime endTime        = new AFTime(endTimeString);
                    AFTimeRange timeRange = new AFTimeRange(startTime, endTime);
                    AFTimeSpan timeSpan   = new AFTimeSpan(TimeSpan.FromSeconds(Int32.Parse(intervalString)));

                    string startTimeStamp = startTime.UtcTime.ToString("yyyy/MM/dd HH:mm:ss");
                    string endTimeStamp   = endTime.UtcTime.ToString("yyyy/MM/dd HH:mm:ss");
                    lock (logger) { logger.Log($"{startTimeStamp} : {timeSpan} : {endTimeStamp}, {tagName}"); }

                    lock (tagClasses)
                    {
                        tagClasses.Add(new AFInterpolatedAttributeRetrievalClass(
                                           attribute,
                                           timeRange,
                                           timeSpan,
                                           outputDirectory,
                                           PIRandomFunctionsUtil.ParseTimeResolutionString(timeResolution),
                                           numYears,
                                           pageSize,
                                           logger));
                    }
                }
                catch (Exception e)
                {
                    logger.Log("Exception: could not FindPiPoint: " + e.ToString());
                }
            });
            return(tagClasses);
        }
示例#23
0
        internal void Execute(string command, PIPointList pointsList, AFTime st, AFTime et,
                              AFTimeSpan summaryDuration, string[] times, string addlparam1, PIServer myServer)
        {
            try
            {
                Console.WriteLine();
                switch (command)
                {
                case "snap":
                {
                    var sb = new StringBuilder();
                    sb.AppendLine($"Point Name(Point Id), Timestamp, Current Value");
                    sb.AppendLine(new string('-', 45));
                    AFListResults <PIPoint, AFValue> results = pointsList.EndOfStream();
                    if (results.HasErrors)
                    {
                        foreach (var e in results.Errors)
                        {
                            sb.AppendLine($"{e.Key}: {e.Value}");
                        }
                    }
                    foreach (var v in results.Results)
                    {
                        if (!results.Errors.ContainsKey(v.PIPoint))
                        {
                            sb.AppendLine($"{string.Concat($"{v.PIPoint.Name} ({v.PIPoint.ID})"),-15}," +
                                          $" {v.Timestamp}, {v.Value}");
                        }
                    }
                    sb.AppendLine();
                    Console.Write(sb.ToString());
                    break;
                }

                case "arclist":
                {
                    AFTimeRange timeRange = new AFTimeRange(st, et);
                    if (!Int32.TryParse(addlparam1, out int maxcount))
                    {
                        maxcount = 0;
                    }

                    // Holds the results keyed on the associated point
                    var resultsMap   = new Dictionary <PIPoint, AFValues>();
                    var pagingConfig = new PIPagingConfiguration(PIPageType.TagCount, GlobalConfig.PageSize);
                    IEnumerable <AFValues> listResults = pointsList.RecordedValues(timeRange: timeRange,
                                                                                   boundaryType: AFBoundaryType.Inside,
                                                                                   filterExpression: null,
                                                                                   includeFilteredValues: false,
                                                                                   pagingConfig: pagingConfig,
                                                                                   maxCount: maxcount
                                                                                   );
                    foreach (var pointResults in listResults)
                    {
                        resultsMap[pointResults.PIPoint] = pointResults;
                    }
                    foreach (var pointValues in resultsMap)
                    {
                        var sb = new StringBuilder();
                        sb.AppendLine($"Point: {pointValues.Key} Archive Values " +
                                      $"Count: {pointValues.Value.Count}");
                        sb.AppendLine(new string('-', 45));
                        pointValues.Value.ForEach(v => sb.AppendLine($"{v.Timestamp}, {v.Value}"));
                        sb.AppendLine();
                        Console.Write(sb.ToString());
                    }
                    break;
                }

                case "plot":
                {
                    AFTimeRange timeRange = new AFTimeRange(st, et);
                    if (!Int32.TryParse(addlparam1, out int intervals))
                    {
                        intervals = 640;         //horizontal pixels in the trend
                    }
                    var resultsMap   = new Dictionary <PIPoint, AFValues>();
                    var pagingConfig = new PIPagingConfiguration(PIPageType.TagCount, GlobalConfig.PageSize);
                    IEnumerable <AFValues> listResults = pointsList.PlotValues(timeRange: timeRange,
                                                                               intervals: intervals,
                                                                               pagingConfig: pagingConfig
                                                                               );
                    foreach (var pointResults in listResults)
                    {
                        resultsMap[pointResults.PIPoint] = pointResults;
                    }
                    foreach (var pointValues in resultsMap)
                    {
                        var sb = new StringBuilder();
                        sb.AppendLine($"Point: {pointValues.Key} Plot Values Interval: {intervals}" +
                                      $" Count: {pointValues.Value.Count}");
                        sb.AppendLine(new string('-', 45));
                        pointValues.Value.ForEach(v => sb.AppendLine($"{v.Timestamp}, {v.Value}"));
                        sb.AppendLine();
                        Console.Write(sb.ToString());
                    }
                    break;
                }

                case "interp":
                {
                    AFTimeRange timeRange    = new AFTimeRange(st, et);
                    var         resultsMap   = new Dictionary <PIPoint, AFValues>();
                    var         pagingConfig = new PIPagingConfiguration(PIPageType.TagCount, GlobalConfig.PageSize);

                    if (addlparam1.StartsWith("c="))
                    {
                        if (!Int32.TryParse(addlparam1.Substring(2), out int count))
                        {
                            count = 10;         //default count
                        }
                        IEnumerable <AFValues> listResults = pointsList.InterpolatedValuesByCount(timeRange: timeRange,
                                                                                                  numberOfValues: count,
                                                                                                  filterExpression: null,
                                                                                                  includeFilteredValues: false,
                                                                                                  pagingConfig: pagingConfig
                                                                                                  );
                        foreach (var pointResults in listResults)
                        {
                            resultsMap[pointResults.PIPoint] = pointResults;
                        }
                        foreach (var pointValues in resultsMap)
                        {
                            var sb = new StringBuilder();
                            sb.AppendLine($"Point: {pointValues.Key} Interpolated Values " +
                                          $"Count: {pointValues.Value.Count}");
                            sb.AppendLine(new string('-', 45));
                            pointValues.Value.ForEach(v => sb.AppendLine($"{v.Timestamp}, {v.Value}"));
                            sb.AppendLine();
                            Console.Write(sb.ToString());
                        }
                    }
                    else
                    {
                        if (!AFTimeSpan.TryParse(addlparam1, out AFTimeSpan interval) || interval == new AFTimeSpan(0))
                        {
                            interval = summaryDuration;
                        }

                        IEnumerable <AFValues> listResults = pointsList.InterpolatedValues(timeRange: timeRange,
                                                                                           interval: interval,
                                                                                           filterExpression: null,
                                                                                           includeFilteredValues: false,
                                                                                           pagingConfig: pagingConfig
                                                                                           );
                        foreach (var pointResults in listResults)
                        {
                            resultsMap[pointResults.PIPoint] = pointResults;
                        }
                        foreach (var pointValues in resultsMap)
                        {
                            var sb = new StringBuilder();
                            sb.AppendLine($"Point: {pointValues.Key} Interpolated Values " +
                                          $"Interval: {interval.ToString()}");
                            sb.AppendLine(new string('-', 45));
                            pointValues.Value.ForEach(v => sb.AppendLine($"{v.Timestamp}, {v.Value}"));
                            sb.AppendLine();
                            Console.Write(sb.ToString());
                        }
                    }
                    break;
                }

                case "summaries":
                {
                    var resultsMap   = new Dictionary <PIPoint, AFValues>();
                    var pagingConfig = new PIPagingConfiguration(PIPageType.TagCount, GlobalConfig.PageSize);
                    if (st > et)         //summaries cannot handle reversed times
                    {
                        var temp = st;
                        st = et;
                        et = temp;
                    }
                    AFTimeRange        timeRange           = new AFTimeRange(st, et);
                    var                intervalDefinitions = new AFTimeIntervalDefinition(timeRange, 1);
                    AFCalculationBasis calculationBasis    = AFCalculationBasis.EventWeighted;
                    if (addlparam1 == "t")
                    {
                        calculationBasis = AFCalculationBasis.TimeWeighted;
                    }

                    foreach (var pt in pointsList)
                    {
                        var summaryType = AFSummaryTypes.All;
                        if (pt.PointType == PIPointType.Digital ||
                            pt.PointType == PIPointType.Timestamp ||
                            pt.PointType == PIPointType.Blob ||
                            pt.PointType == PIPointType.String ||
                            pt.PointType == PIPointType.Null)
                        {
                            summaryType = AFSummaryTypes.AllForNonNumeric;
                        }
                        IDictionary <AFSummaryTypes, AFValues> summaries = pt.Summaries(new List <AFTimeIntervalDefinition>()
                            {
                                intervalDefinitions
                            },
                                                                                        reverseTime: false,
                                                                                        summaryType: summaryType,
                                                                                        calcBasis: calculationBasis,
                                                                                        timeType: AFTimestampCalculation.Auto
                                                                                        );
                        var sb = new StringBuilder();
                        sb.AppendLine($"Point: {pt.Name} {calculationBasis} Summary");
                        sb.AppendLine(new string('-', 45));
                        foreach (var s in summaries)
                        {
                            AFValues vals = s.Value;
                            foreach (var v in vals)
                            {
                                if (v.Value.GetType() != typeof(PIException))
                                {
                                    if (string.Compare(s.Key.ToString(), "Minimum", true) == 0 ||
                                        string.Compare(s.Key.ToString(), "Maximum", true) == 0)
                                    {
                                        sb.AppendLine($"{s.Key,-16}: {v.Value,-20} {v.Timestamp}");
                                    }
                                    else
                                    {
                                        sb.AppendLine($"{s.Key,-16}: {v.Value}");
                                    }
                                }
                                else
                                {
                                    sb.AppendLine($"{s.Key,-16}: {v}");
                                }
                            }
                        }
                        sb.AppendLine();
                        Console.Write(sb.ToString());
                    }

                    /*
                     * Non numeric tags in pointsList requires splitting of queries so the above is preferred.
                     * The below implementation works when there are no non-numeric types or one particular summary needs to be run
                     */
                    //var listResults = pointsList.Summaries(new List<AFTimeIntervalDefinition>() {
                    //                                                               intervalDefinitions },
                    //                                                               reverseTime: false,
                    //                                                               summaryTypes: AFSummaryTypes.All,
                    //                                                               calculationBasis: calculationBasis,
                    //                                                               timeType: AFTimestampCalculation.Auto,
                    //                                                               pagingConfig: pagingConfig
                    //                                                               );
                    //foreach (IDictionary<AFSummaryTypes, AFValues> summaries in listResults)
                    //{
                    //     foreach (IDictionary<AFSummaryTypes, AFValues> pointResults in listResults)
                    //    {
                    //            AFValues pointValues = pointResults[AFSummaryTypes.Average];
                    //            PIPoint point = pointValues.PIPoint;
                    //           //Map the results back to the point
                    //           resultsMap[point] = pointValues;
                    //     }
                    //}
                    break;
                }

                case "update":
                case "annotate":
                {
                    string         addlparam2   = string.Empty;
                    AFUpdateOption updateOption = AFUpdateOption.Replace;
                    AFBufferOption bufOption    = AFBufferOption.BufferIfPossible;
                    AFValue        val;
                    if (times.Length > 0)
                    {
                        addlparam1 = times[0];
                        if (times.Length > 1)
                        {
                            addlparam2 = times[1];
                        }
                    }
                    switch (addlparam1)
                    {
                    case "i":
                        updateOption = AFUpdateOption.Insert;
                        break;

                    case "nr":
                        updateOption = AFUpdateOption.NoReplace;
                        break;

                    case "ro":
                        updateOption = AFUpdateOption.ReplaceOnly;
                        break;

                    case "inc":
                        updateOption = AFUpdateOption.InsertNoCompression;
                        break;

                    case "rm":
                        updateOption = AFUpdateOption.Remove;
                        break;
                    }
                    switch (addlparam2)
                    {
                    case "dnb":
                        bufOption = AFBufferOption.DoNotBuffer;
                        break;

                    case "buf":
                        bufOption = AFBufferOption.Buffer;
                        break;
                    }
                    foreach (var pt in pointsList)
                    {
                        Console.WriteLine($"Point: {pt.Name} {command} ({updateOption} {bufOption})");
                        Console.WriteLine(new string('-', 45));
                        Console.Write("Enter timestamp: ");
                        var time = Console.ReadLine();

                        if (!AFTime.TryParse(time, out AFTime ts))
                        {
                            ParseArgs.PrintHelp("Invalid Timestamp");
                            break;
                        }
                        if (command == "update" ||
                            !(pt.RecordedValuesAtTimes(new List <AFTime>()
                            {
                                ts
                            }, AFRetrievalMode.Exact)[0].IsGood))
                        {
                            Console.Write("Enter new value: ");
                            var data = Console.ReadLine();
                            if (!Double.TryParse(data, out var value))
                            {
                                ParseArgs.PrintHelp("Invalid data");
                                break;
                            }
                            val = new AFValue(value, ts);
                        }
                        else
                        {
                            val = pt.RecordedValuesAtTimes(new List <AFTime>()
                                {
                                    ts
                                }, AFRetrievalMode.Exact)[0];
                        }
                        if (command == "annotate")
                        {
                            Console.Write("Enter annotation: ");
                            var ann = Console.ReadLine();
                            pt.SetAnnotation(val, ann);
                        }
                        pt.UpdateValue(value: val, option: updateOption, bufferOption: bufOption);
                        Console.WriteLine($"Successfully {command}d");
                    }
                    Console.WriteLine();
                    break;
                }

                case "delete":
                {
                    AFTimeRange timeRange = new AFTimeRange(st, et);

                    if (myServer.Supports(PIServerFeature.DeleteRange))
                    {
                        foreach (var pt in pointsList)
                        {
                            int delcount            = 0;
                            var sb                  = new StringBuilder();
                            var intervalDefinitions = new AFTimeIntervalDefinition(timeRange, 1);
                            //getting the count of events - optional
                            IDictionary <AFSummaryTypes, AFValues> summaries = pt.Summaries(new List <AFTimeIntervalDefinition>()
                                {
                                    intervalDefinitions
                                },
                                                                                            reverseTime: false,
                                                                                            summaryType: AFSummaryTypes.Count,
                                                                                            calcBasis: AFCalculationBasis.EventWeighted,
                                                                                            timeType: AFTimestampCalculation.Auto
                                                                                            );
                            foreach (var s in summaries)
                            {
                                AFValues vals = s.Value;
                                vals = s.Value;
                                foreach (var v in vals)
                                {
                                    if (v.Value.GetType() != typeof(PIException))
                                    {
                                        delcount = v.ValueAsInt32();         //count
                                    }
                                }
                            }
                            if (delcount > 0)
                            {
                                var errs = pt.ReplaceValues(timeRange, new List <AFValue>()
                                    {
                                    });
                                if (errs != null)
                                {
                                    foreach (var e in errs.Errors)
                                    {
                                        sb.AppendLine($"{e.Key}: {e.Value}");
                                        delcount--;
                                    }
                                }
                            }
                            sb.AppendLine($"Point: {pt.Name} Deleted {delcount} events");
                            sb.AppendLine(new string('-', 45));
                            sb.AppendLine();
                            Console.Write(sb.ToString());
                        }
                    }
                    else
                    {
                        foreach (var pt in pointsList)
                        {
                            int      delcount = 0;
                            var      sb       = new StringBuilder();
                            AFValues vals     = pt.RecordedValues(timeRange: timeRange,
                                                                  boundaryType: AFBoundaryType.Inside,
                                                                  filterExpression: null,
                                                                  includeFilteredValues: false,
                                                                  maxCount: 0
                                                                  );
                            delcount = vals.Count;
                            if (delcount > 0)
                            {
                                var errs = pt.UpdateValues(values: vals,
                                                           updateOption: AFUpdateOption.Remove,
                                                           bufferOption: AFBufferOption.BufferIfPossible);
                                if (errs != null)
                                {
                                    foreach (var e in errs.Errors)
                                    {
                                        sb.AppendLine($"{e.Key}: {e.Value}");
                                        delcount--;
                                    }
                                }
                            }
                            sb.AppendLine($"Point: {pt.Name} Deleted {delcount} events");
                            sb.AppendLine(new string('-', 45));
                            sb.AppendLine();
                            Console.Write(sb.ToString());
                        }
                    }
                    break;
                }

                case "sign,t":
                {
                    Dictionary <PIPoint, int> errPoints = pointsList.ToDictionary(key => key, value => 0);
                    //if (Int32.TryParse(myServer.ServerVersion.Substring(4, 3), out int srvbuild) && srvbuild >= 395);
                    if (myServer.Supports(PIServerFeature.TimeSeriesDataPipe))
                    {
                        PIDataPipe timeSeriesDatapipe = new PIDataPipe(AFDataPipeType.TimeSeries);
                        Console.WriteLine("Signing up for TimeSeries events");
                        var errs = timeSeriesDatapipe.AddSignups(pointsList);
                        if (errs != null)
                        {
                            foreach (var e in errs.Errors)
                            {
                                Console.WriteLine($"Failed timeseries signup: {e.Key}, {e.Value.Message}");
                                errPoints[e.Key]++;
                            }
                            foreach (var ep in errPoints)
                            {
                                if (ep.Value >= 1)
                                {
                                    pointsList.Remove(ep.Key);
                                }
                            }
                            if (pointsList.Count == 0)
                            {
                                ParseArgs.PrintHelp("No valid PI Points");
                                if (timeSeriesDatapipe != null)
                                {
                                    timeSeriesDatapipe.Close();
                                    timeSeriesDatapipe.Dispose();
                                }
                                return;
                            }
                        }
                        timeSeriesDatapipe.Subscribe(new DataPipeObserver("TimeSeries"));
                        Console.WriteLine("Subscribed Points (current value): ");
                        AFListResults <PIPoint, AFValue> results = pointsList.EndOfStream();
                        if (results.HasErrors)
                        {
                            foreach (var e in results.Errors)
                            {
                                Console.WriteLine($"{e.Key}: {e.Value}");
                            }
                        }
                        foreach (var v in results.Results)
                        {
                            if (!results.Errors.ContainsKey(v.PIPoint))
                            {
                                Console.WriteLine($"{v.PIPoint.Name,-12}, {v.Timestamp}, {v.Value}");
                            }
                        }
                        Console.WriteLine(new string('-', 45));

                        //Fetch timeseries events till user termination
                        while (!GlobalConfig.CancelSignups)
                        {
                            timeSeriesDatapipe.GetObserverEvents(GlobalConfig.PipeMaxEvtCount, out bool hasMoreEvents);
                            Thread.Sleep(GlobalConfig.PipeCheckFreq);
                        }
                        Console.WriteLine("Cancelling signups ...");
                        if (timeSeriesDatapipe != null)
                        {
                            timeSeriesDatapipe.Close();
                            timeSeriesDatapipe.Dispose();
                        }
                    }
                    else
                    {
                        ParseArgs.PrintHelp($"Time series not supported in Archive version {myServer.ServerVersion}");
                    }
                    break;
                }

                case "sign,as":
                case "sign,sa":
                case "sign,a":
                case "sign,s":
                {
                    bool       snapSubscribe            = false;
                    bool       archSubscribe            = false;
                    PIDataPipe snapDatapipe             = null;
                    PIDataPipe archDatapipe             = null;
                    Dictionary <PIPoint, int> errPoints = pointsList.ToDictionary(key => key, value => 0);
                    if (command.Substring(5).Contains("s"))
                    {
                        snapSubscribe = true;
                        snapDatapipe  = new PIDataPipe(AFDataPipeType.Snapshot);

                        Console.WriteLine("Signing up for Snapshot events");
                        var errs = snapDatapipe.AddSignups(pointsList);
                        snapDatapipe.Subscribe(new DataPipeObserver("Snapshot"));
                        if (errs != null)
                        {
                            foreach (var e in errs.Errors)
                            {
                                Console.WriteLine($"Failed snapshot signup: {e.Key}, {e.Value.Message}");
                                errPoints[e.Key]++;
                            }
                        }
                    }
                    if (command.Substring(5).Contains("a"))
                    {
                        archSubscribe = true;
                        archDatapipe  = new PIDataPipe(AFDataPipeType.Archive);
                        Console.WriteLine("Signing up for Archive events");
                        var errs = archDatapipe.AddSignups(pointsList);
                        if (errs != null)
                        {
                            foreach (var e in errs.Errors)
                            {
                                Console.WriteLine($"Failed archive signup: {e.Key}, {e.Value.Message}");
                                errPoints[e.Key]++;
                            }
                        }
                        archDatapipe.Subscribe(new DataPipeObserver("Archive "));
                    }

                    //remove unsubscribable points
                    int errorLimit = snapSubscribe ? 1 : 0;
                    if (archSubscribe)
                    {
                        errorLimit++;
                    }
                    foreach (var ep in errPoints)
                    {
                        if (ep.Value >= errorLimit)
                        {
                            pointsList.Remove(ep.Key);
                        }
                    }
                    if (pointsList.Count == 0)
                    {
                        ParseArgs.PrintHelp("No valid PI Points");
                        if (snapDatapipe != null)
                        {
                            snapDatapipe.Close();
                            snapDatapipe.Dispose();
                        }
                        if (archDatapipe != null)
                        {
                            archDatapipe.Close();
                            archDatapipe.Dispose();
                        }
                        return;
                    }
                    Console.WriteLine("Subscribed Points (current value): ");
                    //foreach (var p in pointsList)
                    //{
                    //    Console.WriteLine($"{p.Name,-12}, {p.EndOfStream().Timestamp}, {p.EndOfStream()}");
                    //}
                    AFListResults <PIPoint, AFValue> results = pointsList.EndOfStream();
                    if (results.HasErrors)
                    {
                        foreach (var e in results.Errors)
                        {
                            Console.WriteLine($"{e.Key}: {e.Value}");
                        }
                    }
                    foreach (var v in results.Results)
                    {
                        if (!results.Errors.ContainsKey(v.PIPoint))
                        {
                            Console.WriteLine($"{v.PIPoint.Name,-12}, {v.Timestamp}, {v.Value}");
                        }
                    }
                    Console.WriteLine(new string('-', 45));

                    //Fetch events from the data pipes
                    while (!GlobalConfig.CancelSignups)
                    {
                        if (snapSubscribe)
                        {
                            snapDatapipe.GetObserverEvents(GlobalConfig.PipeMaxEvtCount, out bool hasMoreEvents1);
                        }
                        if (archSubscribe)
                        {
                            archDatapipe.GetObserverEvents(GlobalConfig.PipeMaxEvtCount, out bool hasMoreEvents2);
                        }
                        Thread.Sleep(GlobalConfig.PipeCheckFreq);
                    }
                    Console.WriteLine("Cancelling signups ...");
                    if (snapDatapipe != null)
                    {
                        snapDatapipe.Close();
                        snapDatapipe.Dispose();
                    }
                    if (archDatapipe != null)
                    {
                        archDatapipe.Close();
                        archDatapipe.Dispose();
                    }
                }
                break;
                }
                Console.WriteLine(new string('~', 45));
            }
            catch (Exception ex)
            {
                ParseArgs.PrintHelp(ex.Message);
                if (myServer != null)
                {
                    myServer.Disconnect();
                    if (GlobalConfig.Debug)
                    {
                        Console.WriteLine($"Disconnecting from {myServer.Name}");
                    }
                }
            }
        }
示例#24
0
		public void InterpolatedValues(WAFTime start, WAFTime end, string interval, string filterExp, bool includeFiltVals, ref WAFValue[] values)
		{
			List<WAFValue> retVals = null;

			try
			{
				AFTimeRange range = new AFTimeRange(start.ToString(), end.ToString());
				
				AFTimeSpan span = new AFTimeSpan();
				if (!AFTimeSpan.TryParse(interval, out span))
				{
					span = AFTimeSpan.Parse("1h");
				}

				AFValues vals = m_Pipt.InterpolatedValues(range, span, filterExp, includeFiltVals);

				retVals = vals.ConvertAll(new Converter<AFValue, WAFValue>(WAFValue.AFValueToWAFValue));
			}
			catch (Exception ex)
			{
				
				System.Console.WriteLine(ex.Message);
			}

			values = retVals.ToArray();
			return;
		}
示例#25
0
        static void Main(string[] args)
        {
            Console.WriteLine(new string('~', 45));
            if (GlobalConfig.Debug)
            {
                Console.WriteLine($"Main thread: {Thread.CurrentThread.ManagedThreadId}");
            }
            if (GlobalConfig.Debug)
            {
                Console.WriteLine($"Args length: {args.Length}");
            }

            var commandsList = new List <string>()
            {
                "snap",
                "sign,a",
                "sign,s",
                "sign,sa",
                "sign,as",
                "sign,t",
                "arclist",
                "interp",
                "plot",
                "summaries",
                "update",
                "annotate",
                "delete"
            };
            var      pointsList      = new PIPointList();
            var      command         = String.Empty;
            var      startTime       = String.Empty;
            var      endTime         = String.Empty;
            var      serverName      = String.Empty;
            var      addlparam1      = string.Empty;
            var      tagMasks        = new string[] { };
            var      times           = new string[] { };
            var      summaryDuration = new AFTimeSpan(TimeSpan.FromMinutes(10));
            var      st = new AFTime();
            var      et = new AFTime();
            PIServer myServer;

            try
            {
                var AppplicationArgs = new ParseArgs(args);
                if (!AppplicationArgs.CheckHelpVersionOrEmpty())
                {
                    return;
                }
                if (!AppplicationArgs.CheckCommandExists(commandsList, out command))
                {
                    return;
                }
                if (!AppplicationArgs.GetTagNames(out tagMasks))
                {
                    return;
                }
                if (!AppplicationArgs.GetAddlParams(command, ref times, ref startTime, ref endTime, ref addlparam1, ref serverName))
                {
                    return;
                }
            }
            catch (Exception ex)
            {
                ParseArgs.PrintHelp(ex.Message);
                return;
            }

            #region Connect Server, Verify Times and Points
            if (!String.IsNullOrEmpty(startTime) && !String.IsNullOrEmpty(endTime))
            {
                if (!AFTime.TryParse(startTime, out st))
                {
                    ParseArgs.PrintHelp($"Invalid start time {startTime}");
                    return;
                }
                if (!AFTime.TryParse(endTime, out et))
                {
                    ParseArgs.PrintHelp($"Invalid end time {endTime}");
                    return;
                }
                if (st == et) //same time or min case (from initialization)
                {
                    ParseArgs.PrintHelp("Incorrect or same time interval specified");
                    return;
                }
            }

            try
            {
                PIServers myServers = new PIServers();
                if (string.IsNullOrEmpty(serverName))
                {
                    if (GlobalConfig.Debug)
                    {
                        Console.WriteLine("Attempting connection to default server ...");
                    }
                    myServer = myServers.DefaultPIServer;
                }
                else if (myServers.Contains(serverName))
                {
                    if (GlobalConfig.Debug)
                    {
                        Console.WriteLine($"Attempting connection to {serverName} server ...");
                    }
                    myServer = myServers[serverName];
                }
                else
                {
                    ParseArgs.PrintHelp($"Server {serverName} not found in KST");
                    return;
                }
                if (myServer != null)
                {
                    myServer.ConnectionInfo.Preference = AFConnectionPreference.Any;
                    myServer.Connect();
                    Console.WriteLine($"Connected to {myServer.Name} as {myServer.CurrentUserIdentityString}");
                }
            }
            catch (Exception ex)
            {
                ParseArgs.PrintHelp("Server Connection error: " + ex.Message);
                return;
            }

            try
            {
                //foreach (var n in tagMasks)
                //{
                //    if (PIPoint.TryFindPIPoint(myServer, n, out PIPoint p))
                //    {
                //        if (!pointsList.Contains(p)) pointsList.Add(p);
                //        else Console.WriteLine($"Duplicate point {p.Name}");
                //    }
                //    else
                //    {
                //        Console.WriteLine($"Point {n} not found");
                //    }
                //}
                pointsList.AddRange(PIPoint.FindPIPoints(myServer, new List <string>(tagMasks), null));
                if (pointsList.Count == 0)
                {
                    ParseArgs.PrintHelp("No valid PI Points");
                    myServer.Disconnect();
                    return;
                }
            }
            catch (Exception ex)
            {
                ParseArgs.PrintHelp("Tagmask error " + ex.Message);
                return;
            }
            #endregion

            //Handle KeyPress event from the user
            Console.CancelKeyPress += (sender, eventArgs) =>
            {
                if (GlobalConfig.Debug)
                {
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                }
                Console.WriteLine();
                Console.WriteLine("Program termination received from user ...");
                if (command == "sign,s" || command == "sign,as" || command == "sign,sa" || command == "sign,a" || command == "sign,t")
                {
                    GlobalConfig.CancelSignups = true;
                    Thread.Sleep(Convert.ToInt32(GlobalConfig.PipeCheckFreq * 1.2));
                }
                else
                {
                    if (myServer != null)
                    {
                        myServer.Disconnect();
                    }
                    Console.WriteLine(new string('~', 45));
                }
            };

            var Exec = new ExecuteCommand();
            if (GlobalConfig.Debug)
            {
                Console.WriteLine($"Command executing: {command}");
            }
            Exec.Execute(command, pointsList, st, et, summaryDuration, times, addlparam1, myServer);
            bool isexec = true;

            if (myServer != null)
            {
                myServer.Disconnect();
                if (GlobalConfig.Debug)
                {
                    Console.WriteLine($"Disconnecting from {myServer.Name}");
                }
            }
            if (!isexec)
            {
                Console.WriteLine(new string('~', 45));
            }
        }
        public override IDictionary <AFSummaryTypes, AFValues> Summaries(AFTimeRange timeRange, AFTimeSpan summaryDuration, AFSummaryTypes summaryType, AFCalculationBasis calcBasis, AFTimestampCalculation timeType)
        {
            AFAttribute targetAttr = this.GetAttribute(_targetAttributeName);

            return(targetAttr.Data.Summaries(timeRange, summaryDuration, summaryType, calcBasis, timeType));
        }