public void PIPointSearchTest() { PIServer piServer = PIFixture.PIServer; int numberOfPointsToCreate = 10; var pointPrefix = "PIPointSearchTest_Point"; try { // Create PI Points Output.WriteLine($"Creating PI Points with prefix [{pointPrefix}]."); var points = PIFixture.CreatePIPoints($"{pointPrefix}#", numberOfPointsToCreate); // Assign range of values to defined tags for (int i = 0; i < points.Count(); i++) { points.ElementAt(i).UpdateValue(new AFValue(Math.Pow(-1, i + 1), null), 0); // Set the Step attribute of half of the PI Points to true and half to false points.ElementAt(i).SetAttribute(PICommonPointAttributes.Step, Convert.ToBoolean(1 * ((i + 1) % 2))); points.ElementAt(i).SaveAttributes(); } // Search PI Points with queries var searchQuery = $"Name:'{pointPrefix}*' value:>0"; Output.WriteLine($"Searching for PI Points with query [{searchQuery}]."); var parsedQuery = PIPointQuery.ParseQuery(piServer, searchQuery); var searchPointsCount = PIPoint.FindPIPoints(piServer, parsedQuery).Count(); AssertEventually.True( () => PIPoint.FindPIPoints(piServer, parsedQuery).Count() == (numberOfPointsToCreate / 2), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(0.5), $"The PI Points count do not match. Expected: {numberOfPointsToCreate / 2}, Actual: {searchPointsCount}."); searchQuery = $"Name:'{pointPrefix}*'"; Output.WriteLine($"Searching for PI Points with query [{searchQuery}]."); parsedQuery = PIPointQuery.ParseQuery(piServer, searchQuery); searchPointsCount = PIPoint.FindPIPoints(piServer, parsedQuery).Count(); AssertEventually.True( () => PIPoint.FindPIPoints(piServer, parsedQuery).Count() == numberOfPointsToCreate, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(0.5), $"The PI Points count do not match. Expected: {numberOfPointsToCreate}, Actual: {searchPointsCount}."); searchQuery = $"Name:'{pointPrefix}*' step:=0"; Output.WriteLine($"Searching for PI Points with query [{searchQuery}]."); parsedQuery = PIPointQuery.ParseQuery(piServer, searchQuery); searchPointsCount = PIPoint.FindPIPoints(piServer, parsedQuery).Count(); AssertEventually.True( () => PIPoint.FindPIPoints(piServer, parsedQuery).Count() == (numberOfPointsToCreate / 2), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(0.5), $"The PI Points count do not match. Expected: {numberOfPointsToCreate / 2}, Actual: {searchPointsCount}."); } finally { PIFixture.DeletePIPoints("PIPointSearchTest_Point*", Output); } }
public void PIPointsTest() { PIServer piServer = PIFixture.PIServer; int count = 10; var pointPrefix = "PIPointsTest_Point"; try { // Create PI Point and verify Output.WriteLine($"Creating PI Points with prefix [{pointPrefix}] with default attributes and verifying."); var points = PIFixture.CreatePIPoints($"{pointPrefix}#", count); var returnedPoints = PIPoint.FindPIPoints(piServer, $"{pointPrefix}*"); Assert.True(returnedPoints.Count() == count, $"Expected to find {count} PI Points on Data Archive [{piServer}], actually found {returnedPoints.Count()}."); var timestamp = new AFTime("*-10m"); // Set Value of PI Points Output.WriteLine("Updating PI Points with new values."); for (int i = 0; i < returnedPoints.Count(); i++) { returnedPoints.ElementAt(i).UpdateValue(new AFValue(i, timestamp), AFUpdateOption.NoReplace); } // Check for updated values Output.WriteLine("Checking PI Points were updated with new values."); for (int i = 0; i < count; i++) { AssertEventually.Equals(returnedPoints.ElementAt(i).CurrentValue(), new AFValue(Convert.ToSingle(i), timestamp.ToPIPrecision())); } // Delete PI Points and verify Output.WriteLine("Deleting PI Points that were created and verifying."); PIFixture.DeletePIPoints($"{pointPrefix}*", Output); returnedPoints = PIPoint.FindPIPoints(piServer, $"{pointPrefix}*"); Assert.True(returnedPoints.Count() == 0, $"Expected to find no PI Points with prefix [{pointPrefix}], but {returnedPoints.Count()} were found."); } finally { PIFixture.DeletePIPoints($"{pointPrefix}*", Output); } }
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); } }