Esempio n. 1
0
        private static OmfTypeCode ToOmfTypeCode(PIPointType pointType)
        {
            switch (pointType)
            {
            case PIPointType.Int16:
                return(OmfTypeCode.Integer);

            case PIPointType.Int32:
                return(OmfTypeCode.Integer);

            case PIPointType.Float16:
                return(OmfTypeCode.Number);

            case PIPointType.Float32:
                return(OmfTypeCode.Number);

            case PIPointType.Float64:
                return(OmfTypeCode.Number);

            case PIPointType.Digital:
                return(OmfTypeCode.String);

            case PIPointType.Timestamp:
                return(OmfTypeCode.Time);

            case PIPointType.String:
                return(OmfTypeCode.String);

            case PIPointType.Blob:
                return(OmfTypeCode.ByteArray);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 2
0
        public static StreamDataType GetDataType(PIPointType pointType)
        {
            switch (pointType)
            {
            case PIPointType.Int16:
                return(StreamDataType.Integer);

            case PIPointType.Int32:
                return(StreamDataType.Integer);

            case PIPointType.Float16:
                return(StreamDataType.Float);

            case PIPointType.Float32:
                return(StreamDataType.Float);

            case PIPointType.Float64:
                return(StreamDataType.Float);

            case PIPointType.Digital:
                return(StreamDataType.String);

            case PIPointType.Timestamp:
                return(StreamDataType.Time);

            case PIPointType.String:
                return(StreamDataType.String);

            case PIPointType.Blob:
                return(StreamDataType.Blob);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 3
0
        public AFAttribute AddTimeSeries(string name, PIPointType type)
        {
            var settings = new Dictionary <string, object>(1)
            {
                [PICommonPointAttributes.PointType] = type
            };

            return(new AFAttribute(server.CreatePIPoint(name, settings)));
        }
Esempio n. 4
0
        public bool AddPIValue(string piPoint, string dateString, string value)
        {
            bool piPointPresent = PIPointExists(piPoint);

            if (piPointPresent)
            {
                PIPoint     myPoint   = PIPoint.FindPIPoint(_pi, piPoint);
                PIPointType pointType = myPoint.PointType;

                object val = 0;
                try
                {
                    val = ParseValue(pointType.ToString().ToLower(), value);
                }
                catch (Exception ex)
                {
                    return(false);
                }

                DateTime dateValue;
                AFTime   afTime;
                if (DateTime.TryParse(dateString, out dateValue))
                {
                    afTime = new AFTime(dateValue);
                }
                else
                {
                    return(false);
                }

                AFValue piValue = new AFValue(val, afTime);
                myPoint.UpdateValue(piValue, AFUpdateOption.InsertNoCompression);
                return(true);
            }
            return(false);
        }
Esempio n. 5
0
 public static string GetQiTypeId(PIPointType pointType)
 {
     return(GetQiTypeId(GetDataType(pointType)));
 }
Esempio n. 6
0
 public AFAttribute AddOrGetTimeSeries(string name, PIPointType type)
 => TryGetTimeSeries(name, out AFAttribute timeseries) ? timeseries : AddTimeSeries(name, type);
        public void PIDataPipeTimeSeriesTest(PIPointType piPointType, object[] eventValues)
        {
            Contract.Requires(eventValues != null);

            const string PointName = "PIDataPipeTests_PIPoint";

            AFDatabase db         = AFFixture.AFDatabase;
            PIServer   piServer   = PIFixture.PIServer;
            var        piDataPipe = new PIDataPipe(AFDataPipeType.TimeSeries);

            var piPointList = new PIPointList();
            var now         = AFTime.NowInWholeSeconds;

            try
            {
                Output.WriteLine("Create the Future PI Points with Zero Compression and specified PI Point type.");
                PIFixture.DeletePIPoints(PointName + "*", Output);
                var testPIPoints = PIFixture.CreatePIPoints(PointName + "###", eventValues.Length, new Dictionary <string, object>
                {
                    { PICommonPointAttributes.PointType, piPointType },
                    { PICommonPointAttributes.ExceptionDeviation, 0 },
                    { PICommonPointAttributes.ExceptionMaximum, 0 },
                    { PICommonPointAttributes.Compressing, 0 },
                    { PICommonPointAttributes.DigitalSetName, "Phases" },
                    { PICommonPointAttributes.Future, true },
                });
                Assert.True(testPIPoints.Count() == eventValues.Length, $"Unable to create all the test PI Points.");
                piPointList.AddRange(testPIPoints);

                // Add the PI Point as sign up to the PIDataPipe.
                Output.WriteLine($"Sign up all PI Points with PIDataPipe.");
                var afErrors           = piDataPipe.AddSignups(piPointList);
                var prefixErrorMessage = "Adding sign ups to the PIDataPipe was unsuccessful.";
                Assert.True(afErrors == null,
                            userMessage: afErrors?.Errors.Aggregate(prefixErrorMessage, (msg, error) => msg += $" PI Point: [{error.Key.Name}] Error: [{error.Value.Message}] "));

                // Write one data value to each PI Point.
                var expectedAFValues = new AFValues();
                for (int i = 0; i < eventValues.Length; i++)
                {
                    AFValue afValue   = null;
                    var     timestamp = now + TimeSpan.FromMinutes(i - eventValues.Length);

                    // Special Handling of Input Data for Digital and Timestamp
                    switch (piPointType)
                    {
                    case PIPointType.Digital:
                        afValue = new AFValue(new AFEnumerationValue("Phases", (int)eventValues[i]), timestamp);
                        break;

                    case PIPointType.Timestamp:
                        afValue = new AFValue(new AFTime(eventValues[i], now), timestamp);
                        break;

                    default:
                        afValue = new AFValue(eventValues[i], timestamp);
                        break;
                    }

                    Output.WriteLine($"Writing Value [{eventValues[i]}] with Timestamp [{timestamp}] to PI Point [{piPointList[i].Name}].");
                    piPointList[i].UpdateValue(afValue, AFUpdateOption.InsertNoCompression);

                    // If writing digital states, we need to save the corresponding value for verification.
                    // Since we are using Phases, 0 ~ Phase1, 1 ~ Phase2, etc.
                    if (piPointType == PIPointType.Digital)
                    {
                        int input = (int)eventValues[i];
                        afValue = new AFValue(new AFEnumerationValue($"Phase{input + 1}", input), timestamp);
                    }

                    afValue.PIPoint = piPointList[i];
                    expectedAFValues.Add(afValue);
                }

                // Retry assert to retrieve expected Update Events from the PIDataPipe
                var actualAFValues = new AFValues();
                Output.WriteLine($"Reading Events from the PI DataPipe.");
                AssertEventually.True(() =>
                {
                    var updateEvents = piDataPipe.GetUpdateEvents(eventValues.Length);

                    prefixErrorMessage = "Retrieving Update Events from the PIDataPipe was unsuccessful.";
                    Assert.False(updateEvents.HasErrors,
                                 userMessage: updateEvents.Errors?.Aggregate(prefixErrorMessage, (msg, error) => msg += $" PI Point: [{error.Key.Name}] Error: [{error.Value.Message}] "));

                    actualAFValues.AddRange(updateEvents.Results.Select(update => update.Value));
                    if (actualAFValues.Count >= expectedAFValues.Count)
                    {
                        // Verify that all expected update events are received from the PIDataPipe
                        Assert.True(expectedAFValues.Count == actualAFValues.Count, "PIDataPipe returned more events than expected. " +
                                    $"Expected Count: {expectedAFValues.Count}, Actual Count: {actualAFValues.Count}.");
                        return(true);
                    }

                    return(false);
                },
                                      TimeSpan.FromSeconds(5),
                                      TimeSpan.FromSeconds(0.5),
                                      "Unable to retrieve events within the time frame.");

                // Verify all received events.
                Output.WriteLine($"Verifying all {actualAFValues.Count} events from the PI DataPipe.");
                for (int i = 0; i < actualAFValues.Count; i++)
                {
                    // Special handling of Output events for Timestamp
                    if (piPointType == PIPointType.Timestamp)
                    {
                        actualAFValues[i].Value = new AFTime(actualAFValues[i].Value, now);
                    }

                    AFFixture.CheckAFValue(actualAFValues[i], expectedAFValues[i]);
                    Assert.True(object.Equals(actualAFValues[i].PIPoint, expectedAFValues[i].PIPoint),
                                $"Unexpected PI Point Association. Expected: [{expectedAFValues[i].PIPoint}], Actual: [{actualAFValues[i].PIPoint}].");
                }

                // Remove all sign ups from the PIDataPipe
                Output.WriteLine($"Remove all PI Point sign ups from PIDataPipe.");
                afErrors           = piDataPipe.RemoveSignups(piPointList);
                prefixErrorMessage = "Removing sign ups to the PIDataPipe was unsuccessful.";
                Assert.True(afErrors == null,
                            userMessage: afErrors?.Errors.Aggregate(prefixErrorMessage, (msg, error) => msg += $" PI Point: [{error.Key.Name}] Error: [{error.Value.Message}] "));

                // Write dummy values to the PI Points and confirm PI DataPipe receives none.
                Output.WriteLine($"Write dummy values to the PI Points.");
                for (int i = 0; i < eventValues.Length; i++)
                {
                    piPointList[i].UpdateValue(new AFValue(eventValues[i], now), AFUpdateOption.InsertNoCompression);
                }

                Output.WriteLine($"Verify no events are received by the PIDataPipe.");
                var noEvents = piDataPipe.GetUpdateEvents(eventValues.Length);
                prefixErrorMessage = "Retrieving Update Events from the PIDataPipe was unsuccessful.";
                Assert.False(noEvents.HasErrors,
                             userMessage: noEvents.Errors?.Aggregate(prefixErrorMessage, (msg, error) => msg += $" PI Point: [{error.Key.Name}] Error: [{error.Value.Message}] "));

                Assert.True(noEvents.Count == 0, "PIDataPipe received events even after removing all sign ups.");
            }
            finally
            {
                piDataPipe.RemoveSignups(piPointList);
                piDataPipe.Dispose();
                PIFixture.DeletePIPoints(PointName + "*", Output);
            }
        }