public void TestInvalidMappings() { var papper = new PlcDataMapper(960, Papper_OnRead, Papper_OnWrite, UpdateHandler, ReadMetaData, OptimizerType.Items); papper.AddMapping(typeof(DB_Safety)); using (var subscription = papper.CreateSubscription(ChangeDetectionStrategy.Event)) { Assert.True(subscription.TryAddItems(PlcWatchReference.FromAddress("DB_Safety.SafeMotion.Slots[0]", 100))); Assert.False(subscription.TryAddItems(PlcWatchReference.FromAddress("Test.XY", 100))); Assert.False(subscription.TryAddItems(PlcWatchReference.FromAddress("DB_Safety.XY", 100))); Assert.Throws <InvalidVariableException>(() => subscription.AddItems(PlcWatchReference.FromAddress("Test.XY", 100))); Assert.Throws <InvalidVariableException>(() => subscription.AddItems(PlcWatchReference.FromAddress("DB_Safety.XY", 100))); } }
public void TestExternalDataChange() { var papper = new PlcDataMapper(960, Papper_OnRead, Papper_OnWrite, UpdateHandler, ReadMetaData, OptimizerType.Items); papper.AddMapping(typeof(DB_Safety)); MockPlc.OnItemChanged = (items) => { papper.OnDataChanges(items.Select(i => new DataPack { Selector = i.Selector, Offset = i.Offset, Length = i.Length, BitMask = i.BitMask, ExecutionResult = ExecutionResult.Ok }.ApplyData(i.Data))); }; var sleepTime = 10000; var mapping = "DB_Safety"; var intiState = true; var originData = new Dictionary <string, object> { { "SafeMotion.Slots[16].SlotId", (byte)0 }, { "SafeMotion.Slots[16].HmiId", (UInt32)0 }, { "SafeMotion.Slots[16].Commands.TakeoverPermitted", false }, }; var writeData = new Dictionary <string, object> { { "SafeMotion.Slots[16].SlotId", (byte)3 }, { "SafeMotion.Slots[16].HmiId", (UInt32)4 }, { "SafeMotion.Slots[16].Commands.TakeoverPermitted", false }, }; var are = new AutoResetEvent(false); // write initial state papper.WriteAsync(PlcWriteReference.FromRoot(mapping, originData.ToArray()).ToArray()).GetAwaiter().GetResult(); using (var subscription = papper.CreateSubscription(ChangeDetectionStrategy.Event)) { subscription.AddItems(originData.Keys.Select(variable => PlcWatchReference.FromAddress($"{mapping}.{variable}", 100))); var t = Task.Run(async() => { try { while (!subscription.Watching.IsCompleted) { var res = await subscription.DetectChangesAsync(); if (!res.IsCompleted && !res.IsCanceled) { _output.WriteLine($"Changed: initial state is {intiState}"); if (!intiState) { Assert.Equal(2, res.Results.Count()); } else { Assert.Equal(3, res.Results.Count()); } foreach (var item in res.Results) { try { _output.WriteLine($"Changed: {item.Variable} = {item.Value}"); if (!intiState) { Assert.Equal(writeData[item.Variable], item.Value); } else { Assert.Equal(originData[item.Variable], item.Value); } } catch (Exception) { } } are.Set(); } } } catch (Exception) { } }); //waiting for initialize Assert.True(are.WaitOne(sleepTime), "waiting for initialize"); intiState = false; var writeResults = papper.WriteAsync(PlcWriteReference.FromRoot(mapping, writeData.ToArray()).ToArray()).GetAwaiter().GetResult(); foreach (var item in writeResults) { Assert.Equal(ExecutionResult.Ok, item.ActionResult); } //waiting for write update Assert.True(are.WaitOne(sleepTime), "waiting for write update"); //test if data change only occurred if data changed Assert.False(are.WaitOne(sleepTime), $"test if data change only occurred if data changed"); } }
public void TestDataChange() { var sleepTime = 4000; var mapping = "DB_Safety"; var intiState = true; var originData = new Dictionary <string, object> { { "SafeMotion.Slots[15].SlotId", (byte)0 }, { "SafeMotion.Slots[15].HmiId", (UInt32)0 }, { "SafeMotion.Slots[15].Commands.TakeoverPermitted", false }, }; var writeData = new Dictionary <string, object> { { "SafeMotion.Slots[15].SlotId", (byte)3 }, { "SafeMotion.Slots[15].HmiId", (UInt32)4 }, { "SafeMotion.Slots[15].Commands.TakeoverPermitted", false }, }; var are = new AutoResetEvent(false); using (var subscription = _papper.CreateSubscription()) { subscription.AddItems(originData.Keys.Select(variable => PlcWatchReference.FromAddress($"{mapping}.{variable}", 100))); var t = Task.Run(async() => { try { while (!subscription.Watching.IsCompleted) { var res = await subscription.DetectChangesAsync(); if (!res.IsCompleted && !res.IsCanceled) { if (!intiState) { Assert.Equal(2, res.Results.Count()); } else { Assert.Equal(3, res.Results.Count()); } foreach (var item in res.Results) { try { if (!intiState) { Assert.Equal(writeData[item.Variable], item.Value); } else { Assert.Equal(originData[item.Variable], item.Value); } } catch (Exception) { } } are.Set(); } } } catch (Exception) { } }); //waiting for initialize Assert.True(are.WaitOne(sleepTime)); intiState = false; var writeResults = _papper.WriteAsync(PlcWriteReference.FromRoot(mapping, writeData.ToArray()).ToArray()).GetAwaiter().GetResult(); foreach (var item in writeResults) { Assert.Equal(ExecutionResult.Ok, item.ActionResult); } //waiting for write update Assert.True(are.WaitOne(sleepTime)); //test if data change only occurred if data changed Assert.False(are.WaitOne(sleepTime)); } }