예제 #1
0
 private Task UpdateHandler(IEnumerable <DataPack> monitoring, bool add = true)
 {
     foreach (var item in monitoring)
     {
         MockPlc.UpdateDataChangeItem(item, !add);
     }
     return(Task.CompletedTask);
 }
예제 #2
0
        public void ArrayStringAccessTest()
        {
            var mapping    = "STRING_ARRAY_TEST_MAPPING";
            var accessDict = new Dictionary <string, object> {
                { "TEXT[1]", "TEST1" },
                { "TEXT[5]", "TEST5" },
            };

            Test(mapping, accessDict, "");

            //Byte data check
            var dbData = MockPlc.GetPlcEntry("DB30").Data;

            Assert.True(dbData.Slice(0, 2).Span.SequenceEqual(new byte[] { 35, 5 }));
            Assert.True(dbData.Slice(2, 5).Span.SequenceEqual("TEST1".ToByteArray(5)));

            Assert.True(dbData.Slice(152, 2).Span.SequenceEqual(new byte[] { 35, 5 }));
            Assert.True(dbData.Slice(154, 5).Span.SequenceEqual("TEST5".ToByteArray(5)));
        }
        public async Task MonitorDifferentIdenticalItems()
        {
            var firstMonitoredItem  = new BytesPlcItem(dataBlock: Data.Datablock, position: Data.StartOfFixedBytes, byteAmount: 2);
            var secondMonitoredItem = new UInt16PlcItem(dataBlock: Data.Datablock, position: Data.StartOfFixedBytes);
            var thirdMonitoredItem  = new BitsPlcItem(dataBlock: Data.Datablock, position: Data.StartOfFixedBytes, bitPosition: BitPosition.X0, bitAmount: 16);

            var differentReadItems = new HashSet <IPlcItem>(new ReferenceComparer());
            var mockPlc            = new MockPlc();
            Func <ICollection <IPlcItem>, CancellationToken, Task> performReadItemsAsyncMock = (plcItems, cancellationToken) =>
            {
                foreach (var plcItem in plcItems)
                {
                    differentReadItems.Add(plcItem);
                }
                return(mockPlc.ReadItemsAsync(plcItems, cancellationToken));
            };

            // Create a mock of MockPlc that signals which items are read.
            var plcMock = new Mock <IPlc>(behavior: MockBehavior.Strict)
            {
                CallBase = true,
            };

            plcMock
            .Setup(x => x.ReadItemsAsync(It.IsAny <IPlcItem[]>(), It.IsAny <CancellationToken>()))
            .Returns(performReadItemsAsyncMock)
            .Verifiable()
            ;

            // Create the monitor with the mocked instance.
            var monitoredPlc = new PollingMonitorablePlc(plcMock.Object);

            // Start monitoring those items.
            monitoredPlc.MonitorItem(firstMonitoredItem);
            monitoredPlc.MonitorItem(secondMonitoredItem);
            monitoredPlc.MonitorItem(thirdMonitoredItem);
            monitoredPlc.Start();
            await Task.Delay(1000);

            monitoredPlc.Stop();
            Assert.AreEqual(1, differentReadItems.Count);
        }
예제 #4
0
        private static Task Papper_OnRead(IEnumerable <DataPack> reads)
        {
            var result = reads.ToList();

            foreach (var item in result)
            {
                Console.WriteLine($"OnRead: selector:{item.Selector}; offset:{item.Offset}; length:{item.Length}");
                var res = MockPlc.GetPlcEntry(item.Selector, item.Offset + item.Length).Data.Slice(item.Offset, item.Length);
                if (!res.IsEmpty)
                {
                    item.ApplyData(res);
                    item.ExecutionResult = ExecutionResult.Ok;
                }
                else
                {
                    item.ExecutionResult = ExecutionResult.Error;
                }
            }
            return(Task.CompletedTask);
        }
