using System; using System.Collections.Generic; using System.Collections.ObjectModel; using Aitex.Core.RT.IOCore; using Aitex.Core.Util; using MECF.Framework.Common.IOCore; using MECF.Framework.RT.Core.IoProviders; using MECF.Framework.Simulator.Core.IoProviders; namespace SicSimulator.Instances { public class SimulatorModulePlc { private Random _rd = new Random(); public ObservableCollection DiItemList { get; set; } public ObservableCollection DoItemList { get; set; } public ObservableCollection AiItemList { get; set; } public ObservableCollection AoItemList { get; set; } private string _source; public const int BufferSize =600; PeriodicJob _threadTimer; protected List _buffers = new List(); public SimulatorModulePlc(int port, string source, string ioMapPathFile, string module) { _source = source; _buffers.Add(new PlcBuffer() { Buffer = new byte[BufferSize], Type = IoType.DI, Offset = 0, Size = BufferSize, BoolValue = new bool[BufferSize] }); _buffers.Add(new PlcBuffer() { Buffer = new byte[BufferSize], Type = IoType.DO, Offset = 0, Size = BufferSize, BoolValue = new bool[BufferSize] }); _buffers.Add(new PlcBuffer() { Buffer = new byte[BufferSize], Type = IoType.AI, Offset = 0, Size = BufferSize, FloatValue = new float[BufferSize] }); _buffers.Add(new PlcBuffer() { Buffer = new byte[BufferSize], Type = IoType.AO, Offset = 0, Size = BufferSize, FloatValue = new float[BufferSize] }); List lstBuffers = new List(); lstBuffers.Add(new IoBlockItem() { Type = IoType.DI, Offset = 0, Size = BufferSize }); lstBuffers.Add(new IoBlockItem() { Type = IoType.DO, Offset = 0, Size = BufferSize }); lstBuffers.Add(new IoBlockItem() { Type = IoType.AI, Offset = 0, Size = BufferSize }); lstBuffers.Add(new IoBlockItem() { Type = IoType.AO, Offset = 0, Size = BufferSize }); SimulatorIoManager.Instance.SetBufferBlock(source, lstBuffers); SimulatorIoManager.Instance.SetIoMap(source, 0, ioMapPathFile, module); Init(); _threadTimer = new PeriodicJob(200, OnTimer, "SimulatorModulePlc", true); } void Init() { if (DiItemList == null) { List diItems = IO.GetDiList(_source); if (diItems != null) { DiItemList = new ObservableCollection(); foreach (var diItem in diItems) { NotifiableIoItem item = new NotifiableIoItem() { Name = diItem.Name, Index = diItem.Index, Description = diItem.Description, BoolValue = diItem.Value, Address = diItem.Addr, BlockOffset = diItem.BlockOffset, BlockIndex = diItem.Index, }; DiItemList.Add(item); } } } if (DoItemList == null) { List doItems = IO.GetDoList(_source); if (doItems != null) { DoItemList = new ObservableCollection(); foreach (var ioItem in doItems) { NotifiableIoItem item = new NotifiableIoItem() { Name = ioItem.Name, Index = ioItem.Index, Description = ioItem.Description, BoolValue = ioItem.Value, Address = ioItem.Addr, BlockOffset = ioItem.BlockOffset, BlockIndex = ioItem.Index, }; DoItemList.Add(item); } } } if (AiItemList == null) { List aiItems = IO.GetAiList(_source); if (aiItems != null) { AiItemList = new ObservableCollection(); foreach (var ioItem in aiItems) { NotifiableIoItem item = new NotifiableIoItem() { Name = ioItem.Name, Index = ioItem.Index, Description = ioItem.Description, FloatValue = ioItem.Value, Address = ioItem.Addr, BlockOffset = ioItem.BlockOffset, BlockIndex = ioItem.Index, }; AiItemList.Add(item); } } } if (AoItemList == null) { List aoItems = IO.GetAoList(_source); if (aoItems != null) { AoItemList = new ObservableCollection(); foreach (var ioItem in aoItems) { NotifiableIoItem item = new NotifiableIoItem() { Name = ioItem.Name, Index = ioItem.Index, Description = ioItem.Description, FloatValue = ioItem.Value, Address = ioItem.Addr, BlockOffset = ioItem.BlockOffset, BlockIndex = ioItem.Index, }; AoItemList.Add(item); } } } } protected bool OnTimer() { bool[] diBuffer = new bool[BufferSize]; if (DiItemList != null) { foreach (var notifiableIoItem in DiItemList) { if (notifiableIoItem.HoldValue) { IO.DI[notifiableIoItem.Name].Value = notifiableIoItem.BoolValue; diBuffer[notifiableIoItem.BlockIndex] = notifiableIoItem.BoolValue; } else { notifiableIoItem.BoolValue = IO.DI[notifiableIoItem.Name].Value; diBuffer[notifiableIoItem.BlockIndex] = IO.DI[notifiableIoItem.Name].Value; } notifiableIoItem.InvokePropertyChanged(nameof(NotifiableIoItem.BoolValue)); } } if (DoItemList != null) { foreach (var notifiableIoItem in DoItemList) { if (notifiableIoItem.HoldValue) IO.DO[notifiableIoItem.Name].Value = notifiableIoItem.BoolValue; else notifiableIoItem.BoolValue = IO.DO[notifiableIoItem.Name].Value; notifiableIoItem.InvokePropertyChanged(nameof(NotifiableIoItem.BoolValue)); } } if (AiItemList != null) { foreach (var notifiableIoItem in AiItemList) { if (notifiableIoItem.HoldValue) { IO.AI[notifiableIoItem.Name].Value = notifiableIoItem.FloatValue; } notifiableIoItem.FloatValue = IO.AI[notifiableIoItem.Name].Value; notifiableIoItem.InvokePropertyChanged(nameof(NotifiableIoItem.FloatValue)); } } if (AoItemList != null) { foreach (var notifiableIoItem in AoItemList) { if (notifiableIoItem.HoldValue) IO.AO[notifiableIoItem.Name].Value = notifiableIoItem.FloatValue; else notifiableIoItem.FloatValue = IO.AO[notifiableIoItem.Name].Value; notifiableIoItem.InvokePropertyChanged(nameof(NotifiableIoItem.FloatValue)); } } foreach (var plcBuffer in _buffers) { //IO修改 ---> PLC if (plcBuffer.Type == IoType.DI) { var ioBuffers = SimulatorIoManager.Instance.GetDiBuffer(_source); if (ioBuffers != null) { foreach (var ioBuffer in ioBuffers) { if (plcBuffer.Offset == ioBuffer.Key) { //plcBuffer.BoolValue = ioBuffer.Value; for (int i = 0; i < plcBuffer.BoolValue.Length; i++) { plcBuffer.BoolValue[i] = diBuffer[i]; } } } } } // PLC --> IO if (plcBuffer.Type == IoType.DO) { var ioBuffers = SimulatorIoManager.Instance.GetDoBuffer(_source); if (ioBuffers != null) { foreach (var buffer in ioBuffers) { if (plcBuffer.Offset == buffer.Key) { //SimulatorIoManager.Instance.SetDoBuffer(_source, plcBuffer.Offset, plcBuffer.BoolValue); } } } } //IO修改 ---> PLC if (plcBuffer.Type == IoType.AI) { var ioBuffers = SimulatorIoManager.Instance.GetAiBuffer(_source); if (ioBuffers != null) { foreach (var buffer in ioBuffers) { if (plcBuffer.Offset == buffer.Key) { plcBuffer.FloatValue = buffer.Value; } } } } // PLC --> IO if (plcBuffer.Type == IoType.AO) { var ioBuffers = SimulatorIoManager.Instance.GetAoBuffer(_source); if (ioBuffers != null) { foreach (var buffer in ioBuffers) { if (plcBuffer.Offset == buffer.Key) { //SimulatorIoManager.Instance.SetAoBuffer(_source, plcBuffer.Offset, Array.ConvertAll(plcBuffer.ShortValue, x => (short)x)); } } } } } return true; } } }