From c0706e7f03912972239f4612a8479ddfb044b810 Mon Sep 17 00:00:00 2001 From: Gavin Date: Mon, 11 Dec 2017 15:14:15 +0800 Subject: [PATCH] update cacheReader --- SCADA/Program/DataService/Alarm.cs | 63 --- SCADA/Program/DataService/CacheReader.cs | 4 +- SCADA/Program/DataService/DataService.csproj | 1 + SCADA/Program/DataService/DeviceAddress.cs | 4 +- SCADA/Program/DataService/Enums.cs | 99 ++++ SCADA/Program/DataService/ITag.cs | 20 - SCADA/Program/DataService/PLCGroup.cs | 275 +++++++++++ .../Program/ModbusDriver/ModbusDriver.csproj | 1 - SCADA/Program/ModbusDriver/ModbusRTUDriver.cs | 28 +- SCADA/Program/ModbusDriver/ModbusRTU_TCP.cs | 462 ------------------ SCADA/Program/ModbusDriver/ModbusTCPDriver.cs | 112 +---- .../Program/OmronPlcDriver/OmronUdpReader.cs | 103 +--- .../PanasonicDriver/PanasonicSerialReader.cs | 97 +--- .../SiemensPLCDriver/SiemensPLCDriver.cs | 81 --- SCADA/dll/DataService.dll | Bin 82432 -> 85504 bytes SCADA/dll/ModbusDriver.dll | Bin 29184 -> 23040 bytes SCADA/dll/OmronPlcDriver.dll | Bin 18432 -> 16896 bytes SCADA/dll/PanasonicDriver.dll | Bin 17408 -> 15872 bytes SCADA/dll/SiemensPLCDriver.dll | Bin 22528 -> 21504 bytes 19 files changed, 407 insertions(+), 943 deletions(-) create mode 100644 SCADA/Program/DataService/Enums.cs delete mode 100644 SCADA/Program/ModbusDriver/ModbusRTU_TCP.cs diff --git a/SCADA/Program/DataService/Alarm.cs b/SCADA/Program/DataService/Alarm.cs index 523fadc..a3feac5 100644 --- a/SCADA/Program/DataService/Alarm.cs +++ b/SCADA/Program/DataService/Alarm.cs @@ -157,67 +157,4 @@ namespace DataService } - [Flags] - public enum AlarmType - { - None = 0, - Level = 1, - Dev = 2, - Dsc = 4, - ROC = 8, - Quality = 16, - Complex = 32, - WordDsc = 64 - } - - [Flags] - public enum SubAlarmType - { - None = 0, - LoLo = 1, - Low = 2, - High = 4, - HiHi = 8, - MajDev = 16, - MinDev = 32, - Dsc = 64, - - BadPV = 128, - MajROC = 256, - MinROC = 512 - } - - public enum Severity - { - Error = 7, - High = 6, - MediumHigh = 5, - Medium = 4, - MediumLow = 3, - Low = 2, - Information = 1, - Normal = 0 - } - - [Flags] - public enum ConditionState : byte - { - Acked = 4, - Actived = 2, - Enabled = 1 - } - - public enum EventType : byte - { - Simple = 1, - TraceEvent = 2, - ConditionEvent = 4, - } - - public enum ConditionType : byte - { - Absolute = 0, - Percent = 1 - } - } diff --git a/SCADA/Program/DataService/CacheReader.cs b/SCADA/Program/DataService/CacheReader.cs index ac64220..e8eb183 100644 --- a/SCADA/Program/DataService/CacheReader.cs +++ b/SCADA/Program/DataService/CacheReader.cs @@ -503,7 +503,7 @@ namespace DataService public unsafe ItemData ReadBit(DeviceAddress address) { - return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit.BitSwap())) != 0, 0, QUALITIES.QUALITY_GOOD); + return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit)) != 0, 0, QUALITIES.QUALITY_GOOD); } public ItemData ReadInt16(DeviceAddress address) @@ -551,7 +551,7 @@ namespace DataService public int WriteBit(DeviceAddress address, bool bit) { - _cache[address.CacheIndex] |= (short)(1 << address.Bit.BitSwap()); + _cache[address.CacheIndex] |= (short)(1 << address.Bit); return 0; } diff --git a/SCADA/Program/DataService/DataService.csproj b/SCADA/Program/DataService/DataService.csproj index b811665..d77019b 100644 --- a/SCADA/Program/DataService/DataService.csproj +++ b/SCADA/Program/DataService/DataService.csproj @@ -158,6 +158,7 @@ + diff --git a/SCADA/Program/DataService/DeviceAddress.cs b/SCADA/Program/DataService/DeviceAddress.cs index 927ec42..16a2648 100644 --- a/SCADA/Program/DataService/DeviceAddress.cs +++ b/SCADA/Program/DataService/DeviceAddress.cs @@ -13,8 +13,9 @@ namespace DataService public ushort CacheIndex; public byte Bit; public DataType VarType; + public ByteOrder ByteOrder; - public DeviceAddress(int area, ushort dbnumber, ushort cIndex, int start, ushort size, byte bit, DataType type) + public DeviceAddress(int area, ushort dbnumber, ushort cIndex, int start, ushort size, byte bit, DataType type, ByteOrder order = ByteOrder.None) { Area = area; DBNumber = dbnumber; @@ -23,6 +24,7 @@ namespace DataService DataSize = size; Bit = bit; VarType = type; + ByteOrder = order; } public static readonly DeviceAddress Empty = new DeviceAddress(0, 0, 0, 0, 0, 0, DataType.NONE); diff --git a/SCADA/Program/DataService/Enums.cs b/SCADA/Program/DataService/Enums.cs new file mode 100644 index 0000000..ce7b7c1 --- /dev/null +++ b/SCADA/Program/DataService/Enums.cs @@ -0,0 +1,99 @@ +using System; + +namespace DataService +{ + + public enum DataSource + { + Cache = 1, + Device = 2 + } + + public enum DataType : byte + { + NONE = 0, + BOOL = 1, + BYTE = 3, + SHORT = 4, + WORD = 5, + TIME = 6, + INT = 7, + FLOAT = 8, + SYS = 9, + STR = 11 + } + + [Flags] + public enum ByteOrder : byte + { + None = 0, + BigEndian = 1, + LittleEndian = 2, + Network = 4, + Host = 8 + } + + + [Flags] + public enum AlarmType + { + None = 0, + Level = 1, + Dev = 2, + Dsc = 4, + ROC = 8, + Quality = 16, + Complex = 32, + WordDsc = 64 + } + + [Flags] + public enum SubAlarmType + { + None = 0, + LoLo = 1, + Low = 2, + High = 4, + HiHi = 8, + MajDev = 16, + MinDev = 32, + Dsc = 64, + + BadPV = 128, + MajROC = 256, + MinROC = 512 + } + + public enum Severity + { + Error = 7, + High = 6, + MediumHigh = 5, + Medium = 4, + MediumLow = 3, + Low = 2, + Information = 1, + Normal = 0 + } + + [Flags] + public enum ConditionState : byte + { + Acked = 4, + Actived = 2, + Enabled = 1 + } + + public enum EventType : byte + { + Simple = 1, + TraceEvent = 2, + ConditionEvent = 4, + } + + public enum ConditionType : byte + { + Absolute = 0, + Percent = 1 + } +} diff --git a/SCADA/Program/DataService/ITag.cs b/SCADA/Program/DataService/ITag.cs index a08c8df..f9f314d 100644 --- a/SCADA/Program/DataService/ITag.cs +++ b/SCADA/Program/DataService/ITag.cs @@ -579,26 +579,6 @@ namespace DataService } } - public enum DataSource - { - Cache = 1, - Device = 2 - } - - public enum DataType : byte - { - NONE = 0, - BOOL = 1, - BYTE = 3, - SHORT = 4, - WORD = 5, - TIME = 6, - INT = 7, - FLOAT = 8, - SYS = 9, - STR = 11 - } - public delegate void ValueChangingEventHandler(object sender, ValueChangingEventArgs e); public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs e); diff --git a/SCADA/Program/DataService/PLCGroup.cs b/SCADA/Program/DataService/PLCGroup.cs index 0040a54..a125ae2 100644 --- a/SCADA/Program/DataService/PLCGroup.cs +++ b/SCADA/Program/DataService/PLCGroup.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Net; using System.Timers; namespace DataService @@ -683,4 +684,278 @@ namespace DataService Count = count; } } + + public sealed class NetBytePLCGroup : PLCGroup + { + public NetBytePLCGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) + { + this._id = id; + this._name = name; + this._updateRate = updateRate; + this._isActive = active; + this._plcReader = plcReader; + this._server = _plcReader.Parent; + this._timer = new Timer(); + this._changedList = new List(); + this._cacheReader = new NetByteCacheReader(); + } + + protected override void Poll() + { + if (_items == null || _items.Count == 0) return; + byte[] cache = (byte[])_cacheReader.Cache; + int offset = 0; + foreach (PDUArea area in _rangeList) + { + byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 + if (rcvBytes == null) + { + //_plcReader.Connect(); + continue; + } + else + { + int index = area.StartIndex;//index指向_items中的Tag元数据 + int count = index + area.Count; + while (index < count) + { + DeviceAddress addr = _items[index].Address; + int iByte = addr.CacheIndex; + int iByte1 = iByte - offset; + if (addr.VarType == DataType.BOOL) + { + int tmp = rcvBytes[iByte1] ^ cache[iByte]; + DeviceAddress next = addr; + if (tmp != 0) + { + while (addr.Start == next.Start) + { + if ((tmp & (1 << next.Bit)) > 0) _changedList.Add(index); + if (++index < count) + next = _items[index].Address; + else + break; + } + } + else + { + while (addr.Start == next.Start && ++index < count) + { + next = _items[index].Address; + } + } + } + else + { + ushort size = addr.DataSize; + for (int i = 0; i < size; i++) + { + if (iByte1 + i < rcvBytes.Length && rcvBytes[iByte1 + i] != cache[iByte + i]) + { + _changedList.Add(index); + break; + } + } + index++; + } + } + for (int j = 0; j < rcvBytes.Length; j++) + cache[j + offset] = rcvBytes[j];//将PLC读取的数据写入到CacheReader中 + } + offset += rcvBytes.Length; + } + } + } + + public sealed class NetShortGroup : PLCGroup + { + public NetShortGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) + { + this._id = id; + this._name = name; + this._updateRate = updateRate; + this._isActive = active; + this._plcReader = plcReader; + this._server = _plcReader.Parent; + this._timer = new Timer(); + this._changedList = new List(); + this._cacheReader = new NetShortCacheReader(); + } + + protected override unsafe void Poll() + { + short[] cache = (short[])_cacheReader.Cache; + int offset = 0; + foreach (PDUArea area in _rangeList) + { + byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 + if (rcvBytes == null || rcvBytes.Length == 0) + { + offset += (area.Len + 1) / 2; + //_plcReader.Connect(); + continue; + } + else + { + int len = rcvBytes.Length / 2; + fixed (byte* p1 = rcvBytes) + { + short* prcv = (short*)p1; + int index = area.StartIndex;//index指向_items中的Tag元数据 + int count = index + area.Count; + while (index < count) + { + DeviceAddress addr = _items[index].Address; + int iShort = addr.CacheIndex; + int iShort1 = iShort - offset; + if (addr.VarType == DataType.BOOL) + { + if (addr.ByteOrder.HasFlag(ByteOrder.Network)) prcv[iShort1] = IPAddress.HostToNetworkOrder(prcv[iShort1]); + int tmp = prcv[iShort1] ^ cache[iShort]; + DeviceAddress next = addr; + if (tmp != 0) + { + while (addr.Start == next.Start) + { + if ((tmp & (1 << next.Bit)) > 0) _changedList.Add(index); + if (++index < count) + next = _items[index].Address; + else + break; + } + } + else + { + while (addr.Start == next.Start && ++index < count) + { + next = _items[index].Address; + } + } + } + else + { + if (addr.DataSize <= 2) + { + if (prcv[iShort1] != cache[iShort]) _changedList.Add(index); + } + else + { + int size = addr.DataSize / 2; + for (int i = 0; i < size; i++) + { + if (prcv[iShort1 + i] != cache[iShort + i]) + { + _changedList.Add(index); + break; + } + } + } + index++; + } + } + for (int j = 0; j < len; j++) + { + cache[j + offset] = prcv[j]; + }//将PLC读取的数据写入到CacheReader中 + } + offset += len; + } + } + } + } + + public sealed class ShortGroup : PLCGroup + { + public ShortGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) + { + this._id = id; + this._name = name; + this._updateRate = updateRate; + this._isActive = active; + this._plcReader = plcReader; + this._server = _plcReader.Parent; + this._timer = new Timer(); + this._changedList = new List(); + this._cacheReader = new ShortCacheReader(); + } + + protected override unsafe void Poll() + { + short[] cache = (short[])_cacheReader.Cache; + int k = 0; + foreach (PDUArea area in _rangeList) + { + byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 + if (rcvBytes == null) + { + continue; + } + else + { + int len = rcvBytes.Length / 2; + fixed (byte* p1 = rcvBytes) + { + short* prcv = (short*)p1; + int index = area.StartIndex;//index指向_items中的Tag元数据 + int count = index + area.Count; + while (index < count) + { + DeviceAddress addr = _items[index].Address; + int iShort = addr.CacheIndex; + int iShort1 = iShort - k; + if (addr.VarType == DataType.BOOL) + { + int tmp = prcv[iShort1] ^ cache[iShort]; + DeviceAddress next = addr; + if (tmp != 0) + { + while (addr.Start == next.Start) + { + if ((tmp & (1 << next.Bit)) > 0) _changedList.Add(index); + if (++index < count) + next = _items[index].Address; + else + break; + } + } + else + { + while (addr.Start == next.Start && ++index < count) + { + next = _items[index].Address; + } + } + } + else + { + if (addr.DataSize <= 2) + { + if (prcv[iShort1] != cache[iShort]) _changedList.Add(index); + } + else + { + int size = addr.DataSize / 2; + for (int i = 0; i < size; i++) + { + if (prcv[iShort1 + i] != cache[iShort + i]) + { + _changedList.Add(index); + break; + } + } + } + index++; + } + } + for (int j = 0; j < len; j++) + { + cache[j + k] = prcv[j]; + }//将PLC读取的数据写入到CacheReader中 + } + k += len; + } + } + } + + } } diff --git a/SCADA/Program/ModbusDriver/ModbusDriver.csproj b/SCADA/Program/ModbusDriver/ModbusDriver.csproj index d57f61d..afea990 100644 --- a/SCADA/Program/ModbusDriver/ModbusDriver.csproj +++ b/SCADA/Program/ModbusDriver/ModbusDriver.csproj @@ -104,7 +104,6 @@ - diff --git a/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs b/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs index dc6a133..03295a6 100644 --- a/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs +++ b/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs @@ -151,8 +151,8 @@ namespace ModbusDriver data[0] = _slaveId; // Slave id high byte data[1] = Modbus.fctWriteSingleCoil; // Function code byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address - data[3] = _adr[1]; // Start address + data[2] = _adr[1]; // Start address + data[3] = _adr[0]; // Start address if (OnOff) data[4] = 0xFF; byte[] arr = Utility.CalculateCrc(data, 6); data[6] = arr[0]; @@ -169,11 +169,11 @@ namespace ModbusDriver data[0] = _slaveId; // Slave id high byte 从站地址高八位 data[1] = Modbus.fctWriteMultipleCoils; // Function code 功能码 byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address 开始地址高八位 - data[3] = _adr[1]; // Start address 开始地址低八位 + data[2] = _adr[1]; // Start address 开始地址高八位 + data[3] = _adr[0]; // Start address 开始地址低八位 byte[] _length = BitConverter.GetBytes((short)numBits); - data[4] = _length[0]; // Number of data to read 寄存器数量高八位 - data[5] = _length[1]; // Number of data to read 寄存器数量低八位 + data[4] = _length[1]; // Number of data to read 寄存器数量高八位 + data[5] = _length[0]; // Number of data to read 寄存器数量低八位 data[6] = (byte)len; //字节数量 Array.Copy(values, 0, data, 7, len); //在data中加入变更数据 byte[] arr = Utility.CalculateCrc(data, len + 7); @@ -190,10 +190,10 @@ namespace ModbusDriver data[0] = _slaveId; // Slave id high byte 从站地址高八位 data[1] = Modbus.fctWriteSingleRegister; // Function code 功能码 byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address 开始地址高八位 - data[3] = _adr[1]; // Start address 开始地址高八位 - data[4] = values[0]; //变更数据的高位 - data[5] = values[1]; //变更数据的低位 + data[2] = _adr[1]; // Start address 开始地址高八位 + data[3] = _adr[0]; // Start address 开始地址高八位 + data[4] = values[1]; //变更数据的高位 + data[5] = values[0]; //变更数据的低位 byte[] arr = Utility.CalculateCrc(data, 6); data[6] = arr[0]; //CRC校验码低八位 data[7] = arr[1]; //CRC校验码高八位 @@ -210,11 +210,11 @@ namespace ModbusDriver data[0] = _slaveId; // Slave id high byte 从站地址 data[1] = Modbus.fctWriteMultipleRegister; // Function code 功能码 byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address 开始地址高八位 - data[3] = _adr[1]; // Start address 开始地址低八位 + data[2] = _adr[1]; // Start address 开始地址高八位 + data[3] = _adr[0]; // Start address 开始地址低八位 byte[] _length = BitConverter.GetBytes((short)(len >> 1)); - data[4] = _length[0]; // Number of data to read 寄存器数量高八位 - data[5] = _length[1]; // Number of data to read 寄存器数量低八位 + data[4] = _length[1]; // Number of data to read 寄存器数量高八位 + data[5] = _length[0]; // Number of data to read 寄存器数量低八位 data[6] = (byte)len; //字节数 Array.Copy(values, 0, data, 7, len); //把变更数据加入data中 byte[] arr = Utility.CalculateCrc(data, len + 7); diff --git a/SCADA/Program/ModbusDriver/ModbusRTU_TCP.cs b/SCADA/Program/ModbusDriver/ModbusRTU_TCP.cs deleted file mode 100644 index e8243f0..0000000 --- a/SCADA/Program/ModbusDriver/ModbusRTU_TCP.cs +++ /dev/null @@ -1,462 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Net.Sockets; -using System.Text; -using DataService; - -namespace ModbusDriver -{ - [Description("Modbus RTU_TCP协议")] - public sealed class ModbusRTU_TCPReader : IPLCDriver, IMultiReadWrite - { - private int _timeout; - - private Socket tcpSynCl; - private byte[] tcpSynClBuffer = new byte[0xFF]; - - short _id; - public short ID - { - get - { - return _id; - } - } - - string _name; - public string Name - { - get - { - return _name; - } - } - - int _slave = 1; - string _ip; - public string ServerName - { - get { return _ip; } - set { _ip = value; } - } - - public bool IsClosed - { - get - { - return tcpSynCl == null || tcpSynCl.Connected == false; - } - } - - public int TimeOut - { - get { return _timeout; } - set { _timeout = value; } - } - - List _grps = new List(20); - public IEnumerable Groups - { - get { return _grps; } - } - - IDataServer _server; - public IDataServer Parent - { - get { return _server; } - } - - public ModbusRTU_TCPReader(IDataServer server, short id, string name, string ip, int timeOut = 500, string spare1 = "1", string spare2 = null) - { - _id = id;//id - _name = name; - _server = server; - _ip = ip; - _timeout = timeOut; - if (!string.IsNullOrEmpty(spare1)) - _slave = int.Parse(spare1); - } - - public bool Connect() - { - int port = 7000; - try - { - if (tcpSynCl != null) - tcpSynCl.Close(); - //IPAddress ip = IPAddress.Parse(_ip); - // ---------------------------------------------------------------- - // Connect synchronous client - tcpSynCl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - tcpSynCl.SendTimeout = _timeout; - tcpSynCl.ReceiveTimeout = _timeout; - tcpSynCl.NoDelay = true; - tcpSynCl.Connect(_ip, port); - return true; - } - catch (SocketException error) - { - if (OnClose != null) - OnClose(this, new ShutdownRequestEventArgs(error.Message)); - return false; - } - } - - private byte[] CreateReadHeader(int startAddress, ushort length, byte function) - { - byte[] data = new byte[8]; - data[0] = (byte)_slave; // Slave id high byte - data[1] = function; // Message size - byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address - data[3] = _adr[1]; // Start address - byte[] _length = BitConverter.GetBytes((short)length); - data[4] = _length[0]; // Number of data to read - data[5] = _length[1]; // Number of data to read - byte[] arr = Utility.CalculateCrc(data, 6); - data[6] = arr[0]; - data[7] = arr[1]; - return data; - } - - public byte[] WriteSingleCoils(int startAddress, bool OnOff) - { - byte[] data = new byte[8]; - data[0] = (byte)_slave; // Slave id high byte - data[1] = Modbus.fctWriteSingleCoil; // Function code - byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address - data[3] = _adr[1]; // Start address - if (OnOff) data[4] = 0xFF; - byte[] arr = Utility.CalculateCrc(data, 6); - data[6] = arr[0]; - data[7] = arr[1]; - return data; - } - - public byte[] WriteMultipleCoils(int startAddress, ushort numBits, byte[] values) - { - int len = values.Length; - byte[] data = new byte[len + 9]; - data[0] = (byte)_slave; // Slave id high byte - data[1] = Modbus.fctWriteMultipleCoils; // Function code - byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address - data[3] = _adr[1]; // Start address - byte[] _length = BitConverter.GetBytes((short)numBits); - data[4] = _length[0]; // Number of data to read - data[5] = _length[1]; // Number of data to read - data[6] = (byte)len; - Array.Copy(values, 0, data, 7, len); - byte[] arr = Utility.CalculateCrc(data, len + 7); - data[len + 7] = arr[0]; - data[len + 8] = arr[1]; - return data; - } - - public byte[] WriteSingleRegister(int startAddress, byte[] values) - { - byte[] data = new byte[8]; - data[0] = (byte)_slave; // Slave id high byte - data[1] = Modbus.fctWriteSingleRegister; // Function code - byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address - data[3] = _adr[1]; // Start address - data[4] = values[0]; - data[5] = values[1]; - byte[] arr = Utility.CalculateCrc(data, 6); - data[6] = arr[0]; - data[7] = arr[1]; - return data; - } - - public byte[] WriteMultipleRegister(int startAddress, byte[] values) - { - int len = values.Length; - if (len % 2 > 0) len++; - byte[] data = new byte[len + 9]; - data[0] = (byte)_slave; // Slave id high byte - data[1] = Modbus.fctWriteMultipleRegister; // Function code - byte[] _adr = BitConverter.GetBytes((short)startAddress); - data[2] = _adr[0]; // Start address - data[3] = _adr[1]; // Start address - byte[] _length = BitConverter.GetBytes((short)(len >> 1)); - data[4] = _length[0]; // Number of data to read - data[5] = _length[1]; // Number of data to read - data[6] = (byte)len; - Array.Copy(values, 0, data, 7, len); - byte[] arr = Utility.CalculateCrc(data, len + 7); - data[len + 7] = arr[0]; - data[len + 8] = arr[1]; - return data; - } - - public int PDU - { - get { return 252; } - //get { return 256; } - } - - public DeviceAddress GetDeviceAddress(string address) - { - DeviceAddress dv = DeviceAddress.Empty; - if (string.IsNullOrEmpty(address)) - return dv; - switch (address[0]) - { - case '0': - { - dv.Area = Modbus.fctReadCoil; - int st; - int.TryParse(address, out st); - //dv.Start = (st / 16) * 16;//??????????????????? - dv.Bit = (byte)(st % 16); - st /= 16; - dv.Start = st; - } - break; - case '1': - { - dv.Area = Modbus.fctReadDiscreteInputs; - int st; - int.TryParse(address.Substring(1), out st); - //dv.Start = (st / 16) * 16;//??????????????????? - dv.Bit = (byte)(st % 16); - st /= 16; - dv.Start = st; - } - break; - case '4': - { - int index = address.IndexOf('.'); - dv.Area = Modbus.fctReadHoldingRegister; - if (index > 0) - { - dv.Start = int.Parse(address.Substring(1, index - 1)); - dv.Bit = byte.Parse(address.Substring(index + 1)); - } - else - dv.Start = int.Parse(address.Substring(1)); - dv.Start--; - } - break; - case '3': - { - int index = address.IndexOf('.'); - dv.Area = Modbus.fctReadInputRegister; - if (index > 0) - { - dv.Start = int.Parse(address.Substring(1, index - 1)); - dv.Bit = byte.Parse(address.Substring(index + 1)); - } - else - dv.Start = int.Parse(address.Substring(1)); - dv.Start--; - } - break; - } - return dv; - } - - public string GetAddress(DeviceAddress address) - { - return string.Empty; - } - - - public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false) - { - ModbusTcpGroup grp = new ModbusTcpGroup(id, name, updateRate, active, this); - _grps.Add(grp); - return grp; - } - - public bool RemoveGroup(IGroup grp) - { - grp.IsActive = false; - return _grps.Remove(grp); - } - - public void Dispose() - { - if (tcpSynCl != null) - { - if (tcpSynCl.Connected) - { - try { tcpSynCl.Shutdown(SocketShutdown.Both); } - catch { } - tcpSynCl.Close(); - } - tcpSynCl = null; - } - foreach (IGroup grp in _grps) - { - grp.Dispose(); - } - _grps.Clear(); - } - - public byte[] ReadBytes(DeviceAddress address, ushort size) - { - int area = address.Area; - try - { - if (!tcpSynCl.Connected) return null; - byte[] header = area == Modbus.fctReadCoil ? CreateReadHeader(address.Start * 16, (ushort)(16 * size), (byte)area) : - CreateReadHeader(address.Start, size, (byte)area); - tcpSynCl.Send(header, 0, header.Length, SocketFlags.None);//是否存在lock的问题? - byte[] frameBytes = new byte[size * 2 + 3]; - int result = tcpSynCl.Receive(frameBytes, 0, frameBytes.Length, SocketFlags.None); - byte[] data = new byte[size * 2]; - if (frameBytes[0] == (byte)_slave) - { - Array.Copy(frameBytes, 3, data, 0, data.Length); - return data; - } - else return new byte[0]; - } - catch (Exception e) - { - if (OnClose != null) - OnClose(this, new ShutdownRequestEventArgs(e.Message)); - return null; - } - } - - public ItemData ReadInt32(DeviceAddress address) - { - byte[] bit = ReadBytes(address, 2); - return bit == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : - new ItemData(BitConverter.ToInt32(bit, 0), 0, QUALITIES.QUALITY_GOOD); - } - - public ItemData ReadInt16(DeviceAddress address) - { - byte[] bit = ReadBytes(address, 1); - return bit == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : - new ItemData(BitConverter.ToInt16(bit, 0), 0, QUALITIES.QUALITY_GOOD); - } - - public ItemData ReadByte(DeviceAddress address) - { - byte[] bit = ReadBytes(address, 1); - return bit == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : - new ItemData(bit[0], 0, QUALITIES.QUALITY_GOOD); - } - - public ItemData ReadString(DeviceAddress address, ushort size) - { - byte[] bit = ReadBytes(address, size); - return bit == null ? new ItemData(string.Empty, 0, QUALITIES.QUALITY_BAD) : - new ItemData(Encoding.ASCII.GetString(bit), 0, QUALITIES.QUALITY_GOOD); - } - - public unsafe ItemData ReadFloat(DeviceAddress address) - { - byte[] bit = ReadBytes(address, 2); - return bit == null ? new ItemData(0f, 0, QUALITIES.QUALITY_BAD) : - new ItemData(BitConverter.ToSingle(bit, 0), 0, QUALITIES.QUALITY_GOOD); - //int value = BitConverter.ToInt32(bit, 0); - //return new ItemData(*(((float*)&value)), 0, QUALITIES.QUALITY_GOOD); - } - - public ItemData ReadBit(DeviceAddress address) - { - byte[] bit = ReadBytes(address, 1); - return bit == null ? new ItemData(false, 0, QUALITIES.QUALITY_BAD) : - new ItemData((bit[0] & (1 << (address.Bit))) > 0, 0, QUALITIES.QUALITY_GOOD); - } - - public ItemData ReadValue(DeviceAddress address) - { - return this.ReadValueEx(address); - } - - public int WriteBytes(DeviceAddress address, byte[] bit) - { - if (!tcpSynCl.Connected) return -1; - var data = WriteMultipleRegister(address.Start, bit); - tcpSynCl.Send(data, 0, data.Length, SocketFlags.None);//是否存在lock的问题? - int result = tcpSynCl.Receive(tcpSynClBuffer, 0, 0xFF, SocketFlags.None); - return (tcpSynClBuffer[1] & 0x80) > 0 ? -1 : 0; - } - - public int WriteBit(DeviceAddress address, bool bit) - { - if (!tcpSynCl.Connected) return -1; - var data = WriteSingleCoils(address.Start + address.Bit, bit); - tcpSynCl.Send(data, 0, data.Length, SocketFlags.None);//是否存在lock的问题? - int result = tcpSynCl.Receive(tcpSynClBuffer, 0, 0xFF, SocketFlags.None); - return (tcpSynClBuffer[1] & 0x80) > 0 ? -1 : 0; - } - - public int WriteBits(DeviceAddress address, byte bits) - { - if (!tcpSynCl.Connected) return -1; - var data = WriteSingleRegister(address.Start, new byte[] { bits }); - tcpSynCl.Send(data, 0, data.Length, SocketFlags.None);//是否存在lock的问题? - int result = tcpSynCl.Receive(tcpSynClBuffer, 0, 0xFF, SocketFlags.None); - return (tcpSynClBuffer[1] & 0x80) > 0 ? -1 : 0; - } - - public int WriteInt16(DeviceAddress address, short value) - { - if (!tcpSynCl.Connected) return -1; - var data = WriteSingleRegister(address.Start, BitConverter.GetBytes(value)); - tcpSynCl.Send(data, 0, data.Length, SocketFlags.None);//是否存在lock的问题? - int result = tcpSynCl.Receive(tcpSynClBuffer, 0, 0xFF, SocketFlags.None); - return (tcpSynClBuffer[1] & 0x80) > 0 ? -1 : 0; - } - - public int WriteInt32(DeviceAddress address, int value) - { - if (!tcpSynCl.Connected) return -1; - var data = WriteMultipleRegister(address.Start, BitConverter.GetBytes(value)); - tcpSynCl.Send(data, 0, data.Length, SocketFlags.None);//是否存在lock的问题? - int result = tcpSynCl.Receive(tcpSynClBuffer, 0, 0xFF, SocketFlags.None); - return (tcpSynClBuffer[1] & 0x80) > 0 ? -1 : 0; - } - - public int WriteFloat(DeviceAddress address, float value) - { - if (!tcpSynCl.Connected) return -1; - var data = WriteMultipleRegister(address.Start, BitConverter.GetBytes(value)); - tcpSynCl.Send(data, 0, data.Length, SocketFlags.None);//是否存在lock的问题? - int result = tcpSynCl.Receive(tcpSynClBuffer, 0, 0xFF, SocketFlags.None); - return (tcpSynClBuffer[1] & 0x80) > 0 ? -1 : 0; - } - - public int WriteString(DeviceAddress address, string str) - { - if (!tcpSynCl.Connected) return -1; - var data = WriteMultipleRegister(address.Start, Encoding.ASCII.GetBytes(str)); - tcpSynCl.Send(data, 0, data.Length, SocketFlags.None);//是否存在lock的问题? - int result = tcpSynCl.Receive(tcpSynClBuffer, 0, 0xFF, SocketFlags.None); - return (tcpSynClBuffer[1] & 0x80) > 0 ? -1 : 0; - } - - public int WriteValue(DeviceAddress address, object value) - { - return this.WriteValueEx(address, value); - } - - public event ShutdownRequestEventHandler OnClose; - - public int Limit - { - get { return 60; } - } - - public ItemData[] ReadMultiple(DeviceAddress[] addrsArr) - { - return this.PLCReadMultiple(new NetShortCacheReader(), addrsArr); - } - - public int WriteMultiple(DeviceAddress[] addrArr, object[] buffer) - { - return this.PLCWriteMultiple(new NetShortCacheReader(), addrArr, buffer, Limit); - } - } -} - diff --git a/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs b/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs index c540f75..db25d08 100644 --- a/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs +++ b/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs @@ -44,6 +44,7 @@ namespace ModbusDriver dv.Bit = (byte)(st % 16); st /= 16; dv.Start = st; + dv.Bit--; } break; case '1': @@ -55,6 +56,7 @@ namespace ModbusDriver dv.Bit = (byte)(st % 16); st /= 16; dv.Start = st; + dv.Bit--; } break; case '4': @@ -69,6 +71,8 @@ namespace ModbusDriver else dv.Start = int.Parse(address.Substring(1)); dv.Start--; + dv.Bit--; + dv.ByteOrder = ByteOrder.Network; } break; case '3': @@ -83,6 +87,8 @@ namespace ModbusDriver else dv.Start = int.Parse(address.Substring(1)); dv.Start--; + dv.Bit--; + dv.ByteOrder = ByteOrder.Network; } break; } @@ -328,7 +334,7 @@ namespace ModbusDriver public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false) { - ModbusTcpGroup grp = new ModbusTcpGroup(id, name, updateRate, active, this); + NetShortGroup grp = new NetShortGroup(id, name, updateRate, active, this); _grps.Add(grp); return grp; } @@ -393,11 +399,8 @@ namespace ModbusDriver internal void CallException(int id, byte function, byte exception) { if (tcpSynCl == null) return; - if (exception == Modbus.excExceptionConnectionLost && IsClosed == false) - { - if (OnClose != null) - OnClose(this, new ShutdownRequestEventArgs(GetErrorString(exception))); - } + if (OnClose != null) + OnClose(this, new ShutdownRequestEventArgs(GetErrorString(exception))); } public byte[] ReadBytes(DeviceAddress address, ushort size) @@ -547,101 +550,4 @@ namespace ModbusDriver return this.PLCWriteMultiple(new NetShortCacheReader(), addrArr, buffer, Limit); } } - - public sealed class ModbusTcpGroup : PLCGroup - { - public ModbusTcpGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) - { - this._id = id; - this._name = name; - this._updateRate = updateRate; - this._isActive = active; - this._plcReader = plcReader; - this._server = _plcReader.Parent; - this._timer = new Timer(); - this._changedList = new List(); - this._cacheReader = new NetShortCacheReader(); - } - - protected override unsafe void Poll() - { - short[] cache = (short[])_cacheReader.Cache; - int offset = 0; - foreach (PDUArea area in _rangeList) - { - byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 - if (rcvBytes == null || rcvBytes.Length == 0) - { - //offset += area.Len / 2; - //_plcReader.Connect(); - continue; - } - else - { - int len = rcvBytes.Length / 2; - fixed (byte* p1 = rcvBytes) - { - short* prcv = (short*)p1; - int index = area.StartIndex;//index指向_items中的Tag元数据 - int count = index + area.Count; - while (index < count) - { - DeviceAddress addr = _items[index].Address; - int iShort = addr.CacheIndex; - int iShort1 = iShort - offset; - if (addr.VarType == DataType.BOOL) - { - int tmp = prcv[iShort1] ^ cache[iShort]; - DeviceAddress next = addr; - if (tmp != 0) - { - while (addr.Start == next.Start) - { - if ((tmp & (1 << next.Bit.BitSwap())) > 0) _changedList.Add(index); - if (++index < count) - next = _items[index].Address; - else - break; - } - } - else - { - while (addr.Start == next.Start && ++index < count) - { - next = _items[index].Address; - } - } - } - else - { - if (addr.DataSize <= 2) - { - if (prcv[iShort1] != cache[iShort]) _changedList.Add(index); - } - else - { - int size = addr.DataSize / 2; - for (int i = 0; i < size; i++) - { - if (prcv[iShort1 + i] != cache[iShort + i]) - { - _changedList.Add(index); - break; - } - } - } - index++; - } - } - for (int j = 0; j < len; j++) - { - cache[j + offset] = prcv[j]; - }//将PLC读取的数据写入到CacheReader中 - } - offset += len; - } - } - } - - } } diff --git a/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs b/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs index e8a5e15..8562a82 100644 --- a/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs +++ b/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs @@ -108,6 +108,7 @@ namespace OmronPlcDriver } break; } + dv.ByteOrder = ByteOrder.Network; return dv; } @@ -434,7 +435,7 @@ namespace OmronPlcDriver public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false) { - OmronCsCjUDPGroup grp = new OmronCsCjUDPGroup(id, name, updateRate, active, this); + NetShortGroup grp = new NetShortGroup(id, name, updateRate, active, this); _grps.Add(grp); return grp; } @@ -694,106 +695,6 @@ namespace OmronPlcDriver } } - public sealed class OmronCsCjUDPGroup : PLCGroup - { - public OmronCsCjUDPGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) - { - this._id = id; - this._name = name; - this._updateRate = updateRate; - this._isActive = active; - this._plcReader = plcReader; - this._server = _plcReader.Parent; - this._timer = new Timer(); - this._changedList = new List(); - this._cacheReader = new NetShortCacheReader(); - } - - protected override unsafe void Poll() - { - //Console.WriteLine("开始遍历》》"); - short[] cache = (short[])_cacheReader.Cache; - int offset = 0; - foreach (PDUArea area in _rangeList) - { - //Console.WriteLine(">>读取:" + area.Start.DBNumber.ToString() + "@" + DateTime.Now.ToString()); - byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 - if (rcvBytes == null || rcvBytes.Length == 0) - { - //Console.WriteLine(">>结果:" + area.Start.DBNumber.ToString() + "->失败"); - continue; - } - else - { - //Console.WriteLine(">>结果:" + area.Start.DBNumber.ToString() + "->" + BitConverter.ToString(rcvBytes) + " at" + DateTime.Now.ToString()); - int len = area.Len;// rcvBytes.Length / 2; - fixed (byte* p1 = rcvBytes) - { - short* prcv = (short*)p1; - int index = area.StartIndex;//index指向_items中的Tag元数据 - int count = index + area.Count; - while (index < count) - { - DeviceAddress addr = _items[index].Address; - int iShort = addr.CacheIndex; - int iShort1 = iShort - offset; - if (addr.VarType == DataType.BOOL) - { - int tmp = prcv[iShort1] ^ cache[iShort]; - DeviceAddress next = addr; - if (tmp != 0) - { - while (addr.Start == next.Start) - { - if ((tmp & 1 << next.Bit.BitSwap()) > 0) - _changedList.Add(index); - if (++index < count) - next = _items[index].Address; - else - break; - } - } - else - { - while (addr.Start == next.Start && ++index < count) - { - next = _items[index].Address; - } - } - } - else - { - if (addr.DataSize <= 2) - { - - if (prcv[iShort1] != cache[iShort]) _changedList.Add(index); - } - else - { - int size = addr.DataSize / 2; - for (int i = 0; i < size; i++) - { - if (prcv[iShort1 + i] != cache[iShort + i]) - { - _changedList.Add(index); - break; - } - } - } - index++; - } - } - for (int j = 0; j < len; j++) - { - cache[j + offset] = prcv[j]; - }//将PLC读取的数据写入到CacheReader中 - } - offset += len; - } - } - } - } - /// /// 欧姆龙Omron CS/CJ系列PLC数据区功能号和错误代码常数定义类 /// diff --git a/SCADA/Program/PanasonicDriver/PanasonicSerialReader.cs b/SCADA/Program/PanasonicDriver/PanasonicSerialReader.cs index 802ac82..8ec1488 100644 --- a/SCADA/Program/PanasonicDriver/PanasonicSerialReader.cs +++ b/SCADA/Program/PanasonicDriver/PanasonicSerialReader.cs @@ -94,7 +94,7 @@ namespace PanasonicPLCriver public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0, bool active = false) { - PanasonicGroup grp = new PanasonicGroup(id, name, updateRate, active, this); + NetShortGroup grp = new NetShortGroup(id, name, updateRate, active, this); _grps.Add(grp); return grp; } @@ -211,6 +211,7 @@ namespace PanasonicPLCriver break; } } + dv.ByteOrder = ByteOrder.Network; return dv; } #region 实现了四个命令 其余没有做 @@ -554,100 +555,6 @@ namespace PanasonicPLCriver } #endregion } - public sealed class PanasonicGroup : PLCGroup - { - public PanasonicGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) - { - this._id = id; - this._name = name; - this._updateRate = updateRate; - this._isActive = active; - this._plcReader = plcReader; - this._server = _plcReader.Parent; - this._timer = new System.Timers.Timer(); - this._changedList = new List(); - this._cacheReader = new NetShortCacheReader(); - } - - protected override void Poll() - { - short[] cache = (short[])_cacheReader.Cache; - int offset = 0; - foreach (PDUArea area in _rangeList) - { - byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 - if (rcvBytes == null || rcvBytes.Length == 0) - { - continue; - } - else - { - int len = rcvBytes.Length / 2; - short[] prcv = new short[rcvBytes.Length / 2]; - for (int i = 0; i < prcv.Length; i++) - prcv[i] = IPAddress.HostToNetworkOrder(BitConverter.ToInt16(rcvBytes, i * 2)); - int index = area.StartIndex;//index指向_items中的Tag元数据 - int count = index + area.Count; - while (index < count) - { - DeviceAddress addr = _items[index].Address; - int iShort = addr.CacheIndex; - int iShort1 = iShort - offset; - if (addr.VarType == DataType.BOOL) - { - short tt = prcv[iShort1]; - short tmp = IPAddress.HostToNetworkOrder((short)(tt ^ cache[iShort])); - DeviceAddress next = addr; - if (tmp != 0) - { - while (addr.Start == next.Start) - { - short ne = (short)(1 << next.Bit); - if ((tmp & (ne)) > 0) _changedList.Add(index); - if (++index < count) - next = _items[index].Address; - else - break; - } - } - else - { - while (addr.Start == next.Start && ++index < count) - { - next = _items[index].Address; - } - } - } - else - { - if (addr.DataSize <= 2) - { - if (prcv[iShort1] != cache[iShort]) _changedList.Add(index); - } - else - { - int size = addr.DataSize / 2; - for (int i = 0; i < size; i++) - { - if (prcv[iShort1 + i] != cache[iShort + i]) - { - _changedList.Add(index); - break; - } - } - } - index++; - } - } - for (int j = 0; j < len; j++) - { - cache[j + offset] = prcv[j]; - }//将PLC读取的数据写入到CacheReader中 - offset += len; - } - } - } - } public struct Panasonic { diff --git a/SCADA/Program/SiemensPLCDriver/SiemensPLCDriver.cs b/SCADA/Program/SiemensPLCDriver/SiemensPLCDriver.cs index 8933f61..f09e4fe 100644 --- a/SCADA/Program/SiemensPLCDriver/SiemensPLCDriver.cs +++ b/SCADA/Program/SiemensPLCDriver/SiemensPLCDriver.cs @@ -719,85 +719,4 @@ namespace SiemensPLCDriver public event ShutdownRequestEventHandler OnClose; } - public sealed class NetBytePLCGroup : PLCGroup - { - public NetBytePLCGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) - { - this._id = id; - this._name = name; - this._updateRate = updateRate; - this._isActive = active; - this._plcReader = plcReader; - this._server = _plcReader.Parent; - this._timer = new Timer(); - this._changedList = new List(); - this._cacheReader = new NetByteCacheReader(); - } - - protected override void Poll() - { - if (_items == null || _items.Count == 0) return; - byte[] cache = (byte[])_cacheReader.Cache; - int offset = 0; - foreach (PDUArea area in _rangeList) - { - byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 - if (rcvBytes == null) - { - //_plcReader.Connect(); - continue; - } - else - { - int index = area.StartIndex;//index指向_items中的Tag元数据 - int count = index + area.Count; - while (index < count) - { - DeviceAddress addr = _items[index].Address; - int iByte = addr.CacheIndex; - int iByte1 = iByte - offset; - if (addr.VarType == DataType.BOOL) - { - int tmp = rcvBytes[iByte1] ^ cache[iByte]; - DeviceAddress next = addr; - if (tmp != 0) - { - while (addr.Start == next.Start) - { - if ((tmp & (1 << next.Bit)) > 0) _changedList.Add(index); - if (++index < count) - next = _items[index].Address; - else - break; - } - } - else - { - while (addr.Start == next.Start && ++index < count) - { - next = _items[index].Address; - } - } - } - else - { - ushort size = addr.DataSize; - for (int i = 0; i < size; i++) - { - if (iByte1 + i < rcvBytes.Length && rcvBytes[iByte1 + i] != cache[iByte + i]) - { - _changedList.Add(index); - break; - } - } - index++; - } - } - for (int j = 0; j < rcvBytes.Length; j++) - cache[j + offset] = rcvBytes[j];//将PLC读取的数据写入到CacheReader中 - } - offset += rcvBytes.Length; - } - } - } } diff --git a/SCADA/dll/DataService.dll b/SCADA/dll/DataService.dll index d9162941764aabe8f55ea9a97b5725c9a7a6cc31..63c7cfb33b083cc492906da5e2df6fc8025ac986 100644 GIT binary patch literal 85504 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 R%Z2z5UYhyezyEm>_&?qXSsefX literal 82432 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

uj}{#d_n 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 P|6iZ=|K|8VzX$#=e*hU* diff --git a/SCADA/dll/ModbusDriver.dll b/SCADA/dll/ModbusDriver.dll index a2c13111519f83efcadd653b63b247a2c35d381e..dcda474c863a9e15f0dd4c159a9b99a71ae3e87d 100644 GIT binary patch delta 7095 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 P_lUlfRi{~RmFK?!>U#86 delta 11642 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 K-;3S`>;C|P9gCj; diff --git a/SCADA/dll/OmronPlcDriver.dll b/SCADA/dll/OmronPlcDriver.dll index 40ee38611fa00ad12652e2ebde5153216bf0cbcb..7d62b05708c4c3bfc5e3b8a4d692b6621078e517 100644 GIT binary patch delta 5030 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 I;X3>O0qv)E!vFvP delta 6546 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 OePW+A`9rp^R{vjK;}muP diff --git a/SCADA/dll/SiemensPLCDriver.dll b/SCADA/dll/SiemensPLCDriver.dll index 632f7202037b64c0fd96f2c839f6788e8fadcdae..f4b07592801de9c6f526d826f8e310f307a444ff 100644 GIT binary patch delta 7751 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