예제 #5
0
        private static Task Papper_OnWrite(IEnumerable <DataPack> reads)
        {
            var result = reads.ToList();

            foreach (var item in result)
            {
                if (item.BitMask == 0)
                {
                    Console.WriteLine($"OnWrite: selector:{item.Selector}; offset:{item.Offset}; length:{item.Length}");
                    item.Data.Slice(0, item.Length).CopyTo(MockPlc.GetPlcEntry(item.Selector, item.Offset + item.Length).Data.Slice(item.Offset, item.Length));
                    item.ExecutionResult = ExecutionResult.Ok;
                }
                else
                {
                    for (int j = 0; j < item.Data.Length; j++)
                    {
                        var bItem = item.Data.Span[j];
                        var bm    = item.BitMask;
                        for (var i = 0; i < 8; i++)
                        {
                            var bit = bm.GetBit(i);
                            if (bit)
                            {
                                var b = MockPlc.GetPlcEntry(item.Selector, item.Offset + 1).Data.Span[item.Offset];
                                MockPlc.GetPlcEntry(item.Selector, item.Offset + 1).Data.Span[item.Offset] = b.SetBit(i, bItem.GetBit(i));
                                item.ExecutionResult = ExecutionResult.Ok;
                                bm = bm.SetBit(i, false);
                                if (bm == 0)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            return(Task.CompletedTask);
        }
        public async Task MonitorDifferentIntervals()
        {
            var monitoredChangesOfFirstItem  = 0;
            var monitoredChangesOfSecondItem = 0;

            var  firstMonitorItemIdentifier  = "Monitored item #01";
            uint firstMonitorItemInterval    = 50;
            var  secondMonitorItemIdentifier = "Monitored item #02";
            uint secondMonitorItemInterval   = 200;

            var changes       = 100;
            var secondChanges = changes / ((secondMonitorItemInterval / firstMonitorItemInterval) / 2);

            var monitoredPlc = new MockPlc().MakeMonitorable
                               (
                new Dictionary <string, uint>
            {
                { firstMonitorItemIdentifier, firstMonitorItemInterval }
                , { secondMonitorItemIdentifier, secondMonitorItemInterval }
            }
                               );

            // Create items that must be monitored.
            var firstMonitoredItem  = new BytePlcItem(dataBlock: Data.Datablock, position: Data.StartOfModifiableBytes, identifier: firstMonitorItemIdentifier);
            var secondMonitoredItem = firstMonitoredItem.Clone(secondMonitorItemIdentifier);

            // Create the item that is used to manipulate the value.
            IPlcItem writeItem = firstMonitoredItem.Clone("ChangeItem");

            // Set a callback for changes to the items.
            firstMonitoredItem.ValueChanged += (sender, args) =>
            {
                monitoredChangesOfFirstItem++;
            };
            secondMonitoredItem.ValueChanged += (sender, args) =>
            {
                monitoredChangesOfSecondItem++;
            };

            try
            {
                // Connect to the plc.
                monitoredPlc.Connect();

                // Start monitoring those items.
                monitoredPlc.MonitorItem(firstMonitoredItem);
                monitoredPlc.MonitorItem(secondMonitoredItem);
                monitoredPlc.Start();

                // Manipulate the monitored value.
                for (byte i = 1; i <= changes; i++)
                {
                    writeItem.Value.TransferValuesFrom(new[] { i });
                    await monitoredPlc.WriteItemAsync(writeItem);

                    await Task.Delay((int)firstMonitorItemInterval * 2);                     // This must be at least the double amount of the polling interval.
                }

                // Stop monitoring.
                monitoredPlc.Stop();

                // Check if all changes where registered.
                Assert.AreEqual(changes, monitoredChangesOfFirstItem);
                Assert.True(monitoredChangesOfSecondItem >= secondChanges);
            }
            finally
            {
                monitoredPlc.Dispose();
            }
        }
        public async Task MonitorChanges()
        {
            var changes          = 100;
            var target           = (changes * (changes + 1)) / 2;   // Gaußsche Summenformel
            var monitoredChanges = 0;
            var collectedValue   = 0;

            var  monitorItemIdentifier = "MonitoredItem";
            uint monitorItemInterval   = 50;

            var monitoredPlc = new MockPlc().MakeMonitorable
                               (
                new Dictionary <string, uint>
            {
                { monitorItemIdentifier, monitorItemInterval }
            }
                               );

            // Create the item that must be monitored.
            var monitorItem = new BytePlcItem(dataBlock: Data.Datablock, position: Data.StartOfModifiableBytes, identifier: monitorItemIdentifier);

            // Create the item that is used to manipulate the value.
            IPlcItem writeItem = monitorItem.Clone("ChangeItem");

            // Set a callback for changes to the items.
            monitorItem.ValueChanged += (sender, args) =>
            {
                monitoredChanges++;
                collectedValue += args.NewValue;
            };

            try
            {
                // Connect to the plc.
                monitoredPlc.Connect();

                // Start monitoring those items.
                monitoredPlc.MonitorItem(monitorItem);
                monitoredPlc.Start();

                // Manipulate the monitored value.
                for (byte i = 1; i <= changes; i++)
                {
                    writeItem.Value.TransferValuesFrom(new[] { i });
                    await monitoredPlc.WriteItemAsync(writeItem);

                    await Task.Delay((int)monitorItemInterval * 2);                     // This must be at least the double amount of the polling interval.
                }

                // Stop monitoring.
                monitoredPlc.Stop();

                // Further manipulate the value to check if this is not monitored.
                writeItem.Value.TransferValuesFrom(new[] { byte.MinValue });
                writeItem.Value.TransferValuesFrom(new[] { byte.MaxValue });

                // Check if all changes where registered.
                Assert.AreEqual(changes, monitoredChanges);
                Assert.AreEqual(target, collectedValue);
                Assert.AreEqual(changes, monitorItem.Value);
            }
            finally
            {
                monitoredPlc.Dispose();
            }
        }