From ad5fbaf8c30a5759e747a12371d23d302928889c Mon Sep 17 00:00:00 2001 From: Gavin Date: Wed, 22 Nov 2017 16:57:16 +0800 Subject: [PATCH] add .net core support --- .../DataService/v15/Server/sqlite3/db.lock | 0 .../v15/Server/sqlite3/storage.ide | Bin 0 -> 2150400 bytes .../DataService/ClientDriver/ClientDriver.cs | 1129 ++++++++++ .../ClientDriver/ClientDriver.csproj | 15 + .../DataService/DataHelper/DataHelper.cs | 198 ++ .../DataService/DataHelper/DataHelper.csproj | 22 + .../DataService/DataHelper/HDAIOHelper.cs | 927 +++++++++ .../DataService/DataHelper/IDataFactory.cs | 32 + .../DataService/DataHelper/MysqlFactory.cs | 778 +++++++ .../CoreApp/DataService/DataService.sln | 71 + .../CoreApp/DataService/DataService/Alarm.cs | 223 ++ .../DataService/DataService/CacheReader.cs | 910 ++++++++ .../DataService/DataService/ClientReader.cs | 607 ++++++ .../DataService/DataService/Condition.cs | 1104 ++++++++++ .../DataService/DataService.csproj | 15 + .../DataService/DataService/DeviceAddress.cs | 43 + .../CoreApp/DataService/DataService/Eval.cs | 716 +++++++ .../DataService/ExtensionMethods.cs | 811 ++++++++ .../DataService/DataService/HistoryData.cs | 83 + .../CoreApp/DataService/DataService/IGroup.cs | 70 + .../DataService/DataService/IReader.cs | 82 + .../DataService/DataService/IServer.cs | 102 + .../CoreApp/DataService/DataService/ITag.cs | 633 ++++++ .../DataService/DataService/PLCGroup.cs | 684 ++++++ .../DataService/DataService/Storage.cs | 95 + .../DataService/DataService/TagMetaData.cs | 108 + .../CoreApp/DataService/GateWay/DAService.cs | 1838 +++++++++++++++++ .../DataService/GateWay/GateWay.csproj | 22 + .../CoreApp/DataService/GateWay/Program.cs | 17 + .../CoreApp/DataService/GateWay/SqlMapping.cs | 556 +++++ .../ModbusDriver/ModbusDriver.csproj | 19 + .../ModbusDriver/ModbusRTUDriver.cs | 563 +++++ .../DataService/ModbusDriver/ModbusRTU_TCP.cs | 462 +++++ .../ModbusDriver/ModbusTCPReader.cs | 634 ++++++ 34 files changed, 13569 insertions(+) create mode 100644 SCADA/Program/CoreApp/DataService/.vs/DataService/v15/Server/sqlite3/db.lock create mode 100644 SCADA/Program/CoreApp/DataService/.vs/DataService/v15/Server/sqlite3/storage.ide create mode 100644 SCADA/Program/CoreApp/DataService/ClientDriver/ClientDriver.cs create mode 100644 SCADA/Program/CoreApp/DataService/ClientDriver/ClientDriver.csproj create mode 100644 SCADA/Program/CoreApp/DataService/DataHelper/DataHelper.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataHelper/DataHelper.csproj create mode 100644 SCADA/Program/CoreApp/DataService/DataHelper/HDAIOHelper.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataHelper/IDataFactory.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataHelper/MysqlFactory.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService.sln create mode 100644 SCADA/Program/CoreApp/DataService/DataService/Alarm.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/CacheReader.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/ClientReader.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/Condition.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/DataService.csproj create mode 100644 SCADA/Program/CoreApp/DataService/DataService/DeviceAddress.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/Eval.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/ExtensionMethods.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/HistoryData.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/IGroup.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/IReader.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/IServer.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/ITag.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/PLCGroup.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/Storage.cs create mode 100644 SCADA/Program/CoreApp/DataService/DataService/TagMetaData.cs create mode 100644 SCADA/Program/CoreApp/DataService/GateWay/DAService.cs create mode 100644 SCADA/Program/CoreApp/DataService/GateWay/GateWay.csproj create mode 100644 SCADA/Program/CoreApp/DataService/GateWay/Program.cs create mode 100644 SCADA/Program/CoreApp/DataService/GateWay/SqlMapping.cs create mode 100644 SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusDriver.csproj create mode 100644 SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusRTUDriver.cs create mode 100644 SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusRTU_TCP.cs create mode 100644 SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusTCPReader.cs diff --git a/SCADA/Program/CoreApp/DataService/.vs/DataService/v15/Server/sqlite3/db.lock b/SCADA/Program/CoreApp/DataService/.vs/DataService/v15/Server/sqlite3/db.lock new file mode 100644 index 0000000..e69de29 diff --git a/SCADA/Program/CoreApp/DataService/.vs/DataService/v15/Server/sqlite3/storage.ide b/SCADA/Program/CoreApp/DataService/.vs/DataService/v15/Server/sqlite3/storage.ide new file mode 100644 index 0000000000000000000000000000000000000000..ddff1c10a0adb8d41950ba9ffbb032a9f3ea1580 GIT binary patch literal 2150400 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%0Am^1C7gl?eTIOHv;hSf3qKi66HT)|K|n!7 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¬`-05WB=$e<10p& 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

Ol#}-eu*ccLDYxh7iQJ~1=yRu@#5-S4hYO9JG6 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 +y{w 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

hIu$ZO7VzTt;N8J*ysse?(C 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

w0!i|6Me+bwAz`V;}F-QK% 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ⅆ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 _grps = new List(1); + public IEnumerable Groups + { + get { return _grps; } + } + + IDataServer _server; + public IDataServer Parent + { + get { return _server; } + } + + public ClientReader(IDataServer server, short id, string name, string ip, int timeout) + { + _id = id; + _server = server; + _ip = ip; + _name = name; + _timeout = timeout; + Connect(); + } + + public bool Connect() + { + int port = 6543; + lock (this) + { + try + { + if (tcpRecive != null) + { + tcpRecive.Dispose(); + } + if (tcpSend != null) + { + tcpSend.Dispose(); + } + tcpRecive = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + tcpRecive.Connect(_ip, port); + tcpRecive.SendTimeout = _timeout; + tcpRecive.ReceiveTimeout = -1; + + tcpSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + tcpSend.Connect(_ip, port); + tcpSend.SendTimeout = _timeout; + tcpSend.ReceiveTimeout = _timeout; + return true; + } + catch (SocketException error) + { + if (OnClose != null) + OnClose(this, new ShutdownRequestEventArgs(error.Message)); + return false; + } + } + } + + public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false) + { + ClientGroup grp = new ClientGroup(id, name, updateRate, active, this); + _grps.Add(grp); + return grp; + } + + public bool RemoveGroup(IGroup grp) + { + grp.IsActive = false; + return _grps.Remove(grp); + } + + public event ShutdownRequestEventHandler OnClose; + + public void Dispose() + { + foreach (IGroup grp in _grps) + { + grp.Dispose(); + } + _grps.Clear(); + try + { + if (tcpRecive != null) + { + if (tcpRecive.Connected) + tcpRecive.Shutdown(SocketShutdown.Both); + tcpRecive.Dispose(); + } + if (tcpSend != null) + { + if (tcpSend.Connected) + tcpSend.Shutdown(SocketShutdown.Both); + tcpSend.Dispose(); + } + } + catch (SocketException err) + { + if (OnClose != null) + OnClose(this, new ShutdownRequestEventArgs(err.Message)); + } + } + } + + public class ClientGroup : IGroup + { + bool _active = false; + public bool IsActive + { + get + { + return _active; + } + set + { + _active = value; + if (value) + { + if (_plcReader != null && _plcReader.tcpSend != null) + { + this._tcpRecive = _plcReader.tcpRecive; + this._tcpSend = _plcReader.tcpSend; + try + { + _addr = (_tcpSend.RemoteEndPoint as IPEndPoint).Address; + } + catch { } + Thread workItem = new Thread(new ThreadStart(ReciveData)); + workItem.Priority = ThreadPriority.Highest; + workItem.Start(); + if (_updateRate > 0) + ThreadPool.QueueUserWorkItem(new WaitCallback(this.OnUpdate)); + else + Init(); + } + } + } + } + + protected short _id; + public short ID + { + get + { + return _id; + } + } + + protected int _updateRate; + public int UpdateRate + { + get + { + return _updateRate; + } + set + { + _updateRate = value; + } + } + + protected DeviceAddress _start; + public DeviceAddress Start + { + get + { + return _start; + } + } + + protected string _name; + public string Name + { + get + { + return _name; + } + set + { + _name = value; + } + } + + protected float _deadband; + public float DeadBand + { + get + { + return _deadband; + } + set + { + _deadband = value; + } + } + + protected ClientReader _plcReader; + public IDriver Parent + { + get + { + return _plcReader; + } + } + + protected Dictionary _items; + public IEnumerable Items + { + get { return _items.Values; } + } + + IDataServer _server; + public IDataServer Server + { + get + { + return _server; + } + } + + Socket _tcpSend, _tcpRecive; + byte[] tcpBuffer; + + IPAddress _addr; + public IPAddress RemoteAddress + { + get { return _addr; } + } + + public ClientGroup(short id, string name, int updateRate, bool active, ClientReader plcReader) + { + this._id = id; + this._name = name; + this._updateRate = updateRate; + this._active = active; + this._plcReader = plcReader; + this._server = plcReader.Parent; + tcpBuffer = new byte[8192]; + } + + object sendasync = new object(); + private byte[] ReadSingleData(DeviceAddress address, DataSource source = DataSource.Cache) + { + if (_tcpSend == null) return null; + short ID = (short)address.Start; + byte type = (byte)address.VarType; + byte len = (byte)(address.DataSize); + byte[] idbits = BitConverter.GetBytes(ID); + byte[] write_data = new byte[6] { FCTCOMMAND.fctHead, FCTCOMMAND.fctReadSingle, + source == DataSource.Cache?(byte)0:(byte)1, idbits[0], idbits[1] ,len}; + byte[] data = new byte[len]; + SocketError error; + lock (sendasync) + { + _tcpSend.Send(write_data, 0, 6, SocketFlags.None, out error); + int result = _tcpSend.Receive(tcpBuffer, 0, data.Length + 5, SocketFlags.None, out error); + } + Array.Copy(tcpBuffer, 5, data, 0, data.Length); + if (error == SocketError.Success) + return data; + else + { + return null; + } + } + + private int WriteSingleData(DeviceAddress address, byte[] value) + { + if (_tcpSend == null) return -1; + short ID = (short)address.Start; + byte type = (byte)address.VarType; + byte[] idbits = BitConverter.GetBytes(ID); + byte[] write_data = new byte[6] { FCTCOMMAND.fctHead, FCTCOMMAND.fctWriteSingle, 1, idbits[0], idbits[1], (byte)(value.Length) }; + byte[] data = new byte[6 + value.Length]; + write_data.CopyTo(data, 0); + value.CopyTo(data, 6); + SocketError error; + lock (sendasync) + { + _tcpSend.Send(data, 0, data.Length, SocketFlags.None, out error); + _tcpSend.Receive(tcpBuffer, 0, 2, SocketFlags.None, out error); + } + if (error == SocketError.Success) + return tcpBuffer[1];//可在此处返回一个错误号 + else + { + return (int)error; + } + } + + public void Init() + { + if (_items != null && _tcpSend != null) + { + int len = 0; + List tags = new List(); + foreach (var tag in _items.Values) + { + len += (3 + tag.Address.DataSize); + if (len >= tcpBuffer.Length - 10) + { + len = 0; + BatchRead(DataSource.Cache, true, tags.ToArray()); + tags.Clear(); + } + tags.Add(tag); + } + BatchRead(DataSource.Cache, true, tags.ToArray()); + } + } + + private void ReciveData() + { + if (!_active || _plcReader.tcpRecive == null) return; + List historys = null; + byte[] bytes = new byte[ushort.MaxValue]; + byte[] temp = new byte[_tcpRecive.ReceiveBufferSize]; + Storage value = Storage.Empty; + int result = 0; + int start = 0; + SocketError error; + do + { + if (!_tcpRecive.Connected) return; + result = _tcpRecive.Receive(bytes, 0, bytes.Length, SocketFlags.None, out error); + if (error == SocketError.Success) + { + if (DataChange != null) + historys = new List(); + //DateTime time = DateTime.Now;//当前时间戳 + if (start != 0 && temp[0] == FCTCOMMAND.fctHead) + { + int j = 3; + if (start < 0) + { + Array.Copy(bytes, 0, temp, -start, 5 + start); + } + short tc = BitConverter.ToInt16(temp, j);//总字节数 + if (start < 0) + start += tc; + Array.Copy(bytes, 0, temp, tc - start, start); + j += 2; + while (j < tc) + { + short id = BitConverter.ToInt16(temp, j);//标签ID、数据长度、数据值(T,L,V) + j += 2; + byte length = temp[j++]; + ITag tag; + if (_items.TryGetValue(id, out tag)) + { + //数据类型 + switch (tag.Address.VarType) + { + case DataType.BOOL: + value.Boolean = BitConverter.ToBoolean(temp, j); + break; + case DataType.BYTE: + value.Byte = temp[j]; + break; + case DataType.WORD: + case DataType.SHORT: + value.Int16 = BitConverter.ToInt16(temp, j);//需测试 + break; + case DataType.INT: + value.Int32 = BitConverter.ToInt32(temp, j);//需测试 + break; + case DataType.FLOAT: + value.Single = BitConverter.ToSingle(temp, j); + break; + case DataType.STR: + StringTag strTag = tag as StringTag; + if (strTag != null) + { + strTag.String = Encoding.ASCII.GetString(temp, j, length).Trim((char)0); + } + break; + default: + break; + } + j += length; + DateTime time = DateTime.FromFileTime(BitConverter.ToInt64(temp, j)); + j += 8; + tag.Update(value, time, QUALITIES.QUALITY_GOOD); + if (historys != null) + historys.Add(new HistoryData(id, QUALITIES.QUALITY_GOOD, value, time)); + } + else + j += length + 8; + } + } + byte head = bytes[start]; + int count = start; + while (head == FCTCOMMAND.fctHead && result > count) + { + if (count + 5 > bytes.Length) + { + start = count - bytes.Length; + Array.Copy(bytes, count, temp, 0, -start); + break; + } + int j = count + 3; + short tc = BitConverter.ToInt16(bytes, j);//总标签数 + count += tc; + if (count >= bytes.Length) + { + start = count - bytes.Length; + Array.Copy(bytes, count - tc, temp, 0, tc - start); + break; + } + else start = 0; + j += 2; + while (j < count) + { + short id = BitConverter.ToInt16(bytes, j);//标签ID、数据长度、数据值(T,L,V) + j += 2; + byte length = bytes[j++]; + ITag tag; + if (_items.TryGetValue(id, out tag)) + { + //数据类型 + switch (tag.Address.VarType) + { + case DataType.BOOL: + value.Boolean = BitConverter.ToBoolean(bytes, j); + break; + case DataType.BYTE: + value.Byte = bytes[j]; + break; + case DataType.WORD: + case DataType.SHORT: + value.Int16 = BitConverter.ToInt16(bytes, j);//需测试 + break; + case DataType.INT: + value.Int32 = BitConverter.ToInt32(bytes, j);//需测试 + break; + case DataType.FLOAT: + value.Single = BitConverter.ToSingle(bytes, j); + break; + case DataType.STR: + StringTag strTag = tag as StringTag; + if (strTag != null) + { + strTag.String = Encoding.ASCII.GetString(bytes, j, length).Trim((char)0); + } + break; + default: + break; + } + j += length; + DateTime time = DateTime.FromFileTime(BitConverter.ToInt64(bytes, j)); + j += 8; + tag.Update(value, time, QUALITIES.QUALITY_GOOD); + if (historys != null) + historys.Add(new HistoryData(id, QUALITIES.QUALITY_GOOD, value, time)); + } + else + j += length + 8; + } + head = bytes[count]; + } + if (DataChange != null && historys.Count > 0) + DataChange(this, new DataChangeEventArgs(1, historys)); + + } + else if (error == SocketError.ConnectionReset || error == SocketError.Interrupted + || error == SocketError.HostDown || error == SocketError.NetworkDown || error == SocketError.Shutdown) + { + _tcpRecive.Dispose(); + _active = false; + return; + } + } + while (result > 0); + } + + public void OnUpdate(object stateInfo) + { + while (true) + { + Thread.Sleep(_updateRate); + lock (this) + { + if (!_active) + { + return; + } + Init(); + } + } + } + + public bool AddItems(IList items) + { + int count = items.Count; + if (_items == null) _items = new Dictionary(count); + lock (_server.SyncRoot) + { + for (int i = 0; i < count; i++) + { + ITag dataItem = null; + TagMetaData meta = items[i]; + DeviceAddress addr = new DeviceAddress(0, 0, 0, meta.ID, meta.Size, 0, meta.DataType); + switch (meta.DataType) + { + case DataType.BOOL: + dataItem = new BoolTag(meta.ID, addr, this); + break; + case DataType.BYTE: + dataItem = new ByteTag(meta.ID, addr, this); + break; + case DataType.WORD: + case DataType.SHORT: + dataItem = new ShortTag(meta.ID, addr, this); + break; + case DataType.TIME: + case DataType.INT: + dataItem = new IntTag(meta.ID, addr, this); + break; + case DataType.FLOAT: + dataItem = new FloatTag(meta.ID, addr, this); + break; + case DataType.STR: + dataItem = new StringTag(meta.ID, addr, this); + break; + default: + dataItem = new BoolTag(meta.ID, addr, this); + break; + } + _items.Add(meta.ID, dataItem); + _server.AddItemIndex(meta.Name, dataItem); + } + } + //Init(); + return true; + } + + public bool AddTags(IEnumerable tags) + { + if (_items == null) + { + _items = new Dictionary(); + } + foreach (ITag tag in tags) + { + if (tag != null) + { + _items.Add(tag.ID, tag); + } + } + //Init(); + return true; + } + + public bool RemoveItems(params ITag[] items) + { + foreach (var item in items) + { + _server.RemoveItemIndex(item.GetTagName()); + _items.Remove(item.ID); + } + return true; + } + + public bool SetActiveState(bool active, params short[] items) + { + return true; + } + + public ITag FindItemByAddress(DeviceAddress addr) + { + ITag tag; + if (_items.TryGetValue((short)addr.Start, out tag)) + return tag; + return _server[(short)addr.Start]; + } + + public HistoryData[] BatchRead(DataSource source, bool isSync, params ITag[] itemArray) + { + if (itemArray.Length == 0 || _tcpSend == null || !_tcpSend.Connected) return null; + short len = (short)itemArray.Length; + byte[] bt = new byte[2]; + byte[] data = new byte[5 + len * 2]; + int j = 0; + data[j++] = FCTCOMMAND.fctHead; + data[j++] = FCTCOMMAND.fctReadMultiple; + data[j++] = source == DataSource.Cache ? (byte)0 : (byte)1; + bt = BitConverter.GetBytes(len); + data[j++] = bt[0]; + data[j++] = bt[1]; + for (int i = 0; i < len; i++) + { + bt = BitConverter.GetBytes(itemArray[i].ID); + data[j++] = bt[0]; + data[j++] = bt[1]; + } + SocketError error; + lock (sendasync) + { + _tcpSend.Send(data, 0, data.Length, SocketFlags.None, out error); + int result = _tcpSend.Receive(tcpBuffer, 0, tcpBuffer.Length, SocketFlags.None, out error); + } + //!!!!此处的协议应注意,如批量读入的数据量超过缓存,必须分批合并;在协议头应加入总字节数,以和result比较是否需要循环读入。 + j = 5; + if (error == SocketError.Success) + { + DateTime time = DateTime.Now; + HistoryData[] values = new HistoryData[len]; + for (int i = 0; i < len; i++) + { + short id = BitConverter.ToInt16(tcpBuffer, j); + j += 2; + ITag tag = _server[id]; + byte length = tcpBuffer[j++]; + if (tag != null && length > 0) + { + switch (tag.Address.VarType) + { + case DataType.BOOL: + values[i].Value.Boolean = BitConverter.ToBoolean(tcpBuffer, j); + break; + case DataType.BYTE: + values[i].Value.Byte = tcpBuffer[j]; + break; + case DataType.WORD: + case DataType.SHORT: + values[i].Value.Int16 = BitConverter.ToInt16(tcpBuffer, j); + break; + case DataType.INT: + values[i].Value.Int32 = BitConverter.ToInt32(tcpBuffer, j); + break; + case DataType.FLOAT: + values[i].Value.Single = BitConverter.ToSingle(tcpBuffer, j); + break; + case DataType.STR: + StringTag strTag = tag as StringTag; + if (strTag != null) + { + strTag.String = Encoding.ASCII.GetString(tcpBuffer, j, length).Trim(); + } + break; + } + if (values[i].Value != tag.Value) + tag.Update(values[i].Value, time, QUALITIES.QUALITY_GOOD); + } + j += length; + } + return values; + } + else + return null; + } + + public int BatchWrite(SortedDictionary items, bool isSync = true) + { + if (_tcpSend == null || !_tcpSend.Connected) return -1; + List list = new List(new byte[] { FCTCOMMAND.fctHead, FCTCOMMAND.fctWriteMultiple }); + list.AddRange(BitConverter.GetBytes((short)items.Count)); + foreach (var item in items) + { + ITag tag = item.Key; + list.AddRange(BitConverter.GetBytes(tag.ID)); + var addr = tag.Address; + if (addr.VarType != DataType.STR) + list.Add((byte)(addr.DataSize));//此处存疑 + switch (addr.VarType) + { + case DataType.BOOL: + list.Add(Convert.ToBoolean(item.Value) ? (byte)1 : (byte)0); + break; + case DataType.BYTE: + list.Add(Convert.ToByte(item.Value)); + break; + case DataType.WORD: + case DataType.SHORT: + list.AddRange(BitConverter.GetBytes(Convert.ToInt16(item.Value))); + break; + case DataType.INT: + list.AddRange(BitConverter.GetBytes(Convert.ToInt32(item.Value))); + break; + case DataType.FLOAT: + list.AddRange(BitConverter.GetBytes(Convert.ToSingle(item.Value))); + break; + case DataType.STR: + var bts = Encoding.ASCII.GetBytes(Convert.ToString(item.Value)); + list.Add((byte)bts.Length); + list.AddRange(bts); + break; + } + } + SocketError error; + lock (sendasync) + { + _tcpSend.Send(list.ToArray(), 0, list.Count, SocketFlags.None, out error); + _tcpSend.Receive(tcpBuffer, 0, 2, SocketFlags.None, out error); + } + if (error == SocketError.Success) + return tcpBuffer[1]; + else + { + return (int)error; + } + } + + public IEnumerable SendHdaRequest(DateTime start, DateTime end) + { + if (_tcpSend == null || !_tcpSend.Connected) yield break; + byte[] hdaReq = new byte[18]; + hdaReq[0] = FCTCOMMAND.fctHead; + hdaReq[1] = FCTCOMMAND.fctHdaRequest; + byte[] startbuffer = BitConverter.GetBytes(start.ToFileTime()); + startbuffer.CopyTo(hdaReq, 2); + byte[] endbuffer = BitConverter.GetBytes(end.ToFileTime()); + endbuffer.CopyTo(hdaReq, 10); + SocketError error; + HistoryData data = HistoryData.Empty; + short tempid = short.MinValue; + byte[] temp = new byte[14]; + ITag tag = null; + int index = 0; + int size = 0; + int result = 0; + short id = 0; + lock (sendasync) + { + _tcpSend.Send(hdaReq); + do + { + result = _tcpSend.Receive(tcpBuffer, 0, tcpBuffer.Length, SocketFlags.None, out error); + if (error == SocketError.ConnectionReset || error == SocketError.Interrupted || error == SocketError.HostDown || error == SocketError.NetworkDown || error == SocketError.Shutdown) + { + _tcpSend.Dispose(); + yield break; + } + if (index != 0) + { + Array.Copy(tcpBuffer, 0, temp, 14 - index, index); + id = BitConverter.ToInt16(temp, 0); + tempid = id; + tag = _server[id]; + if (tag == null) yield break; + data.ID = id; + size = tag.Address.DataSize; + index -= (4 - size); + switch (tag.Address.VarType) + { + case DataType.BOOL: + data.Value.Boolean = BitConverter.ToBoolean(temp, 2); + break; + case DataType.BYTE: + data.Value.Byte = tcpBuffer[index]; + break; + case DataType.WORD: + case DataType.SHORT: + data.Value.Int16 = BitConverter.ToInt16(temp, 2); + break; + case DataType.TIME: + case DataType.INT: + data.Value.Int32 = BitConverter.ToInt32(temp, 2); + break; + case DataType.FLOAT: + data.Value.Single = BitConverter.ToSingle(temp, 2); + break; + } + long fileTime = BitConverter.ToInt64(temp, 2 + size); + if (fileTime == -1) yield break; + data.TimeStamp = DateTime.FromFileTime(fileTime); + yield return data; + } + while (result >= index + 2) + { + id = BitConverter.ToInt16(tcpBuffer, index); + if (tempid != id) + { + tempid = id; + tag = _server[id]; + if (tag == null) yield break; + size = tag.Address.DataSize; + } + if (index + 10 + size > result) + break; + data.ID = id; + index += 2; + switch (tag.Address.VarType) + { + case DataType.BOOL: + data.Value.Boolean = BitConverter.ToBoolean(tcpBuffer, index); + break; + case DataType.BYTE: + data.Value.Byte = tcpBuffer[index]; + break; + case DataType.WORD: + case DataType.SHORT: + data.Value.Int16 = BitConverter.ToInt16(tcpBuffer, index); + break; + case DataType.TIME: + case DataType.INT: + data.Value.Int32 = BitConverter.ToInt32(tcpBuffer, index); + break; + case DataType.FLOAT: + data.Value.Single = BitConverter.ToSingle(tcpBuffer, index); + break; + } + index += size; + long fileTime = BitConverter.ToInt64(tcpBuffer, index); + if (fileTime == -1) yield break; + data.TimeStamp = DateTime.FromFileTime(fileTime); + index += 8; + yield return data; + } + if (index == result) + index = 0; + else + { + Array.Copy(tcpBuffer, index, temp, 0, result - index); + index += 14 - result; + } + } while (result > 0); + } + yield break; + } + + public IEnumerable SendHdaRequest(DateTime start, DateTime end, short id) + { + if (_tcpSend == null || !_tcpSend.Connected) yield break; + ITag tag = _server[id]; + if (tag == null) yield break; + byte[] hdaReq = new byte[20]; + hdaReq[0] = FCTCOMMAND.fctHead; + hdaReq[1] = FCTCOMMAND.fctHdaIdRequest; + byte[] startbuffer = BitConverter.GetBytes(start.ToFileTime()); + startbuffer.CopyTo(hdaReq, 2); + byte[] endbuffer = BitConverter.GetBytes(end.ToFileTime()); + endbuffer.CopyTo(hdaReq, 10); + byte[] idbuffer = BitConverter.GetBytes(id); + idbuffer.CopyTo(hdaReq, 18); + SocketError error; + int index = 0; + HistoryData data = HistoryData.Empty; + data.ID = id; + int result = 0; + lock (sendasync) + { + _tcpSend.Send(hdaReq); + switch (tag.Address.VarType) + { + case DataType.FLOAT: + do + { + result = _tcpSend.Receive(tcpBuffer, 0, tcpBuffer.Length, SocketFlags.None, out error); + if (error == SocketError.ConnectionReset || error == SocketError.Interrupted || error == SocketError.HostDown || error == SocketError.NetworkDown || error == SocketError.Shutdown) + { + _tcpSend.Dispose(); + yield break; + } + while (index + 12 <= result) + { + data.Value.Single = BitConverter.ToSingle(tcpBuffer, index);//未来可考虑量程转换和其他数据类型 + index += 4; + long fileTime = BitConverter.ToInt64(tcpBuffer, index); + if (fileTime == -1) yield break; + data.TimeStamp = DateTime.FromFileTime(fileTime); + index += 8; + yield return data; + } + if (index == result) + index = 0; + else + index += 12 - result;//丢弃一个值 + } while (result > 0); + break; + case DataType.INT: + do + { + result = _tcpSend.Receive(tcpBuffer, 0, tcpBuffer.Length, SocketFlags.None, out error); + if (error == SocketError.ConnectionReset || error == SocketError.Interrupted || error == SocketError.HostDown || error == SocketError.NetworkDown || error == SocketError.Shutdown) + { + _tcpSend.Dispose(); + yield break; + } + while (index + 12 <= result) + { + data.Value.Int32 = BitConverter.ToInt32(tcpBuffer, index);//未来可考虑量程转换和其他数据类型 + index += 4; + long fileTime = BitConverter.ToInt64(tcpBuffer, index); + if (fileTime == -1) yield break; + data.TimeStamp = DateTime.FromFileTime(fileTime); + index += 8; + yield return data; + } + if (index == result) + index = 0; + else + index += 12 - result;//丢弃一个值 + } while (result > 0); + break; + case DataType.BOOL://布尔量一个都不能少 + { + byte[] temp = new byte[9]; + do + { + result = _tcpSend.Receive(tcpBuffer, 0, tcpBuffer.Length, SocketFlags.None, out error); + if (error == SocketError.ConnectionReset || error == SocketError.Interrupted || error == SocketError.HostDown || error == SocketError.NetworkDown || error == SocketError.Shutdown) + { + _tcpSend.Dispose(); + yield break; + } + if (index != 0) + { + Array.Copy(tcpBuffer, 0, temp, 9 - index, index); + data.Value.Boolean = BitConverter.ToBoolean(temp, 0); + long fileTime = BitConverter.ToInt64(temp, 1); + if (fileTime == -1) yield break; + data.TimeStamp = DateTime.FromFileTime(fileTime); + yield return data; + } + while (index + 9 <= result) + { + data.Value.Boolean = BitConverter.ToBoolean(tcpBuffer, index); + index += 1; + long fileTime = BitConverter.ToInt64(tcpBuffer, index); + if (fileTime == -1) yield break; + data.TimeStamp = DateTime.FromFileTime(fileTime); + index += 8; + yield return data; + } + if (index == result) + index = 0; + else + { + Array.Copy(tcpBuffer, index, temp, 0, result - index); + index += 9 - result; + } + } while (result > 0); + } + break; + } + } + } + + public int SendResetRequest() + { + if (_tcpSend != null && _tcpSend.Connected) + { + var ipaddr = (_tcpSend.LocalEndPoint as IPEndPoint).Address; + byte[] resetReq = new byte[6]; + resetReq[0] = FCTCOMMAND.fctHead; + resetReq[1] = FCTCOMMAND.fctReset; + ipaddr.GetAddressBytes().CopyTo(resetReq, 2); + lock (sendasync) + { + return _tcpSend.Send(resetReq); + } + } + return -1; + } + + public int SendAlarmRequest(DateTime? start, DateTime? end) + { + if (_tcpSend != null && _tcpSend.Connected) + { + byte[] alarmReq = new byte[18]; + alarmReq[0] = FCTCOMMAND.fctHead; + alarmReq[1] = FCTCOMMAND.fctAlarmRequest; + if (start.HasValue) + { + byte[] startbuffer = BitConverter.GetBytes(start.Value.ToFileTime()); + startbuffer.CopyTo(alarmReq, 2); + } + if (end.HasValue) + { + byte[] endbuffer = BitConverter.GetBytes(end.Value.ToFileTime()); + endbuffer.CopyTo(alarmReq, 10); + } + SocketError error; + lock (sendasync) + { + _tcpSend.Send(alarmReq); + _tcpSend.Receive(tcpBuffer, 0, 2, SocketFlags.None, out error); + } + return (int)error; + } + return -1; + } + + public ItemData ReadInt32(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : + new ItemData(BitConverter.ToInt32(data, 0), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : + new ItemData(BitConverter.ToInt16(data, 0), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : + new ItemData(data[0], 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadFloat(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + if (data == null) + return new ItemData(0.0f, 0, QUALITIES.QUALITY_BAD); + else + { + int value = BitConverter.ToInt32(data, 0); + return new ItemData(*(((float*)&value)), 0, QUALITIES.QUALITY_GOOD); + } + } + + public ItemData ReadBool(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(false, 0, QUALITIES.QUALITY_BAD) : + new ItemData(BitConverter.ToBoolean(data, address.Bit), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadString(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(string.Empty, 0, QUALITIES.QUALITY_BAD) : + new ItemData(Encoding.ASCII.GetString(data, 0, Math.Min((int)address.DataSize, 254)).Trim((char)0), 0, QUALITIES.QUALITY_GOOD); + } + + public int WriteInt32(DeviceAddress address, int value) + { + return WriteSingleData(address, BitConverter.GetBytes(value)); + } + + public int WriteInt16(DeviceAddress address, short value) + { + return WriteSingleData(address, BitConverter.GetBytes(value)); + } + + public int WriteFloat(DeviceAddress address, float value) + { + return WriteSingleData(address, BitConverter.GetBytes(value)); + } + + public int WriteString(DeviceAddress address, string value) + { + return WriteSingleData(address, Encoding.ASCII.GetBytes(value)); + } + + public int WriteBit(DeviceAddress address, bool value) + { + return WriteSingleData(address, new byte[] { (byte)(value ? 1 : 0) }); + } + + public int WriteBits(DeviceAddress address, byte value) + { + return WriteSingleData(address, new byte[] { value }); + } + + public event DataChangeEventHandler DataChange; + + public void Dispose() + { + if (_items != null) + { + _items.Clear(); + } + _items = null; + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/ClientDriver/ClientDriver.csproj b/SCADA/Program/CoreApp/DataService/ClientDriver/ClientDriver.csproj new file mode 100644 index 0000000..45f8072 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/ClientDriver/ClientDriver.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp2.0 + + + + true + + + + + + + diff --git a/SCADA/Program/CoreApp/DataService/DataHelper/DataHelper.cs b/SCADA/Program/CoreApp/DataService/DataHelper/DataHelper.cs new file mode 100644 index 0000000..cd9ba9f --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataHelper/DataHelper.cs @@ -0,0 +1,198 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Debug; +using MySql.Data.MySqlClient; +using System; +using System.Data; +using System.Data.Common; +using System.IO; +using System.Net; +using System.Text; + +namespace DatabaseLib +{ + public static class DataHelper + { + static string m_ConnStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=SharpSCADA;Integrated Security=True"; + static string m_Path = @"D:\HDA"; + static string m_host = Environment.MachineName; + static string m_type = "MSSQL"; + //数据库工厂接口 + const string CFGPATH = @"C:\DataConfig\host.cfg"; + const string INIPATH = @"C:\DataConfig\host.ini"; + const string DATALOGSOURCE = "Data Operations"; + const string DATALOGNAME = "Data Log"; + const int STRINGMAX = 255; + + static ILogger Log; + #region GetInstance + private static IDataFactory _ins; + + public static IDataFactory Instance + { + get + { + return _ins; + } + } + + public static string HostName + { + get { return m_host; } + } + + public static string ConnectString + { + get { return m_ConnStr; } + } + + public static string HdaPath + { + get { return m_Path; } + } + #endregion + ///

+ /// 数据库工厂构造函数 + /// + /// 数据库枚举 + static DataHelper() + { + var loggerFactory = new LoggerFactory(); + Func filter = (category, level) => true; + loggerFactory.AddProvider(new DebugLoggerProvider(filter)); + Log = loggerFactory.CreateLogger(DATALOGSOURCE); + try + { + if (File.Exists(INIPATH)) + { + var builder = new ConfigurationBuilder(); + var ibuild = builder.AddIniFile(INIPATH); + var root = ibuild.Build(); + var host = root.GetSection("HOST"); + m_host = host.GetSection("SERVER").Value; + var db = root.GetSection("DATABASE"); + m_ConnStr = db.GetSection("CONNSTRING").Value; + m_Path = db.GetSection("ARCHIVE").Value; + m_type = db.GetSection("TYPE").Value; + } + else if (File.Exists(CFGPATH)) + { + using (StreamReader objReader = new StreamReader(CFGPATH)) + { + m_host = objReader.ReadLine(); + m_ConnStr = objReader.ReadLine(); + m_Path = objReader.ReadLine(); + } + } + IPAddress addr; + if (string.IsNullOrEmpty(m_host) || !IPAddress.TryParse(m_host, out addr)) + { + m_host = Environment.MachineName; + } + _ins = new MysqlFactory(); + } + catch (Exception e) + { + AddErrorLog(e); + } + } + + public static DbParameter CreateParam(string paramName, SqlDbType dbType, object objValue, int size = 0, ParameterDirection direction = ParameterDirection.Input) + { + return _ins.CreateParam(paramName, dbType, objValue, size, direction); + } + + public static string DataTableToCsv(DataTable table) + { + //以半角逗号(即,)作分隔符,列为空也要表达其存在。 + //列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。 + //列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。 + StringBuilder sb = new StringBuilder(); + DataColumn colum; + foreach (DataRow row in table.Rows) + { + for (int i = 0; i < table.Columns.Count; i++) + { + colum = table.Columns[i]; + if (i != 0) sb.Append(","); + var txt = row[colum] == null ? "" : row[colum].ToString(); + if (colum.DataType == typeof(string) && txt.Contains(",")) + { + sb.Append("\"" + txt.Replace("\"", "\"\"") + "\""); + } + else sb.Append(txt); + } + sb.AppendLine(); + } + return sb.ToString(); + } + + public static string ReaderToCsv(IDataReader reader) + { + StringBuilder sb = new StringBuilder(); + var colcount = reader.FieldCount; + while (reader.Read()) + { + for (int i = 0; i < colcount; i++) + { + if (i != 0) sb.Append(","); + var txt = reader[i] == null ? "" : reader[i].ToString(); + if (txt.Contains(",")) + { + sb.Append("\"" + txt.Replace("\"", "\"\"") + "\""); + } + else sb.Append(txt); + } + sb.AppendLine(); + } + return sb.ToString(); + } + + public static void AddErrorLog(Exception e) + { + string err = ""; + Exception exp = e; + while (exp != null) + { + err += string.Format("\n {0}", exp.Message); + exp = exp.InnerException; + } + err += string.Format("\n {0}", e.StackTrace); + Log.LogError(err); + } + + public static string GetNullableString(this DbDataReader reader, int index) + { + return reader.GetString(index); + } + + public static DateTime? GetNullableTime(this DbDataReader reader, int index) + { + return reader.GetDateTime(index); + } + + public static int GetTimeTick(this DbDataReader reader, int index) + { + var datetime = reader.GetDateTime(index); + var value = datetime.Subtract(new DateTime(1900, 1, 1)); + long num2 = value.Ticks - value.Days * 864000000000; + if (num2 < 0) + num2 += 864000000000; + int num3 = (int)(num2 / 10000.0 * 0.3 + 0.5); + if (num3 > 300 * 60 * 60 * 24 - 1) + num3 = 0; + return num3; + } + + public static object GetSqlValue(this DbDataReader reader, int index) + { + var mq = reader as MySqlDataReader; + if (mq != null) + { + return mq.GetValue(index); + } + return ""; + } + } + +} \ No newline at end of file diff --git a/SCADA/Program/CoreApp/DataService/DataHelper/DataHelper.csproj b/SCADA/Program/CoreApp/DataService/DataHelper/DataHelper.csproj new file mode 100644 index 0000000..085e74a --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataHelper/DataHelper.csproj @@ -0,0 +1,22 @@ + + + + netcoreapp2.0 + + + + true + + + + + + + + + + + + + + diff --git a/SCADA/Program/CoreApp/DataService/DataHelper/HDAIOHelper.cs b/SCADA/Program/CoreApp/DataService/DataHelper/HDAIOHelper.cs new file mode 100644 index 0000000..c2a3903 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataHelper/HDAIOHelper.cs @@ -0,0 +1,927 @@ +using DataService; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlTypes; +using System.IO; +using System.IO.MemoryMappedFiles; +using System.Runtime.InteropServices; +using System.Text; + +namespace DatabaseLib +{ + public class HDAIOHelper + { + static int[] dataLen = new int[] { 5, 5, 5, 5, 6, 6, 8, 8, 8, 8, 8, 8 }; + + static string m_Path = @"D:\HDA"; + + static HDAIOHelper() + { + m_Path = DataHelper.HdaPath; + } + + public static bool FindFile(DateTime date) + { + if (Directory.Exists(m_Path)) + { + return File.Exists(string.Concat(m_Path, "\\", date.Year.ToString(), "-", date.Month.ToString(), ".bin")); + } + return false; + } + + public static bool CreateFile(int year, int month) + { + string path = string.Concat(m_Path, "\\", year.ToString(), "-", month.ToString(), ".bin"); + try + { + if (Directory.Exists(m_Path)) + { + if (File.Exists(path)) + { + return true; + } + } + else + { + Directory.CreateDirectory(m_Path); + } + using (var stream = File.Create(path, 0x100)) + { + stream.Write(new byte[0x100], 0, 0x100); + return true; + } + } + catch (Exception err) + { + DataHelper.AddErrorLog(err); + return false; + } + } + + public static bool GetRangeFromDatabase(short? ID, ref DateTime start, ref DateTime end) + { + using (var reader = DataHelper.Instance.ExecuteReader("SELECT MIN(TIMESTAMP),MAX(TIMESTAMP) FROM LOG_HDATA" + (ID.HasValue ? " WHERE ID=" + ID.Value : ""))) + { + if (reader != null) + { + while (reader.Read()) + { + if (!reader.IsDBNull(0)) + start = reader.GetDateTime(0); + if (!reader.IsDBNull(1)) + end = reader.GetDateTime(1); + return true; + } + } + } + //start = end = DateTime.MinValue; + return false; + } + + public static void BackUpFile(DateTime date) + { + lock (typeof(HDAIOHelper)) + { + if (WriteToFile(date.AddDays(-1)) == 0) + { + DataHelper.Instance.ExecuteNonQuery(string.Format("DELETE FROM LOG_HDATA WHERE [TIMESTAMP]<='{0}';", date.ToShortDateString())); + } + } + } + + public static int WriteToFile(DateTime date)//每天凌晨写入昨天的数据到文件,可以考虑用服务或计划任务;数据库只保留当天的记录;调度程序负责删除过期记录;历史数据应支持合并 + { + int year = date.Year; int month = date.Month; int day = date.Day; + string path = string.Concat(m_Path, "\\", year.ToString(), "-", month.ToString(), ".bin"); + if (CreateFile(year, month))//如该月文件不存在,则创建;否则写入 + { + using (FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + stream.Seek(day * 8, SeekOrigin.Begin);//先读入索引区,定位到该日期的指针 + byte[] bits = new byte[8]; + stream.Read(bits, 0, 8);//如果该位置指针为>0的正数,说明该区域已有数据 + if (BitConverter.ToInt64(bits, 0) > 0) return -1; + } + using (var dataReader = DataHelper.Instance.ExecuteProcedureReader("WRITEHDATA", DataHelper.CreateParam("@DATE", SqlDbType.DateTime, date))) + { + if (dataReader == null) return -10; + else + { + dataReader.Read(); + int cont = dataReader.GetInt32(0);//读入标签数量 + if (cont == 0) return -2; + string path2 = path + ".temp"; + try + { + File.Copy(path, path2, true);//先把原文件全部复制到临时文件 + //Stopwatch sw = Stopwatch.StartNew(); + using (FileStream stream = File.Open(path2, FileMode.Open)) + { + //w.Seek(8 + day * 8, SeekOrigin.Begin); + //w.Seek(0x100, SeekOrigin.Begin); + long start = stream.Seek(0, SeekOrigin.End);//定位到文件末尾 + long end = 0; + using (BinaryWriter w = new BinaryWriter(stream)) + { + w.Write(new SqlDateTime(date).DayTicks);//写入日期 + w.Write(cont);///写入标签数量 + int count = dataReader.GetInt32(1); + w.Write(count); + HDataFormat[] list = new HDataFormat[count]; + if (dataReader.NextResult()) + { + int p = 0; + int x = 0; + while (dataReader.Read())//写入标签元数据 + { + short id = dataReader.GetInt16(0);//ID号 + byte type = dataReader.GetByte(1);//数据类型 + int cn = dataReader.GetInt32(2);//标签个数 + //list[x].ID = id; + list[x].Type = (DataType)type; + list[x].Count = cn; + //list[x].Offset = p; + w.Write(id); + w.Write(type); + w.Write(cn); + w.Write(p); + p += cn * dataLen[type]; + x++; + } + if (dataReader.NextResult()) + { + for (int i = 0; i < list.Length; i++) + { + int len = list[i].Count; + for (int j = 0; j < len; j++) + { + if (dataReader.Read()) + { + w.Write(dataReader.GetTimeTick(0)); + switch (list[i].Type) + { + case DataType.BOOL: + w.Write(dataReader.GetFloat(1) > 0); + break; + case DataType.BYTE: + w.Write((byte)dataReader.GetFloat(1)); + break; + case DataType.WORD: + case DataType.SHORT: + w.Write((short)dataReader.GetFloat(1)); + break; + case DataType.INT: + w.Write((int)dataReader.GetFloat(1)); + break; + case DataType.FLOAT: + w.Write(dataReader.GetFloat(1)); + break; + } + } + } + } + + } + } + end = stream.Position;//文件的结尾,总长度 + w.Seek((day - 1) * 8, SeekOrigin.Begin);//定位到索引区 + w.Write(start);//写入当日指针 + w.Write(end);//写入下一日指针 + //w.Close(); + } + } + File.Copy(path2, path, true); + } + catch (Exception err) + { + DataHelper.AddErrorLog(err); + return -3; + } + finally + { + if (File.Exists(path2)) + File.Delete(path2); + } + //dataReader.Close(); + return 0; + /*写入失败,则将备份文件还原;数据库不做删除动作,保留记录,次日服务检查数据文件是否存在,不存在则合并写入 + 可在服务内建XML文件保存失败记录的日期列表,以便还原;用File.Mov;定时间隔、开始时间也可XML定义。 + 先备份二进制归档库,再加载数据库数据,写入文件;如成功,删除数据库当日记录并删除备份文件 + sw.Stop(); + * if (sw.ElapsedTicks > 0) { } + */ + } + } + } + return -10; + } + + public static IEnumerable LoadFromFile(DateTime start, DateTime end, bool sdt = false) + { + //Stopwatch sw = Stopwatch.StartNew(); + //文件的组织格式:头文件:31,ln为间隔日期,position为指向日期段的指针,sizes为日期段的长度。 + //每日的抬头:按ID次序,包含每个TAG的数量,arr为每个日期所有的标签、每标签数量、数据类型、位置指针。 + //按时间排序,每个标签的值、时间戳。 + string path = string.Concat(m_Path, "\\", start.Year.ToString(), "-", start.Month.ToString(), sdt ? ".sdt" : ".bin"); + if (!File.Exists(path)) yield break; + int day1 = start.Day; + int startTicks = new SqlDateTime(start).TimeTicks; + int endTicks = new SqlDateTime(end).TimeTicks; + int ln = end.Day - day1 + 1; + using (FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + BinaryReader reader = new BinaryReader(stream); + long[] positions = new long[ln + 1]; + long[] sizes = new long[ln]; + stream.Seek((day1 - 1) * 8, SeekOrigin.Begin); + positions[0] = reader.ReadInt64(); + for (int i = 0; i < ln; i++) + { + positions[i + 1] = reader.ReadInt64(); + sizes[i] = positions[i + 1] - positions[i];//每一天数据的长度 + } + //reader.Close(); + HistoryData data = HistoryData.Empty; + using (MemoryMappedFile mapp = MemoryMappedFile.CreateFromFile(stream, Guid.NewGuid().ToString(), 0, MemoryMappedFileAccess.Read, + HandleInheritability.Inheritable, false)) + { + for (int k = 0; k < ln; k++) + { + if (positions[k] < 0x100 || sizes[k] <= 0 || positions[k] + sizes[k] > stream.Length) + continue; + using (MemoryMappedViewAccessor acc = mapp.CreateViewAccessor(positions[k], sizes[k], MemoryMappedFileAccess.Read)) + { + long pos = 0; + int day = acc.ReadInt32(pos); + pos += 8; + int count = acc.ReadInt32(pos); + pos += 4; + HDataFormat[] arr = new HDataFormat[count]; + for (int i = 0; i < count; i++) + { + arr[i].ID = acc.ReadInt16(pos); + pos += 2; + arr[i].Type = (DataType)acc.ReadByte(pos); + pos++; + arr[i].Count = acc.ReadInt32(pos);//4个字节是预留 + pos += 8; + } + long tempos = pos; + for (int i = 0; i < count; i++) + { + int con = arr[i].Count; + int j = 0; + pos = tempos + acc.ReadInt32(i * 11 + 19); + long pf = pos; + DataType type = arr[i].Type; + int len = dataLen[(int)type]; + if (k == 0) //判断是否为起始日期或结束日期 + { + int ind = BinarySearchTime(acc, pf, con, len, startTicks); + if (ind < 0) ind = ~ind; + j += ind; + pos += ind * len; + } + if (k == ln - 1) + { + int index = BinarySearchTime(acc, pf, con, len, endTicks); + con = index >= 0 ? index : ~index; + } + while (j++ < con) + { + data.ID = arr[i].ID; + data.TimeStamp = new SqlDateTime(day, acc.ReadInt32(pos)).Value; + pos += 4; + switch (type) + { + case DataType.BOOL: + data.Value.Boolean = acc.ReadBoolean(pos); + pos++; + break; + case DataType.BYTE: + data.Value.Byte = acc.ReadByte(pos); + pos++; + break; + case DataType.WORD: + case DataType.SHORT: + data.Value.Int16 = acc.ReadInt16(pos); + pos += 2; + break; + case DataType.INT: + data.Value.Int32 = acc.ReadInt32(pos); + pos += 4; + break; + case DataType.FLOAT: + data.Value.Single = acc.ReadSingle(pos); + pos += 4; + break; + } + yield return data; + } + } + } + } + } + } + yield break; + } + + public static IEnumerable LoadFromFile(DateTime start, DateTime end, short ID, bool sdt = false) + { + string path = string.Concat(m_Path, "\\", start.Year.ToString(), "-", start.Month.ToString(), sdt ? ".sdt" : ".bin");//bin-sdt + if (!File.Exists(path)) yield break; + int day1 = start.Day; + int startTicks = new SqlDateTime(start).TimeTicks;//开始日期部分的4位数据 + int endTicks = new SqlDateTime(end).TimeTicks; + int ln = end.Day - day1 + 1;//日期天数 + using (FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + long filelen = stream.Length;//文件长度 + BinaryReader reader = new BinaryReader(stream); + long[] positions = new long[ln];//每日数据指针(指向第一条数据,包括当日数据索引区) + stream.Seek((day1 - 1) * 8, SeekOrigin.Begin);///找到对应的开始日期索引位置 + + for (int i = 0; i < ln; i++) + { + positions[i] = reader.ReadInt64();//读入时间段内每日数据长度值 + } + long[] sizes = new long[ln]; + for (int i = 0; i < ln; i++) + { + if (positions[i] >= filelen) break;//如果读入长度超过文件大小则退出 + stream.Seek(positions[i] + 8, SeekOrigin.Begin);//定位文件指针到当日数据开头 + sizes[i] = reader.ReadInt32();//sizes为当日该标签数 + } + //reader.Close(); + HistoryData data = HistoryData.Empty; + //stream.Read(new byte[] + using (MemoryMappedFile mapp = MemoryMappedFile.CreateFromFile(stream, Guid.NewGuid().ToString(), filelen, MemoryMappedFileAccess.Read, + HandleInheritability.Inheritable, false)) + { + for (int k = 0; k < ln; k++)//先读入当日索引区 + { + if (positions[k] < 0x100 || sizes[k] <= 0 || positions[k] + sizes[k] > filelen) + continue; + //if (sizes[k] == 0) continue; + long pos = 0; + int count = 0; + int day = 0; + int len = 0; + DataType type = DataType.NONE; + using (MemoryMappedViewAccessor acc1 = mapp.CreateViewAccessor(positions[k], 12 + sizes[k] * 11, MemoryMappedFileAccess.Read))//12是头的长度,11是一个格式字段的长度 + { + day = acc1.ReadInt32(0);//当日日期部分 + int index = BinarySearch(acc1, (int)sizes[k], ID);//找到当天 指定标签的记录索引 + if (index >= 0) + index = index * 11 + 12;//如找到,则定位到当日数据的元数据(相对位移) + //sw.Stop(); + else continue; + byte tp = acc1.ReadByte(index + 2);//读入数据类型 + type = (DataType)tp; + len = dataLen[tp];//4,6,8分别为存储的标签长度,其中4字节是时间戳 + count = acc1.ReadInt32(index + 3);//读入数量 + pos = positions[k] + 12 + sizes[k] * 11 + acc1.ReadInt32(index + 7);//指针指向当日当前标签第一条记录 + } + using (MemoryMappedViewAccessor acc2 = mapp.CreateViewAccessor(pos, count * len, MemoryMappedFileAccess.Read))//重新从头定位文件指针到数据区 + { + pos = 0; + int j = 0; + if (k == 0)//判断是否为起始日期或结束日期 + { + int ind = BinarySearchTime(acc2, 0, count, len, startTicks);//根据时间排序方式二分法查找当日当前时间节点的数据,如为第一日 + if (ind < 0) ind = ~ind; + j += ind; + pos += ind * len; + } + if (k == ln - 1) + { + int ind = BinarySearchTime(acc2, 0, count, len, endTicks);//如果为最后一日的数据,则按结束时间定位 + count = ind >= 0 ? ind : ~ind; + } + while (j++ < count) + { + data.ID = ID; + data.TimeStamp = new SqlDateTime(day, acc2.ReadInt32(pos)).Value;//日期在前(4位) + pos += 4;//数据区也是4位 + switch (type) + { + case DataType.BOOL: + data.Value.Boolean = acc2.ReadBoolean(pos); + pos++; + break; + case DataType.BYTE: + data.Value.Byte = acc2.ReadByte(pos); + pos++; + break; + case DataType.WORD: + case DataType.SHORT: + data.Value.Int16 = acc2.ReadInt16(pos); + pos += 2; + break; + case DataType.INT: + data.Value.Int32 = acc2.ReadInt32(pos); + pos += 4; + break; + case DataType.FLOAT: + data.Value.Single = acc2.ReadSingle(pos); + pos += 4; + break; + } + yield return data; + } + } + } + } + reader.Close(); + } + yield break; + } + + public static IEnumerable LoadFromDatabase(DateTime start, DateTime end, short? ID = null) + { + using (var dataReader = DataHelper.Instance.ExecuteProcedureReader("READHDATA", + DataHelper.CreateParam("@STARTTIME", SqlDbType.DateTime, start), + DataHelper.CreateParam("@ENDTIME", SqlDbType.DateTime, end), + DataHelper.CreateParam("@ID", SqlDbType.Int, (object)ID ?? DBNull.Value))) + { + if (dataReader == null) yield break; + HistoryData data = HistoryData.Empty; + int itime = ID.HasValue ? 0 : 1; + int ivalue = ID.HasValue ? 1 : 2; + int itype = ID.HasValue ? 2 : 3; + while (dataReader.Read()) + { + data.ID = ID.HasValue ? ID.Value : dataReader.GetInt16(0); + data.TimeStamp = dataReader.GetDateTime(itime); + switch ((DataType)dataReader.GetByte(itype)) + { + case DataType.BOOL: + data.Value.Boolean = dataReader.GetFloat(ivalue) > 0 ? true : false; + break; + case DataType.BYTE: + data.Value.Byte = Convert.ToByte(dataReader.GetFloat(ivalue)); + break; + case DataType.WORD: + case DataType.SHORT: + data.Value.Int16 = Convert.ToInt16(dataReader.GetFloat(ivalue)); + break; + case DataType.INT: + data.Value.Int32 = Convert.ToInt32(dataReader.GetFloat(ivalue)); + break; + case DataType.FLOAT: + data.Value.Single = dataReader.GetFloat(ivalue); + break; + } + yield return data; + } + } + yield break; + } + + public static IEnumerable LoadFromDatabaseAtTime(short? ID, params DateTime[] timeStamps) + { + StringBuilder sql = new StringBuilder("SELECT "); + if (ID == null) sql.Append("ID,"); + sql.Append(" [TIMESTAMP],[VALUE],M.DATATYPE FROM LOG_HDATA L INNER JOIN META_TAG M ON L.ID=M.TAGID WHERE"); + if (ID != null) sql.Append(" ID=").Append(ID.Value).Append(" AND "); + sql.Append(" [TIMESTAMP] IN("); + for (int i = 0; i < timeStamps.Length; i++) + { + sql.Append("'").Append(timeStamps[i]).Append("',"); + } + using (var dataReader = DataHelper.Instance.ExecuteReader(sql.Append("1)").ToString())) + { + if (dataReader == null) yield break; + HistoryData data = HistoryData.Empty; + int itime = ID == null ? 0 : 1; + int ivalue = ID == null ? 1 : 2; + int itype = ID == null ? 2 : 3; + while (dataReader.Read()) + { + data.ID = ID == null ? dataReader.GetInt16(0) : ID.Value; + data.TimeStamp = dataReader.GetDateTime(itime); + switch ((DataType)dataReader.GetByte(itype)) + { + case DataType.BOOL: + data.Value.Boolean = dataReader.GetFloat(ivalue) > 0 ? true : false; + break; + case DataType.BYTE: + data.Value.Byte = Convert.ToByte(dataReader.GetFloat(ivalue)); + break; + case DataType.WORD: + case DataType.SHORT: + data.Value.Int16 = Convert.ToInt16(dataReader.GetFloat(ivalue)); + break; + case DataType.INT: + data.Value.Int32 = Convert.ToInt32(dataReader.GetFloat(ivalue)); + break; + case DataType.FLOAT: + data.Value.Single = dataReader.GetFloat(ivalue); + break; + } + yield return data; + } + } + yield break; + } + + private static int BinarySearch(MemoryMappedViewAccessor acc, int length, short value) + { + int i = 0; + int num2 = length - 1; + while (i <= num2) + { + int num3 = i + ((num2 - i) >> 1); + int num4 = acc.ReadInt16(12 + num3 * 11).CompareTo(value); + if (num4 == 0) + { + return num3; + } + if (num4 < 0) + { + i = num3 + 1; + } + else + { + num2 = num3 - 1; + } + } + return -1; + } + + private static int BinarySearchTime(MemoryMappedViewAccessor acc, long offset, int count, int len, int ticks) + { + int i = 0; + int num2 = count - 1; + while (i <= num2) + { + int num3 = i + ((num2 - i) >> 1); + int num4 = acc.ReadInt32(offset + num3 * len).CompareTo(ticks); + if (num4 == 0) + { + return num3; + } + if (num4 < 0) + { + i = num3 + 1; + } + else + { + num2 = num3 - 1; + } + } + return ~i; + } + + public static void SDTCompression(int year, int month, float E = 0.7f) + { + //Stopwatch sw = Stopwatch.StartNew(); + string path = string.Concat(m_Path, "\\", year.ToString(), "-", month.ToString()); + using (FileStream stream = File.Open(path + ".bin", FileMode.Open, FileAccess.Read, FileShare.Read)) + { + using (FileStream outstream = File.Create(path + ".sdt")) + { + outstream.Write(new byte[0x100], 0, 0x100); + BinaryWriter w = new BinaryWriter(outstream); + using (MemoryMappedFile mapp = MemoryMappedFile.CreateFromFile(stream, "map1", stream.Length, + MemoryMappedFileAccess.ReadWrite, HandleInheritability.Inheritable, false)) + { + int days = DateTime.DaysInMonth(year, month); + long[] ps = new long[days + 1]; + long[] ps1 = new long[days + 1]; + long[] sizes = new long[days]; + MemoryMappedViewAccessor acc1 = mapp.CreateViewAccessor(0, 8 * days); + long begin = 0; + ps[0] = acc1.ReadInt64(begin); + for (int i = 0; i < days; i++) + { + begin += 8; + ps[i + 1] = (i == days - 1 ? stream.Length : acc1.ReadInt64(begin)); + sizes[i] = ps[i + 1] - ps[i]; + } + acc1.Dispose(); + for (int i = 0; i < days; i++) + { + if (ps[i] < 0x100 || sizes[i] <= 0) + continue; + using (MemoryMappedViewAccessor acc = mapp.CreateViewAccessor(ps[i], sizes[i])) + { + ps1[i] = outstream.Position; + int len = acc.ReadInt32(8); + int len1 = len * 11 + 12; + HDataFormat[] list = new HDataFormat[len]; + w.Write(acc.ReadInt32(0)); + w.Write(acc.ReadInt32(4)); + w.Write(len); + outstream.Write(new byte[len1 - 12], 0, len1 - 12); + long pos = 12; + int off = 0; + for (int j = 0; j < len; j++) + { + short id; byte type; int count; int offset; + id = acc.ReadInt16(pos); + type = acc.ReadByte(pos + 2); + count = acc.ReadInt32(pos + 3); + offset = acc.ReadInt32(pos + 7); + list[j].ID = id; + list[j].Type = (DataType)type; + list[j].Offset = off;//此处可采取三次到五次抽样得到E和TLM + if (count < 3) + { + long pos2 = len1 + offset; + for (int m = 0; m < count; m++) + { + w.Write(acc.ReadInt32(pos2)); + pos2 += 4; + w.Write(acc.ReadSingle(pos2)); + pos2 += 4; + } + continue; + } + else + { + switch (list[j].Type) + { + case DataType.FLOAT: + { + int crt = 0; int net = 0; + float crv = 0; float nev = 0; + int maxt = 0; int mint = maxt; int sumt = 0; + float minv = 0; float maxv = minv; float sumv = 0; + int old_time = 0; int time = 0; + float mem = 0; float old_mem = 0; + long pp = len1 + offset; + long pos2 = pp + 16; + for (int c = 0; c < 9; c++) + { + crt = acc.ReadInt32(pp); + pp += 4; + crv = acc.ReadSingle(pp); + pp += 4; + if (c > 0) + { + float cv = crv - nev; + int ct = crt - net; + if (c == 1) + { + time = crt; + mem = crv; + maxt = mint = ct; + minv = maxv = cv; + } + else + { + if (cv > maxv) + maxv = cv; + if (cv < minv) + minv = cv; + if (ct > maxt) + maxt = ct; + if (ct < mint) + mint = ct; + } + sumv += cv; + sumt += ct; + } + else + { + old_mem = crv; + old_time = crt; + } + nev = crv; + net = crt; + } + int TLM = (sumt - maxt - mint) / 2; + float E1 = E * (sumv - maxv - minv) / 6; + int sum = 1; + //old_time = now_time = new_time = 0; + float timespan; + w.Write(old_time); + w.Write(old_mem); + float k1, k2, k; + timespan = time - old_time; + k = (mem - old_mem) / timespan; + k1 = k + (E1 / timespan); + k2 = 2 * k - k1; + for (int m = 2; m < count; m++) + { + if (timespan >= TLM || k < k2 || k > k1) + { + ++sum; + w.Write(old_time); + w.Write(old_mem); + k1 = k + (E1 / timespan); + k2 = 2 * k - k1; + } + old_time = time; + old_mem = mem; + time = acc.ReadInt32(pos2); + pos2 += 4; + mem = acc.ReadSingle(pos2); + pos2 += 4; + timespan = time - old_time; + k = (mem - old_mem) / timespan; + } + list[j].Count = sum; + off += sum * 8; + } + break; + case DataType.WORD: + case DataType.SHORT: + { + int crt = 0; int net = 0; + short crv = 0; short nev = 0; + int maxt = 0; int mint = maxt; int sumt = 0; + int minv = 0; int maxv = minv; int sumv = 0; + int old_time = 0; int time = 0; + short mem = 0; short old_mem = 0; + long pp = len1 + offset; + long pos2 = pp + 12; + for (int c = 0; c < 9; c++) + { + crt = acc.ReadInt32(pp); + pp += 4; + crv = acc.ReadInt16(pp); + pp += 2; + if (c > 0) + { + int cv = crv - nev; + int ct = crt - net; + if (c == 1) + { + time = crt; + maxt = mint = ct; + mem = crv; + minv = maxv = cv; + } + else + { + if (cv > maxv) + maxv = cv; + if (cv < minv) + minv = cv; + if (ct > maxt) + maxt = ct; + if (ct < mint) + mint = ct; + } + sumv += cv; + sumt += ct; + } + else + { + old_mem = crv; + old_time = crt; + } + nev = crv; + net = crt; + } + int TLM = (sumt - maxt - mint) / 2; + float E1 = E * (sumv - maxv - minv) / 6; + int sum = 1; + float timespan; + w.Write(old_time); + w.Write(old_mem); + float k1, k2, k; + timespan = time - old_time; + k = (mem - old_mem) / timespan; + k1 = k + (E1 / timespan); + k2 = 2 * k - k1; + for (int m = 2; m < count; m++) + { + if (timespan >= TLM || k < k2 || k > k1) + { + ++sum; + w.Write(old_time); + w.Write(old_mem); + k1 = k + (E1 / timespan); + k2 = 2 * k - k1; + } + old_time = time; + old_mem = mem; + time = acc.ReadInt32(pos2); + pos2 += 4; + mem = acc.ReadInt16(pos2); + pos2 += 2; + timespan = time - old_time; + k = (mem - old_mem) / timespan; + } + + list[j].Count = sum; + off += sum * 8; + } + break; + default: + { + byte[] buffer = new byte[count * dataLen[type]]; + stream.Seek(ps[i] + len1 + offset, SeekOrigin.Begin); + stream.Read(buffer, 0, buffer.Length); + outstream.Write(buffer, 0, buffer.Length); + list[j].Count = count; + off += buffer.Length; + } + break; + } + pos += 11; + } + } + outstream.Seek(ps1[i] + 12, SeekOrigin.Begin); + for (int j = 0; j < len; j++) + { + w.Write(list[j].ID); + w.Write((byte)list[j].Type); + w.Write(list[j].Count); + w.Write(list[j].Offset); + } + ps1[i + 1] = outstream.Seek(0, SeekOrigin.End); + } + + } + outstream.Seek(0, SeekOrigin.Begin); + for (int i = 0; i < days + 1; i++) + { + w.Write(ps1[i]); + } + } + } + } + } + + //遍历两个文件夹下所有历史记录文件;如日期无重复,则复制源路径下文件到目标路径;否则合并到一个文件 + public static unsafe bool Merge(string sourcePath, string targetPath) + { + return true; + } + + public static unsafe ushort ToFloat16(float f) + { + uint* i = (uint*)&f; + uint sign = (*i >> 31) & 0x1; + uint exponent = ((*i >> 23) & 0xff) - 0x7f; + uint mantissa = (*i) & 0x7fffff; + + exponent += 0x7; + uint ret = ((sign & 0x1) << 15); + ret |= ((exponent & 0xf) << 11); + ret |= ((mantissa >> 13) & 0x7ff); + return (ushort)ret; + } + + public static unsafe float ToFloat32(ushort f) + { + ushort* i = (ushort*)&f; + int sign = (*i >> 15) & 0x1; + int exponent = ((*i >> 11) & 0xf) - 0x7; + int mantissa = (*i) & 0x7ff; + + exponent += 0x7f; + int ret = ((sign & 0x1) << 31); + ret |= (exponent & 0xff) << 23; + ret |= (mantissa << 13) & 0x7fffff; + return *((float*)&ret); + } + + + public static float[] Interpolation(float[] dataIn, int n) + { + float[] dataOut = new float[n]; + int lenIn = dataIn.Length; + float[] divOut = new float[n]; + for (int i = 1; i < n; i++) + { + divOut[i] = divOut[i - 1] + lenIn / (float)n; + } + int k = 0; + for (int i = k; i < n; i++) + { + for (int j = 0; j < lenIn - 1; j++) + { + if (divOut[i] >= j && divOut[i] < j + 1) + { + dataOut[i] = (dataIn[j + 1] - dataIn[j]) * (divOut[i] - j) + dataIn[j]; + k = i; + } + } + } + return dataOut; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal struct HDataFormat + { + public short ID; + public DataType Type; + public int Count; + public int Offset; + + public HDataFormat(short id, DataType type, int count, int offset) + { + ID = id; + Type = type; + Count = count; + Offset = offset; + } + } +} \ No newline at end of file diff --git a/SCADA/Program/CoreApp/DataService/DataHelper/IDataFactory.cs b/SCADA/Program/CoreApp/DataService/DataHelper/IDataFactory.cs new file mode 100644 index 0000000..66260b9 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataHelper/IDataFactory.cs @@ -0,0 +1,32 @@ +using System.Data; +using System.Data.Common; + +namespace DatabaseLib +{ + public interface IDataFactory + { + bool BulkCopy(IDataReader reader, string tableName, string command = null); + void CallException(string message); + bool ConnectionTest(); + DbParameter CreateParam(string paramName, SqlDbType dbType, object objValue, int size = 0, ParameterDirection direction = ParameterDirection.Input); + DataRow ExecuteDataRowProcedure(string ProName, params DbParameter[] ParaName); + DataRowView ExecuteDataRowViewProcedure(string ProName, params DbParameter[] ParaName); + DataSet ExecuteDataset(string SQL); + DataSet ExecuteDataset(string[] SQLs, string[] TableNames); + DataSet ExecuteDataset(string SQL, string TableName); + DataSet ExecuteDataSetProcedure(string ProName, params DbParameter[] ParaName); + DataSet ExecuteDataSetProcedure(string ProName, ref int returnValue, params DbParameter[] ParaName); + DataTable ExecuteDataTable(string SQL); + DataTable ExecuteDataTableProcedure(string ProName, params DbParameter[] ParaName); + DataTable ExecuteDataTableProcedure(string ProName, ref int returnValue, DbParameter[] ParaName); + int ExecuteNonQuery(string[] SQLs); + int ExecuteNonQuery(string SQL); + int ExecuteNonQuery(string[] SQLs, object[][] Pars); + DbDataReader ExecuteProcedureReader(string sSQL, params DbParameter[] ParaName); + DbDataReader ExecuteReader(string sSQL); + object ExecuteScalar(string sSQL); + bool ExecuteStoredProcedure(string ProName); + int ExecuteStoredProcedure(string ProName, params DbParameter[] ParaName); + void FillDataSet(ref DataSet ds, string SQL, string TableName); + } +} \ No newline at end of file diff --git a/SCADA/Program/CoreApp/DataService/DataHelper/MysqlFactory.cs b/SCADA/Program/CoreApp/DataService/DataHelper/MysqlFactory.cs new file mode 100644 index 0000000..45cb93e --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataHelper/MysqlFactory.cs @@ -0,0 +1,778 @@ +using MySql.Data.MySqlClient; +using System; +using System.Data; +using System.Data.Common; +using System.IO; + +namespace DatabaseLib +{ + public class MysqlFactory : IDataFactory + { + public void CallException(string message) + { + DataHelper.AddErrorLog(new Exception(message)); + } + + public bool ConnectionTest() + { + //创建连接对象 + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + //myMySqlConnection.ConnectionTimeout = 1;//设置连接超时的时间 + try + { + //Open DataBase + //打开数据库 + m_Conn.Open(); + if (m_Conn.State == ConnectionState.Open) + { + return true; + } + } + catch (Exception e) + { + CallException(e.Message); + } + } + //myMySqlConnection is a MySqlConnection object + return false; + } + + public MySqlDbType ConvertType(SqlDbType dbType) + { + switch (dbType) + { + case SqlDbType.BigInt: + return MySqlDbType.Int64; + case SqlDbType.Binary: + return MySqlDbType.Binary; + case SqlDbType.Bit: + return MySqlDbType.Bit; + case SqlDbType.Date: + return MySqlDbType.Date; + case SqlDbType.SmallDateTime: + case SqlDbType.DateTime2: + case SqlDbType.DateTime: + return MySqlDbType.DateTime; + case SqlDbType.DateTimeOffset: + return MySqlDbType.Time; + case SqlDbType.Decimal: + return MySqlDbType.Decimal; + case SqlDbType.Float: + return MySqlDbType.Double; + case SqlDbType.Image: + return MySqlDbType.Binary; + case SqlDbType.Int: + return MySqlDbType.Int32; + case SqlDbType.Money: + return MySqlDbType.Float; + case SqlDbType.NText: + case SqlDbType.Text: + return MySqlDbType.Text; + case SqlDbType.Real: + return MySqlDbType.Float; + case SqlDbType.SmallInt: + return MySqlDbType.Int16; + case SqlDbType.Structured: + return MySqlDbType.Set; + case SqlDbType.Time: + return MySqlDbType.Time; + case SqlDbType.Timestamp: + return MySqlDbType.Timestamp; + case SqlDbType.TinyInt: + return MySqlDbType.Byte; + case SqlDbType.VarBinary: + return MySqlDbType.VarBinary; + case SqlDbType.Char: + case SqlDbType.NVarChar: + case SqlDbType.VarChar: + return MySqlDbType.VarChar; + default: + return MySqlDbType.VarChar; + } + } + + public DbParameter CreateParam(string paramName, SqlDbType dbType, object objValue, int size = 0, ParameterDirection direction = ParameterDirection.Input) + { + if (string.IsNullOrEmpty(paramName)) return null; + if (paramName[0] == '@') paramName = 'p' + paramName.TrimStart('@'); + MySqlParameter parameter = new MySqlParameter(paramName, ConvertType(dbType)); + if (size > 0) parameter.Size = size; + if (objValue == null) + { + if (direction == ParameterDirection.Output) + { + parameter.Direction = direction; + return parameter; + } + parameter.IsNullable = true; + parameter.Value = DBNull.Value; + return parameter; + } + parameter.Value = objValue; + return parameter; + } + #region ExecuteDataset //执行查询语句,返回一个记录集 + + /// + /// 返回记录集 + /// + /// 用于返回记录集的SQL语句 + /// 记录集 + public DataSet ExecuteDataset(string SQL) + { + DataSet ds = new DataSet(); + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + try + { + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + MySqlCommand cmd = new MySqlCommand(SQL, m_Conn); + da.SelectCommand = cmd; + da.Fill(ds); + } + catch (Exception e) + { + CallException(SQL + " " + e.Message); + } + } + return ds; + } + + + /// + /// 返回记录集 + /// + /// 用于返回记录集的SQL语句 + /// 映射表名 + /// 记录集 + public DataSet ExecuteDataset(string SQL, string TableName) + { + DataSet ds = new DataSet(); + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + try + { + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + MySqlCommand cmd = new MySqlCommand(SQL, m_Conn); + da.SelectCommand = cmd; + da.Fill(ds, TableName); + } + catch (Exception e) + { + CallException(SQL + " " + e.Message); + } + } + return ds; + } + + /// + /// 返回包含多个表的记录集 + /// + /// 用于返回记录集的SQL语句 + /// 映射表名 + /// 记录集 + + public DataSet ExecuteDataset(string[] SQLs, string[] TableNames) + { + DataSet ds = new DataSet(); + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + try + { + for (int i = 0; i < SQLs.Length; i++) + { + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + MySqlCommand cmd = new MySqlCommand(SQLs[i], m_Conn); + da.SelectCommand = cmd; + da.Fill(ds, TableNames[i]); + } + } + catch (Exception e) + { + CallException(SQLs + " " + e.Message); + } + } + return ds; + } + + #endregion ExecuteDataset + + /// + /// 返回表 + /// + /// 用于返回记录集的SQL语句 + /// 记录集 + public DataTable ExecuteDataTable(string SQL) + { + DataTable dt = new DataTable(); + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + try + { + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + MySqlCommand cmd = new MySqlCommand(SQL, m_Conn); + da.SelectCommand = cmd; + da.Fill(dt); + } + catch (Exception e) + { + CallException(SQL + " " + e.Message); + } + } + return dt; + } + + #region ExecuteNonQuery //执行非查询语句 + + /// + /// 执行一条INSERT、UPDATE、DELETE语句 + /// + /// T-SQL语句 + /// 返回影响的行数 + public int ExecuteNonQuery(string SQL) + { + int res = -1; + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + MySqlTransaction sqlT = null; MySqlBulkLoader loader = new MySqlBulkLoader(m_Conn); + //loader.Columns + try + { + using (MySqlCommand cmd = new MySqlCommand(SQL, m_Conn)) + { + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + cmd.Connection = m_Conn; + sqlT = m_Conn.BeginTransaction(); + cmd.Transaction = sqlT; + res = cmd.ExecuteNonQuery(); + sqlT.Commit(); + } + } + catch (Exception e) + { + if (sqlT != null) + sqlT.Rollback(); + CallException(SQL + " " + e.Message); + return -1; + } + return res; + } + } + + /// + /// 执行一组INSERT、UPDATE、DELETE语句 + /// + /// T-SQL语句 + /// 返回影响的行数 + public int ExecuteNonQuery(string[] SQLs) + { + int res = -1; + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + MySqlTransaction sqlT = null; + MySqlCommand cmd = new MySqlCommand(); + try + { + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + cmd.Connection = m_Conn; + sqlT = m_Conn.BeginTransaction(); + cmd.Transaction = sqlT; + for (int i = 0; i < SQLs.Length; i++) + { + cmd.CommandText = SQLs[i]; + res = cmd.ExecuteNonQuery(); + } + sqlT.Commit(); + } + catch (Exception e) + { + if (sqlT != null) + sqlT.Rollback(); + CallException(SQLs + " " + e.Message); + res = -1; + } + return res; + } + } + + /// + /// 执行一组INSERT、UPDATE、DELETE语句 + /// + /// T-SQL语句 + /// 执行参数 + /// 返回影响的行数 + public int ExecuteNonQuery(string[] SQLs, object[][] Pars) + { + int res = -1; + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + MySqlTransaction sqlT = null; + MySqlCommand cmd = new MySqlCommand(); + try + { + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + cmd.Connection = m_Conn; + sqlT = m_Conn.BeginTransaction(); + cmd.Transaction = sqlT; + for (int i = 0; i < SQLs.Length; i++) + { + cmd.CommandText = SQLs[i]; + cmd.Parameters.Clear(); + for (int j = 0; j < Pars[i].Length; j++) + { + cmd.Parameters.AddWithValue("@p" + j.ToString(), Pars[i][j]); + } + res = cmd.ExecuteNonQuery(); + } + sqlT.Commit(); + } + catch (Exception e) + { + if (sqlT != null) + sqlT.Rollback(); + CallException(SQLs + " " + e.Message); + res = -1; + } + return res; + } + } + + #endregion ExecuteNonQuery + + #region FillDataSet //填充一个记录集 + + /// + /// 用指定的SQL语句来填充一个记录集 + /// + /// 记录集 + /// SELECT语句 + /// 映射表名 + public void FillDataSet(ref DataSet ds, string SQL, string TableName) + { + try + { + MySqlConnection m_Conn; + m_Conn = new MySqlConnection(DataHelper.ConnectString); + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + MySqlCommand cmd = new MySqlCommand(SQL, m_Conn); + da.SelectCommand = cmd; + da.Fill(ds, TableName); + } + catch (Exception e) + { + CallException(SQL + " " + e.Message); + } + } + + #endregion FillDataSet + + #region + // + /// 返回一个MySqlDataReader + /// + public DbDataReader ExecuteReader(string sSQL) + { + MySqlConnection connection = new MySqlConnection(DataHelper.ConnectString); + MySqlCommand command = new MySqlCommand(sSQL, connection); + if (connection.State == ConnectionState.Closed) + connection.Open(); + return command.ExecuteReader(CommandBehavior.CloseConnection); + } + + + public DbDataReader ExecuteProcedureReader(string sSQL, params DbParameter[] ParaName) + { + MySqlConnection connection = new MySqlConnection(DataHelper.ConnectString); + MySqlCommand command = new MySqlCommand(sSQL, connection); + command.CommandType = CommandType.StoredProcedure; + if (ParaName != null) + { + command.Parameters.AddRange(ParaName); + } + try + { + if (connection.State == ConnectionState.Closed) + connection.Open(); + return command.ExecuteReader(CommandBehavior.CloseConnection); + } + catch (Exception e) + { + CallException(sSQL + " " + e.Message); + return null; + } + } + #endregion + + #region ExecuteScalar //执行查询,并返回查询所返回的结果集中第一行的第一列 + + /// + /// 执行查询,并返回查询所返回的结果集中第一行的第一列 + /// + /// SQL语句 + /// + public object ExecuteScalar(string sSQL) + { + MySqlTransaction sqlT = null; + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + MySqlCommand cmd = new MySqlCommand(sSQL, m_Conn); + try + { + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + sqlT = m_Conn.BeginTransaction(); + cmd.Transaction = sqlT; + var res = cmd.ExecuteScalar(); + sqlT.Commit(); + if (res == DBNull.Value) res = null; + return res; + } + catch (Exception e) + { + if (sqlT != null) + sqlT.Rollback(); + CallException(sSQL + " " + e.Message); + return null; + } + } + } + + #endregion ExecuteScalar + + #region ExecuteStoredProcedure //执行一个存储过程 + + /// + /// 执行一个带参数的存储过程 + /// + /// 存储过程名 + /// 参数名称 + /// 参数方向,Input参数是输入参数 InputOutput参数既能输入,也能输出 Output参数是输出参数 ReturnValue参数存储过程返回值。 + /// 参数对象数组 + /// 成功返回true,失败返回false + public int ExecuteStoredProcedure(string ProName, params DbParameter[] ParaName) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + try + { + MySqlCommand cmd = new MySqlCommand(ProName, m_Conn) + { + CommandType = CommandType.StoredProcedure + }; + if (ParaName != null) + { + cmd.Parameters.AddRange(ParaName); + } + MySqlParameter param = new MySqlParameter(); + cmd.Parameters.Add(param); + param.Direction = ParameterDirection.ReturnValue; + if (m_Conn.State == ConnectionState.Closed) + { + m_Conn.Open(); + } + cmd.ExecuteNonQuery(); + return (int)param.Value; + } + catch (Exception e) + { + CallException(ProName + " " + e.Message); + return -1; + } + } + } + + /// + /// 执行一个没有参数和返回值的存储过程(默认参数类型) + /// + /// 存储过程名 + /// 参数对象数组 + /// 成功返回true,失败返回false + public bool ExecuteStoredProcedure(string ProName) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + try + { + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + MySqlCommand cmd = new MySqlCommand(ProName, m_Conn); + cmd.CommandType = CommandType.StoredProcedure; + cmd.ExecuteNonQuery(); + return true; + } + catch (Exception e) + { + CallException(ProName + " " + e.Message); + return false; + } + } + } + + /// + /// 执行一个带参数的存储过程,并返回数据集 + /// + /// 存储过程名 + /// 参数名称 + /// 参数对象数组 + /// 执行过程中返回的数据集 + /// 成功返回true,失败返回false + public DataSet ExecuteDataSetProcedure(string ProName, ref int returnValue, params DbParameter[] ParaName) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + DataSet ds = new DataSet(); + try + { + MySqlCommand cmd = new MySqlCommand(ProName, m_Conn); + cmd.CommandType = CommandType.StoredProcedure; + if (ParaName != null) + { + cmd.Parameters.AddRange(ParaName); + } + MySqlParameter param = new MySqlParameter { Direction = ParameterDirection.ReturnValue }; + cmd.Parameters.Add(param); + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + da.SelectCommand = cmd; + da.Fill(ds); + returnValue = (int)param.Value; + return ds; + } + catch (Exception e) + { + CallException(ProName + " " + e.Message); + return null; + } + } + } + + public DataSet ExecuteDataSetProcedure(string ProName, params DbParameter[] ParaName) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + DataSet ds = new DataSet(); + try + { + MySqlCommand cmd = new MySqlCommand(ProName, m_Conn); + cmd.CommandType = CommandType.StoredProcedure; + if (ParaName != null) + { + cmd.Parameters.AddRange(ParaName); + } + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + da.SelectCommand = cmd; + da.Fill(ds); + return ds; + } + + catch (Exception e) + { + CallException(ProName + " " + e.Message); + return null; + } + } + } + + /// + /// 执行一个带参数的存储过程,并返回数据集 + /// + /// 存储过程名 + /// 参数名称 + /// 参数对象数组 + /// 执行过程中返回的数据集 + /// 成功返回true,失败返回false + /// + public DataTable ExecuteDataTableProcedure(string ProName, params DbParameter[] ParaName) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + DataTable ds = new DataTable(); + try + { + MySqlCommand cmd = new MySqlCommand(ProName, m_Conn); + cmd.CommandType = CommandType.StoredProcedure; + if (ParaName != null) + { + cmd.Parameters.AddRange(ParaName); + } + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + da.SelectCommand = cmd; + da.Fill(ds); + return ds; + } + catch (Exception e) + { + CallException(ProName + " " + e.Message); + return null; + } + } + } + + public DataTable ExecuteDataTableProcedure(string ProName, ref int returnValue, DbParameter[] ParaName) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + DataTable ds = new DataTable(); + try + { + MySqlCommand cmd = new MySqlCommand(ProName, m_Conn); + cmd.CommandType = CommandType.StoredProcedure; + if (ParaName != null) + { + cmd.Parameters.AddRange(ParaName); + } + MySqlParameter param = new MySqlParameter { Direction = ParameterDirection.ReturnValue }; + cmd.Parameters.Add(param); + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + da.SelectCommand = cmd; + da.Fill(ds); + returnValue = (int)param.Value; + return ds; + } + catch (Exception e) + { + CallException(ProName + " " + e.Message); + return null; + } + } + } + + /// + /// 执行一个带参数的存储过程,同时输出一行 + /// + /// 存储过程名 + /// 参数名称 + /// 参数对象数组 + /// 返回整数 + public DataRow ExecuteDataRowProcedure(string ProName, params DbParameter[] ParaName) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + try + { + MySqlCommand cmd = new MySqlCommand(ProName, m_Conn); + cmd.CommandType = CommandType.StoredProcedure; + if (ParaName != null) + { + cmd.Parameters.AddRange(ParaName); + } + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + DataTable table = new DataTable(); + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + da.SelectCommand = cmd; + da.Fill(table); + if (table.Rows.Count > 0) + return table.Rows[0]; + else + return table.NewRow(); + } + catch (Exception e) + { + CallException(ProName + " " + e.Message); + return null; + } + } + } + + /// + /// 执行一个带参数的存储过程,同时输出一行 + /// + /// 存储过程名 + /// 参数名称 + /// 参数对象数组 + /// 返回整数 + public DataRowView ExecuteDataRowViewProcedure(string ProName, params DbParameter[] ParaName) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + try + { + MySqlCommand cmd = new MySqlCommand(ProName, m_Conn); + cmd.CommandType = CommandType.StoredProcedure; + if (ParaName != null) + { + cmd.Parameters.AddRange(ParaName); + } + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + DataTable table = new DataTable(); + var da = MySqlClientFactory.Instance.CreateDataAdapter(); + da.SelectCommand = cmd; + da.Fill(table); + if (table.Rows.Count > 0) + return table.DefaultView[0]; + else + return table.DefaultView.AddNew(); + } + catch (Exception e) + { + CallException(ProName + " " + e.Message); + return null; + } + } + } + + public bool BulkCopy(IDataReader reader, string tableName, string command = null) + { + using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString)) + { + MySqlTransaction sqlT = null; + try + { + if (m_Conn.State == ConnectionState.Closed) + m_Conn.Open(); + sqlT = m_Conn.BeginTransaction(); + if (!string.IsNullOrEmpty(command)) + { + MySqlCommand cmd = new MySqlCommand(command, m_Conn); + cmd.Transaction = sqlT; + cmd.ExecuteNonQuery(); + } + string tmpPath = Path.GetTempFileName(); + string csv = DataHelper.ReaderToCsv(reader); + File.WriteAllText(tmpPath, csv); + MySqlBulkLoader copy = new MySqlBulkLoader(m_Conn) + { + FieldTerminator = ",", + FieldQuotationCharacter = '"', + EscapeCharacter = '"', + LineTerminator = "\r\n", + FileName = tmpPath, + NumberOfLinesToSkip = 0, + TableName = tableName, + }; + //copy.BatchSize = _capacity; + copy.Load();//如果写入失败,考虑不能无限增加线程数 + //Clear(); + sqlT.Commit(); + m_Conn.Close(); + File.Delete(tmpPath); + return true; + } + catch (Exception e) + { + if (sqlT != null) + sqlT.Rollback(); + m_Conn.Close(); + DataHelper.AddErrorLog(e); + return false; + } + } + } + + + #endregion ExecuteStoredProcedure + } +} diff --git a/SCADA/Program/CoreApp/DataService/DataService.sln b/SCADA/Program/CoreApp/DataService/DataService.sln new file mode 100644 index 0000000..f950486 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService.sln @@ -0,0 +1,71 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2005 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataService", "DataService\DataService.csproj", "{46BF803C-F153-4222-8FFC-9AC957F34EA5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GateWay", "GateWay\GateWay.csproj", "{99BEC8C4-2684-4BFD-897A-2340B6963120}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataHelper", "DataHelper\DataHelper.csproj", "{EE99C592-F4F2-4152-94CC-564ABA066C20}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModbusDriver", "ModbusDriver\ModbusDriver.csproj", "{79CDC563-AA30-48CA-8913-32454EDE76FA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientDriver", "ClientDriver\ClientDriver.csproj", "{3D10E811-46FE-4EE7-A268-8B50C3B2D08F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {46BF803C-F153-4222-8FFC-9AC957F34EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46BF803C-F153-4222-8FFC-9AC957F34EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46BF803C-F153-4222-8FFC-9AC957F34EA5}.Debug|x86.ActiveCfg = Debug|Any CPU + {46BF803C-F153-4222-8FFC-9AC957F34EA5}.Debug|x86.Build.0 = Debug|Any CPU + {46BF803C-F153-4222-8FFC-9AC957F34EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46BF803C-F153-4222-8FFC-9AC957F34EA5}.Release|Any CPU.Build.0 = Release|Any CPU + {46BF803C-F153-4222-8FFC-9AC957F34EA5}.Release|x86.ActiveCfg = Release|Any CPU + {46BF803C-F153-4222-8FFC-9AC957F34EA5}.Release|x86.Build.0 = Release|Any CPU + {99BEC8C4-2684-4BFD-897A-2340B6963120}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99BEC8C4-2684-4BFD-897A-2340B6963120}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99BEC8C4-2684-4BFD-897A-2340B6963120}.Debug|x86.ActiveCfg = Debug|Any CPU + {99BEC8C4-2684-4BFD-897A-2340B6963120}.Debug|x86.Build.0 = Debug|Any CPU + {99BEC8C4-2684-4BFD-897A-2340B6963120}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99BEC8C4-2684-4BFD-897A-2340B6963120}.Release|Any CPU.Build.0 = Release|Any CPU + {99BEC8C4-2684-4BFD-897A-2340B6963120}.Release|x86.ActiveCfg = Release|Any CPU + {99BEC8C4-2684-4BFD-897A-2340B6963120}.Release|x86.Build.0 = Release|Any CPU + {EE99C592-F4F2-4152-94CC-564ABA066C20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE99C592-F4F2-4152-94CC-564ABA066C20}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE99C592-F4F2-4152-94CC-564ABA066C20}.Debug|x86.ActiveCfg = Debug|Any CPU + {EE99C592-F4F2-4152-94CC-564ABA066C20}.Debug|x86.Build.0 = Debug|Any CPU + {EE99C592-F4F2-4152-94CC-564ABA066C20}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE99C592-F4F2-4152-94CC-564ABA066C20}.Release|Any CPU.Build.0 = Release|Any CPU + {EE99C592-F4F2-4152-94CC-564ABA066C20}.Release|x86.ActiveCfg = Release|Any CPU + {EE99C592-F4F2-4152-94CC-564ABA066C20}.Release|x86.Build.0 = Release|Any CPU + {79CDC563-AA30-48CA-8913-32454EDE76FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79CDC563-AA30-48CA-8913-32454EDE76FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79CDC563-AA30-48CA-8913-32454EDE76FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {79CDC563-AA30-48CA-8913-32454EDE76FA}.Debug|x86.Build.0 = Debug|Any CPU + {79CDC563-AA30-48CA-8913-32454EDE76FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79CDC563-AA30-48CA-8913-32454EDE76FA}.Release|Any CPU.Build.0 = Release|Any CPU + {79CDC563-AA30-48CA-8913-32454EDE76FA}.Release|x86.ActiveCfg = Release|Any CPU + {79CDC563-AA30-48CA-8913-32454EDE76FA}.Release|x86.Build.0 = Release|Any CPU + {3D10E811-46FE-4EE7-A268-8B50C3B2D08F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D10E811-46FE-4EE7-A268-8B50C3B2D08F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D10E811-46FE-4EE7-A268-8B50C3B2D08F}.Debug|x86.ActiveCfg = Debug|Any CPU + {3D10E811-46FE-4EE7-A268-8B50C3B2D08F}.Debug|x86.Build.0 = Debug|Any CPU + {3D10E811-46FE-4EE7-A268-8B50C3B2D08F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D10E811-46FE-4EE7-A268-8B50C3B2D08F}.Release|Any CPU.Build.0 = Release|Any CPU + {3D10E811-46FE-4EE7-A268-8B50C3B2D08F}.Release|x86.ActiveCfg = Release|Any CPU + {3D10E811-46FE-4EE7-A268-8B50C3B2D08F}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {06245D70-C147-4613-91E1-E3990B520C63} + EndGlobalSection +EndGlobal diff --git a/SCADA/Program/CoreApp/DataService/DataService/Alarm.cs b/SCADA/Program/CoreApp/DataService/DataService/Alarm.cs new file mode 100644 index 0000000..523fadc --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/Alarm.cs @@ -0,0 +1,223 @@ +using System; +using System.ComponentModel; + +namespace DataService +{ + + public class AlarmItem : IComparable, INotifyPropertyChanged + { + int _condiId; + + Severity _severity; + SubAlarmType _alarmType; + DateTime _startTime; + TimeSpan _duration; + object _alarmValue; + string _alarmText; + string _source; + + public SubAlarmType SubAlarmType + { + get + { + return _alarmType; + } + set + { + _alarmType = value; + } + } + + public Severity Severity + { + get + { + return _severity; + } + set + { + _severity = value; + } + } + + public DateTime StartTime + { + get + { + return _startTime; + } + set + { + _startTime = value; + } + } + + public int ConditionId + { + get + { + return _condiId; + } + set + { + _condiId = value; + } + } + + public TimeSpan Duration + { + get + { + //return _endTime-_startTime; + return _duration; + } + set + { + _duration = value; + OnPropertyChanged("Duration"); + } + } + + public object AlarmValue + { + get + { + return _alarmValue; + } + set + { + _alarmValue = value; + } + } + + public string AlarmText + { + get + { + return _alarmText; + } + set + { + _alarmText = value; + } + } + + public string Source + { + get + { + return _source; + } + set + { + _source = value; + } + } + + public AlarmItem(DateTime time, string alarmText, object alarmValue, SubAlarmType type, Severity severity, int condId, string source) + { + this._startTime = time; + this._alarmType = type; + this._alarmText = alarmText; + this._alarmValue = alarmValue; + this._severity = severity; + this._condiId = condId; + this._source = source; + } + + public AlarmItem() + { + this._startTime = DateTime.Now; + this._alarmType = SubAlarmType.None; + this._alarmText = string.Empty; + this._severity = Severity.Normal; + this._condiId = -1; + this._source = string.Empty; + } + + #region IComparable Members + + public int CompareTo(AlarmItem other) + { + return this._startTime.CompareTo(other._startTime); + } + + #endregion + + public event PropertyChangedEventHandler PropertyChanged; + + private void OnPropertyChanged(string propertyName) + { + if (this.PropertyChanged != null) + { + + this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + + } + + [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/CoreApp/DataService/DataService/CacheReader.cs b/SCADA/Program/CoreApp/DataService/DataService/CacheReader.cs new file mode 100644 index 0000000..ac64220 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/CacheReader.cs @@ -0,0 +1,910 @@ +using System; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; + +namespace DataService +{ + public sealed class ByteCacheReader : ICache + { + byte[] _cache; + public Array Cache { get { return _cache; } } + + public int ByteCount + { + get { return 1; } + } + + int _size; + public int Size + { + get { return _size; } + set { _size = value; this._cache = new byte[_size]; } + } + + public ByteCacheReader() { } + + public ByteCacheReader(int size) + { + this.Size = size; + } + + public int GetOffset(DeviceAddress start, DeviceAddress end) + { + return start.Area == end.Area && start.DBNumber == end.DBNumber ? start.Start - end.Start : ushort.MaxValue; + } + + public ItemData ReadInt32(DeviceAddress address) + { + return new ItemData(BitConverter.ToInt32(_cache, address.CacheIndex), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadBit(DeviceAddress address) + { + return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit)) != 0, 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address) + { + return new ItemData(BitConverter.ToInt16(_cache, address.CacheIndex), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address) + { + return new ItemData(_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadString(DeviceAddress address, ushort size = 0xFF) + { + return new ItemData(Encoding.ASCII.GetString(_cache, address.CacheIndex, size), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadFloat(DeviceAddress address) + { + return new ItemData(BitConverter.ToSingle(_cache, address.CacheIndex), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadValue(DeviceAddress address) + { + return this.ReadValueEx(address); + } + + public int WriteBit(DeviceAddress address, bool bit) + { + _cache[address.CacheIndex] |= (byte)(1 << address.Bit); + return 0; + } + + public int WriteBits(DeviceAddress address, byte bits) + { + _cache[address.CacheIndex] = bits; + return 0; + } + + public unsafe int WriteInt16(DeviceAddress address, short value) + { + fixed (byte* p1 = _cache) + { + Marshal.WriteInt16((IntPtr)(p1 + address.CacheIndex), value); + } + return 0; + } + + public unsafe int WriteInt32(DeviceAddress address, int value) + { + fixed (byte* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), value); + } + return 0; + } + + public unsafe int WriteFloat(DeviceAddress address, float value) + { + fixed (byte* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), *(int*)&value); + } + return 0; + } + + public int WriteString(DeviceAddress address, string str) + { + byte[] b = Encoding.ASCII.GetBytes(str); + int index = address.CacheIndex; + Array.Copy(_cache, index, b, 0, b.Length); + return 0; + } + + public int WriteValue(DeviceAddress address, object value) + { + return this.WriteValueEx(address, value); + } + + public byte[] ReadBytes(DeviceAddress address, ushort size) + { + byte[] bytes = new byte[size]; + Array.Copy(_cache, address.CacheIndex, bytes, 0, size); + return bytes; + } + + public int WriteBytes(DeviceAddress address, byte[] bit) + { + if (bit != null && bit.Length > 0) + { + Array.Copy(bit, 0, _cache, address.CacheIndex, bit.Length); + return 0; + } + return -1; + } + } + + public sealed class NetByteCacheReader : ICache + { + byte[] _cache; + public Array Cache { get { return _cache; } } + + public int ByteCount + { + get { return 1; } + } + + int _size; + public int Size + { + get { return _size; } + set { _size = value; this._cache = new byte[_size]; } + } + + public NetByteCacheReader() { } + + public NetByteCacheReader(int size) + { + this.Size = size; + } + + public int GetOffset(DeviceAddress start, DeviceAddress end) + { + return start.Area == end.Area && start.DBNumber == end.DBNumber ? start.Start - end.Start : ushort.MaxValue; + } + + public ItemData ReadInt32(DeviceAddress address) + { + return new ItemData(Utility.NetToInt32(_cache, address.CacheIndex), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadBit(DeviceAddress address) + { + return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit)) != 0, 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address) + { + return new ItemData(Utility.NetToInt16(_cache, address.CacheIndex), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address) + { + return new ItemData(_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadString(DeviceAddress address, ushort size = 0xFF) + { + return new ItemData(Utility.ConvertToString(_cache, address.CacheIndex, size), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadFloat(DeviceAddress address) + { + return new ItemData(Utility.NetToSingle(_cache, address.CacheIndex), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadValue(DeviceAddress address) + { + return this.ReadValueEx(address); + } + + public int WriteBit(DeviceAddress address, bool bit) + { + _cache[address.CacheIndex] |= (byte)(1 << address.Bit); + return 0; + } + + public int WriteBits(DeviceAddress address, byte bits) + { + _cache[address.CacheIndex] = bits; + return 0; + } + + public unsafe int WriteInt16(DeviceAddress address, short value) + { + fixed (byte* p1 = _cache) + { + Marshal.WriteInt16((IntPtr)(p1 + address.CacheIndex), IPAddress.HostToNetworkOrder(value)); + } + return 0; + } + + public unsafe int WriteInt32(DeviceAddress address, int value) + { + fixed (byte* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), IPAddress.HostToNetworkOrder(value)); + } + return 0; + } + + public unsafe int WriteFloat(DeviceAddress address, float value) + { + fixed (byte* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), IPAddress.HostToNetworkOrder(*(int*)(&value))); + } + return 0; + } + + public int WriteString(DeviceAddress address, string str) + { + byte[] b = Encoding.ASCII.GetBytes(str); + int index = address.CacheIndex; + Array.Copy(_cache, index, b, 0, b.Length); + return 0; + } + + public int WriteValue(DeviceAddress address, object value) + { + return this.WriteValueEx(address, value); + } + + public byte[] ReadBytes(DeviceAddress address, ushort size) + { + byte[] bytes = new byte[size]; + Array.Copy(_cache, address.CacheIndex, bytes, 0, size); + return bytes; + } + + public int WriteBytes(DeviceAddress address, byte[] bit) + { + if (bit != null && bit.Length > 0) + { + Array.Copy(bit, 0, _cache, address.CacheIndex, bit.Length); + return 0; + } + return -1; + } + + } + + public sealed class ShortCacheReader : ICache + { + short[] _cache; + public Array Cache + { + get + { + return _cache; + } + } + + public int ByteCount + { + get { return 2; } + } + + int _size; + public int Size + { + get + { + return _size; + } + set + { + _size = value; + this._cache = new short[_size]; + } + } + + public ShortCacheReader() + { + } + + public ShortCacheReader(int size) + { + this.Size = size; + } + + public int GetOffset(DeviceAddress start, DeviceAddress end) + { + return start.Area == end.Area && start.DBNumber == end.DBNumber ? start.Start - end.Start : ushort.MaxValue; + } + + public ItemData ReadInt32(DeviceAddress address) + { + int startIndex = address.CacheIndex; + int result; + if (startIndex == _cache.Length - 1) + { + result = _cache[startIndex]; + } + else + { + result = (_cache[startIndex + 1] << 16) | ((ushort)_cache[startIndex]); + } + return new ItemData(result, 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadBit(DeviceAddress address) + { + return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit)) != 0, 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address) + { + return new ItemData(_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address) + { + return new ItemData((byte)_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadString(DeviceAddress address, ushort size) + { + byte[] buffer = new byte[size]; + Buffer.BlockCopy(_cache, 2 * address.CacheIndex, buffer, 0, size); + return new ItemData(Encoding.ASCII.GetString(buffer).Trim(), 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadFloat(DeviceAddress address) + { + int startIndex = address.CacheIndex; + int result; + if (startIndex == _cache.Length - 1) + { + result = _cache[startIndex]; + } + else + { + result = (_cache[startIndex] << 16) | ((ushort)_cache[startIndex + 1]); + } + return new ItemData(*(((float*)&result)), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadValue(DeviceAddress address) + { + return this.ReadValueEx(address); + } + + public int WriteBit(DeviceAddress address, bool bit) + { + _cache[address.CacheIndex] |= (short)(1 << address.Bit); + return 0; + } + + public int WriteBits(DeviceAddress address, byte bits) + { + _cache[address.CacheIndex] = bits; + return 0; + } + + public unsafe int WriteInt16(DeviceAddress address, short value) + { + _cache[address.CacheIndex] = value; + return 0; + } + + public unsafe int WriteInt32(DeviceAddress address, int value) + { + fixed (short* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), value); + } + return 0; + } + + public unsafe int WriteFloat(DeviceAddress address, float value) + { + fixed (short* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), *(int*)&value); + } + return 0; + } + + public int WriteString(DeviceAddress address, string str) + { + byte[] b = Encoding.ASCII.GetBytes(str); + int index = address.CacheIndex; + Buffer.BlockCopy(_cache, index, b, 0, b.Length); + return 0; + } + + public int WriteValue(DeviceAddress address, object value) + { + return this.WriteValueEx(address, value); + } + + public byte[] ReadBytes(DeviceAddress address, ushort size) + { + byte[] bytes = new byte[2 * size]; + Buffer.BlockCopy(_cache, address.CacheIndex, bytes, 0, bytes.Length); + return bytes; + } + + public int WriteBytes(DeviceAddress address, byte[] bit) + { + if (bit != null && bit.Length > 0) + { + Buffer.BlockCopy(bit, 0, _cache, address.CacheIndex, bit.Length); + return 0; + } + return -1; + } + } + + public sealed class NetShortCacheReader : ICache + { + short[] _cache; + public Array Cache + { + get + { + return _cache; + } + } + + public int ByteCount + { + get { return 2; } + } + + int _size; + public int Size + { + get + { + return _size; + } + set + { + _size = value; + this._cache = new short[_size]; + } + } + + public NetShortCacheReader() + { + } + + public NetShortCacheReader(int size) + { + this.Size = size; + } + + public int GetOffset(DeviceAddress start, DeviceAddress end) + { + return start.Area == end.Area && start.DBNumber == end.DBNumber ? start.Start - end.Start : ushort.MaxValue; + } + + public ItemData ReadInt32(DeviceAddress address) + { + int startIndex = address.CacheIndex; + int result; + if (startIndex == _cache.Length - 1) + { + result = _cache[startIndex]; + } + else + { + result = (IPAddress.HostToNetworkOrder(_cache[startIndex]) << 16) | ((ushort)IPAddress.HostToNetworkOrder(_cache[startIndex + 1])); + } + return new ItemData(result, 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadBit(DeviceAddress address) + { + return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit.BitSwap())) != 0, 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address) + { + return new ItemData(IPAddress.HostToNetworkOrder(_cache[address.CacheIndex]), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address) + { + return new ItemData((byte)IPAddress.HostToNetworkOrder(_cache[address.CacheIndex]), 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadString(DeviceAddress address, ushort size) + { + short[] sarray = new short[size / 2]; + int index = address.CacheIndex; + for (int i = 0; i < sarray.Length; i++) + { + sarray[i] = IPAddress.HostToNetworkOrder(_cache[index + i]); + } + byte[] buffer = new byte[size]; + Buffer.BlockCopy(sarray, 0, buffer, 0, size); + return new ItemData(Encoding.ASCII.GetString(buffer).Trim(), 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadFloat(DeviceAddress address) + { + int startIndex = address.CacheIndex; + int result; + if (startIndex == _cache.Length - 1) + { + result = _cache[startIndex]; + } + else + { + result = (IPAddress.HostToNetworkOrder(_cache[startIndex]) << 16) | ((ushort)IPAddress.HostToNetworkOrder(_cache[startIndex + 1])); + } + return new ItemData(*(((float*)&result)), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadValue(DeviceAddress address) + { + return this.ReadValueEx(address); + } + + public int WriteBit(DeviceAddress address, bool bit) + { + _cache[address.CacheIndex] |= (short)(1 << address.Bit.BitSwap()); + return 0; + } + + public int WriteBits(DeviceAddress address, byte bits) + { + _cache[address.CacheIndex] = bits; + return 0; + } + + public unsafe int WriteInt16(DeviceAddress address, short value) + { + _cache[address.CacheIndex] = value; + return 0; + } + + public unsafe int WriteInt32(DeviceAddress address, int value) + { + fixed (short* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), IPAddress.HostToNetworkOrder(value)); + } + return 0; + } + + public unsafe int WriteFloat(DeviceAddress address, float value) + { + fixed (short* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), IPAddress.HostToNetworkOrder(*(int*)&value)); + } + return 0; + } + + public int WriteString(DeviceAddress address, string str) + { + byte[] b = Encoding.ASCII.GetBytes(str); + int index = address.CacheIndex; + Buffer.BlockCopy(_cache, index, b, 0, b.Length); + return 0; + } + + public int WriteValue(DeviceAddress address, object value) + { + return this.WriteValueEx(address, value); + } + + public byte[] ReadBytes(DeviceAddress address, ushort size) + { + byte[] bytes = new byte[2 * size]; + Buffer.BlockCopy(_cache, address.CacheIndex, bytes, 0, bytes.Length); + return bytes; + } + + public int WriteBytes(DeviceAddress address, byte[] bit) + { + if (bit != null && bit.Length > 0) + { + Buffer.BlockCopy(bit, 0, _cache, address.CacheIndex, bit.Length); + return 0; + } + return -1; + } + } + + public sealed class IntCacheReader : ICache + { + int[] _cache; + + public Array Cache + { + get + { + return _cache; + } + } + + public int ByteCount + { + get { return 4; } + } + + int _size; + public int Size + { + get + { + return _size; + } + set + { + _size = value; + this._cache = new int[_size]; + } + } + + public IntCacheReader() + { + } + + public IntCacheReader(int size) + { + this.Size = size; + } + + public int GetOffset(DeviceAddress start, DeviceAddress end) + { + return start.Area == end.Area && start.DBNumber == end.DBNumber ? start.Start - end.Start : ushort.MaxValue; + } + + public ItemData ReadInt32(DeviceAddress address) + { + + return new ItemData(_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadBit(DeviceAddress address) + { + return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit)) != 0, 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address) + { + return new ItemData((short)(_cache[address.CacheIndex]), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address) + { + return new ItemData((byte)_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadString(DeviceAddress address, ushort size) + { + byte[] buffer = new byte[size]; + Buffer.BlockCopy(_cache, 4 * address.CacheIndex, buffer, 0, size); + return new ItemData(Encoding.ASCII.GetString(buffer).Trim(), 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadFloat(DeviceAddress address) + { + int result = _cache[address.CacheIndex]; + return new ItemData(*(((float*)&result)), 0, QUALITIES.QUALITY_GOOD);//强制将4字节转换为浮点格式 + } + + public ItemData ReadValue(DeviceAddress address) + { + return this.ReadValueEx(address); + } + + public int WriteBit(DeviceAddress address, bool bit) + { + _cache[address.CacheIndex] |= (1 << address.Bit); + return 0; + } + + public int WriteBits(DeviceAddress address, byte bits) + { + _cache[address.CacheIndex] = bits; + return 0; + } + + public unsafe int WriteInt16(DeviceAddress address, short value) + { + _cache[address.CacheIndex] = value; + return 0; + } + + public unsafe int WriteInt32(DeviceAddress address, int value) + { + _cache[address.CacheIndex] = value; + return 0; + } + + public unsafe int WriteFloat(DeviceAddress address, float value) + { + fixed (int* p1 = _cache) + { + Marshal.WriteInt32((IntPtr)(p1 + address.CacheIndex), *(int*)&value); + } + return 0; + } + + public int WriteString(DeviceAddress address, string str) + { + byte[] b = Encoding.ASCII.GetBytes(str); + int index = address.CacheIndex; + Buffer.BlockCopy(_cache, index, b, 0, b.Length); + return 0; + } + + public int WriteValue(DeviceAddress address, object value) + { + return this.WriteValueEx(address, value); + } + + public byte[] ReadBytes(DeviceAddress address, ushort size) + { + byte[] bytes = new byte[4 * size]; + Buffer.BlockCopy(_cache, address.CacheIndex, bytes, 0, bytes.Length); + return bytes; + } + + public int WriteBytes(DeviceAddress address, byte[] bit) + { + if (bit != null && bit.Length > 0) + { + Buffer.BlockCopy(bit, 0, _cache, address.CacheIndex, bit.Length); + return 0; + } + return -1; + } + } + + public sealed class FloatCacheReader : ICache + { + float[] _cache; + + public Array Cache + { + get + { + return _cache; + } + } + + public int ByteCount + { + get { return 4; } + } + + int _size; + public int Size + { + get + { + return _size; + } + set + { + _size = value; + this._cache = new float[_size]; + } + } + + public FloatCacheReader() + { + } + + public FloatCacheReader(int size) + { + this.Size = size; + } + + public int GetOffset(DeviceAddress start, DeviceAddress end) + { + return start.Area == end.Area && start.DBNumber == end.DBNumber ? start.Start - end.Start : ushort.MaxValue; + } + + public ItemData ReadInt32(DeviceAddress address) + { + + return new ItemData((int)_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadBit(DeviceAddress address) + { + return new ItemData(((int)_cache[address.CacheIndex] & (1 << address.Bit)) != 0, 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address) + { + return new ItemData((short)(_cache[address.CacheIndex]), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address) + { + return new ItemData((byte)_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadString(DeviceAddress address, ushort size) + { + byte[] buffer = new byte[size]; + Buffer.BlockCopy(_cache, 4 * address.CacheIndex, buffer, 0, size); + return new ItemData(Encoding.ASCII.GetString(buffer).Trim(), 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadFloat(DeviceAddress address) + { + return new ItemData(_cache[address.CacheIndex], 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadValue(DeviceAddress address) + { + return this.ReadValueEx(address); + } + + public int WriteBit(DeviceAddress address, bool bit) + { + _cache[address.CacheIndex] = (int)_cache[address.CacheIndex] | (1 << address.Bit); + return 0; + } + + public int WriteBits(DeviceAddress address, byte bits) + { + _cache[address.CacheIndex] = bits; + return 0; + } + + public unsafe int WriteInt16(DeviceAddress address, short value) + { + _cache[address.CacheIndex] = value; + return 0; + } + + public unsafe int WriteInt32(DeviceAddress address, int value) + { + _cache[address.CacheIndex] = value; + return 0; + } + + public unsafe int WriteFloat(DeviceAddress address, float value) + { + _cache[address.CacheIndex] = value; + return 0; + } + + public int WriteString(DeviceAddress address, string str) + { + byte[] b = Encoding.ASCII.GetBytes(str); + int index = address.CacheIndex; + Buffer.BlockCopy(_cache, index, b, 0, b.Length); + return 0; + } + + public int WriteValue(DeviceAddress address, object value) + { + return this.WriteValueEx(address, value); + } + + public byte[] ReadBytes(DeviceAddress address, ushort size) + { + byte[] bytes = new byte[4 * size]; + Buffer.BlockCopy(_cache, address.CacheIndex, bytes, 0, bytes.Length); + return bytes; + } + + public int WriteBytes(DeviceAddress address, byte[] bit) + { + if (bit != null && bit.Length > 0) + { + Buffer.BlockCopy(bit, 0, _cache, address.CacheIndex, bit.Length); + return 0; + } + return -1; + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/ClientReader.cs b/SCADA/Program/CoreApp/DataService/DataService/ClientReader.cs new file mode 100644 index 0000000..1b1c7bb --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/ClientReader.cs @@ -0,0 +1,607 @@ +using System; +using System.Collections.Generic; +using System.Net.Sockets; +using System.Net; +using System.Text; +using System.Threading; + +namespace DataService +{ + public class ClientReader : IDevice + { + string _ip; + public string ServerName + { + get { return _ip; } + } + + internal Socket tcpSynCl; + internal Socket tcpASynCl; + + public bool IsClosed + { + get + { + //return tcpASynCl.Poll(-1, SelectMode.SelectRead); + return !tcpSynCl.Connected || !tcpASynCl.Connected; + } + } + + private ushort _timeout = 0; + public int TimeOut + { + get { return _timeout; } + } + + + List _grps = new List(1); + public IEnumerable Groups + { + get { return _grps; } + } + + IDataServer _server; + public IDataServer Parent + { + get { return _server; } + } + + public ClientReader(IDataServer server, string ip) + { + _server = server; + _ip = ip; + } + + public bool Connect() + { + try + { + int port = 1000; + IPAddress ip = IPAddress.Parse(_ip); + tcpASynCl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + tcpASynCl.Connect(new IPEndPoint(ip, port)); + tcpASynCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, _timeout); + tcpASynCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, _timeout); + + tcpSynCl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + tcpSynCl.Connect(new IPEndPoint(ip, port)); + tcpSynCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, _timeout); + tcpSynCl.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, _timeout); + return true; + } + catch (SocketException error) + { + if (OnClose != null) + OnClose(this, new ShutdownRequestEventArgs(error.Message)); + return false; + } + } + + public IGroup AddGroup(string name, ushort id, int updateRate, int timeOut = 0, float deadBand = 0f, bool active = false) + { + ClientGroup grp = new ClientGroup(id, name, updateRate, active, this); + _grps.Add(grp); + return grp; + } + + public int RemoveAllGroup() + { + foreach (IGroup grp in _grps) + { + grp.Dispose(); + } + _grps.Clear(); + return 1; + } + + public event ShutdownRequestEventHandler OnClose; + + public void Dispose() + { + if (tcpSynCl != null) + { + if (tcpSynCl.Connected) + { + try + { + tcpASynCl.Shutdown(SocketShutdown.Both); + tcpSynCl.Shutdown(SocketShutdown.Both); + } + catch { } + if (OnClose != null) + OnClose(this, new ShutdownRequestEventArgs("SHUTDOWN")); + tcpSynCl.Close(); + tcpASynCl.Close(); + } + tcpSynCl = null; + tcpASynCl = null; + } + RemoveAllGroup(); + } + } + + public class ClientGroup : IGroup + { + public const byte fctHead = 0xAB; + public const byte fctReadSingle = 1; + public const byte fctReadMultiple = 2; + public const byte fctWriteSingle = 5; + public const byte fctWriteMultiple = 15; + + bool _active = false; + public bool IsActive + { + get + { + return _active; + } + set + { + _active = value; + if (value) + { + ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ReciveData), _tcpASynCl); + } + } + } + + protected ushort _id; + public ushort ID + { + get + { + return _id; + } + } + + protected int _updateRate; + public int UpdateRate + { + get + { + return _updateRate; + } + set + { + _updateRate = value; + } + } + + protected DeviceAddress _start; + public DeviceAddress Start + { + get + { + return _start; + } + } + + public int Size + { + get + { + return _items == null ? 0 : _items.Length; + } + } + + protected string _name; + public string Name + { + get + { + return _name; + } + } + + protected float _deadband; + public float DeadBand + { + get + { + return _deadband; + } + set + { + _deadband = value; + } + } + + protected ClientReader _plcReader; + public IDevice Parent + { + get + { + return _plcReader; + } + } + + protected ITag[] _items; + public IEnumerable Items + { + get { return _items; } + } + + IDataServer _server; + Socket _tcpSynCl, _tcpASynCl; + + byte[] tcpSynClBuffer; + + public ClientGroup(ushort id, string name, int updateRate, bool active, ClientReader plcReader) + { + this._id = id; + this._name = name; + this._updateRate = updateRate; + this._active = active; + this._plcReader = plcReader; + this._server = plcReader.Parent; + this._tcpASynCl = plcReader.tcpASynCl; + this._tcpSynCl = plcReader.tcpASynCl; + tcpSynClBuffer = new byte[_tcpASynCl.ReceiveBufferSize]; + } + + private byte[] ReadSingleData(DeviceAddress address, DataSource source = DataSource.Cache) + { + short ID = (short)address.Start; + byte type = (byte)address.VarType; + byte[] idbits = BitConverter.GetBytes(ID); + byte[] write_data = new byte[6] { fctHead, fctReadSingle, + source == DataSource.Cache?(byte)0:(byte)1, idbits[0], idbits[1], type }; + byte[] data = new byte[type < 4 ? 1 : type < 6 ? 2 : 4]; + SocketError error; + _tcpSynCl.Send(write_data, 0, 6, SocketFlags.None, out error); + int result = _tcpSynCl.Receive(tcpSynClBuffer, 0, data.Length + 3, SocketFlags.None, out error); + Array.Copy(tcpSynClBuffer, 3, data, 0, data.Length); + if (error == SocketError.Success) + return data; + else + { + throw new SocketException((int)error); + } + } + + + private int WriteSingleData(DeviceAddress address, byte[] value) + { + short ID = (short)address.Start; + byte type = (byte)address.VarType; + byte[] idbits = BitConverter.GetBytes(ID); + byte[] write_data = new byte[6] { fctHead, fctWriteSingle, 1, idbits[0], idbits[1], type }; + byte[] data = new byte[6 + value.Length]; + write_data.CopyTo(data, 0); + value.CopyTo(data, 6); + SocketError error; + _tcpSynCl.Send(data, 0, data.Length, SocketFlags.None, out error); + int result = _tcpSynCl.Receive(tcpSynClBuffer, 0, 2, SocketFlags.None, out error); + if (error == SocketError.Success) + return tcpSynClBuffer[1]; + else + { + throw new SocketException((int)error); + } + } + + + public void Init() + { + if (_items != null) + { + for (int i = 0; i < _items.Length; i++) + { + _items[i].Value = _items[i].Read(DataSource.Cache);//DataSource.Device + } + } + } + + private void ReciveData(object state) + { + if (state == null || !_active) return; + byte[] bytes = new byte[_tcpASynCl.ReceiveBufferSize]; + int result = 0; + SocketError error; + do + { + result = _tcpASynCl.Receive(bytes, 0, bytes.Length, SocketFlags.None, out error); + if (result > 5 && bytes[0] == 0xAB) + { + short len = BitConverter.ToInt16(bytes, 1); + short count = BitConverter.ToInt16(bytes, 3); + int j = 5; + DateTime time = DateTime.UtcNow; + Storage value = Storage.Empty; + for (int i = 0; i < count; i++) + { + short id = BitConverter.ToInt16(bytes, j); + j += 2; + ITag tag = GetItemByID(id); + if (tag != null) + { + DataType type = (DataType)bytes[j++]; + switch (type) + { + case DataType.BOOL: + value.Boolean = BitConverter.ToBoolean(bytes, j++); + break; + case DataType.BYTE: + value.Byte = bytes[j++]; + break; + case DataType.SHORT: + value.Int16 = BitConverter.ToInt16(bytes, j); + j += 2; + break; + case DataType.INT: + value.Int32 = BitConverter.ToInt32(bytes, j); + j += 4; + break; + case DataType.FLOAT: + value.Single = BitConverter.ToSingle(bytes, j); + j += 4; + break; + } + tag.Update(value, time, QUALITIES.QUALITY_GOOD); + } + else + { + byte type = bytes[j]; + j += (type < 4 ? 2 : type < 6 ? 3 : 5); + } + } + //Array.Clear(bytes, 0, count); + } + } + while (result > 0); + } + + public bool AddItems(ItemMetaData[] items) + { + int count = items.Length; + if (_items == null) _items = new ITag[count]; + for (int i = 0; i < count; i++) + { + ITag dataItem = null; + ItemMetaData meta = items[i]; + DeviceAddress addr = new DeviceAddress(0, 0, meta.ID, meta.Size, 0, meta.DataType); + switch (meta.DataType) + { + case DataType.BOOL: + dataItem = new BoolTag(meta.ID, addr, this); + break; + case DataType.BYTE: + dataItem = new ByteTag(meta.ID, addr, this); + break; + case DataType.WORD: + case DataType.SHORT: + dataItem = new ShortTag(meta.ID, addr, this); + break; + case DataType.TIME: + case DataType.INT: + dataItem = new IntTag(meta.ID, addr, this); + break; + case DataType.FLOAT: + dataItem = new FloatTag(meta.ID, addr, this); + break; + case DataType.STR: + dataItem = new StringTag(meta.ID, addr, this); + break; + default: + dataItem = new BoolTag(meta.ID, addr, this); + break; + } + _items[i] = dataItem; + _server.AddItemIndex(meta.Name, dataItem); + } + Array.Sort(_items); + Init(); + return true; + } + + public bool RemoveAll() + { + Array.Clear(_items, 0, _items.Length); + return true; + } + + public bool SetActiveState(bool active, params short[] items) + { + return true; + } + + public int FindItemByAddress(DeviceAddress addr) + { + return Array.BinarySearch(_items, new BoolTag(0, addr, null)); + } + + public ITag GetItemByID(short id) + { + return _server[id]; + } + + public int BatchRead(DataSource source, bool isSync, params ITag[] itemArray) + { + if (itemArray == null) return -1; + int len = itemArray.Length; + byte[] bt = new byte[4]; + byte[] data = new byte[3 + len * 2]; + int j=0; + data[j++] = fctHead; + data[j++] = fctReadMultiple; + data[j++] = source == DataSource.Cache ? (byte)0 : (byte)1; + bt = BitConverter.GetBytes(itemArray.Length); + data[j++] = bt[0]; + data[j++] = bt[1]; + data[j++] = bt[2]; + data[j++] = bt[3]; + for (int i = 0; i < len; i++) + { + ITag tag = itemArray[i]; + bt = BitConverter.GetBytes(tag.ID); + data[j++] = bt[0]; + data[j++] = bt[1]; + data[j++] = (byte)(tag.Address.DataSize >> 3); + } + SocketError error; + _tcpSynCl.Send(data, 0, data.Length, SocketFlags.None, out error); + int result = _tcpSynCl.Receive(tcpSynClBuffer, 0, tcpSynClBuffer.Length, SocketFlags.None, out error); + j = 2; + if (error == SocketError.Success) + { + DateTime time=DateTime.UtcNow; + Storage value=Storage.Empty; + for (int i = 0; i < len; i++) + { + ITag tag = itemArray[i]; + switch (tag.Address.VarType) + { + case DataType.BOOL: + value.Boolean = BitConverter.ToBoolean(tcpSynClBuffer, j++); + break; + case DataType.BYTE: + value.Byte = tcpSynClBuffer[j++]; + break; + case DataType.SHORT: + value.Int16 = BitConverter.ToInt16(tcpSynClBuffer, j); + j += 2; + break; + case DataType.INT: + value.Int32 = BitConverter.ToInt32(tcpSynClBuffer, j); + j += 4; + break; + case DataType.FLOAT: + value.Single = BitConverter.ToSingle(tcpSynClBuffer, j); + j += 4; + break; + } + tag.Update(value, time, QUALITIES.QUALITY_GOOD); + } + return 0; + } + else + { + throw new SocketException((int)error); + } + } + + public int BatchWrite(IDictionary items, bool isSync = true) + { + List list = new List(new byte[] { fctHead, fctWriteMultiple }); + list.AddRange(BitConverter.GetBytes(items.Count)); + foreach (var item in items) + { + ITag tag = item.Key; + list.AddRange(BitConverter.GetBytes(tag.ID)); + switch (tag.Address.VarType) + { + case DataType.BOOL: + list.Add((bool)item.Value ? (byte)1 : (byte)0); + break; + case DataType.BYTE: + list.Add((byte)item.Value); + break; + case DataType.SHORT: + list.AddRange(BitConverter.GetBytes((short)item.Value)); + break; + case DataType.INT: + list.AddRange(BitConverter.GetBytes((int)item.Value)); + break; + case DataType.FLOAT: + list.AddRange(BitConverter.GetBytes((float)item.Value)); + break; + } + } + SocketError error; + _tcpSynCl.Send(list.ToArray(), 0, list.Count, SocketFlags.None, out error); + int result = _tcpSynCl.Receive(tcpSynClBuffer, 0, 2, SocketFlags.None, out error); + if (error == SocketError.Success) + return tcpSynClBuffer[1]; + else + { + throw new SocketException((int)error); + } + } + + + public ItemData ReadInt32(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : + new ItemData(BitConverter.ToInt32(data, 0), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : + new ItemData(BitConverter.ToInt16(data, 0), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(0, 0, QUALITIES.QUALITY_BAD) : + new ItemData(data[0], 0, QUALITIES.QUALITY_GOOD); + } + + public unsafe ItemData ReadFloat(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + if (data == null) + return new ItemData(0.0f, 0, QUALITIES.QUALITY_BAD); + else + { + int value = BitConverter.ToInt32(data, 0); + return new ItemData(*(((float*)&value)), 0, QUALITIES.QUALITY_GOOD); + } + } + + public ItemData ReadBool(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(false, 0, QUALITIES.QUALITY_BAD) : + new ItemData(BitConverter.ToBoolean(data, address.Bit), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadString(DeviceAddress address, DataSource source = DataSource.Cache) + { + var data = ReadSingleData(address, source); + return data == null ? new ItemData(string.Empty, 0, QUALITIES.QUALITY_BAD) : + new ItemData(Encoding.Default.GetString(data, 0, address.DataSize), 0, QUALITIES.QUALITY_GOOD); + } + + public int WriteInt32(DeviceAddress address, int value) + { + return WriteSingleData(address, BitConverter.GetBytes(value)); + } + + public int WriteInt16(DeviceAddress address, short value) + { + return WriteSingleData(address, BitConverter.GetBytes(value)); + } + + public int WriteFloat(DeviceAddress address, float value) + { + return WriteSingleData(address, BitConverter.GetBytes(value)); + } + + public int WriteString(DeviceAddress address, string value) + { + return WriteSingleData(address, Encoding.ASCII.GetBytes(value)); + } + + public int WriteBit(DeviceAddress address, bool value) + { + return WriteSingleData(address, new byte[] { (byte)(value ? 1 : 0) }); + } + + public int WriteBits(DeviceAddress address, byte value) + { + return WriteSingleData(address, new byte[] { value }); + } + + public event DataChangeEventHandler DataChange; + + public void Dispose() + { + RemoveAll(); + _items = null; + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/Condition.cs b/SCADA/Program/CoreApp/DataService/DataService/Condition.cs new file mode 100644 index 0000000..1a0c23d --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/Condition.cs @@ -0,0 +1,1104 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; + +namespace DataService +{ + public delegate void AlarmEventHandler(object sender, AlarmItem e); + + public interface IEvent + { + bool IsEnabled { get; set; } + bool IsAcked { get; set; } + bool IsActived { get; set; } + Severity Severity { get; } + EventType EventType { get; } + DateTime LastActive { get; set; } + string Comment { get; } + } + + public abstract class ICondition : IEvent, IDisposable, IComparable, IEquatable + { + public const string ALARMSTOP = "Alarm Clear"; + protected bool _enable, _ack, _active; + protected int _id; + protected DateTime _timeStamp; + protected SubAlarmType _tempType; + protected SubCondition[] _subConditions; + + public int ID + { + get + { + return _id; + } + set + { + _id = value; + } + } + + public bool IsEnabled + { + get + { + return _enable; + } + set + { + _enable = value; + } + } + + public bool IsActived + { + get + { + return _active; + } + set + { + _active = value; + } + } + + public bool IsAcked + { + get + { + return _ack; + } + set + { + _ack = value; + if (_ack) + { + _tempType = SubAlarmType.None; + _lastAckTime = DateTime.Now; + if (_ack && AlarmAck != null) + { + foreach (EventHandler deleg in AlarmAck.GetInvocationList()) + { + deleg.BeginInvoke(this, EventArgs.Empty, null, null); + } + } + } + } + } + + public abstract AlarmType AlarmType + { + get; + } + + public EventType EventType + { + get + { + return EventType.ConditionEvent; + } + } + + + protected ConditionType _conditionType; + public ConditionType ConditionType + { + get + { + return _conditionType; + } + set + { + _conditionType = value; + } + } + + protected DateTime _lastAckTime, _condLastActive, _lastInactive; + public DateTime LastAckTime + { + get + { + return _lastAckTime; + } + set + { + _lastAckTime = value; + } + } + + public DateTime SubCondLastActive + { + get + { + return _current.StartTime; + } + //set + //{ + // _subCondLastActive = value; + //} + } + + public DateTime LastActive + { + get + { + return _condLastActive; + } + set + { + _condLastActive = value; + } + } + + public DateTime LastInactive + { + get + { + return _lastInactive; + } + set + { + _lastInactive = value; + } + } + + protected AlarmItem _current; + + protected SubAlarmType _activeSub; + public SubAlarmType ActiveSubCondition + { + get + { + return _activeSub; + } + protected set + { + _activeSub = value; + } + } + + public Severity Severity + { + get + { + return _current.Severity; + } + } + + public string Message + { + get + { + return _current.AlarmText; + } + } + + public abstract string Value + { + get; + } + + protected float _para; + public float Para + { + get + { + return _para; + } + set + { + _para = value; + } + } + + protected float _deadBand; + public float DeadBand + { + get + { + return _deadBand; + } + set + { + _deadBand = value; + } + } + + protected int _delay; + public int Delay + { + get + { + return _delay; + } + set + { + _delay = value; + } + } + + protected string _comment; + public string Comment + { + get + { + return _comment; + } + set + { + _comment = value; + } + } + + protected string _source; + public string Source + { + get + { + return _source; + } + } + + public IList SubConditions + { + get + { + return _subConditions; + } + } + + public AlarmEventHandler AlarmActive; + public EventHandler AlarmAck; + + protected ICondition(int id, ConditionType conditionType, string source, string comment, float para, float deadBand, int delay) + { + this._id = id; + this._conditionType = conditionType; + this._para = para; + this._source = source; + this._comment = comment; + this._deadBand = deadBand; + this._delay = delay; + this._current = new AlarmItem(); + } + + public abstract bool AddSubCondition(SubCondition condition); + + public abstract bool RemoveSubCondition(SubCondition condition); + + protected abstract void OnActive(SubCondition condition, Storage value, DateTime timeStamp); + + protected abstract void OnInActive(Storage value); + + public int CompareTo(ICondition other) + { + int comp1 = ((int)this.Severity).CompareTo((int)other.Severity); + return comp1 == 0 ? this.LastActive.CompareTo(other.LastActive) : -comp1; + } + + public bool Equals(ICondition other) + { + if (other == null) return false; + return this._id == other._id; + } + + public virtual void Dispose() + { + _current = null; + AlarmAck = null; + AlarmActive = null; ; + } + } + + public abstract class SimpleCondition : ICondition, INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public override string Value + { + get + { + return _tag == null ? null : _tag.ToString(); + } + } + + protected ITag _tag; + public ITag Tag + { + get + { + return _tag; + } + set + { + if (_tag != null) + _tag.ValueChanging -= CheckAlarm; + _tag = value; + if (_tag != null) + _tag.ValueChanging += CheckAlarm; + } + } + + protected SimpleCondition(int id, ConditionType conditionType, string source, string comment, float para, float deadBand, int delay) : + base(id, conditionType, source, comment, para, deadBand, delay) + { + } + + protected override void OnActive(SubCondition condition, Storage value, DateTime timeStamp) + { + if (condition.SubAlarmType != ActiveSubCondition) + { + if (condition.SubAlarmType != _tempType) + { + _timeStamp = timeStamp; + _tempType = condition.SubAlarmType; + } + if (_delay == 0 || (timeStamp - _timeStamp).TotalMilliseconds > _delay) + { + if (ActiveSubCondition == SubAlarmType.None) + { + _active = true; + _condLastActive = timeStamp; + } + _ack = false; + ActiveSubCondition = condition.SubAlarmType; + _current.Duration = timeStamp - SubCondLastActive; + _current = new AlarmItem(timeStamp, condition.Message, _tag.GetValue(value), ActiveSubCondition, condition.Severity, _id, _source); + if (AlarmActive != null) + { + foreach (AlarmEventHandler deleg in AlarmActive.GetInvocationList()) + { + deleg.BeginInvoke(this, _current, null, null); + } + } + RaiseChanged("Value"); + } + } + else + { + RaiseChanged("Value"); + } + } + + protected override void OnInActive(Storage value) + { + if (ActiveSubCondition != SubAlarmType.None) + { + _active = false; + ActiveSubCondition = SubAlarmType.None; + _current.Duration = DateTime.Now - SubCondLastActive; + _current = new AlarmItem(DateTime.Now, string.Concat("【", _current.AlarmText, "】", ALARMSTOP), _tag.GetValue(value), SubAlarmType.None, Severity.Normal, _id, _source); + if (AlarmActive != null) + { + foreach (AlarmEventHandler deleg in AlarmActive.GetInvocationList()) + { + deleg.BeginInvoke(this, _current, null, null); + } + } + } + } + + protected void RaiseChanged(string property) + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(property)); + } + } + + public override void Dispose() + { + base.Dispose(); + PropertyChanged = null; + if (_tag != null) + _tag.ValueChanging -= CheckAlarm; + } + + protected abstract void CheckAlarm(object sender, ValueChangingEventArgs e); + + public override AlarmType AlarmType + { + get + { + return AlarmType.None; + } + } + + public override bool AddSubCondition(SubCondition condition) + { + return true; + } + + public override bool RemoveSubCondition(SubCondition condition) + { + return true; + } + } + + public sealed class ComplexCondition : ICondition, INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public override string Value + { + get + { + return Convert.ToString(_current.AlarmValue); + } + } + + public ComplexCondition(int id, string source, string comment, float deadBand, int delay) : + base(id, ConditionType.Absolute, source, comment, 0f, deadBand, delay) + { + _subConditions = new SubCondition[1] + { + new SubCondition(SubAlarmType.Dsc) + }; + } + + protected override void OnActive(SubCondition condition, Storage value, DateTime timeStamp) + { + if (condition.SubAlarmType != ActiveSubCondition) + { + if (condition.SubAlarmType != _tempType) + { + _timeStamp = timeStamp; + _tempType = condition.SubAlarmType; + } + if (_delay == 0 || (timeStamp - _timeStamp).TotalMilliseconds > _delay) + { + if (ActiveSubCondition == SubAlarmType.None) + { + _active = true; + _condLastActive = timeStamp; + } + _ack = false; + ActiveSubCondition = condition.SubAlarmType; + _current.Duration = timeStamp - SubCondLastActive; + _current = new AlarmItem(timeStamp, condition.Message, true, ActiveSubCondition, condition.Severity, _id, _source); + if (AlarmActive != null) + { + foreach (AlarmEventHandler deleg in AlarmActive.GetInvocationList()) + { + deleg.BeginInvoke(this, _current, null, null); + } + } + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs("Value")); + } + } + } + else + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs("Value")); + } + } + } + + protected override void OnInActive(Storage value) + { + if (ActiveSubCondition != SubAlarmType.None) + { + _active = false; + ActiveSubCondition = SubAlarmType.None; + _current.Duration = DateTime.Now - SubCondLastActive; + _current = new AlarmItem(DateTime.Now, string.Concat("【", _current.AlarmText, "】", ALARMSTOP), false, SubAlarmType.None, Severity.Normal, _id, _source); + if (AlarmActive != null) + { + foreach (AlarmEventHandler deleg in AlarmActive.GetInvocationList()) + { + deleg.BeginInvoke(this, _current, null, null); + } + } + } + } + + public Action SetFunction(Delegate tagChanged) + { + var _func = tagChanged as Func; + if (_func != null) + { + return delegate + { + if (_enable) + { + SubCondition condition = _subConditions[0]; + if (condition.IsEnabled) + { + if (_func()) + { + OnActive(condition, Storage.Empty, DateTime.Now); + return; + } + } + OnInActive(Storage.Empty); + } + }; + } + else + return null; + } + + public override void Dispose() + { + base.Dispose(); + PropertyChanged = null; + } + + public override AlarmType AlarmType + { + get + { + return AlarmType.Complex; + } + } + + public override bool AddSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.Dsc: + _subConditions[0] = condition; + return true; + default: + return false; + } + } + + public override bool RemoveSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.Dsc: + _subConditions[0] = SubCondition.Empty; + return true; + default: + return false; + } + } + + } + + public sealed class LevelAlarm : SimpleCondition + { + public override AlarmType AlarmType + { + get { return AlarmType.Level; } + } + + public LevelAlarm(int id, string source, string comment, float deadBand = 0f, int delay = 0) : + base(id, ConditionType.Absolute, source, comment, 0, deadBand, delay) + { + _subConditions = new SubCondition[4] + { + new SubCondition(SubAlarmType.HiHi), + new SubCondition(SubAlarmType.High), + new SubCondition(SubAlarmType.LoLo), + new SubCondition(SubAlarmType.Low) + }; + } + + protected override void CheckAlarm(object sender, ValueChangingEventArgs e) + { + if (_enable) + { + SubCondition condition; + float value = _tag.ScaleToValue(e.NewValue); + for (int i = 0; i < _subConditions.Length; i++) + { + if (_subConditions[i].IsEnabled) + { + condition = _subConditions[i]; + if (i < 2)//Hi Alarm + { + if (value > condition.Threshold) + { + OnActive(condition, e.NewValue, e.NewTimeStamp); + return; + } + else if (_deadBand > 0 && ActiveSubCondition == condition.SubAlarmType && value > condition.Threshold - _deadBand) + { + return; + } + } + else//Low Alarm + { + if (value < condition.Threshold) + { + OnActive(condition, e.NewValue, e.NewTimeStamp); + return; + } + else if (_deadBand > 0 && ActiveSubCondition == condition.SubAlarmType && value > condition.Threshold + _deadBand) + { + return; + } + } + } + } + OnInActive(e.NewValue); + } + } + + public override bool AddSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.HiHi: + _subConditions[0] = condition; + return true; + case SubAlarmType.High: + _subConditions[1] = condition; + return true; + case SubAlarmType.LoLo: + _subConditions[2] = condition; + return true; + case SubAlarmType.Low: + _subConditions[3] = condition; + return true; + default: + return false; + } + } + + public override bool RemoveSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.HiHi: + _subConditions[0] = SubCondition.Empty; + return true; + case SubAlarmType.High: + _subConditions[1] = SubCondition.Empty; + return true; + case SubAlarmType.LoLo: + _subConditions[2] = SubCondition.Empty; + return true; + case SubAlarmType.Low: + _subConditions[3] = SubCondition.Empty; + return true; + default: + return false; + } + } + } + + public sealed class DevAlarm : SimpleCondition + { + public override AlarmType AlarmType + { + get { return AlarmType.Dev; } + } + + public DevAlarm(int id, ConditionType conditionType, string source, string comment, float para, float deadBand = 0f, int delay = 0) : + base(id, conditionType, source, comment, para, deadBand, delay) + { + _subConditions = new SubCondition[2] + { + new SubCondition(SubAlarmType.MajDev), + new SubCondition(SubAlarmType.MinDev) + }; + } + + protected override void CheckAlarm(object sender, ValueChangingEventArgs e) + { + if (_enable) + { + float value = _tag.ScaleToValue(e.NewValue) - _para; + SubCondition condition; + for (int i = 0; i < _subConditions.Length; i++) + { + if (_subConditions[i].IsEnabled) + { + condition = _subConditions[i]; + if (value > (_conditionType == ConditionType.Absolute ? condition.Threshold : _para * condition.Threshold)) + { + OnActive(condition, e.NewValue, e.NewTimeStamp); + return; + } + else if (_deadBand > 0 && ActiveSubCondition == condition.SubAlarmType && + ((_conditionType == ConditionType.Absolute && value > condition.Threshold - _deadBand) + || (_conditionType == ConditionType.Percent && value > _para * (condition.Threshold - _deadBand)))) + { + return; + } + } + } + OnInActive(e.NewValue); + } + } + + public override bool AddSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.MajDev: + _subConditions[0] = condition; + return true; + case SubAlarmType.MinDev: + _subConditions[1] = condition; + return true; + default: + return false; + } + } + + public override bool RemoveSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.MajDev: + _subConditions[0] = SubCondition.Empty; + return true; + case SubAlarmType.MinDev: + _subConditions[1] = SubCondition.Empty; + return true; + default: + return false; + } + } + } + + public sealed class DigitAlarm : SimpleCondition + { + public override AlarmType AlarmType + { + get { return AlarmType.Dsc; } + } + + public DigitAlarm(int id, string source = null, string comment = null, int delay = 0) : + base(id, ConditionType.Absolute, source, comment, 0, 0f, delay) + { + _subConditions = new SubCondition[1] + { + new SubCondition(SubAlarmType.Dsc) + }; + } + + protected override void CheckAlarm(object sender, ValueChangingEventArgs e) + { + if (_enable) + { + SubCondition condition = _subConditions[0]; + if (condition.IsEnabled) + { + if (e.NewValue.Boolean == condition.Threshold > 0) + { + OnActive(condition, e.NewValue, e.NewTimeStamp); + return; + } + } + OnInActive(e.NewValue); + } + } + + public override bool AddSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.Dsc: + _subConditions[0] = condition; + return true; + default: + return false; + } + } + + public override bool RemoveSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.Dsc: + _subConditions[0] = SubCondition.Empty; + return true; + default: + return false; + } + } + } + + public sealed class WordDigitAlarm : SimpleCondition + { + public override AlarmType AlarmType + { + get { return AlarmType.WordDsc; } + } + + public WordDigitAlarm(int id, string source = null, string comment = null, int delay = 0) : + base(id, ConditionType.Absolute, source, comment, 0, 0f, delay) + { + _subConditions = new SubCondition[16]; + for (int i = 0; i < 16; i++) + { + _subConditions[i].SubAlarmType = SubAlarmType.Dsc; + _subConditions[i].Threshold = i; + }; + } + + protected override void CheckAlarm(object sender, ValueChangingEventArgs e) + { + if (_enable) + { + short newvalue = e.NewValue.Int16; + short oldvlaue = e.OldValue.Int16; + if (newvalue == 0 && oldvlaue != 0) + { + OnInActive(e.NewValue); + return; + } + for (short i = 0; i < _subConditions.Length; i++) + { + SubCondition condition = _subConditions[i]; + if (condition.IsEnabled) + { + int mask = 1 << i; + int newval = mask & newvalue; + int oldval = mask & oldvlaue; + if (newval != 0 && oldval == 0) + { + OnActive(condition, new Storage { Int16 = i }, e.NewTimeStamp); + } + } + } + } + } + + public override bool AddSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.Dsc: + int index = (int)condition.Threshold; + if (index >= 0 && index < 16) + _subConditions[index] = condition; + return true; + default: + return false; + } + } + + public override bool RemoveSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.Dsc: + int index = (int)condition.Threshold; + if (index >= 0 && index < 16) + _subConditions[index] = SubCondition.Empty; + return true; + default: + return false; + } + } + + protected override void OnActive(SubCondition condition, Storage value, DateTime timeStamp) + { + if (ActiveSubCondition == SubAlarmType.None) + { + _active = true; + _condLastActive = timeStamp; + } + _ack = false; + ActiveSubCondition = condition.SubAlarmType; + _current = new AlarmItem(timeStamp, condition.Message, value.Int16, ActiveSubCondition, condition.Severity, _id, _source); + if (AlarmActive != null) + { + foreach (AlarmEventHandler deleg in AlarmActive.GetInvocationList()) + { + deleg.BeginInvoke(this, _current, null, null); + } + } + RaiseChanged("Value"); + } + + protected override void OnInActive(Storage value) + { + if (ActiveSubCondition != SubAlarmType.None) + { + _active = false; + ActiveSubCondition = SubAlarmType.None; + _current.Duration = DateTime.Now - LastActive; + _current = new AlarmItem(DateTime.Now, string.Concat("【", Comment, "】", ALARMSTOP), 0, SubAlarmType.None, Severity.Normal, _id, _source); + if (AlarmActive != null) + { + foreach (AlarmEventHandler deleg in AlarmActive.GetInvocationList()) + { + deleg.BeginInvoke(this, _current, null, null); + } + } + } + } + } + + public sealed class QualitiesAlarm : SimpleCondition + { + public override AlarmType AlarmType + { + get { return AlarmType.Quality; } + } + + public QualitiesAlarm(int id, string source, string comment, int delay = 0) : + base(id, ConditionType.Absolute, source, comment, 0, 0f, delay) + { + _subConditions = new SubCondition[1] + { + new SubCondition(SubAlarmType.BadPV) + }; + } + + protected override void CheckAlarm(object sender, ValueChangingEventArgs e) + { + if (_enable) + { + SubCondition condition = _subConditions[0]; + if (condition.IsEnabled) + { + if (e.Quality != QUALITIES.QUALITY_GOOD) + OnActive(condition, e.NewValue, e.NewTimeStamp); + return; + } + OnInActive(e.NewValue); + } + } + + public override bool AddSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.BadPV: + _subConditions[0] = condition; + return true; + default: + return false; + } + } + + public override bool RemoveSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.BadPV: + _subConditions[0] = SubCondition.Empty; + return true; + default: + return false; + } + } + } + + public sealed class ROCAlarm : SimpleCondition + { + public override AlarmType AlarmType + { + get { return AlarmType.ROC; } + } + + + public ROCAlarm(int id, string souce, string comment, float deadBand = 0f, int delay = 0) : + base(id, ConditionType.Percent, souce, comment, 0, deadBand, delay) + { + _subConditions = new SubCondition[2] + { + new SubCondition(SubAlarmType.MajROC), + new SubCondition(SubAlarmType.MinROC) + }; + } + + protected override void CheckAlarm(object sender, ValueChangingEventArgs e) + { + if (_enable) + { + float value = (float)((_tag.ScaleToValue(e.NewValue) - e.OldValue.Single) / (e.NewTimeStamp - e.OldTimeStamp).TotalMilliseconds); + SubCondition condition; + for (int i = 0; i < _subConditions.Length; i++) + { + if (_subConditions[i].IsEnabled) + { + condition = _subConditions[i]; + if (value > condition.Threshold) + { + OnActive(condition, e.NewValue, e.NewTimeStamp); + return; + } + else if (_deadBand > 0 && ActiveSubCondition == condition.SubAlarmType && value > condition.Threshold - _deadBand) + { + return; + } + } + } + OnInActive(e.NewValue); + } + } + + public override bool AddSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.MajROC: + _subConditions[0] = condition; + return true; + case SubAlarmType.MinROC: + _subConditions[1] = condition; + return true; + default: + return false; + } + } + + public override bool RemoveSubCondition(SubCondition condition) + { + switch (condition.SubAlarmType) + { + case SubAlarmType.MajROC: + _subConditions[0] = SubCondition.Empty; + return true; + case SubAlarmType.MinROC: + _subConditions[1] = SubCondition.Empty; + return true; + default: + return false; + } + } + } + + public struct SubCondition + { + public bool IsEnabled; + + public SubAlarmType SubAlarmType; + + public Severity Severity; + + public float Threshold; + + public string Message; + + public SubCondition(SubAlarmType type, float threshold = 0f, Severity severity = Severity.Normal, string message = "", bool enabled = true) + { + this.SubAlarmType = type; + this.Threshold = threshold; + this.Severity = severity; + this.Message = message; + this.IsEnabled = enabled; + } + + public static readonly SubCondition Empty = new SubCondition(SubAlarmType.None, 0f, Severity.Normal, "正常", false); + } + + public class CompareCondBySource : IComparer + { + public int Compare(ICondition x, ICondition y) + { + if (x == null || x.Source == null) + { + return y == null || y.Source == null ? 0 : 1; + } + else + { + return y == null || y.Source == null ? 1 : x.Source.CompareTo(y.Source); + } + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/DataService.csproj b/SCADA/Program/CoreApp/DataService/DataService/DataService.csproj new file mode 100644 index 0000000..fe04d3e --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/DataService.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp2.0 + + + + true + + + + + + + diff --git a/SCADA/Program/CoreApp/DataService/DataService/DeviceAddress.cs b/SCADA/Program/CoreApp/DataService/DataService/DeviceAddress.cs new file mode 100644 index 0000000..927ec42 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/DeviceAddress.cs @@ -0,0 +1,43 @@ +using System; +using System.Runtime.InteropServices; + +namespace DataService +{ + [StructLayout(LayoutKind.Sequential)] + public struct DeviceAddress : IComparable + { + public int Area; + public int Start; + public ushort DBNumber; + public ushort DataSize; + public ushort CacheIndex; + public byte Bit; + public DataType VarType; + + public DeviceAddress(int area, ushort dbnumber, ushort cIndex, int start, ushort size, byte bit, DataType type) + { + Area = area; + DBNumber = dbnumber; + CacheIndex = cIndex; + Start = start; + DataSize = size; + Bit = bit; + VarType = type; + } + + public static readonly DeviceAddress Empty = new DeviceAddress(0, 0, 0, 0, 0, 0, DataType.NONE); + + public int CompareTo(DeviceAddress other) + { + return this.Area > other.Area ? 1 : + this.Area < other.Area ? -1 : + this.DBNumber > other.DBNumber ? 1 : + this.DBNumber < other.DBNumber ? -1 : + this.Start > other.Start ? 1 : + this.Start < other.Start ? -1 : + this.Bit > other.Bit ? 1 : + this.Bit < other.Bit ? -1 : 0; + } + } + +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/Eval.cs b/SCADA/Program/CoreApp/DataService/DataService/Eval.cs new file mode 100644 index 0000000..14cb0eb --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/Eval.cs @@ -0,0 +1,716 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace DataService +{ + public class ExpressionEval : IDisposable + { + Expression _param1; + List _tagList = new List(); + public List TagList + { + get + { + return _tagList; + } + } + + IDataServer _server; + + public ExpressionEval(IDataServer server) + { + _server = server; + _param1 = Expression.Constant(this); + } + + public Delegate Eval(string expression) + { + if (string.IsNullOrEmpty(expression)) return null; + var lambda = ComplieRpnExp(RpnExpression(expression)); + if (lambda != null) return lambda.Compile(); + return null; + } + + public Delegate WriteEval(string expression) + { + if (_server == null || string.IsNullOrEmpty(expression)) return null; + if (_server[expression.ToUpper()] != null) + { + return new Func((object value) => { return WriteTag(expression, value); }); + } + return null; + } + + public Func WriteEval(string expression1, string expression2) + { + if (_server == null || string.IsNullOrEmpty(expression2)) return null; + if (_server[expression1.ToUpper()] != null) + { + var dele = Eval(expression2); + var funcbool = dele as Func; + if (funcbool != null) + return () => { return WriteTag(expression1, funcbool()); }; + var funcint = dele as Func; + if (funcint != null) + return () => { return WriteTag(expression1, funcint()); }; + var funcfloat = dele as Func; + if (funcfloat != null) + return () => { return WriteTag(expression1, funcfloat()); }; + var funcstring = dele as Func; + if (funcstring != null) + return () => { return WriteTag(expression1, funcstring()); }; + } + return null; + } + + public static bool ValidationExpression(string expression) + { + return true;//可加入正则表达式验证 + } + + /// + /// 操作符运算级别 + /// + /// 操作符 + /// 操作运算符,空格返回0,出错返回-1 + private static byte GetOperatorLevel(char strOperator) + { + switch (strOperator) + { + case '~': + return 10; + case '*': + case '/': + case '%': + return 9; + case '+': + case '-': + return 8; + case '>': + case '<': + return 7; + case '&': + return 6; + case '^': + return 5; + case '|': + return 4; + case '=': + case '!': + case '?': + return 3; + case '(': + return 2; + case ')': + return 1; + //case ':': + default: + return 0; + + } + } + + /// + /// 将中缀表达式转换为逆波兰表达式 + /// + /// 标准中缀表达式 + /// 标准逆波兰表达式 + public static List RpnExpression(string expression) + { + //加入结束标记 + //定义出栈和入栈堆栈 + string[] strNum = expression.Split('~', '%', '>', '<', '=', '!', '&', '|', '?', '#', '^', '+', '-', '*', '/', '(', ')'); + if (strNum.Length < 2) return new List() { expression }; + //操作运算符堆栈 + Stack oper = new Stack(); + //定义输出堆栈 + List output = new List(); + + //定义前缀表达式字符读取指针 + int i = 0; + + //定义当前读取数字数组指针 + int n = -1; + //定义操作运算符级别函数 + Operator op = new Operator(); + //输出堆栈的大小 + int intStackCount = 0; + + //从左到右读取前缀表达式 + while (i < expression.Length) + { + //读取一个字符 + char strChar = expression[i]; + //取字符的运算级别 + if (strChar == '#') { i++; continue; } + byte intLevel = GetOperatorLevel(strChar); + if (intLevel == 0) + //数字直接推入输出堆栈 + { + while (n++ < strNum.Length) + { + if (strNum[n] != "") + { + output.Add(strNum[n]); + i += strNum[n].Length; + //移动数组指针 + break; + } + } + } + else //操作字符根据运算字符级别推入运算符堆栈 + { + if (oper.Count == 0) + { + //运算符堆栈为空,直接推入堆栈 + oper.Push(new Operator(strChar, intLevel)); + //移动字符读取指针 + i++; + } + else + { + op = oper.Peek(); + if (intLevel > op.Level || intLevel == 2) + { + //运算字符比运算符堆栈最后的级别高或者运算符为'('直接推入运算符堆栈 + oper.Push(new Operator(strChar, intLevel)); + //移动字符读取指针 + i++; + } + else + { + //运算字符不高于运算符堆栈最后的级别,则将运算符堆栈出栈,直到比其高为止 + intStackCount = oper.Count; + for (int m = 0; m < intStackCount; m++) + { + op = oper.Peek(); + if (op.Level >= intLevel) + { + //将操作符出栈并压入输入堆栈 + char o = op.OperatorStack; + if (!(o == ')' || o == '(')) + { + output.Add(o.ToString()); + } + oper.Pop(); + if (op.Level == 2) + { + //如果操作符堆栈中最后的操作符为'('则停止出栈 + i++; + break; + } + } + else + { + //直到运算符已经高出运算符栈中最后的级别,则入栈 + oper.Push(new Operator(strChar, intLevel)); + i++; + break; + } + } + } + } + } + } + + intStackCount = oper.Count; + for (int m = 0; m < intStackCount; m++) + { + op = oper.Peek(); + output.Add(op.OperatorStack.ToString()); + oper.Pop(); + } + + return output; + } + + /// + /// 解逆波兰表达式 + /// + /// 标准逆波兰表达式 + /// 逆波兰表达式的解 + public LambdaExpression ComplieRpnExp(List strNum) + { + _tagList.Clear(); + //拆分逆波兰表达式 + int intLenth = strNum.Count; + if (intLenth == 0) return null; + //定义数字堆栈 + try + { + Stack number = new Stack(); + for (int i = 0; i < intLenth; i++) + { + string expr = strNum[i]; + switch (expr) + { + case "~": + if (number.Count > 0) + { + Expression left = number.Pop(); + number.Push(Expression.Not(left)); + } + break; + case "*": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + number.Push(Expression.Multiply(left, right)); + } + break; + case "/": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + number.Push(Expression.Divide(left, right)); + } + break; + case "%": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(int)) + left = Expression.Convert(left, typeof(int)); + if (right.Type != typeof(int)) + right = Expression.Convert(right, typeof(int)); + } + number.Push(Expression.Modulo(left, right)); + } + break; + case "+": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type == typeof(string) || right.Type == typeof(string)) + { + if (left.Type != typeof(string)) + left = Expression.Convert(left, typeof(object)); + if (right.Type != typeof(string)) + right = Expression.Convert(right, typeof(object)); + number.Push(Expression.Call(typeof(string).GetMethod("Concat", new Type[] { typeof(object), typeof(object) }), left, right)); + } + else + { + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + number.Push(Expression.Add(left, right)); + } + } + break; + case "-": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + number.Push(Expression.Subtract(left, right)); + } + break; + case ">": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + number.Push(Expression.GreaterThan(left, right)); + } + break; + case "<": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + number.Push(Expression.LessThan(left, right)); + } + break; + case "&": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + number.Push(Expression.And(left, right)); + } + break; + case "^": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + number.Push(Expression.ExclusiveOr(left, right)); + } + break; + case "|": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + number.Push(Expression.Or(left, right)); + } + break; + case "=": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + number.Push(Expression.Equal(left, right)); + } + break; + case "!": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + number.Push(Expression.NotEqual(left, right)); + } + break; + case "?": + if (number.Count > 1) + { + Expression right = number.Pop(); + Expression left = number.Pop(); + if (left.Type != right.Type) + { + if (left.Type != typeof(float)) + left = Expression.Convert(left, typeof(float)); + if (right.Type != typeof(float)) + right = Expression.Convert(right, typeof(float)); + } + Expression test = number.Pop(); + number.Push(Expression.Condition(test, left, right)); + } + break; + default: + if (expr[0] == '@') + { + switch (expr.Substring(1).ToUpper()) + { + case "TIME": + { + Expression> f = () => DateTime.Now.ToShortTimeString(); + number.Push(f.Body); + } + goto lab1; + case "DATE": + { + Expression> f = () => DateTime.Now.ToShortDateString(); + number.Push(f.Body); + } + goto lab1; + case "DATETIME": + { + Expression> f = () => DateTime.Now.ToString(); + number.Push(f.Body); + } + goto lab1; + case "APP": + { + Expression> f = () => AppDomain.CurrentDomain.FriendlyName; + number.Push(f.Body); + } + goto lab1; + case "NAME": + { + Expression> f = () => Environment.MachineName; + number.Push(f.Body); + } + goto lab1; + case "PATH": + { + Expression> f = () => Environment.CurrentDirectory; + number.Push(f.Body); + } + goto lab1; + case "USER": + { + Expression> f = () => Environment.UserName; + number.Push(f.Body); + } + goto lab1; + case "REGION": + { + Expression> f = () => System.Globalization.CultureInfo.CurrentCulture.Name; + number.Push(f.Body); + } + goto lab1; + } + } + object result; + if (IsConstant(expr, out result)) + { + number.Push(Expression.Constant(result)); + } + else + { + number.Push(GetTagExpression(expr)); + } + lab1: + break; + } + } + + Expression d = number.Pop(); + return Expression.Lambda(d); + } + catch (Exception e) { return null; } + } + + MethodInfo _boolinfo = typeof(ExpressionEval).GetMethod("GetBool"); + MethodInfo _floatinfo = typeof(ExpressionEval).GetMethod("GetFloat"); + MethodInfo _intinfo = typeof(ExpressionEval).GetMethod("GetInt"); + MethodInfo _stringinfo = typeof(ExpressionEval).GetMethod("GetString"); + + public Expression GetTagExpression(string tagName) + { + if (_server == null) return Expression.Empty(); + ITag tag = _server[tagName]; + switch (tag.Address.VarType) + { + case DataType.BOOL: + return Expression.Call(_param1, _boolinfo, Expression.Constant(tagName)); + case DataType.BYTE: + case DataType.WORD: + case DataType.SHORT: + case DataType.TIME: + case DataType.INT: + return Expression.Call(_param1, _intinfo, Expression.Constant(tagName)); + case DataType.FLOAT: + return Expression.Call(_param1, _floatinfo, Expression.Constant(tagName)); + case DataType.STR: + return Expression.Call(_param1, _stringinfo, Expression.Constant(tagName)); + default: + return Expression.Empty(); + } + } + + public bool GetBool(string tagName) + { + if (_server == null) return false; + ITag tag = _server[tagName]; + switch (tag.Address.VarType) + { + case DataType.BOOL: + return tag.Value.Boolean; + case DataType.BYTE: + return Convert.ToBoolean(tag.Value.Byte); + case DataType.WORD: + case DataType.SHORT: + return Convert.ToBoolean(tag.Value.Int16); + case DataType.TIME: + case DataType.INT: + return Convert.ToBoolean(tag.Value.Int32); + case DataType.FLOAT: + return Convert.ToBoolean(tag.Value.Single); + case DataType.STR: + return Convert.ToBoolean(tag.ToString()); + default: + return false; + } + } + + public float GetFloat(string tagName) + { + if (_server == null) return 0f; + ITag tag = _server[tagName]; + return tag.ScaleToValue(tag.Value); + } + + public int GetInt(string tagName) + { + if (_server == null) return 0; + ITag tag = _server[tagName]; + switch (tag.Address.VarType) + { + case DataType.BOOL: + return tag.Value.Boolean ? 1 : 0; + case DataType.BYTE: + return (int)tag.Value.Byte; + case DataType.WORD: + case DataType.SHORT: + return (int)tag.Value.Int16; + case DataType.TIME: + case DataType.INT: + return tag.Value.Int32; + case DataType.FLOAT: + return Convert.ToInt32(tag.Value.Single); + case DataType.STR: + return int.Parse(tag.ToString()); + default: + return 0; + } + } + + public string GetString(string tagName) + { + return _server == null ? null : _server[tagName].ToString(); + } + + public int WriteTag(string tagName, object value) + { + if (_server == null || value == null) return -1; + ITag tag = _server[tagName]; + if (tag.Address.VarType == DataType.BOOL || tag.Address.VarType == DataType.STR) + return tag.Write(value); + else + { + float temp; + string str = value as string; + if (str == null) temp = Convert.ToSingle(value); + else + { + if (!float.TryParse(str, out temp)) + return -1; + } + return tag.Write(tag.ValueToScale(temp)); + } + } + + private bool IsConstant(string str, out object value) + { + if (str.Length > 1 & str[0] == '\'' && str[str.Length - 1] == '\'') + { + value = str.Trim('\''); + return true; + } + string upp = str.ToUpper(); + if (upp == "TRUE") + { + value = true; + return true; + } + else if (upp == "FALSE") + { + value = false; + return true; + } + if (_server != null) + { + var tag = _server[upp]; + if (tag != null) + { + if (!_tagList.Contains(tag)) + _tagList.Add(tag); + value = null; + return false; + } + } + int dotcount = 0; + for (int i = 0; i < str.Length; i++) + { + char opr = str[i]; + if (opr < '0' || opr > '9') + { + if (opr != '.') + { + value = str; + return true; + } + else + { + if (dotcount > 0) + { + value = str; + return true; + } + dotcount++; + } + } + } + //value = (dotcount == 0 ? int.Parse(str) : float.Parse(str)); + if (dotcount == 0) + value = int.Parse(str); + else value = float.Parse(str); + return true; + } + + public void Clear() + { + //_param1 = null; + _tagList.Clear(); + //_tagList = null; + } + + public void Dispose() + { + _param1 = null; + _tagList.Clear(); + _tagList = null; + _boolinfo = _floatinfo = _stringinfo = null; + } + } + + [StructLayout(LayoutKind.Sequential)] + /// + /// 操作符结构 + /// + public struct Operator + { + public char OperatorStack; + public byte Level; + public Operator(char OperatorStack, byte Level) + { + this.OperatorStack = OperatorStack; + this.Level = Level; + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/ExtensionMethods.cs b/SCADA/Program/CoreApp/DataService/DataService/ExtensionMethods.cs new file mode 100644 index 0000000..09ab545 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/ExtensionMethods.cs @@ -0,0 +1,811 @@ +using System; +using System.Text; +using System.Net; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Data.SqlClient; + +namespace DataService +{ + public static class ExtMethods + { + public static string GetExceptionMsg(this Exception e) + { + string err = string.Empty; + Exception exp = e; + while (exp != null) + { + err += string.Format("\n {0}", exp.Message); + exp = exp.InnerException; + } + err += string.Format("\n {0}", e.StackTrace); + return err; + } + + public static bool ModifyItemName(this ITag tag, string name) + { + IDataServer server = tag.Parent.Server; + lock (server.SyncRoot) + { + int index = server.GetItemProperties(tag.ID); + if (index < 0) return false; + var meta = server.MetaDataList[index]; + if (meta.Name == name) return true; + server.MetaDataList[index] = new TagMetaData(meta.ID, meta.GroupID, name, meta.Address, meta.DataType, meta.Size, meta.Archive, meta.Maximum, meta.Minimum, meta.Cycle); + server.RemoveItemIndex(meta.Name); + server.AddItemIndex(name, tag); + return true; + } + } + + public static SubCondition FindSubConditon(this IAlarmServer server, string sourceName, SubAlarmType alarmType) + { + var conds = server.QueryConditions(sourceName); + if (conds == null) return SubCondition.Empty; + foreach (ICondition cond in conds) + { + SubCondition sub = cond.FindSubConditon(alarmType); + if (sub.SubAlarmType == alarmType) + return sub; + } + return SubCondition.Empty; + } + + public static SubCondition FindSubConditon(this ICondition cond, SubAlarmType alarmType) + { + var subs = cond.SubConditions; + if (subs != null && subs.Count > 0) + { + foreach (var sub in subs) + { + if (sub.SubAlarmType == alarmType) + { + return sub; + } + } + } + return SubCondition.Empty; + } + + public static bool HasScaling(this IDataServer server, string tagName) + { + ITag tag = server[tagName]; + if (tag == null) return false; + int scaleid = server.GetScaleByID(tag.ID); + return scaleid >= 0; + } + + public static bool HasAlarm(this IDataServer dserver, string sourceName) + { + IAlarmServer server = dserver as IAlarmServer; + if (server == null) return false; + List conds = server.ConditionList as List; + return conds == null || conds.Count == 0 ? false : conds.BinarySearch(new DigitAlarm(0, sourceName)) >= 0; + } + + public static bool HasSubCondition(this IDataServer dserver, string sourceName, SubAlarmType alarmType) + { + IAlarmServer server = dserver as IAlarmServer; + if (server == null) return false; + var conds = server.QueryConditions(sourceName); + if (conds == null) return false; + foreach (ICondition cond in conds) + { + var subs = cond.SubConditions; + if (subs != null && subs.Count > 0) + { + foreach (var sub in subs) + { + if (sub.SubAlarmType == alarmType) + { + return true; + } + } + } + } + return false; + } + + public static ItemData ReadValueEx(this IReaderWriter reader, DeviceAddress address) + { + switch (address.VarType) + { + case DataType.BOOL: + var bit = reader.ReadBit(address); + return new ItemData(bit.Value, bit.TimeStamp, bit.Quality); + case DataType.BYTE: + var bt = reader.ReadByte(address); + return new ItemData(bt.Value, bt.TimeStamp, bt.Quality); + case DataType.WORD: + case DataType.SHORT: + var sh = reader.ReadInt16(address); + return new ItemData(sh.Value, sh.TimeStamp, sh.Quality); + case DataType.TIME: + case DataType.INT: + var it = reader.ReadInt32(address); + return new ItemData(it.Value, it.TimeStamp, it.Quality); + case DataType.FLOAT: + var fl = reader.ReadFloat(address); + return new ItemData(fl.Value, fl.TimeStamp, fl.Quality); + case DataType.STR: + var str = reader.ReadString(address, address.DataSize); + return new ItemData(str.Value, str.TimeStamp, str.Quality); + } + return new ItemData(null, 0, QUALITIES.QUALITY_BAD); + } + + public static int WriteValueEx(this IReaderWriter writer, DeviceAddress address, object value) + { + switch (address.VarType) + { + case DataType.BOOL: + return writer.WriteBit(address, Convert.ToBoolean(value)); + case DataType.BYTE: + return writer.WriteBits(address, Convert.ToByte(value)); + case DataType.WORD: + case DataType.SHORT: + return writer.WriteInt16(address, Convert.ToInt16(value)); + case DataType.TIME: + case DataType.INT: + return writer.WriteInt32(address, Convert.ToInt32(value)); + case DataType.FLOAT: + return writer.WriteFloat(address, Convert.ToSingle(value)); + case DataType.STR: + return writer.WriteString(address, value.ToString()); + } + return -1; + } + + public static HistoryData[] BatchRead(DataSource source, params ITag[] itemArray) + { + int len = itemArray.Length; + HistoryData[] values = new HistoryData[len]; + for (int i = 0; i < len; i++) + { + itemArray[i].Refresh(source); + values[i].ID = itemArray[i].ID; + values[i].Value = itemArray[i].Value; + values[i].TimeStamp = itemArray[i].TimeStamp; + } + return values; + } + + public static int BatchWrite(IDictionary items) + { + int rev = 0; + foreach (var tag in items) + { + if (tag.Key.Write(tag.Value) < 0) + rev = -1; + } + return rev; + } + + public static List AssignFromPDU(this ICache cacheReader, int PDU, params DeviceAddress[] addrsArr) + { + List rangeList = new List(); + int count = addrsArr.Length; + if (count > 0) + { + //Array.Sort(addrsArr); + DeviceAddress start = addrsArr[0]; + start.Bit = 0; + int bitCount = cacheReader.ByteCount; + if (count > 1) + { + int cacheLength = 0;//缓冲区的大小 + int cacheIndexStart = 0; + int startIndex = 0; + DeviceAddress segmentEnd, tagAddress; + DeviceAddress segmentStart = start; + for (int j = 1, i = 1; i < count; i++, j++) + { + tagAddress = addrsArr[i];//当前变量地址 + int offset1 = cacheReader.GetOffset(tagAddress, segmentStart); + if (offset1 > (PDU / cacheReader.ByteCount)) + { + segmentEnd = addrsArr[i - 1]; + int len = cacheReader.GetOffset(segmentEnd, segmentStart); + len += segmentEnd.DataSize <= bitCount ? 1 : segmentEnd.DataSize / bitCount; + tagAddress.CacheIndex = (ushort)(cacheIndexStart + len); + addrsArr[i] = tagAddress; + rangeList.Add(new PDUArea(segmentStart, len, startIndex, j)); + startIndex += j; j = 0; + cacheLength += len;//更新缓存长度 + cacheIndexStart = cacheLength; + segmentStart = tagAddress;//更新数据片段的起始地址 + } + else + { + tagAddress.CacheIndex = (ushort)(cacheIndexStart + offset1); + addrsArr[i] = tagAddress; + } + if (i == count - 1) + { + segmentEnd = addrsArr[i]; + int segmentLength = cacheReader.GetOffset(segmentEnd, segmentStart); + if (segmentLength > PDU / cacheReader.ByteCount) + { + segmentEnd = addrsArr[i - 1]; + segmentLength = segmentEnd.DataSize <= bitCount ? 1 : segmentEnd.DataSize / bitCount; + } + tagAddress.CacheIndex = (ushort)(cacheIndexStart + segmentLength); + addrsArr[i] = tagAddress; + segmentLength += segmentEnd.DataSize <= bitCount ? 1 : segmentEnd.DataSize / bitCount; + rangeList.Add(new PDUArea(segmentStart, segmentLength, startIndex, j + 1)); + cacheLength += segmentLength; + } + } + cacheReader.Size = cacheLength; + } + else + cacheReader.Size = start.DataSize <= bitCount ? 1 : start.DataSize / bitCount;//改变Cache的Size属性值将创建Cache的内存区域 + } + return rangeList; + } + + //调用前应对地址数组排序(是否加锁?) + public static ItemData[] PLCReadMultiple(this IPLCDriver plc, ICache cache, DeviceAddress[] addrsArr) + { + if (addrsArr == null || cache == null || addrsArr.Length == 0) return null; + int len = addrsArr.Length; + ItemData[] items = new ItemData[len]; + int offset = 0; long now = DateTime.Now.ToFileTime(); + List areas = cache.AssignFromPDU(plc.PDU, addrsArr); + foreach (PDUArea area in areas) + { + byte[] rcvBytes = plc.ReadBytes(area.Start, (ushort)area.Len); + Buffer.BlockCopy(rcvBytes, 0, cache.Cache, offset, rcvBytes.Length); + offset += rcvBytes.Length / cache.ByteCount; + } + for (int i = 0; i < len; i++) + { + switch (addrsArr[i].VarType) + { + case DataType.BOOL: + items[i].Value.Boolean = cache.ReadBit(addrsArr[i]).Value; + break; + case DataType.BYTE: + items[i].Value.Byte = cache.ReadByte(addrsArr[i]).Value; + break; + case DataType.WORD: + case DataType.SHORT: + items[i].Value.Int16 = cache.ReadInt16(addrsArr[i]).Value; + break; + case DataType.TIME: + case DataType.INT: + items[i].Value.Int32 = cache.ReadInt32(addrsArr[i]).Value; + break; + case DataType.FLOAT: + items[i].Value.Single = cache.ReadFloat(addrsArr[i]).Value; + break; + case DataType.STR: + var item = cache.ReadString(addrsArr[i], addrsArr[i].DataSize); + break; + } + items[i].Quality = QUALITIES.QUALITY_GOOD; + items[i].TimeStamp = now; + } + return items; + } + + public static int PLCWriteMultiple(this IPLCDriver plc, ICache cache, DeviceAddress[] addrArr, object[] buffer, int limit) + { + if (cache == null || addrArr == null || buffer == null || addrArr.Length != buffer.Length) return -1; + if (addrArr.Length == 1) return plc.WriteValue(addrArr[0], buffer[0]); + lock (plc)//不锁定会有并发冲突问题;锁定也不能保障绝对安全,如有人现场操作会导致数据刷新 + { + List areas = cache.AssignFromPDU(plc.PDU, addrArr); + int offset = 0; + foreach (PDUArea area in areas) + { + byte[] rcvBytes = plc.ReadBytes(area.Start, (ushort)area.Len); + if (rcvBytes == null) return -1; + Buffer.BlockCopy(rcvBytes, 0, cache.Cache, offset, rcvBytes.Length); + offset += rcvBytes.Length / cache.ByteCount; + } + DeviceAddress start = addrArr[0]; + int startIndex = 0; + int endIndex = 0; + while (endIndex < addrArr.Length) + { + if (start.Area != addrArr[endIndex].Area || start.DBNumber != addrArr[endIndex].DBNumber || endIndex - startIndex >= limit) + { + for (int i = startIndex; i < endIndex; i++) + { + cache.WriteValue(addrArr[i], buffer[i]); + } + int c1 = start.CacheIndex; int c2 = addrArr[endIndex - 1].CacheIndex; + byte[] bytes = new byte[cache.ByteCount * (c2 - c1 + 1)]; + Buffer.BlockCopy(cache.Cache, c1, bytes, 0, bytes.Length); + if (plc.WriteBytes(start, bytes) < 0) return -1; + start = addrArr[endIndex]; + startIndex = endIndex; + } + endIndex++; + } + } + return 0; + } + /// + /// string RightFrom + /// + /// + /// + /// + public static string RightFrom(this string text, int index) + { + return text.Substring(index + 1, text.Length - index - 1); + } + + public static string Right(this string text, int length) + { + return text.Substring(text.Length - length, length); + } + + /// + /// Convert to Datetime + /// + /// + /// + + public static DateTime ToDateTime(this long filetime) + { + return filetime == 0 ? DateTime.Now : DateTime.FromFileTime(filetime); + } + + public static Type ToType(this DataType dataType) + { + switch (dataType) + { + case DataType.BOOL: + return typeof(bool); + case DataType.BYTE: + return typeof(byte); + case DataType.WORD: + return typeof(ushort); + case DataType.SHORT: + return typeof(short); + case DataType.INT: + case DataType.TIME: + return typeof(int); + case DataType.FLOAT: + return typeof(float); + case DataType.STR: + return typeof(string); + default: + return typeof(object); + } + } + + public static string ToFormatString(this int num, int len) + { + string str = num.ToString(); + int off = len - str.Length; + return off > 0 ? string.Concat(new string('0', off), str) : str; + } + + public static bool IsEquals(this byte[] b1, byte[] b2) + { + if (b1 == null || b2 == null) return false; + if (b1.Length != b2.Length) return false; + for (int i = 0; i < b1.Length; i++) + if (b1[i] != b2[i]) + return false; + return true; + } + + public static string ConvertToString(this byte[] bits) + { + char[] chars = new char[bits.Length]; + for (int i = 0; i < bits.Length; i++) + { + chars[i] = (char)bits[i]; + } + return new string(chars); + } + + public static byte[] ConvertToArray(this string bits) + { + var chars = bits.ToCharArray(); + byte[] arr = new byte[chars.Length]; + for (int i = 0; i < chars.Length; i++) + { + arr[i] = (byte)chars[i]; + } + return arr; + } + + public static int BitSwap(this byte bit) + { + return (bit < 8 ? bit + 8 : bit - 8); + } + + [Obsolete] + public static Storage ToStorage(this ITag tag, object obj) + { + Storage value = Storage.Empty; + var str = obj as string; + switch (tag.Address.VarType) + { + case DataType.BOOL: + value.Boolean = str == null ? Convert.ToBoolean(obj) : str == "0" ? false : str == "1" ? true : bool.Parse(str); + break; + case DataType.BYTE: + value.Byte = Convert.ToByte(obj); + break; + case DataType.WORD: + case DataType.SHORT: + value.Int16 = Convert.ToInt16(obj); + break; + case DataType.TIME: + case DataType.INT: + value.Int32 = Convert.ToInt32(obj); + break; + case DataType.FLOAT: + value.Single = Convert.ToSingle(obj); + break; + } + return value; + } + + public static byte[] ToByteArray(this ITag tag) + { + switch (tag.Address.VarType) + { + case DataType.BOOL: + return new byte[] { tag.Value.Boolean ? (byte)1 : (byte)0 }; + case DataType.BYTE: + return new byte[] { tag.Value.Byte }; + case DataType.WORD: + case DataType.SHORT: + return BitConverter.GetBytes(tag.Value.Int16); + case DataType.INT: + return BitConverter.GetBytes(tag.Value.Int32); + case DataType.FLOAT: + return BitConverter.GetBytes(tag.Value.Single); + case DataType.STR: + return Encoding.ASCII.GetBytes(tag.ToString()); + default: + return new byte[0]; + } + } + + public static byte[] ToByteArray(this ITag tag, Storage value) + { + switch (tag.Address.VarType) + { + case DataType.BOOL: + return new byte[] { value.Boolean ? (byte)1 : (byte)0 }; + case DataType.BYTE: + return new byte[] { value.Byte }; + case DataType.WORD: + case DataType.SHORT: + return BitConverter.GetBytes(value.Int16); + case DataType.INT: + return BitConverter.GetBytes(value.Int32); + case DataType.FLOAT: + return BitConverter.GetBytes(value.Single); + case DataType.STR: + return Encoding.ASCII.GetBytes(tag.ToString()); + default: + return new byte[0]; + } + } + + public static object GetValue(this ITag tag, Storage value) + { + switch (tag.Address.VarType) + { + case DataType.BOOL: + return value.Boolean; + case DataType.BYTE: + return value.Byte; + case DataType.WORD: + case DataType.SHORT: + return value.Int16; + case DataType.TIME: + case DataType.INT: + return value.Int32; + case DataType.FLOAT: + return value.Single; + case DataType.STR: + return tag.ToString(); + default: + return null; + } + } + + public static float ValueToScale(this ITag tag, float value) + { + IDataServer srv = tag.Parent.Server; + int ind = srv.GetScaleByID(tag.ID); + Scaling meta = ind < 0 ? Scaling.Empty : srv.ScalingList[ind]; + if (meta.ScaleType == ScaleType.None) + { + return value; + } + else + { + double temp = (value - meta.EULo) / (meta.EUHi - meta.EULo); + if (meta.ScaleType == ScaleType.SquareRoot) + temp = temp * temp; + return (meta.RawHi - meta.RawLo) * (float)temp + meta.RawLo; + } + } + + public static float ScaleToValue(this ITag tag, Storage value) + { + DataType type = tag.Address.VarType; + if (type == DataType.BOOL) return value.Boolean ? 1f : 0f; + IDataServer srv = tag.Parent.Server; + int ind = srv.GetScaleByID(tag.ID); + Scaling meta = ind < 0 ? Scaling.Empty : srv.ScalingList[ind]; + if (meta.ScaleType == ScaleType.None) + { + switch (type) + { + case DataType.BYTE: + return (float)value.Byte; + case DataType.WORD: + case DataType.SHORT: + return (float)value.Int16; + case DataType.INT: + return (float)value.Int32; + case DataType.FLOAT: + return value.Single; + case DataType.STR: + return float.Parse(tag.ToString()); + default: + return 0f; + } + } + else + { + double temp; + switch (type) + { + case DataType.BYTE: + temp = (value.Byte - meta.RawLo) / (meta.RawHi - meta.RawLo); + break; + case DataType.WORD: + case DataType.SHORT: + temp = (value.Int16 - meta.RawLo) / (meta.RawHi - meta.RawLo); + break; + case DataType.INT: + temp = (value.Int32 - meta.RawLo) / (meta.RawHi - meta.RawLo); + break; + case DataType.FLOAT: + temp = (value.Single - meta.RawLo) / (meta.RawHi - meta.RawLo); + break; + default: + return 0f; + } + if (meta.ScaleType == ScaleType.SquareRoot) + temp = Math.Sqrt(temp); + return (meta.EUHi - meta.EULo) * (float)temp + meta.EULo; + } + } + + public static float ScaleToValue(this ITag tag) + { + return ScaleToValue(tag, tag.Value); + } + + public static string GetTagName(this ITag tag) + { + IDataServer srv = tag.Parent.Server; + int ind = srv.GetItemProperties(tag.ID); + return ind < 0 ? null : srv.MetaDataList[ind].Name; + } + + public static string GetTagName(this IDataServer srv, short id) + { + int ind = srv.GetItemProperties(id); + return ind < 0 ? null : srv.MetaDataList[ind].Name; + } + + public static TagMetaData GetMetaData(this ITag tag) + { + IDataServer srv = tag.Parent.Server; + int index = srv.GetItemProperties(tag.ID); + return index < 0 ? new TagMetaData() : srv.MetaDataList[index]; + } + } + + public static class Utility + { + private static readonly ushort[] crcTable = { + 0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241, + 0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440, + 0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40, + 0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841, + 0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40, + 0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41, + 0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641, + 0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040, + 0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240, + 0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441, + 0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41, + 0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840, + 0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41, + 0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40, + 0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640, + 0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041, + 0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240, + 0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441, + 0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41, + 0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840, + 0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41, + 0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40, + 0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640, + 0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041, + 0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241, + 0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440, + 0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40, + 0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841, + 0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40, + 0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41, + 0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641, + 0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040 + }; + + /// + /// Converts an array of bytes to an ASCII byte array + /// + /// The byte array + /// An array of ASCII byte values + public static string GetAsciiBytes(byte[] numbers) + { + string str = string.Empty; + for (int i = 0; i < numbers.Length; i++) + { + str += numbers[i].ToString("X2"); + } + return str; + } + + /// + /// Converts an array of UInt16 to an ASCII byte array + /// + /// The ushort array + /// An array of ASCII byte values + public static string GetAsciiBytes(ushort[] numbers) + { + string str = string.Empty; + for (int i = 0; i < numbers.Length; i++) + { + str += numbers[i].ToString("X4"); + } + return str; + } + + /// + /// Converts a network order byte array to an array of UInt16 values in host order + /// + /// The network order byte array + /// The host order ushort array + public static ushort[] NetworkBytesToHostUInt16(byte[] networkBytes) + { + if (networkBytes == null) + throw new ArgumentNullException("networkBytes"); + + if (networkBytes.Length % 2 != 0) + throw new FormatException("NetworkBytesNotEven"); + + ushort[] result = new ushort[networkBytes.Length / 2]; + + for (int i = 0; i < result.Length; i++) + result[i] = (ushort)IPAddress.HostToNetworkOrder(BitConverter.ToInt16(networkBytes, i * 2)); + + return result; + } + + /// + /// Converts a hex string to a byte array. + /// + /// The hex string + /// Array of bytes + public static byte[] HexToBytes(string hex) + { + if (string.IsNullOrEmpty(hex)) + throw new ArgumentNullException("hex"); + + if (hex.Length % 2 != 0) + throw new FormatException("HexCharacterCountNotEven"); + + byte[] bytes = new byte[hex.Length / 2]; + + for (int i = 0; i < bytes.Length; i++) + bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16); + + return bytes; + } + + /// + /// Calculate Longitudinal Redundancy Check. + /// + /// The data used in LRC + /// LRC value + public static byte CalculateLrc(byte[] data, int len = 0) + { + if (data == null) + throw new ArgumentNullException("data"); + if (len == 0) len = data.Length; + byte lrc = 0; + for (int i = 0; i < len; i++) + { lrc += data[i]; } + + lrc = (byte)((lrc ^ 0xFF) + 1); + + return lrc; + } + + /// + /// Calculate Cyclical Redundancy Check + /// + /// The data used in CRC + /// CRC value + public static byte[] CalculateCrc(byte[] data, int len = 0) + { + if (data == null) + throw new ArgumentNullException("data"); + if (len == 0) len = data.Length; + ushort crc = ushort.MaxValue; + for (int i = 0; i < len; i++) + { + byte tableIndex = (byte)(crc ^ data[i]); + crc >>= 8; + crc ^= crcTable[tableIndex]; + } + + return BitConverter.GetBytes(crc); + } + + public static bool CheckSumCRC(byte[] frame) + { + int len = frame.Length; + byte[] chk = CalculateCrc(frame, len - 2); + return (chk[0] == frame[len - 2] && chk[1] == frame[len - 1]); + } + + public static unsafe short NetToInt16(byte[] value, int startIndex) + { + if (value == null || startIndex > value.Length - 2) + { + throw new NotImplementedException(); + } + fixed (byte* numRef = &(value[startIndex])) + { + return (short)((numRef[0] << 8) | numRef[1]); + } + } + + public static unsafe int NetToInt32(byte[] value, int startIndex) + { + if (value == null || startIndex > value.Length - 4) + { + throw new NotImplementedException(); + } + fixed (byte* numRef = &(value[startIndex])) + { + return (int)((numRef[0] << 24) | (numRef[1] << 16) | (numRef[2] << 8) | numRef[3]); + } + } + + public static unsafe float NetToSingle(byte[] value, int startIndex) + { + int a = NetToInt32(value, startIndex); + return *(float*)&a; + } + + public static string ConvertToString(byte[] bytes, int start = 0, int len = 0) + { + //西门子300、400 + if (bytes == null || bytes.Length == 0) + return string.Empty; + var klen = bytes[start + 1]; + return Encoding.ASCII.GetString(bytes, start + 2, klen).Trim((char)0); + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/HistoryData.cs b/SCADA/Program/CoreApp/DataService/DataService/HistoryData.cs new file mode 100644 index 0000000..fd00199 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/HistoryData.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; + +namespace DataService +{ + public struct HistoryData : IComparable + { + public short ID; + public QUALITIES Quality; + public Storage Value; + public DateTime TimeStamp; + + public HistoryData(short id, QUALITIES qualitie, Storage value, DateTime timeStamp) + { + ID = id; + Quality = qualitie; + Value = value; + TimeStamp = timeStamp; + } + + public override bool Equals(object obj) + { + if (obj == null) return false; + if (obj is HistoryData) + { + return this == (HistoryData)obj; + } + else return false; + } + + public override int GetHashCode() + { + return ID.GetHashCode() ^ TimeStamp.GetHashCode(); + } + + + public static bool operator ==(HistoryData x, HistoryData y) + { + return x.ID == y.ID && x.TimeStamp == y.TimeStamp; + } + + public static bool operator !=(HistoryData x, HistoryData y) + { + return x.ID != y.ID || x.TimeStamp != y.TimeStamp; + } + + public static readonly HistoryData Empty = new HistoryData(); + + public int CompareTo(HistoryData other) + { + int comp = this.TimeStamp.CompareTo(other.TimeStamp); + return comp == 0 ? this.ID.CompareTo(other.ID) : comp; + } + } + + public struct FileData : IComparable + { + public short ID; + public Storage Value; + public string Text; + + public FileData(short id, Storage value, string text) + { + ID = id; + Value = value; + Text = text; + } + + public int CompareTo(FileData other) + { + return this.ID.CompareTo(other.ID); + } + } + + public class CompareHistoryData : IComparer + { + public int Compare(HistoryData x, HistoryData y) + { + int c1 = x.TimeStamp.CompareTo(y.TimeStamp); + return c1 == 0 ? x.ID.CompareTo(y.ID) : c1; + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/IGroup.cs b/SCADA/Program/CoreApp/DataService/DataService/IGroup.cs new file mode 100644 index 0000000..a3928d4 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/IGroup.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; + +namespace DataService +{ + public interface IGroup : IDisposable + { + bool IsActive { get; set; } + short ID { get; } + int UpdateRate { get; set; } + float DeadBand { get; set; } + string Name { get; set; } + IDriver Parent { get; } + IDataServer Server { get; } + IEnumerable Items { get; } + bool AddItems(IList items); + bool AddTags(IEnumerable tags); + bool RemoveItems(params ITag[] items); + bool SetActiveState(bool active, params short[] items); + ITag FindItemByAddress(DeviceAddress addr); + HistoryData[] BatchRead(DataSource source, bool isSync, params ITag[] itemArray); + int BatchWrite(SortedDictionary items, bool isSync = true); + ItemData ReadInt32(DeviceAddress address, DataSource source = DataSource.Cache); + ItemData ReadInt16(DeviceAddress address, DataSource source = DataSource.Cache); + ItemData ReadByte(DeviceAddress address, DataSource source = DataSource.Cache); + ItemData ReadFloat(DeviceAddress address, DataSource source = DataSource.Cache); + ItemData ReadBool(DeviceAddress address, DataSource source = DataSource.Cache); + ItemData ReadString(DeviceAddress address, DataSource source = DataSource.Cache); + int WriteInt32(DeviceAddress address, int value); + int WriteInt16(DeviceAddress address, short value); + int WriteFloat(DeviceAddress address, float value); + int WriteString(DeviceAddress address, string value); + int WriteBit(DeviceAddress address, bool value); + int WriteBits(DeviceAddress address, byte value); + event DataChangeEventHandler DataChange; + } + + public class DataChangeEventArgs : EventArgs + { + public DataChangeEventArgs(int transactionID, IList pValues) + { + this.TransactionID = transactionID; + this.Values = pValues; + } + + public int TransactionID; + public IList Values; + } + + public class WriteCompleteEventArgs : EventArgs + { + public WriteCompleteEventArgs(int transactionID, short[] pIds, int[] errors) + { + this.TransactionID = transactionID; + this.Values = pIds; + this.Errors = errors; + } + + public int TransactionID; + public short[] Values; + public int[] Errors; + } + + public delegate void DataChangeEventHandler(object sender, DataChangeEventArgs e); + + public delegate void ReadCompleteEventHandler(object sender, DataChangeEventArgs e); + + public delegate void WriteCompleteEventHandler(object sender, WriteCompleteEventArgs e); + +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/IReader.cs b/SCADA/Program/CoreApp/DataService/DataService/IReader.cs new file mode 100644 index 0000000..2e28be0 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/IReader.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; + +namespace DataService +{ + public interface IReaderWriter + { + byte[] ReadBytes(DeviceAddress address, ushort size); + ItemData ReadInt32(DeviceAddress address); + ItemData ReadInt16(DeviceAddress address); + ItemData ReadByte(DeviceAddress address); + ItemData ReadString(DeviceAddress address, ushort size); + ItemData ReadFloat(DeviceAddress address); + ItemData ReadBit(DeviceAddress address); + ItemData ReadValue(DeviceAddress address); + + int WriteBytes(DeviceAddress address, byte[] bit); + int WriteBit(DeviceAddress address, bool bit); + int WriteBits(DeviceAddress address, byte bits); + int WriteInt16(DeviceAddress address, short value); + int WriteInt32(DeviceAddress address, int value); + int WriteFloat(DeviceAddress address, float value); + int WriteString(DeviceAddress address, string str); + int WriteValue(DeviceAddress address, object value); + } + + + public interface ICache : IReaderWriter + { + int Size { get; set; } + int ByteCount { get; } + Array Cache { get; } + int GetOffset(DeviceAddress start, DeviceAddress end); + } + + public interface IMultiReadWrite + { + int Limit { get; } + ItemData[] ReadMultiple(DeviceAddress[] addrsArr); + int WriteMultiple(DeviceAddress[] addrArr, object[] buffer); + } + + public interface IDriver : IDisposable + { + short ID { get; } + string Name { get; } + string ServerName { get; set; }//可以考虑增加一个附加参数,Sever只定义本机名 + bool IsClosed { get; } + int TimeOut { get; set; } + IEnumerable Groups { get; } + IDataServer Parent { get; } + bool Connect(); + IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false); + bool RemoveGroup(IGroup group); + event ShutdownRequestEventHandler OnClose; + } + + public interface IPLCDriver : IDriver, IReaderWriter + { + int PDU { get; } + DeviceAddress GetDeviceAddress(string address); + string GetAddress(DeviceAddress address); + } + + public interface IFileDriver : IDriver, IReaderWriter + { + string FileName { get; set; } + FileData[] ReadAll(short groupId); + //bool RecieveData(string data); + } + + public class ShutdownRequestEventArgs : EventArgs + { + public ShutdownRequestEventArgs(string reson) + { + shutdownReason = reson; + } + public string shutdownReason; + } + + public delegate void ShutdownRequestEventHandler(object sender, ShutdownRequestEventArgs e); +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/IServer.cs b/SCADA/Program/CoreApp/DataService/DataService/IServer.cs new file mode 100644 index 0000000..4ad8815 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/IServer.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; + +namespace DataService +{ + //历史数据、报警数据的提交和数据均从服务器 + public interface IHDAServer : IDisposable + { + IEnumerable ReadAtTime(params DateTime[] timeStamps); + IEnumerable ReadAtTime(short ID, params DateTime[] timeStamps); + IEnumerable ReadRaw(DateTime start, DateTime end); + IEnumerable ReadRaw(DateTime start, DateTime end, short ID); + //IEnumerable ReadProcessed(DateTime start, DateTime end, HDAAggregate aggregates, params short[] aggregateIDs); + } + + public interface IAlarmServer : IDisposable + { + int DisableCondition(string sourceName, AlarmType type); + int EnableCondition(string sourceName, AlarmType type); + int RemoveConditon(string sourceName, AlarmType type); + int RemoveConditons(string sourceName); + int AckConditions(params ICondition[] conditions); + IList QueryConditions(string sourceName); + IEnumerable AlarmList { get; } + IList ConditionList { get; } + IList ActivedConditionList { get; } + } + + public interface IDataServer : IDisposable + { + ITag this[short id] { get; } + ITag this[string name] { get; } + ExpressionEval Eval { get; } + Object SyncRoot { get; }//对所有涉及集合更改项目使用;包括IGROUP的ADDITEMS + IList MetaDataList { get; } + IList ScalingList { get; } + IEnumerable Drivers { get; } + IEnumerable BrowseItems(BrowseType browseType, string tagName, DataType dataType); + IDriver AddDriver(short id, string name, string server, int timeOut, + string assembly, string className, string spare1, string spare2); + IGroup GetGroupByName(string name); + int GetScaleByID(short id); + int GetItemProperties(short id);//返回的是元数据在元数据列表的索引 + bool RemoveDriver(IDriver device); + bool AddItemIndex(string key, ITag value); + bool RemoveItemIndex(string key); + void ActiveItem(bool active, params ITag[] items); + int BatchWrite(Dictionary tags, bool sync); + HistoryData[] BatchRead(DataSource source, bool sync, params ITag[] itemArray); + } + + public class FCTCOMMAND + { + public const byte fctHead = 0xAB;//报头可加密,如报头不符,则不进行任何操作;客户端Socket发送报警请求,封装于Server + public const byte fctHdaIdRequest = 30; + public const byte fctHdaRequest = 31; + public const byte fctAlarmRequest = 32; + public const byte fctOrderChange = 33; + public const byte fctReset = 34; + public const byte fctXMLHead = 0xEE;//xml协议 + public const byte fctReadSingle = 1; + public const byte fctReadMultiple = 2; + public const byte fctWriteSingle = 5; + public const byte fctWriteMultiple = 15; + } + + public enum HDAAggregate + { + HDANoAggregate, + HDAInterpolative, + HDATotal, + HDAAverage, + HDATimeAverage, + HDACount, + HDAStDev, + HDAMinimumActualTime, + HDAMinimum, + HDAMaximumActualTime, + HDAMaximum, + HDAStart, + HDAEnd, + HDADelta, + HDARegSlope, + HDARegConst, + HDARegDev, + HDAVariance, + HDARange, + HDADurationGood, + HDADurationBad, + HDAPercentGood, + HDAPercentBad, + HDAWorstQuality, + HDAAnnotations, + } + + public enum BrowseType + { + Branch = 1, + Leaf = 2, + Flat = 3 + } +} \ No newline at end of file diff --git a/SCADA/Program/CoreApp/DataService/DataService/ITag.cs b/SCADA/Program/CoreApp/DataService/DataService/ITag.cs new file mode 100644 index 0000000..a08c8df --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/ITag.cs @@ -0,0 +1,633 @@ +using System; + +namespace DataService +{ + public abstract class ITag : IComparable + { + protected short _id; + public short ID + { + get + { + return _id; + } + } + + protected bool _active = true; + public bool Active + { + get + { + return _active; + } + set + { + _group.SetActiveState(value, _id); + _active = value; + } + } + + protected QUALITIES _quality; + public QUALITIES Quality + { + get + { + return _quality; + } + } + + protected Storage _value; + public Storage Value + { + get + { + return _value; + } + } + + protected DateTime _timeStamp = DateTime.MinValue; + public DateTime TimeStamp + { + get + { + return _timeStamp; + } + } + + protected DeviceAddress _plcAddress; + public DeviceAddress Address + { + get + { + return _plcAddress; + } + set + { + _plcAddress = value; + } + } + + protected IGroup _group; + public IGroup Parent + { + get + { + return _group; + } + } + + protected ITag(short id, DeviceAddress address, IGroup group) + { + _id = id; + _group = group; + _plcAddress = address; + } + + public void Update(Storage newvalue, DateTime timeStamp, QUALITIES quality) + { + if (_timeStamp > timeStamp) return;//如果时间戳更旧或值未改变 + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(quality, _value, newvalue, _timeStamp, timeStamp)); + } + _timeStamp = timeStamp; + _quality = quality; + if (quality == QUALITIES.QUALITY_GOOD) + { + _value = newvalue; + if (ValueChanged != null) + { + ValueChanged(this, new ValueChangedEventArgs(_value)); + } + } + } + + public abstract bool Refresh(DataSource source = DataSource.Device); + + public abstract Storage Read(DataSource source = DataSource.Cache); + + protected abstract int InnerWrite(Storage value); + + public abstract int Write(object value); + + public int Write(Storage value, bool bForce) + { + DateTime time = DateTime.Now; + _timeStamp = time; + if (bForce) + { + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(QUALITIES.QUALITY_GOOD, _value, value, _timeStamp, time)); + } + } + int result = InnerWrite(value); + if (bForce || result != 0) + { + var data = Read(DataSource.Device); + if (data != value) + { + time = DateTime.Now; + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(QUALITIES.QUALITY_GOOD, _value, data, _timeStamp, time)); + } + _value = data; + _timeStamp = time; + return result; + } + } + return 0; + } + + public ValueChangingEventHandler ValueChanging; + + public ValueChangedEventHandler ValueChanged; + + #region IComparable Members + + public override int GetHashCode() + { + return _id.GetHashCode(); + } + + public int CompareTo(ITag other) + { + return _plcAddress.CompareTo(other._plcAddress); + } + + #endregion + } + + public sealed class BoolTag : ITag + { + public BoolTag(short id, DeviceAddress addr, IGroup group) + : base(id, addr, group) + { + } + + #region IDevice Members + + public override bool Refresh(DataSource source = DataSource.Cache) + { + var _newvalue = _group.ReadBool(_plcAddress, source); + if (_newvalue.Value != _value.Boolean) + { + Storage value = Storage.Empty; + value.Boolean = _newvalue.Value; + DateTime time = _newvalue.TimeStamp.ToDateTime(); + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(_newvalue.Quality, _value, value, _timeStamp, time)); + } + _timeStamp = time; + _quality = _newvalue.Quality; + if (_quality == QUALITIES.QUALITY_GOOD) + { + _value = value; + if (ValueChanged != null) + { + ValueChanged(this, new ValueChangedEventArgs(value)); + } + } + return true; + } + return false; + } + + public override Storage Read(DataSource source = DataSource.Cache) + { + Storage value = Storage.Empty; + value.Boolean = _group.ReadBool(_plcAddress, source).Value; + return value; + } + + public override int Write(object value) + { + if (value == null) return -1; + bool temp = _value.Boolean; + var str = value as string; + if (str == null) + temp = Convert.ToBoolean(value); + else if (!Boolean.TryParse(str, out temp)) + return -1; + _timeStamp = DateTime.Now; + return _group.WriteBit(_plcAddress, temp); + } + + protected override int InnerWrite(Storage value) + { + return _group.WriteBit(_plcAddress, value.Boolean); + } + + #endregion + + public override string ToString() + { + return _value.Boolean.ToString(); + } + } + + public sealed class ByteTag : ITag + { + + public ByteTag(short id, DeviceAddress addr, IGroup group) + : base(id, addr, group) + { + } + + + #region IDevice Members + public override bool Refresh(DataSource source = DataSource.Device) + { + var _newvalue = _group.ReadByte(_plcAddress, source); + if (_newvalue.Value != _value.Byte) + { + Storage value = Storage.Empty; + value.Byte = _newvalue.Value; + DateTime time = _newvalue.TimeStamp.ToDateTime(); + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(_newvalue.Quality, _value, value, _timeStamp, time)); + } + _timeStamp = time; + _quality = _newvalue.Quality; + if (_quality == QUALITIES.QUALITY_GOOD) + { + _value = value; + if (ValueChanged != null) + { + ValueChanged(this, new ValueChangedEventArgs(value)); + } + } + return true; + } + return false; + } + + public override Storage Read(DataSource source = DataSource.Cache) + { + Storage value = Storage.Empty; + value.Byte = _group.ReadByte(_plcAddress, source).Value; + return value; + } + + public override int Write(object value) + { + byte temp = _value.Byte; + var str = value as string; + if (str == null) + temp = Convert.ToByte(value); + else if (!Byte.TryParse(str, out temp)) + return -1; + _timeStamp = DateTime.Now; + return _group.WriteBits(_plcAddress, temp); + } + + protected override int InnerWrite(Storage value) + { + return _group.WriteBits(_plcAddress, value.Byte); + } + + #endregion + + public override string ToString() + { + return _value.Byte.ToString(); + } + } + + public sealed class ShortTag : ITag + { + + public ShortTag(short id, DeviceAddress addr, IGroup group) + : base(id, addr, group) + { + } + + + #region IDevice Members + public override bool Refresh(DataSource source = DataSource.Device) + { + var _newvalue = _group.ReadInt16(_plcAddress, source); + if (_newvalue.Value != _value.Int16) + { + Storage value = Storage.Empty; + value.Int16 = _newvalue.Value; + DateTime time = _newvalue.TimeStamp.ToDateTime(); + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(_newvalue.Quality, _value, value, _timeStamp, time)); + } + _timeStamp = time; + _quality = _newvalue.Quality; + if (_quality == QUALITIES.QUALITY_GOOD) + { + _value = value; + if (ValueChanged != null) + { + ValueChanged(this, new ValueChangedEventArgs(value)); + } + } + return true; + } + return false; + } + + public override Storage Read(DataSource source = DataSource.Cache) + { + Storage value = Storage.Empty; + value.Int16 = _group.ReadInt16(_plcAddress, source).Value; + return value; + } + + public override int Write(object value) + { + var temp = _value.Int16; + var str = value as string; + if (str == null) + temp = Convert.ToInt16(value); + else if (!short.TryParse(str, out temp)) + return -1; + _timeStamp = DateTime.Now; + return _group.WriteInt16(_plcAddress, temp); + } + + protected override int InnerWrite(Storage value) + { + return _group.WriteInt16(_plcAddress, value.Int16); + } + + #endregion + + public override string ToString() + { + return _value.Int16.ToString(); + } + } + + public sealed class IntTag : ITag + { + + public IntTag(short id, DeviceAddress addr, IGroup group) + : base(id, addr, group) + { + } + + #region IDevice Members + public override bool Refresh(DataSource source = DataSource.Device) + { + var _newvalue = _group.ReadInt32(_plcAddress, source); + if (_newvalue.Value != _value.Int32) + { + Storage value = Storage.Empty; + value.Int32 = _newvalue.Value; + DateTime time = _newvalue.TimeStamp.ToDateTime(); + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(_newvalue.Quality, _value, value, _timeStamp, time)); + } + _timeStamp = time; + _quality = _newvalue.Quality; + if (_quality == QUALITIES.QUALITY_GOOD) + { + _value = value; + if (ValueChanged != null) + { + ValueChanged(this, new ValueChangedEventArgs(value)); + } + } + return true; + } + return false; + } + + public override Storage Read(DataSource source = DataSource.Cache) + { + Storage value = Storage.Empty; + value.Int32 = _group.ReadInt32(_plcAddress, source).Value; + return value; + } + + public override int Write(object value) + { + var temp = _value.Int32; + var str = value as string; + if (str == null) + temp = Convert.ToInt32(value); + else if (!int.TryParse(str, out temp)) + return -1; + _timeStamp = DateTime.Now; + return _group.WriteInt32(_plcAddress, temp); + } + + protected override int InnerWrite(Storage value) + { + return _group.WriteInt32(_plcAddress, value.Int32); + } + + #endregion + + public override string ToString() + { + return _value.Int32.ToString(); + } + } + + public sealed class FloatTag : ITag + { + + public FloatTag(short id, DeviceAddress addr, IGroup group) + : base(id, addr, group) + { + } + + + #region IDevice Members + public override bool Refresh(DataSource source = DataSource.Device) + { + var _newvalue = _group.ReadFloat(_plcAddress, source); + if (_newvalue.Value != _value.Single) + { + Storage value = Storage.Empty; + value.Single = _newvalue.Value; + DateTime time = _newvalue.TimeStamp.ToDateTime(); + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(_newvalue.Quality, _value, value, _timeStamp, time)); + } + _timeStamp = time; + _quality = _newvalue.Quality; + if (_quality == QUALITIES.QUALITY_GOOD) + { + _value = value; + if (ValueChanged != null) + { + ValueChanged(this, new ValueChangedEventArgs(value)); + } + } + return true; + } + return false; + } + + public override Storage Read(DataSource source = DataSource.Cache) + { + Storage value = Storage.Empty; + value.Single = _group.ReadFloat(_plcAddress, source).Value; + return value; + } + + public override int Write(object value) + { + var temp = _value.Single; + var str = value as string; + if (str == null) + temp = Convert.ToSingle(value); + else if (!float.TryParse(str, out temp)) + return -1; + _timeStamp = DateTime.Now; + return _group.WriteFloat(_plcAddress, temp); + } + + protected override int InnerWrite(Storage value) + { + return _group.WriteFloat(_plcAddress, value.Single); + } + + #endregion + + public override string ToString() + { + return _value.Single.ToString(); + } + } + + public sealed class StringTag : ITag + { + string _str; + public string String + { + get + { + return _str; + } + set + { + _str = value; + } + } + + public StringTag(short id, DeviceAddress addr, IGroup group) + : base(id, addr, group) + { + } + + + #region IDevice Members + public override bool Refresh(DataSource source = DataSource.Device) + { + var _newvalue = _group.ReadString(_plcAddress, source); + if (_newvalue.Value != _str) + { + DateTime time = _newvalue.TimeStamp.ToDateTime(); + if (ValueChanging != null) + { + ValueChanging(this, new ValueChangingEventArgs(_newvalue.Quality, _value, _value, _timeStamp, time)); + } + _timeStamp = time; + _quality = _newvalue.Quality; + if (_quality == QUALITIES.QUALITY_GOOD) + { + _str = _newvalue.Value; + if (ValueChanged != null) + { + ValueChanged(this, new ValueChangedEventArgs(_value)); + } + } + return true; + } + return false; + } + + public override Storage Read(DataSource source = DataSource.Cache) + { + var value = _group.ReadString(_plcAddress, source); + if (value.Quality == QUALITIES.QUALITY_GOOD) + _str = value.Value; + return Storage.Empty; + } + + public override int Write(object value) + { + if (value == null) return -1; + var str = (value is String) ? (String)value : value.ToString(); + _timeStamp = DateTime.Now; + return _group.WriteString(_plcAddress, str); + } + + protected override int InnerWrite(Storage value) + { + return _group.WriteString(_plcAddress, _str); + } + + #endregion + + public override string ToString() + { + return _str ?? string.Empty; + } + } + + 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); + + public class ValueChangingEventArgs : EventArgs + { + public ValueChangingEventArgs(QUALITIES quality, T oldValue, T newValue, DateTime oldTime, DateTime newTime) + { + this.Quality = quality; + this.OldValue = oldValue; + this.NewValue = newValue; + this.OldTimeStamp = oldTime; + this.NewTimeStamp = newTime; + } + + public QUALITIES Quality; + public T OldValue; + public T NewValue; + public DateTime OldTimeStamp; + public DateTime NewTimeStamp; + } + + public class ValueChangedEventArgs : EventArgs + { + public ValueChangedEventArgs(Storage value) + { + this.Value = value; + } + + public Storage Value; + } + +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/PLCGroup.cs b/SCADA/Program/CoreApp/DataService/DataService/PLCGroup.cs new file mode 100644 index 0000000..07bbd7e --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/PLCGroup.cs @@ -0,0 +1,684 @@ +using System; +using System.Collections.Generic; +using System.Timers; + +namespace DataService +{ + public class PLCGroup : IGroup + { + protected Timer _timer; + + protected bool _isActive; + public virtual bool IsActive + { + get + { + return _isActive; + } + set + { + _isActive = value; + if (value) + { + //_timer.Start((uint)_updateRate, true); + //_timer.Timer += new EventHandler(timer_Timer); + _timer.Interval = _updateRate; + _timer.Elapsed += new ElapsedEventHandler(timer_Timer); + _timer.Start(); + } + else + { + _timer.Elapsed -= new ElapsedEventHandler(timer_Timer); + _timer.Stop(); + } + } + } + + protected short _id; + public short ID + { + get + { + return _id; + } + } + + protected int _updateRate; + public int UpdateRate + { + get + { + return _updateRate; + } + set + { + _updateRate = value; + } + } + + protected string _name; + public string Name + { + get + { + return _name; + } + set + { + _name = value; + } + } + + protected float _deadband; + public float DeadBand + { + get + { + return _deadband; + } + set + { + _deadband = value; + } + } + + + protected ICache _cacheReader; + + protected IPLCDriver _plcReader; + public IDriver Parent + { + get + { + return _plcReader; + } + } + + protected List _changedList; + public List ChangedList + { + get + { + return _changedList; + } + } + + + protected List _items; + public IEnumerable Items + { + get { return _items; } + } + + protected IDataServer _server; + public IDataServer Server + { + get + { + return _server; + } + } + + protected List _rangeList = new List(); + + protected PLCGroup() + { + } + + public PLCGroup(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._changedList = new List(); + this._cacheReader = new ByteCacheReader(); + this._timer = new Timer(); + } + + public bool AddItems(IList items) + { + int count = items.Count; + if (_items == null) _items = new List(count); + lock (_server.SyncRoot) + { + for (int i = 0; i < count; i++) + { + ITag dataItem = null; + TagMetaData meta = items[i]; + if (meta.GroupID == this._id) + { + DeviceAddress addr = _plcReader.GetDeviceAddress(meta.Address); + if (addr.DataSize == 0) addr.DataSize = meta.Size; + if (addr.VarType == DataType.NONE) addr.VarType = meta.DataType; + if (addr.VarType != DataType.BOOL) addr.Bit = 0; + switch (meta.DataType) + { + case DataType.BOOL: + dataItem = new BoolTag(meta.ID, addr, this); + break; + case DataType.BYTE: + dataItem = new ByteTag(meta.ID, addr, this); + break; + case DataType.WORD: + case DataType.SHORT: + dataItem = new ShortTag(meta.ID, addr, this); + break; + case DataType.TIME: + case DataType.INT: + dataItem = new IntTag(meta.ID, addr, this); + break; + case DataType.FLOAT: + dataItem = new FloatTag(meta.ID, addr, this); + break; + case DataType.STR: + dataItem = new StringTag(meta.ID, addr, this); + break; + } + if (dataItem != null) + { + //dataItem.Active = meta.Active; + _items.Add(dataItem); + _server.AddItemIndex(meta.Name, dataItem); + } + } + } + } + _items.TrimExcess(); + _items.Sort(); + UpdatePDUArea(); + return true; + } + + public bool AddTags(IEnumerable tags) + { + if (_items == null) + { + _items = new List(); + } + foreach (ITag tag in tags) + { + if (tag != null) + { + _items.Add(tag); + } + } + _items.TrimExcess(); + _items.Sort(); + UpdatePDUArea(); + return true; + } + + public bool RemoveItems(params ITag[] items) + { + foreach (var item in items) + { + _server.RemoveItemIndex(item.GetTagName()); + _items.Remove(item); + } + UpdatePDUArea(); + return true; + } + + protected void UpdatePDUArea() + { + int count = _items.Count; + if (count > 0) + { + DeviceAddress _start = _items[0].Address; + _start.Bit = 0; + int bitCount = _cacheReader.ByteCount; + if (count > 1) + { + int cacheLength = 0;//缓冲区的大小 + int cacheIndexStart = 0; + int startIndex = 0; + DeviceAddress segmentEnd = DeviceAddress.Empty; + DeviceAddress tagAddress = DeviceAddress.Empty; + DeviceAddress segmentStart = _start; + for (int j = 1, i = 1; i < count; i++, j++) + { + tagAddress = _items[i].Address;//当前变量地址 + int offset1 = _cacheReader.GetOffset(tagAddress, segmentStart); + if (offset1 > (_plcReader.PDU - tagAddress.DataSize) / bitCount) + { + segmentEnd = _items[i - 1].Address; + int len = _cacheReader.GetOffset(segmentEnd, segmentStart); + len += segmentEnd.DataSize <= bitCount ? 1 : segmentEnd.DataSize / bitCount; + tagAddress.CacheIndex = (ushort)(cacheIndexStart + len); + _items[i].Address = tagAddress; + _rangeList.Add(new PDUArea(segmentStart, len, startIndex, j)); + startIndex += j; j = 0; + cacheLength += len;//更新缓存长度 + cacheIndexStart = cacheLength; + segmentStart = tagAddress;//更新数据片段的起始地址 + } + else + { + tagAddress.CacheIndex = (ushort)(cacheIndexStart + offset1); + _items[i].Address = tagAddress; + } + if (i == count - 1) + { + segmentEnd = _items[i].Address; + int segmentLength = _cacheReader.GetOffset(segmentEnd, segmentStart); + if (segmentLength > (_plcReader.PDU - segmentEnd.DataSize) / bitCount) + { + segmentEnd = _items[i - 1].Address; + segmentLength = segmentEnd.DataSize <= bitCount ? 1 : segmentEnd.DataSize / bitCount; + } + tagAddress.CacheIndex = (ushort)(cacheIndexStart + segmentLength); + _items[i].Address = tagAddress; + segmentLength += segmentEnd.DataSize <= bitCount ? 1 : segmentEnd.DataSize / bitCount; + _rangeList.Add(new PDUArea(segmentStart, segmentLength, startIndex, j + 1)); + cacheLength += segmentLength; + } + } + _cacheReader.Size = cacheLength; + } + else + _cacheReader.Size = _start.DataSize <= bitCount ? 1 : _start.DataSize / bitCount;//改变Cache的Size属性值将创建Cache的内存区域 + } + } + + public ITag FindItemByAddress(DeviceAddress addr) + { + int index = _items.BinarySearch(new BoolTag(0, addr, null)); + return index < 0 ? null : _items[index]; + } + + public bool SetActiveState(bool active, params short[] items) + { + return false; + } + + object sync = new object(); + protected void timer_Timer(object sender, EventArgs e) + { + if (_isActive) + { + lock (sync) + { + Poll(); + if (_changedList.Count > 0) + Update(); + } + } + else + return; + } + + protected virtual int Poll() + { + if (_plcReader.IsClosed) return -1; + 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(); + return -1; + } + 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 (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; + } + return 1; + } + + protected void Update() + { + DateTime dt = DateTime.Now; + if (DataChange != null) + { + HistoryData[] values = new HistoryData[_changedList.Count]; + int i = 0; + foreach (int index in _changedList) + { + ITag item = _items[index]; + var itemData = item.Read(); + if (item.Active) + item.Update(itemData, dt, QUALITIES.QUALITY_GOOD); + if (_deadband == 0 || (item.Address.VarType == DataType.FLOAT && + (Math.Abs(itemData.Single / item.Value.Single - 1) > _deadband))) + { + values[i].ID = item.ID; + values[i].Quality = item.Quality; + values[i].Value = itemData; + values[i].TimeStamp = item.TimeStamp; + i++; + } + } + foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList()) + { + deleg.BeginInvoke(this, new DataChangeEventArgs(1, values), null, null); + } + } + else + { + foreach (int index in _changedList) + { + ITag item = _items[index]; + if (item.Active) + item.Update(item.Read(), dt, QUALITIES.QUALITY_GOOD); + } + } + _changedList.Clear(); + } + + public void Dispose() + { + if (_timer != null) + _timer.Dispose(); + //if (_items != null) + // _items.Clear(); + } + + public virtual HistoryData[] BatchRead(DataSource source, bool isSync, params ITag[] itemArray) + { + int len = itemArray.Length; + HistoryData[] values = new HistoryData[len]; + if (source == DataSource.Device) + { + IMultiReadWrite multi = _plcReader as IMultiReadWrite; + if (multi != null) + { + Array.Sort(itemArray); + var itemArr = multi.ReadMultiple(Array.ConvertAll(itemArray, x => x.Address)); + for (int i = 0; i < len; i++) + { + values[i].ID = itemArray[i].ID; + values[i].Value = itemArr[i].Value; + values[i].TimeStamp = itemArr[i].TimeStamp.ToDateTime(); + itemArray[i].Update(itemArr[i].Value, values[i].TimeStamp, itemArr[i].Quality); + } + } + else + { + for (int i = 0; i < len; i++) + { + itemArray[i].Refresh(source); + values[i].ID = itemArray[i].ID; + values[i].Value = itemArray[i].Value; + values[i].Quality = itemArray[i].Quality; + values[i].TimeStamp = itemArray[i].TimeStamp; + } + } + } + else + { + for (int i = 0; i < len; i++) + { + values[i].ID = itemArray[i].ID; + values[i].Value = itemArray[i].Value; + values[i].Quality = itemArray[i].Quality; + values[i].TimeStamp = itemArray[i].TimeStamp; + } + } + return values; + } + + public virtual int BatchWrite(SortedDictionary items, bool isSync = true) + { + int len = items.Count; + int rev = 0; + IMultiReadWrite multi = _plcReader as IMultiReadWrite; + if (multi != null) + { + DeviceAddress[] addrs = new DeviceAddress[len]; + object[] objs = new object[len]; + int i = 0; + foreach (var item in items) + { + addrs[i] = item.Key.Address; + objs[i] = item.Value; + i++; + } + rev = multi.WriteMultiple(addrs, objs); + } + else + { + foreach (var tag in items) + { + if (tag.Key.Write(tag.Value) < 0) + rev = -1; + } + } + if (DataChange != null && rev >= 0) + { + HistoryData[] data = new HistoryData[len]; + int i = 0; + foreach (var item in items) + { + ITag tag = item.Key; + data[i].ID = tag.ID; + data[i].TimeStamp = tag.TimeStamp; + data[i].Quality = tag.Quality; + data[i].Value = item.Key.ToStorage(item.Value); + i++; + } + foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList()) + { + deleg.BeginInvoke(this, new DataChangeEventArgs(1, data), null, null); + } + } + return rev; + } + + public ItemData ReadInt32(DeviceAddress address, DataSource source = DataSource.Cache) + { + return source == DataSource.Cache ? _cacheReader.ReadInt32(address) : _plcReader.ReadInt32(address); + } + + public ItemData ReadInt16(DeviceAddress address, DataSource source = DataSource.Cache) + { + return source == DataSource.Cache ? _cacheReader.ReadInt16(address) : _plcReader.ReadInt16(address); + } + + public ItemData ReadByte(DeviceAddress address, DataSource source = DataSource.Cache) + { + return source == DataSource.Cache ? _cacheReader.ReadByte(address) : _plcReader.ReadByte(address); + } + + public ItemData ReadFloat(DeviceAddress address, DataSource source = DataSource.Cache) + { + return source == DataSource.Cache ? _cacheReader.ReadFloat(address) : _plcReader.ReadFloat(address); + } + + public ItemData ReadBool(DeviceAddress address, DataSource source = DataSource.Cache) + { + return source == DataSource.Cache ? _cacheReader.ReadBit(address) : _plcReader.ReadBit(address); + } + + public ItemData ReadString(DeviceAddress address, DataSource source = DataSource.Cache) + { + ushort siz = address.DataSize; + return source == DataSource.Cache ? _cacheReader.ReadString(address, siz) : + _plcReader.ReadString(address, siz); + } + + public int WriteInt32(DeviceAddress address, int value) + { + int rs = _plcReader.WriteInt32(address, value); + if (rs >= 0) + { + if (DataChange != null) + { + ITag tag = GetTagByAddress(address); + if (tag != null) + DataChange(this, new DataChangeEventArgs(1, new HistoryData[1] + { + new HistoryData(tag.ID,QUALITIES.QUALITY_GOOD,new Storage{Int32=value}, DateTime.Now) + })); + } + } + return rs; + } + + public int WriteInt16(DeviceAddress address, short value) + { + int rs = _plcReader.WriteInt16(address, value); + if (rs >= 0) + { + if (DataChange != null) + { + ITag tag = GetTagByAddress(address); + if (tag != null) + DataChange(this, new DataChangeEventArgs(1, new HistoryData[1] + { + new HistoryData(tag.ID,QUALITIES.QUALITY_GOOD,new Storage{Int16=value}, DateTime.Now) + })); + } + } + return rs; + } + + public int WriteFloat(DeviceAddress address, float value) + { + int rs = _plcReader.WriteFloat(address, value); + if (rs >= 0) + { + if (DataChange != null) + { + ITag tag = GetTagByAddress(address); + if (tag != null) + DataChange(this, new DataChangeEventArgs(1, new HistoryData[1] + { + new HistoryData(tag.ID,QUALITIES.QUALITY_GOOD,new Storage{Single=value}, DateTime.Now) + })); + } + } + return rs; + } + + public int WriteString(DeviceAddress address, string value) + { + int rs = _plcReader.WriteString(address, value); + if (rs >= 0) + { + if (DataChange != null) + { + ITag tag = GetTagByAddress(address); + if (tag != null) + DataChange(this, new DataChangeEventArgs(1, new HistoryData[1] + { + new HistoryData(tag.ID,QUALITIES.QUALITY_GOOD,Storage.Empty, DateTime.Now) + })); + } + } + return rs; + } + + public int WriteBit(DeviceAddress address, bool value) + { + int rs = _plcReader.WriteBit(address, value); + if (rs >= 0) + { + if (DataChange != null) + { + ITag tag = GetTagByAddress(address); + if (tag != null) + DataChange(this, new DataChangeEventArgs(1, new HistoryData[1] + { + new HistoryData(tag.ID,QUALITIES.QUALITY_GOOD,new Storage{Boolean=value}, DateTime.Now) + })); + } + } + return rs; + } + + public int WriteBits(DeviceAddress address, byte value) + { + int rs = _plcReader.WriteBits(address, value); + if (rs >= 0) + { + if (DataChange != null) + { + ITag tag = GetTagByAddress(address); + if (tag != null) + DataChange(this, new DataChangeEventArgs(1, new HistoryData[1] + { + new HistoryData(tag.ID,QUALITIES.QUALITY_GOOD,new Storage{Byte=value}, DateTime.Now) + })); + } + } + return rs; + } + + private ITag GetTagByAddress(DeviceAddress addr) + { + int index = _items.BinarySearch(new BoolTag(0, addr, null)); + return index < 0 ? null : _items[index]; + } + + public event DataChangeEventHandler DataChange; + } + + + public struct PDUArea + { + public DeviceAddress Start; + public int Len; + public int StartIndex; + public int Count; + + public PDUArea(DeviceAddress start, int len, int startIndex, int count) + { + Start = start; + Len = len; + StartIndex = startIndex; + Count = count; + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/DataService/Storage.cs b/SCADA/Program/CoreApp/DataService/DataService/Storage.cs new file mode 100644 index 0000000..1c2df0b --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/Storage.cs @@ -0,0 +1,95 @@ +using System.Runtime.InteropServices; +using System; + +namespace DataService +{ + [StructLayout(LayoutKind.Explicit, Size = 4)] + public struct Storage + { + // Fields + [FieldOffset(0)] + public bool Boolean; + [FieldOffset(0)] + public byte Byte; + [FieldOffset(0)] + public short Int16; + [FieldOffset(0)] + public int Int32; + [FieldOffset(0)] + public float Single; + + public static readonly Storage Empty ; + + static Storage() + { + Empty = new Storage(); + } + + public override bool Equals(object obj) + { + if (obj == null) return false; + Type type = obj.GetType(); + if (type == typeof(Storage)) + return this.Int32 == ((Storage)obj).Int32; + else + { + if (type == typeof(Int32)) + return this.Int32 == (Int32)obj; + if (type == typeof(Int16)) + return this.Int16 == (Int16)obj; + if (type == typeof(Byte)) + return this.Byte == (Byte)obj; + if (type == typeof(Boolean)) + return this.Boolean == (Boolean)obj; + if (type == typeof(Single)) + return this.Single == (Single)obj; + if (type == typeof(String)) + return this.ToString() == obj.ToString(); + } + return false; + } + + public override int GetHashCode() + { + return Int32.GetHashCode(); + } + + public static bool operator ==(Storage x, Storage y) + { + return x.Int32 == y.Int32; + } + + public static bool operator !=(Storage x, Storage y) + { + return x.Int32 != y.Int32; + } + } + + public enum QUALITIES : short + { + // Fields + LIMIT_CONST = 3, + LIMIT_HIGH = 2, + LIMIT_LOW = 1, + //LIMIT_MASK = 3, + //LIMIT_OK = 0, + QUALITY_BAD = 0, + QUALITY_COMM_FAILURE = 0x18, + QUALITY_CONFIG_ERROR = 4, + QUALITY_DEVICE_FAILURE = 12, + QUALITY_EGU_EXCEEDED = 0x54, + QUALITY_GOOD = 0xc0, + QUALITY_LAST_KNOWN = 20, + QUALITY_LAST_USABLE = 0x44, + QUALITY_LOCAL_OVERRIDE = 0xd8, + QUALITY_MASK = 0xc0, + QUALITY_NOT_CONNECTED = 8, + QUALITY_OUT_OF_SERVICE = 0x1c, + QUALITY_SENSOR_CAL = 80, + QUALITY_SENSOR_FAILURE = 0x10, + QUALITY_SUB_NORMAL = 0x58, + QUALITY_UNCERTAIN = 0x40, + QUALITY_WAITING_FOR_INITIAL_DATA = 0x20, + STATUS_MASK = 0xfc, + } +} \ No newline at end of file diff --git a/SCADA/Program/CoreApp/DataService/DataService/TagMetaData.cs b/SCADA/Program/CoreApp/DataService/DataService/TagMetaData.cs new file mode 100644 index 0000000..b8f9fec --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/DataService/TagMetaData.cs @@ -0,0 +1,108 @@ +using System; +using System.Runtime.InteropServices; + +namespace DataService +{ + [StructLayout(LayoutKind.Sequential)] + public struct TagMetaData : IComparable + { + public bool Archive; + + public DataType DataType; + + public ushort Size; + + public short ID; + + public short GroupID; + + public float Maximum; + + public float Minimum; + + public int Cycle; + + public string Address; + + public string Name; + + public TagMetaData(short id, short grpId, string name, string address, + DataType type, ushort size, bool archive = false, float max = 0, float min = 0, int cycle = 0) + { + ID = id; + GroupID = grpId; + Name = name; + Address = address; + DataType = type; + Size = size; + Archive = archive; + Maximum = max; + Minimum = min; + Cycle = cycle; + } + + public int CompareTo(TagMetaData other) + { + return this.ID.CompareTo(other.ID); + } + + public override string ToString() + { + return Name; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct Scaling : IComparable + { + public short ID; + + public ScaleType ScaleType; + + public float EUHi; + + public float EULo; + + public float RawHi; + + public float RawLo; + + public Scaling(short id, ScaleType type, float euHi, float euLo, float rawHi, float rawLo) + { + ID = id; + ScaleType = type; + EUHi = euHi; + EULo = euLo; + RawHi = rawHi; + RawLo = rawLo; + } + + public int CompareTo(Scaling other) + { + return ID.CompareTo(other.ID); + } + + public static readonly Scaling Empty = new Scaling { ScaleType = ScaleType.None }; + } + + public struct ItemData + { + public T Value; + public long TimeStamp; + public QUALITIES Quality; + + public ItemData(T value, long timeStamp, QUALITIES quality) + { + Value = value; + TimeStamp = timeStamp; + Quality = quality; + } + } + + public enum ScaleType : byte + { + None = 0, + Linear = 1, + SquareRoot = 2 + } +} diff --git a/SCADA/Program/CoreApp/DataService/GateWay/DAService.cs b/SCADA/Program/CoreApp/DataService/GateWay/DAService.cs new file mode 100644 index 0000000..521595b --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/GateWay/DAService.cs @@ -0,0 +1,1838 @@ +using ClientDriver; +using DatabaseLib; +using DataService; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Console; +using Microsoft.Extensions.Logging.Debug; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Timers; +using System.Xml; + +namespace BatchCoreService +{ + + public class DAService : IDataServer, IAlarmServer + { + const int PORT = 6543; + + const char SPLITCHAR = '.'; + const string SERVICELOGSOURCE = "DataProcess"; + const string SERVICELOGNAME = "DataProcess"; + const string PATH = @"C:\DataConfig\"; + const string FILENAME = "server.xml"; + + + //可配置参数,从XML文件读取 + int DELAY = 3000; + int MAXHDACAP = 10000; + int ALARMLIMIT = 1000; + int CYCLE = 60000; + int CYCLE2 = 600000; + int SENDTIMEOUT = 60000; + //int SENDSIZE = ushort.MaxValue; + int HDALEN = 1024 * 1024; + int MAXLOGSIZE = 1024; + int HDADELAY = 3600 * 1000; + int ALARMDELAY = 3600 * 1000; + int ARCHIVEINTERVAL = 100; + + static ILogger Log; + + private System.Timers.Timer timer1 = new System.Timers.Timer(); + private System.Timers.Timer timer2 = new System.Timers.Timer(); + private System.Timers.Timer timer3 = new System.Timers.Timer(); + private DateTime _hdastart = DateTime.Now; + private DateTime _alarmstart = DateTime.Now; + + #region DAServer(标签数据服务器) + public ITag this[short id] + { + get + { + int index = GetItemProperties(id); + if (index >= 0) + { + return this[_list[index].Name]; + } + return null; + } + } + + public ITag this[string name] + { + get + { + if (string.IsNullOrEmpty(name)) return null; + ITag dataItem; + _mapping.TryGetValue(name.ToUpper(), out dataItem); + return dataItem; + } + } + + List _list; + public IList MetaDataList + { + get + { + return _list; + } + } + + public IList ScalingList + { + get + { + return _scales; + } + } + + object _syncRoot; + public object SyncRoot + { + get + { + if (this._syncRoot == null) + { + Interlocked.CompareExchange(ref this._syncRoot, new object(), null); + } + return this._syncRoot; + } + } + + bool _hasHda = false; + List _hda; + Dictionary _archiveTimes = new Dictionary(); + + Socket tcpServer = null; + + Dictionary _socketThreadList; + public Dictionary SocketList + { + get + { + return _socketThreadList; + } + } + + Dictionary _mapping; + + List _scales; + + SortedList _drivers; + public IEnumerable Drivers + { + get { return _drivers.Values; } + } + + CompareCondBySource _compare; + + ExpressionEval reval; + public ExpressionEval Eval + { + get + { + return reval; + } + } + + private object _myLock = new object(); + Dictionary _archiveList = null;//是否需要lock + public Dictionary ArchiveList + { + get + { + lock (_myLock) + { + if (_archiveList == null) + { + var list = MetaDataList.Where(x => x.Archive).Select(y => y.ID);//&& x.DataType != DataType.BOOL + if (list != null && list.Count() > 0) + { + string sql = "SELECT TAGID,DESCRIPTION FROM META_TAG WHERE TAGID IN(" + string.Join(",", list) + ");"; + using (var reader = DataHelper.Instance.ExecuteReader(sql)) + { + if (reader != null) + { + _archiveList = new Dictionary(); + while (reader.Read()) + { + _archiveList.Add(reader.GetInt16(0), reader.GetNullableString(1)); + } + } + } + } + } + } + return _archiveList; + } + } + + public DAService() + { + var loggerFactory = new LoggerFactory(); + Func filter = (category, level) => true; + loggerFactory.AddProvider( new ConsoleLoggerProvider(filter, false)); + loggerFactory.AddProvider(new DebugLoggerProvider(filter)); + Log = loggerFactory.CreateLogger(SERVICELOGSOURCE); + InitServerByXml(); + _scales = new List(); + _drivers = new SortedList(); + _alarmList = new List(ALARMLIMIT + 10); + reval = new ExpressionEval(this); + _hda = new List(); + InitServerByDatabase(); + InitConnection(); + _socketThreadList = new Dictionary(); + InitHost(); + + timer1.Elapsed += timer1_Elapsed; + timer2.Elapsed += timer2_Elapsed; + timer3.Elapsed += timer3_Elapsed; + timer1.Interval = CYCLE; + timer1.Enabled = true; + timer1.Start(); + timer2.Interval = CYCLE2; + timer2.Enabled = true; + timer2.Start(); + if (_hasHda) + { + foreach (var item in _archiveTimes.Values) + { + if (item != null) + { + timer3.Interval = ARCHIVEINTERVAL; + timer3.Enabled = true; + timer3.Start(); + return; + } + } + } + } + + public void Dispose() + { + lock (this) + { + try + { + if (timer1 != null) + timer1.Dispose(); + if (timer2 != null) + timer2.Dispose(); + if (timer3 != null) + timer3.Dispose(); + if (_drivers != null) + { + foreach (var driver in Drivers) + { + driver.OnClose -= this.reader_OnClose; + driver.Dispose(); + } + foreach (var condition in _conditionList) + { + if (condition != null) + condition.AlarmActive -= cond_SendAlarm; + } + + if (_hasHda) + { + Flush(); + //hda.Clear(); + } + SaveAlarm(); + foreach (var socket in _socketThreadList.Values) + { + socket.Dispose(); + } + if (tcpServer != null && tcpServer.Connected) + tcpServer.Disconnect(false); + + _mapping.Clear(); + _conditionList.Clear(); + reval.Dispose(); + } + } + catch (Exception e) + { + AddErrorLog(e); + } + } + } + + public void AddErrorLog(Exception e) + { + Log.LogError(e.GetExceptionMsg()); + } + + private void timer1_Elapsed(object sender, ElapsedEventArgs e) + { + foreach (IDriver d in Drivers) + { + if (d.IsClosed) + { + d.Connect();//t.IsAlive可加入判断;如线程异常,重新启动。 + } + } + } + + private void timer2_Elapsed(object sender, ElapsedEventArgs e) + { + if (HDADELAY > 0 && _hda.Count > 0 && (DateTime.Now - _hdastart).TotalMilliseconds > HDADELAY) + { + lock (_hdaRoot) + { + ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(this.SaveCachedData), _hda.ToArray()); + _hda.Clear(); + } + } + if (ALARMDELAY > 0 && _alarmList.Count > 0 && (DateTime.Now - _alarmstart).TotalMilliseconds > ALARMDELAY) + SaveAlarm(); + DateTime today = DateTime.Today; + try + { + if (e.SignalTime > today.AddHours(2)) + { + DateTime startTime = DateTime.MinValue; + DateTime endTime = DateTime.MaxValue; + HDAIOHelper.GetRangeFromDatabase(null, ref startTime, ref endTime); + if (startTime >= today || startTime == DateTime.MinValue) + { + return; + } + bool success = true; + if (endTime < today && _hda.Count > 0 && _hda[0].TimeStamp < today) + { + success = SaveRange(endTime, today); + } + if (success) + { + startTime = startTime.Date.AddDays(1); + endTime = endTime.Date.AddDays(1); + if (endTime >= today) endTime = today; + while (startTime <= endTime) + { + HDAIOHelper.BackUpFile(startTime); + startTime = startTime.AddDays(1); + } + } + } + } + catch (Exception err) + { + AddErrorLog(err); + } + } + + private void timer3_Elapsed(object sender, ElapsedEventArgs e) + { + var now = e.SignalTime; + List tempData = new List(); + foreach (var archive in _archiveTimes) + { + var archiveTime = archive.Value; + if (archiveTime != null && (now - archiveTime.LastTime).TotalMilliseconds > archiveTime.Cycle) + { + var tag = this[archive.Key]; + if (tag != null && tag.TimeStamp > archiveTime.LastTime) + { + tempData.Add(new HistoryData(tag.ID, tag.Quality, tag.Value, now)); + archive.Value.LastTime = now; + } + } + } + if (tempData.Count > 0) + { + ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(this.OnUpdate), tempData); + } + //var result = from item in _archiveTimes where item.Value.Cycle > 0 && (now - item.Value.LastTime).Milliseconds > item.Value.Cycle select item.Key; + } + + #region 初始化(标签数据服务器) + void InitConnection() + { + foreach (IDriver reader in _drivers.Values) + { + reader.OnClose += new ShutdownRequestEventHandler(reader_OnClose); + if (reader.IsClosed) + { + //if (reader is IFileDriver) + reader.Connect(); + } + foreach (IGroup grp in reader.Groups) + { + grp.DataChange += new DataChangeEventHandler(grp_DataChange); + //可在此加入判断,如为ClientDriver发出,则变化数据毋须广播,只需归档。 + grp.IsActive = grp.IsActive; + } + } + //此处需改进,与Condition采用相同的处理方式,可配置 + } + + void InitServerByDatabase() + { + using (var dataReader = DataHelper.Instance.ExecuteProcedureReader("InitServer", DataHelper.CreateParam("@TYPE", SqlDbType.Int, 0))) + { + if (dataReader == null) return;// Stopwatch sw = Stopwatch.StartNew(); + while (dataReader.Read()) + { + AddDriver(dataReader.GetInt16(0), dataReader.GetNullableString(1), + dataReader.GetNullableString(2), dataReader.GetInt32(3), dataReader.GetNullableString(4), dataReader.GetNullableString(5), + dataReader.GetNullableString(6), dataReader.GetNullableString(7)); + } + + dataReader.NextResult(); + dataReader.Read(); + int count = dataReader.GetInt32(0); + _list = new List(count); + _mapping = new Dictionary(count); + dataReader.NextResult(); + while (dataReader.Read()) + { + var meta = new TagMetaData(dataReader.GetInt16(0), dataReader.GetInt16(1), dataReader.GetString(2), dataReader.GetString(3), (DataType)dataReader.GetByte(4), + (ushort)dataReader.GetInt16(5), dataReader.GetBoolean(6), dataReader.GetFloat(7), dataReader.GetFloat(8), dataReader.GetInt32(9)); + _list.Add(meta); + if (meta.Archive) + { + _archiveTimes.Add(meta.ID, meta.Cycle == 0 ? null : new ArchiveTime(meta.Cycle, DateTime.MinValue)); + } + //Advise(DDETOPIC, meta.Name); + } + _list.Sort(); + dataReader.NextResult(); + while (dataReader.Read()) + { + IDriver dv; + _drivers.TryGetValue(dataReader.GetInt16(0), out dv); + if (dv != null) + { + IGroup grp = dv.AddGroup(dataReader.GetString(1), dataReader.GetInt16(2), dataReader.GetInt32(3), + dataReader.GetFloat(4), dataReader.GetBoolean(5)); + if (grp != null) + grp.AddItems(_list); + } + } + dataReader.NextResult(); + while (dataReader.Read()) + { + ITag tag = this[dataReader.GetNullableString(0)]; + if (tag != null) + { + tag.ValueChanged += OnValueChanged; + } + } + dataReader.NextResult(); + _conditions = new List(); + _conditionList = new List(); + while (dataReader.Read()) + { + int id = dataReader.GetInt32(0); + AlarmType type = (AlarmType)dataReader.GetInt32(2); + ICondition cond; + string source = dataReader.GetString(1); + if (_conditions.Count > 0) + { + cond = _conditions[_conditions.Count - 1]; + if (cond.ID == id) + { + cond.AddSubCondition(new SubCondition((SubAlarmType)dataReader.GetInt32(9), dataReader.GetFloat(10), + (Severity)dataReader.GetByte(11), dataReader.GetString(12), dataReader.GetBoolean(13))); + continue; + } + } + switch (type) + { + case AlarmType.Complex: + cond = new ComplexCondition(id, source, dataReader.GetString(6), dataReader.GetFloat(7), dataReader.GetInt32(8)); + break; + case AlarmType.Level: + cond = new LevelAlarm(id, source, dataReader.GetString(6), dataReader.GetFloat(7), dataReader.GetInt32(8)); + break; + case AlarmType.Dev: + cond = new DevAlarm(id, (ConditionType)dataReader.GetByte(4), source, dataReader.GetString(6), + dataReader.GetFloat(5), dataReader.GetFloat(7), dataReader.GetInt32(8)); + break; + case AlarmType.ROC: + cond = new ROCAlarm(id, source, dataReader.GetString(6), dataReader.GetFloat(7), dataReader.GetInt32(8)); + break; + case AlarmType.Quality: + cond = new QualitiesAlarm(id, source, dataReader.GetString(6)); + break; + case AlarmType.WordDsc: + cond = new WordDigitAlarm(id, source, dataReader.GetString(6), dataReader.GetInt32(8)); + break; + default: + cond = new DigitAlarm(id, source, dataReader.GetString(6), dataReader.GetInt32(8)); + break; + } + cond.AddSubCondition(new SubCondition((SubAlarmType)dataReader.GetInt32(9), dataReader.GetFloat(10), + (Severity)dataReader.GetByte(11), dataReader.GetString(12), dataReader.GetBoolean(13))); + + cond.IsEnabled = dataReader.GetBoolean(3); + var simpcond = cond as SimpleCondition; + if (simpcond != null) + { + simpcond.Tag = this[source]; + } + else + { + var complexcond = cond as ComplexCondition; + if (complexcond != null) + { + var action = complexcond.SetFunction(reval.Eval(source)); + if (action != null) + { + ValueChangedEventHandler handle = (s1, e1) => { action(); }; + foreach (ITag tag in reval.TagList) + { + tag.ValueChanged += handle;// tag.Refresh(); + } + } + } + } + cond.AlarmActive += new AlarmEventHandler(cond_SendAlarm); + //_conditions.Add(cond);// UpdateCondition(cond); + _conditions.Add(cond); + } + dataReader.NextResult(); + while (dataReader.Read()) + { + _scales.Add(new Scaling(dataReader.GetInt16(0), (ScaleType)dataReader.GetByte(1), + dataReader.GetFloat(2), dataReader.GetFloat(3), dataReader.GetFloat(4), dataReader.GetFloat(5))); + } + } + if (_archiveTimes.Count > 0) + { + _hasHda = true; + _hda.Capacity = MAXHDACAP; + } + reval.Clear(); + _scales.Sort(); + _compare = new CompareCondBySource(); + _conditions.Sort(_compare); + } + + void InitHost() + { + /*对关闭状态的判断,最好用心跳检测;冗余切换,可广播冗余命令,包含新主机名、数据库连接、IP地址等。 + * 服务启动时,向整个局域网UDP广播加密的主机名、连接字符串等信息 + */ + //socketThreadList = new Dictionary(); + tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IPEndPoint LocalPort = new IPEndPoint(IPAddress.Any, PORT); + tcpServer.Bind(LocalPort); + tcpServer.Listen(100); + ThreadPool.QueueUserWorkItem(new WaitCallback(AcceptWorkThread)); + } + + void InitServerByXml() + { + string path = PATH + '\\' + FILENAME; + if (File.Exists(path)) + { + try + { + using (var reader = XmlTextReader.Create(path)) + { + while (reader.Read()) + { + if (reader.NodeType == XmlNodeType.Element) + { + switch (reader.Name) + { + case "Server": + { + if (reader.MoveToAttribute("MaxLogSize")) + int.TryParse(reader.Value, out MAXLOGSIZE); + } + break; + case "Data": + { + if (reader.MoveToAttribute("TestCycle")) + int.TryParse(reader.Value, out CYCLE); + if (reader.MoveToAttribute("SendTimeout")) + int.TryParse(reader.Value, out SENDTIMEOUT); + } + break; + case "Hda": + { + if (reader.MoveToAttribute("MaxHdaCap")) + { + int.TryParse(reader.Value, out MAXHDACAP); + } + if (reader.MoveToAttribute("HdaLen")) + int.TryParse(reader.Value, out HDALEN); + if (reader.MoveToAttribute("WriteCycle")) + int.TryParse(reader.Value, out CYCLE2); + if (reader.MoveToAttribute("Delay")) + int.TryParse(reader.Value, out HDADELAY); + if (reader.MoveToAttribute("Interval")) + int.TryParse(reader.Value, out ARCHIVEINTERVAL); + } + break; + case "Alarm": + { + if (reader.MoveToAttribute("AlarmLimit")) + int.TryParse(reader.Value, out ALARMLIMIT); + if (reader.MoveToAttribute("Delay")) + int.TryParse(reader.Value, out ALARMDELAY); + } + break; + } + } + } + } + } + catch (Exception err) + { + AddErrorLog(err); + } + } + } + #endregion + + void AcceptWorkThread(object state) + { + while (true) + { + //if (tcpServer.Poll(0, SelectMode.SelectRead)) + Socket s_Accept = tcpServer.Accept(); + //IPAddress addr = (s_Accept.RemoteEndPoint as IPEndPoint).Address; + s_Accept.SendTimeout = SENDTIMEOUT; + IPAddress addr = (s_Accept.RemoteEndPoint as IPEndPoint).Address; + try + { + if (!_socketThreadList.ContainsKey(addr)) + _socketThreadList.Add(addr, s_Accept); + } + catch (Exception err) + { + AddErrorLog(err); + } + ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ReceiveWorkThread), s_Accept); + } + } + + void ReceiveWorkThread(object obj) + { + Socket s_Receive = (Socket)obj; + IPAddress addr = null; + try + { + addr = (s_Receive.RemoteEndPoint as IPEndPoint).Address; + } + catch (Exception err) + { + AddErrorLog(err); + return; + } + byte[] buffer = new byte[s_Receive.ReceiveBufferSize]; // 创建接收缓冲 + while (true) + { + try + { + if (addr == null || !_socketThreadList.ContainsKey(addr)) return; + /*if (!s_Receive.Connected) return; + 关于数据传输协议:命令可分为:订单指令(订单类型,增删改标记可各用一个字段,路径ID用GUID,路径状态包括暂停、继续 + 、终止、启动);可返回客户端一个可行的路径设备链、ERP交换数据指令(包含DATASET),冗余切换指令等) + */ + int ReceiveCount = s_Receive.Receive(buffer); + + if (buffer[0] == FCTCOMMAND.fctHead) + { + //buffer[0]是协议头,1是指令号,2是读方式(缓存还是设备),3、4是ID,5是长度,后接变量值 + byte command = buffer[1]; + switch (command) + { + case FCTCOMMAND.fctReadSingle: + { + //DataSource source = buffer[2] == 0 ? DataSource.Cache : DataSource.Device; + short id = BitConverter.ToInt16(buffer, 3); + byte length = buffer[5]; + byte[] send = new byte[5 + length]; + for (int i = 0; i < 5; i++) + { + send[i] = buffer[i]; + } + ITag tag = this[id]; + if (tag != null) + { + Storage value = buffer[2] == 0 ? tag.Value : tag.Read(DataSource.Device); + byte[] bt = tag.ToByteArray(value); + for (int k = 0; k < bt.Length; k++) + { + send[5 + k] = bt[k]; + } + } + else + { + //出错处理,可考虑返回一个DATATYPE.NONE类型 + } + s_Receive.Send(send); + } + break; + case FCTCOMMAND.fctReadMultiple: + { + //buffer[0]是协议头,1是指令号,2是读方式(缓存还是设备),3、4是变量数,后接变量值 + //DataSource source = buffer[2] == 0 ? DataSource.Cache : DataSource.Device; + byte[] send = new byte[s_Receive.SendBufferSize]; + send[0] = FCTCOMMAND.fctHead; + short count = BitConverter.ToInt16(buffer, 3);//要读取的变量数 + int j = 5; int l = 5; + if (buffer[2] == 0) + { + for (int i = 0; i < count; i++) + { + short id = BitConverter.ToInt16(buffer, l); + send[j++] = buffer[l++]; + send[j++] = buffer[l++]; + ITag tag = this[id]; + if (tag != null) + { + byte[] bt = tag.ToByteArray(); + var length = (byte)bt.Length; + send[j++] = length; + for (int k = 0; k < length; k++) + { + send[j + k] = bt[k]; + } + j += length; + } + else + {//类型后跟长度 + send[j++] = 0; + } + } + } + else + { + Dictionary> dict = new Dictionary>(); + for (int i = 0; i < count; i++) + { + short id = BitConverter.ToInt16(buffer, l); + l += 2; + ITag tag = this[id]; + if (tag != null) + { + IGroup grp = tag.Parent; + if (!dict.ContainsKey(grp)) + dict.Add(grp, new List { tag }); + else + dict[grp].Add(tag); + } + } + foreach (var dev in dict) + { + var list = dev.Value; + var array = dev.Key.BatchRead(DataSource.Device, true, list.ToArray()); + if (array == null) continue; + for (int i = 0; i < list.Count; i++) + { + byte[] bt = list[i].ToByteArray(array[i].Value); + var length = (byte)bt.Length; + send[j++] = length; + for (int k = 0; k < bt.Length; k++) + { + send[j + k] = bt[k]; + } + j += length; + } + } + } + s_Receive.Send(send, 0, j, SocketFlags.None); + } + break; + case FCTCOMMAND.fctWriteSingle: + { + //buffer[0]是协议头,1是指令号,2是写方式(缓存还是设备),3、4是ID,5是长度 + short id = BitConverter.ToInt16(buffer, 3); + byte rs = 0; + ITag tag = this[id]; + if (tag != null)//此处应考虑万一写失败,是否需要更新值 + { + if (tag.Address.VarType == DataType.STR) + { + StringTag strTag = tag as StringTag; + if (strTag != null) + { + string txt = Encoding.ASCII.GetString(buffer, 6, buffer[5]).Trim((char)0); + rs = (byte)tag.Write(txt); + if (rs == 0) + strTag.String = txt; + } + } + else + { + Storage value = Storage.Empty; + switch (tag.Address.VarType) + { + case DataType.BOOL: + value.Boolean = BitConverter.ToBoolean(buffer, 6); + break; + case DataType.BYTE: + value.Byte = buffer[6]; + break; + case DataType.WORD: + case DataType.SHORT: + value.Int16 = BitConverter.ToInt16(buffer, 6); + break; + case DataType.TIME: + case DataType.INT: + value.Int32 = BitConverter.ToInt32(buffer, 6); + break; + case DataType.FLOAT: + value.Single = BitConverter.ToSingle(buffer, 6); + break; + default: + break; + } + rs = (byte)tag.Write(value, false); + } + } + else + { + rs = 0xFF;//此处长度应注意;如无此变量,应返回一个错误代码 + } + s_Receive.Send(new byte[] { FCTCOMMAND.fctWriteSingle, rs }, 0, 2, SocketFlags.None);//应返回一个错误代码; + } + break; + case FCTCOMMAND.fctWriteMultiple: + { //int BatchWrite(IDictionary items, bool isSync = true); + int count = BitConverter.ToInt16(buffer, 2); + int j = 4; byte rs = 0; + Dictionary> dict = new Dictionary>(); + for (int i = 0; i < count; i++) + { + short id = BitConverter.ToInt16(buffer, j); + j += 2; + byte length = buffer[j++]; + ITag tag = this[id]; + IGroup grp = tag.Parent; + SortedDictionary values; + if (!dict.ContainsKey(grp)) + { + values = new SortedDictionary(); + dict.Add(grp, values); + } + else + values = dict[grp]; + if (tag != null) + { + switch (tag.Address.VarType) + { + case DataType.BOOL: + values.Add(tag, BitConverter.ToBoolean(buffer, j)); + break; + case DataType.BYTE: + values.Add(tag, buffer[j]); + break; + case DataType.WORD: + case DataType.SHORT: + values.Add(tag, BitConverter.ToInt16(buffer, j)); + break; + case DataType.TIME: + case DataType.INT: + values.Add(tag, BitConverter.ToInt32(buffer, j)); + break; + case DataType.FLOAT: + values.Add(tag, BitConverter.ToSingle(buffer, j)); + break; + case DataType.STR: + values.Add(tag, Encoding.ASCII.GetString(buffer, j, length).Trim((char)0)); + break; + } + } + j += length; + } + foreach (var dev in dict) + { + if (dev.Key.BatchWrite(dev.Value) < 0) rs = 0xFF; + } + s_Receive.Send(new byte[] { FCTCOMMAND.fctWriteMultiple, rs }, 0, 2, SocketFlags.None); + } + break; + case FCTCOMMAND.fctAlarmRequest://刷新报警数据 + { + if (_alarmList.Count > 0) + { + long startTime = BitConverter.ToInt64(buffer, 2); + long endTime = BitConverter.ToInt64(buffer, 10); + if (_alarmstart > DateTime.FromFileTime(startTime) || DateTime.FromFileTime(endTime) > _alarmstart) + { + SaveAlarm(); + } + } + s_Receive.Send(new byte[] { FCTCOMMAND.fctAlarmRequest, 0 }, 0, 2, SocketFlags.None); + } + break; + case FCTCOMMAND.fctReset://重置连接 + { + byte[] iparry = new byte[4]; + Array.Copy(buffer, 2, iparry, 0, 4); + IPAddress ipaddr = new IPAddress(iparry); + if (_socketThreadList.Count > 0 && _socketThreadList.ContainsKey(ipaddr)) + { + var scok = _socketThreadList[ipaddr]; + _socketThreadList.Remove(ipaddr); + if (scok != null) + { + scok.Dispose(); + } + } + } + break; + case FCTCOMMAND.fctHdaRequest: + { + DateTime start = DateTime.FromFileTime(BitConverter.ToInt64(buffer, 2)); + DateTime end = DateTime.FromFileTime(BitConverter.ToInt64(buffer, 10)); + try + { + SendHData(GetHData(start, end), new byte[HDALEN], s_Receive); + } + catch (Exception err) + { + AddErrorLog(err); + } + s_Receive.Send(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 24, SocketFlags.None); + } + break; + case FCTCOMMAND.fctHdaIdRequest://优先读取本地HDA文件夹下的二进制归档文件 + { + DateTime start = DateTime.FromFileTime(BitConverter.ToInt64(buffer, 2)); + DateTime end = DateTime.FromFileTime(BitConverter.ToInt64(buffer, 10)); + short ID = BitConverter.ToInt16(buffer, 18); + try + { + SendHData(GetHData(start, end, ID), new byte[HDALEN], s_Receive, this[ID]); + } + catch (Exception err) + { + AddErrorLog(err); + } + s_Receive.Send(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 24, SocketFlags.None); + } + break; + } + } + } + catch (SocketException ex) + { + var err = ex.SocketErrorCode; + if (err == SocketError.ConnectionAborted || err == SocketError.HostDown || err == SocketError.NetworkDown || err == SocketError.Shutdown || err == SocketError.ConnectionReset) + { + s_Receive.Dispose(); + if (addr != null) + _socketThreadList.Remove(addr); + //s_Receive.Dispose(); + } + AddErrorLog(ex); + } + catch (Exception ex) + { + AddErrorLog(ex); + } + } + } + + #region 历史数据归档查询 + private IEnumerable GetHData(DateTime start, DateTime end, short ID) + { + if (start > end) yield break; + DateTime now = DateTime.Now; + if (start > now) yield break; + if (end > now) end = now; + if (now.Date > start.Date) + { + DateTime tempstart = DateTime.MinValue; + DateTime tempend = end; + HDAIOHelper.GetRangeFromDatabase(ID, ref tempend, ref tempstart); + if (tempend > end) tempend = end; + if (tempend > start) + { + int eyear = tempend.Year; + int syear = start.Year; + int emonth = tempend.Month; + int smonth = start.Month; + int year = syear; + while (year <= eyear) + { + int month = (year == syear ? smonth : 1); + while (month <= (year == eyear ? emonth : 12)) + { + var result = HDAIOHelper.LoadFromFile((year == syear && month == smonth ? start : new DateTime(year, month, 1)), + (year == eyear && month == emonth ? tempend : new DateTime(year, month, 1).AddMonths(1).AddMilliseconds(-2)), ID);//考虑按月遍历 + if (result != null) + { + foreach (var data in result) + { + yield return data; + } + } + month++; + } + year++; + } + } + } + var tempdata = _hda.ToArray(); + DateTime ftime = (tempdata.Length > 0 ? tempdata[0].TimeStamp : DateTime.Now); + if (start < ftime) + { + var result = HDAIOHelper.LoadFromDatabase(start, ftime > end ? end : ftime, ID);//范围冲突 + if (result != null) + { + foreach (var data in result) + { + yield return data; + } + } + } + if (end > ftime) + { + var result = tempdata.Where(x => x.ID == ID && x.TimeStamp >= ftime && x.TimeStamp <= end); + if (result != null) + { + foreach (var data in result) + { + yield return data; + } + } + } + yield break; + } + + private IEnumerable GetHData(DateTime start, DateTime end) + { + if (start > end) yield break; + DateTime now = DateTime.Now; + if (start > now) yield break; + if (end > now) end = now; + if (now.Date > start.Date) + { + DateTime tempstart = DateTime.MinValue; + DateTime tempend = end; + HDAIOHelper.GetRangeFromDatabase(null, ref tempend, ref tempstart); + if (tempend > start) + { + int eyear = tempend.Year; + int syear = start.Year; + int emonth = tempend.Month; + int smonth = start.Month; + int year = syear; + while (year <= eyear) + { + int month = (year == syear ? smonth : 1); + while (month <= (year == eyear ? emonth : 12)) + { + var result = HDAIOHelper.LoadFromFile((year == syear && month == smonth ? start : new DateTime(year, month, 1)), + (year == eyear && month == emonth ? tempend : new DateTime(year, month, 1).AddMonths(1).AddMilliseconds(-2)));//考虑按月遍历 + if (result != null) + { + foreach (var data in result) + { + yield return data; + } + } + month++; + } + year++; + } + } + } + var tempdata = _hda.ToArray(); + DateTime ftime = (tempdata.Length > 0 ? tempdata[0].TimeStamp : DateTime.Now); + if (start < ftime) + { + var result = HDAIOHelper.LoadFromDatabase(start, ftime > end ? end : ftime);//范围冲突 + if (result != null) + { + foreach (var data in result) + { + yield return data; + } + } + } + if (end > ftime) + { + var result = tempdata.Where(x => x.TimeStamp >= ftime && x.TimeStamp <= end); + if (result != null) + { + foreach (var data in result) + { + yield return data; + } + } + } + yield break; + } + + private void SendHData(IEnumerable result, byte[] buffer, Socket socket, ITag tag) + { + if (result == null || tag == null || socket == null || !socket.Connected) return; + int index = 0; + int len = buffer.Length; + int size = tag.Address.DataSize; + foreach (var data in result) + { + if (index + 8 + size >= len) + { + //s_Receive.BeginSend(tempbuffer, 0, index, SocketFlags.None, null, null); + socket.Send(buffer, index, SocketFlags.None); + index = 0; + } + byte[] bits = tag.ToByteArray(data.Value); + bits.CopyTo(buffer, index); + index += size; + bits = BitConverter.GetBytes(data.TimeStamp.ToFileTime()); + bits.CopyTo(buffer, index); + index += 8; + } + socket.Send(buffer, index, SocketFlags.None); + } + + private void SendHData(IEnumerable result, byte[] buffer, Socket socket) + { + if (result == null || socket == null || !socket.Connected) return; + int index = 0; + int len = buffer.Length; + short tempid = short.MinValue; + ITag tag = null; + byte[] idarray = new byte[2]; + foreach (var data in result) + { + if (tempid != data.ID) + { + tempid = data.ID; + idarray = BitConverter.GetBytes(tempid); + tag = this[tempid]; + } + if (tag == null) continue; + int size = tag.Address.DataSize; + if (index + 10 + size >= len) + { + //s_Receive.BeginSend(tempbuffer, 0, index, SocketFlags.None, null, null);这里有一个同步的问题,发生ID号错位。 + socket.Send(buffer, index, SocketFlags.None); + index = 0; + } + idarray.CopyTo(buffer, index); + index += 2; + byte[] bits = tag.ToByteArray(data.Value); + bits.CopyTo(buffer, index); + index += size; + bits = BitConverter.GetBytes(data.TimeStamp.ToFileTime()); + bits.CopyTo(buffer, index); + index += 8; + } + socket.Send(buffer, index, SocketFlags.None); + } + + private object _hdaRoot = new object(); + public void Flush() + { + lock (_hdaRoot) + { + if (_hda.Count == 0) return; + if (DataHelper.Instance.BulkCopy(new HDASqlReader(_hda, this), "Log_HData", + string.Format("DELETE FROM Log_HData WHERE [TIMESTAMP]>'{0}'", _hda[0].TimeStamp.ToString()))) + { + _hda.Clear(); + _hdastart = DateTime.Now; + } + } + } + + public bool SaveRange(DateTime startTime, DateTime endTime) + { + var tempdata = _hda.ToArray(); + if (tempdata.Length == 0) return true; + return DataHelper.Instance.BulkCopy(new HDASqlReader(GetData(tempdata, startTime, endTime), this), "Log_HData", + string.Format("DELETE FROM Log_HData WHERE [TIMESTAMP] BETWEEN '{0}' AND '{1}'", startTime, endTime)); + } + + public void OnUpdate(object stateInfo) + { + lock (_hdaRoot) + { + var tempData = (List)stateInfo; + _hda.AddRange(tempData); + if (_hda.Count >= MAXHDACAP) + { + //Reverse(data); + DateTime start = _hda[0].TimeStamp; + //_array.CopyTo(data, 0); + if (DataHelper.Instance.BulkCopy(new HDASqlReader(_hda, this), "Log_HData", + string.Format("DELETE FROM Log_HData WHERE [TIMESTAMP]>'{0}'", start.ToString()))) + _hdastart = DateTime.Now; + else ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(this.SaveCachedData), _hda.ToArray()); + _hda.Clear(); + } + } + } + + public void SaveCachedData(object stateInfo) + { + var tempData = (HistoryData[])stateInfo; + if (tempData.Length == 0) return; + DateTime startTime = tempData[0].TimeStamp; + DateTime endTime = tempData[tempData.Length - 1].TimeStamp; + //Thread.Sleep(TimeSpan.FromMinutes(10)); + int count = 0; + while (true) + { + if (count >= 5) return; + if (DataHelper.Instance.BulkCopy(new HDASqlReader(tempData, this), "Log_HData", + string.Format("DELETE FROM Log_HData WHERE [TIMESTAMP] BETWEEN '{0}' AND '{1}'", + startTime, endTime))) + { + stateInfo = null; + _hdastart = DateTime.Now; + } + count++; + Thread.Sleep(CYCLE2); + } + } + + public IEnumerable GetData(HistoryData[] hdaarray, DateTime startTime, DateTime endTime) + { + //if (hdaarray.Length == 0) yield break; + foreach (var data in hdaarray) + { + if (data.TimeStamp >= startTime) + { + if (data.TimeStamp <= endTime) + yield return data; + else + yield break; + } + } + } + #endregion + + void OnValueChanged(object sender, ValueChangedEventArgs e) + { + var tag = sender as ITag; + DataHelper.Instance.ExecuteStoredProcedure("AddEventLog", + DataHelper.CreateParam("@StartTime", SqlDbType.DateTime, tag.TimeStamp), + DataHelper.CreateParam("@Source", SqlDbType.NVarChar, tag.ID.ToString(), 50), + DataHelper.CreateParam("@StartTime", SqlDbType.NVarChar, tag.ToString(), 50)); + } + + public HistoryData[] BatchRead(DataSource source, bool sync, params ITag[] itemArray) + { + int count = itemArray.Length; + HistoryData[] data = new HistoryData[count]; + Dictionary> dict = new Dictionary>(); + for (int i = 0; i < count; i++) + { + short id = itemArray[i].ID; + ITag tag = this[id]; + if (tag != null) + { + IGroup grp = tag.Parent; + if (!dict.ContainsKey(grp)) + dict.Add(grp, new List { tag }); + else + dict[grp].Add(tag); + } + } + int j = 0; + foreach (var dev in dict) + { + var list = dev.Value; + var array = dev.Key.BatchRead(source, sync, list.ToArray()); + if (array == null) continue; + Array.Copy(array, 0, data, j, array.Length); + j += array.Length; + } + return data; + } + + public int BatchWrite(Dictionary tags, bool sync) + { + int rs = -1; + Dictionary> dict = new Dictionary>(); + foreach (var item in tags) + { + var tag = this[item.Key]; + if (tag != null) + { + IGroup grp = tag.Parent; + SortedDictionary values; + if (!dict.ContainsKey(grp)) + { + values = new SortedDictionary(); + if (tag.Address.VarType != DataType.BOOL && tag.Address.VarType != DataType.STR) + { + values.Add(tag, tag.ValueToScale(Convert.ToSingle(item.Value))); + } + else + values.Add(tag, item.Value); + dict.Add(grp, values); + } + else + { + values = dict[grp]; + if (tag.Address.VarType != DataType.BOOL && tag.Address.VarType != DataType.STR) + { + values.Add(tag, tag.ValueToScale(Convert.ToSingle(item.Value))); + } + else + values.Add(tag, item.Value); + } + } + else Log.LogError(string.Format("变量{0}不在变量表中,无法下载", item.Key)); + } + foreach (var dev in dict) + { + rs = dev.Key.BatchWrite(dev.Value, sync); + } + return rs; + } + + void grp_DataChange(object sender, DataChangeEventArgs e) + { + var data = e.Values; + var now = DateTime.Now; + if (_hasHda) + { + ArchiveTime archiveTime; + List tempData = new List(20); + for (int i = 0; i < data.Count; i++) + { + if (_archiveTimes.TryGetValue(data[i].ID, out archiveTime) && archiveTime == null && data[i].TimeStamp != DateTime.MinValue) + { + tempData.Add(data[i]); + } + } + if (tempData.Count > 0) + { + ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(this.OnUpdate), tempData); + } + } + if (_socketThreadList != null && _socketThreadList.Count > 0) + { + IPAddress addr = null; + var grp = sender as ClientGroup; + if (grp != null) + addr = grp.RemoteAddress; + ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(this.SendData), new TempCachedData(addr, data)); + } + } + //此处发生内存泄漏;需要试验CLRProfile确定泄漏原因;改回原方法测试;看是否解决队列堵塞问题。对于客户端Grp,要过滤掉 + private void SendData(object obj) + { + var tempdata = obj as TempCachedData; + var data = tempdata.Data; + byte[] sendBuffer = new byte[8192]; + sendBuffer[0] = FCTCOMMAND.fctHead; + sendBuffer[1] = FCTCOMMAND.fctReadMultiple; + //bytes[2] = 0; + int len = data.Count; + short j = 5; + for (int i = 0; i < len; i++) + { + short id = data[i].ID; + byte[] dt = BitConverter.GetBytes(id); + sendBuffer[j++] = dt[0]; + sendBuffer[j++] = dt[1]; + switch (_list[GetItemProperties(id)].DataType) + { + case DataType.BOOL: + sendBuffer[j++] = 1; + sendBuffer[j++] = data[i].Value.Boolean ? (byte)1 : (byte)0; + break; + case DataType.BYTE: + sendBuffer[j++] = 1; + sendBuffer[j++] = data[i].Value.Byte; + break; + case DataType.WORD: + case DataType.SHORT: + { + sendBuffer[j++] = 2; + byte[] bt = BitConverter.GetBytes(data[i].Value.Int16); + sendBuffer[j++] = bt[0]; + sendBuffer[j++] = bt[1]; + } + break; + case DataType.TIME: + case DataType.INT: + { + sendBuffer[j++] = 4; + byte[] bt = BitConverter.GetBytes(data[i].Value.Int32); + sendBuffer[j++] = bt[0]; + sendBuffer[j++] = bt[1]; + sendBuffer[j++] = bt[2]; + sendBuffer[j++] = bt[3]; + } + break; + case DataType.FLOAT: + { + sendBuffer[j++] = 4; + byte[] bt = BitConverter.GetBytes(data[i].Value.Single); + sendBuffer[j++] = bt[0]; + sendBuffer[j++] = bt[1]; + sendBuffer[j++] = bt[2]; + sendBuffer[j++] = bt[3]; + } + break; + case DataType.STR: + { + byte[] bt = Encoding.ASCII.GetBytes(this[data[i].ID].ToString()); + sendBuffer[j++] = (byte)bt.Length; + for (int k = 0; k < bt.Length; k++) + { + sendBuffer[j++] = bt[k]; + } + } + break; + default: + break; + } + Array.Copy(BitConverter.GetBytes((data[i].TimeStamp == DateTime.MinValue ? DateTime.Now : data[i].TimeStamp).ToFileTime()), 0, sendBuffer, j, 8); + j += 8; + } + byte[] dt1 = BitConverter.GetBytes(j); + sendBuffer[3] = dt1[0]; + sendBuffer[4] = dt1[1]; + SocketError err; + //bytes.CopyTo(bytes2, 0); + List sockets = new List(_socketThreadList.Count); + foreach (var socket in _socketThreadList) + { + if (!socket.Key.Equals(tempdata.Address)) + sockets.Add(socket.Value); + } + data = null; + obj = null; + tempdata = null; + foreach (var socket in sockets) + { + try + { + socket.Send(sendBuffer, 0, j, SocketFlags.None, out err); + if (err == SocketError.ConnectionAborted || err == SocketError.HostDown || + err == SocketError.NetworkDown || err == SocketError.Shutdown) + { + _socketThreadList.Remove((socket.RemoteEndPoint as IPEndPoint).Address); + } + } + catch (Exception ex1) + { + AddErrorLog(ex1); + } + } + } + + public IDriver AddDriver(short id, string name, string server, int timeOut, + string assembly, string className, string spare1, string spare2) + { + if (_drivers.ContainsKey(id)) + return _drivers[id]; + IDriver dv = null; + try + { + Assembly ass = Assembly.LoadFrom(assembly); + var dvType = ass.GetType(className); + if (dvType != null) + { + //dv = new ModbusDriver.ModbusTCPReader(this, id, name, server, timeOut); + dv = Activator.CreateInstance(dvType, new object[] { this, id, name, server, timeOut, spare1, spare2 }) as IDriver; + if (dv != null) + _drivers.Add(id, dv); + } + } + catch (Exception e) + { + AddErrorLog(e); + } + return dv; + } + + public bool RemoveDriver(IDriver device) + { + lock (SyncRoot) + { + if (_drivers.Remove(device.ID)) + { + device.Dispose(); + device = null; + return true; + } + return false; + } + } + + void reader_OnClose(object sender, ShutdownRequestEventArgs e) + { + Log.LogWarning(e.shutdownReason); + //AddErrorLog(new Exception(e.shutdownReason)); + } + + public bool AddItemIndex(string key, ITag value) + { + key = key.ToUpper(); + if (_mapping.ContainsKey(key)) + return false; + _mapping.Add(key, value); + return true; + } + + public bool RemoveItemIndex(string key) + { + return _mapping.Remove(key.ToUpper()); + } + + + object _alarmsync = new object(); + + string[] itemList = null; + public IEnumerable BrowseItems(BrowseType browseType, string tagName, DataType dataType) + { + lock (SyncRoot) + { + if (_list.Count == 0) yield break; + int len = _list.Count; + if (itemList == null) + { + itemList = new string[len]; + for (int i = 0; i < len; i++) + { + itemList[i] = _list[i].Name; + } + Array.Sort(itemList); + } + int ii = 0; + bool hasTag = !string.IsNullOrEmpty(tagName); + bool first = true; + string str = hasTag ? tagName + SPLITCHAR : string.Empty; + if (hasTag) + { + ii = Array.BinarySearch(itemList, tagName); + if (ii < 0) first = false; + //int strLen = str.Length; + ii = Array.BinarySearch(itemList, str); + if (ii < 0) ii = ~ii; + } + //while (++i < len && temp.Length >= strLen && temp.Substring(0, strLen) == str) + do + { + if (first && hasTag) + { + first = false; + yield return tagName; + } + string temp = itemList[ii]; + if (hasTag && !temp.StartsWith(str, StringComparison.Ordinal)) + break; + if (dataType == DataType.NONE || _mapping[temp].Address.VarType == dataType) + { + bool b3 = true; + if (browseType != BrowseType.Flat) + { + string curr = temp + SPLITCHAR; + int index = Array.BinarySearch(itemList, ii, len - ii, curr); + if (index < 0) index = ~index; + b3 = itemList[index].StartsWith(curr, StringComparison.Ordinal); + if (browseType == BrowseType.Leaf) + b3 = !b3; + } + if (b3) + yield return temp; + } + } while (++ii < len); + } + } + + public int GetScaleByID(short Id) + { + if (_scales == null || _scales.Count == 0) return -1; + return _scales.BinarySearch(new Scaling { ID = Id }); + } + + public IGroup GetGroupByName(string name) + { + if (string.IsNullOrEmpty(name)) return null; + foreach (IDriver device in Drivers) + { + foreach (IGroup grp in device.Groups) + { + if (grp.Name == name) + return grp; + } + } + return null; + } + + public void ActiveItem(bool active, params ITag[] items) + { + Dictionary> dict = new Dictionary>(); + for (int i = 0; i < items.Length; i++) + { + List list = null; + ITag item = items[i]; + dict.TryGetValue(item.Parent, out list); + if (list != null) + { + list.Add(item.ID); + } + else + dict.Add(item.Parent, new List { item.ID }); + + } + foreach (var grp in dict) + { + grp.Key.SetActiveState(active, grp.Value.ToArray()); + } + } + + public int GetItemProperties(short id) + { + return _list.BinarySearch(new TagMetaData { ID = id }); + } + #endregion + + #region Condition & Alarm(报警和条件) + List _conditions; + List _conditionList; + + List _alarmList; + public IEnumerable AlarmList + { + get + { + return _alarmList; + } + } + + public IList ActivedConditionList + { + get + { + return _conditionList; + } + } + + public IList ConditionList + { + get + { + return _conditions; + } + } + + void cond_SendAlarm(object sender, AlarmItem e) + { + lock (_alarmsync) + { + int index2 = _conditions.BinarySearch(new DigitAlarm(0, e.Source), _compare); + if (index2 > -1) + { + var cond = _conditions[index2]; + _conditionList.Remove(cond); + if (e.SubAlarmType != SubAlarmType.None) + { + _conditionList.Add(cond); + } + } + + if (_alarmList.Count < ALARMLIMIT) + { + _alarmList.Add(e); + } + else + { + SaveAlarm(); + _alarmList.Add(e); + } + } + /*应加入判断,是否需要更新数据库(if(Index>=ALARMLIMIT){Save(); Index=0;}else Index++; + * 客户端查询前先发送一个查询报警(alarmQuery)请求,包含起始时间参数,服务器从判断是否要将缓存写入数据库, + * 待服务器返回就绪后,客户端再从数据库查询报警记录。 + */ + } + + private bool SaveAlarm() + { + if (_alarmList.Count == 0) return true; + if (DataHelper.Instance.BulkCopy(new AlarmDataReader(_alarmList), "Log_Alarm", null)) + { + _alarmList.Clear(); + _alarmstart = DateTime.Now; + return true; + } + return false; + } + + public ICondition GetCondition(string tagName, AlarmType type) + { + ITag tag = this[tagName]; + if (tag == null) return null; + short id = tag.ID; + int index = _conditions.BinarySearch(new DigitAlarm(0, tagName)); + if (index < 0) return null; + int ind1 = index - 1; + ICondition cond = _conditions[index]; + while (index < _conditions.Count && cond.Source == tagName) + { + cond = _conditions[index++]; + if (cond.AlarmType == type) + { + return cond; + } + } + while (ind1 >= 0 && cond.Source == tagName) + { + cond = _conditions[ind1--]; + if (cond.AlarmType == type) + { + return cond; + } + } + return null; + } + + public IList QueryConditions(string sourceName) + { + if (_conditions == null || sourceName == null) return null; + ITag tag = this[sourceName]; + if (tag == null) return null; + int index = _conditions.BinarySearch(new DigitAlarm(0, sourceName)); + if (index < 0) return null; + List condList = new List(); + ICondition cond = _conditions[index]; + int ind1 = index - 1; + while (cond.Source == sourceName) + { + condList.Add(cond); + if (++index < _conditions.Count) + cond = _conditions[index]; + else + break; + } + while (ind1 >= 0) + { + if (cond.Source == sourceName) + condList.Add(cond); + } + return condList; + } + + public int DisableCondition(string sourceName, AlarmType type) + { + var cond = GetCondition(sourceName, type); + if (cond != null) + { + cond.IsEnabled = false; + return 1; + } + return -1; + } + + public int EnableCondition(string sourceName, AlarmType type) + { + var cond = GetCondition(sourceName, type); + if (cond != null) + { + cond.IsEnabled = true; + return 1; + } + return -1; + } + + public int RemoveConditon(string sourceName, AlarmType type) + { + var cond = GetCondition(sourceName, type); + if (cond != null) + { + _conditions.Remove(cond); + return 1; + } + return -1; + } + + public int RemoveConditons(string sourceName) + { + ITag tag = this[sourceName]; + if (_conditions == null || tag == null) return -1; + int index = _conditions.BinarySearch(new DigitAlarm(0, sourceName)); + if (index < 0) return index; + int ind1 = index - 1; + ICondition cond = _conditions[index]; + List li = new List(); + while (cond.Source == sourceName) + { + li.Add(index); + if (++index < _conditions.Count) + cond = _conditions[index]; + else + break; + } + while (ind1 >= 0) + { + cond = _conditions[ind1--]; + if (cond.Source == sourceName) + li.Add(ind1); + } + if (li.Count == 0) return -1; + for (int i = li.Count - 1; i >= 0; i--) + { + _conditions.RemoveAt(i); + } + return 1; + } + + public int AckConditions(params ICondition[] conditions) + { + if (conditions == null || conditions.Length == 0) return -1; + foreach (ICondition cond in conditions) + { + cond.IsAcked = true; + cond.LastAckTime = DateTime.Now; + } + return 1; + } + #endregion + } + + class TempCachedData + { + IPAddress _addr; + public IPAddress Address + { + get { return _addr; } + } + + IList _data; + public IList Data + { + get { return _data; } + } + + public TempCachedData(IPAddress addr, IList data) + { + _addr = addr; + _data = data; + } + } + + internal sealed class ArchiveTime + { + public int Cycle; + public DateTime LastTime; + public ArchiveTime(int cycle, DateTime last) + { + Cycle = cycle; + LastTime = last; + } + } +} diff --git a/SCADA/Program/CoreApp/DataService/GateWay/GateWay.csproj b/SCADA/Program/CoreApp/DataService/GateWay/GateWay.csproj new file mode 100644 index 0000000..58c9ec4 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/GateWay/GateWay.csproj @@ -0,0 +1,22 @@ + + + + Exe + netcoreapp2.0 + + + + + + + + + + + + + + + + + diff --git a/SCADA/Program/CoreApp/DataService/GateWay/Program.cs b/SCADA/Program/CoreApp/DataService/GateWay/Program.cs new file mode 100644 index 0000000..d73799c --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/GateWay/Program.cs @@ -0,0 +1,17 @@ +using BatchCoreService; +using System; + +namespace GateWay +{ + class Program + { + static void Main(string[] args) + { + //Console.WriteLine("Hello World!"); + DAService dataService = new DAService(); + Console.ReadLine(); + } + + + } +} diff --git a/SCADA/Program/CoreApp/DataService/GateWay/SqlMapping.cs b/SCADA/Program/CoreApp/DataService/GateWay/SqlMapping.cs new file mode 100644 index 0000000..c7a9ec8 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/GateWay/SqlMapping.cs @@ -0,0 +1,556 @@ +using System; +using System.Collections.Generic; +using System.Data; +using DataService; + +namespace BatchCoreService +{ + internal class AlarmDataReader : IDataReader + { + IEnumerator _enumer; + + public AlarmDataReader(IEnumerable list) + { + this._enumer = list.GetEnumerator(); + } + + #region IDataReader Members + + public void Close() + { + + } + public int Depth + { + get { return 0; } + } + + public DataTable GetSchemaTable() + { + DataTable table = new DataTable("AlarmItem"); + table.Columns.Add("StartTime", typeof(DateTime)); + table.Columns.Add("Source", typeof(string)); + table.Columns.Add("ConditionId", typeof(int)); + table.Columns.Add("AlarmText", typeof(string)); + table.Columns.Add("AlarmValue", typeof(object)); + table.Columns.Add("Duration", typeof(int)); + table.Columns.Add("Severity", typeof(int)); + table.Columns.Add("SubAlarmType", typeof(int)); + return table; + } + public bool IsClosed + { + get { return false; } + } + + public bool NextResult() + { + return false; + } + + public bool Read() + { + return _enumer.MoveNext(); + } + + public int RecordsAffected + { + get { throw new NotImplementedException(); } + } + + #endregion + + #region IDisposable Members + + public void Dispose() + { + } + + #endregion + + #region IDataRecord Members + + public int FieldCount + { + get { return 8; } + } + + public bool GetBoolean(int i) + { + return (bool)GetValue(i); + } + + public byte GetByte(int i) + { + return (byte)GetValue(i); + } + + public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) + { + throw new NotImplementedException(); + } + + public char GetChar(int i) + { + return (char)GetValue(i); + } + + public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) + { + throw new NotImplementedException(); + } + + public IDataReader GetData(int i) + { + throw new NotImplementedException(); + } + + public string GetDataTypeName(int i) + { + throw new NotImplementedException(); + } + + public DateTime GetDateTime(int i) + { + return (DateTime)GetValue(i); + } + + public decimal GetDecimal(int i) + { + return (decimal)GetValue(i); + } + + public double GetDouble(int i) + { + return (double)GetValue(i); + } + + public Type GetFieldType(int i) + { + switch (i) + { + case 0: + return typeof(DateTime); + case 1: + return typeof(string); + case 2: + return typeof(int); + case 3: + return typeof(string); + case 4: + return typeof(object); + case 5: + return typeof(int); + case 6: + return typeof(int); + case 7: + return typeof(int); + default: + return typeof(string); + } + } + + public float GetFloat(int i) + { + return (float)GetValue(i); + } + + public Guid GetGuid(int i) + { + return (Guid)GetValue(i); + } + + public short GetInt16(int i) + { + return (short)GetValue(i); + } + public int GetInt32(int i) + { + return (int)GetValue(i); + } + + public long GetInt64(int i) + { + return (long)GetValue(i); + } + + public string GetName(int i) + { + switch (i) + { + case 0: + return "StartTime"; + case 1: + return "Source"; + case 2: + return "ConditionId"; + case 3: + return "AlarmText"; + case 4: + return "AlarmValue"; + case 5: + return "Duration"; + case 6: + return "Severity"; + case 7: + return "SubAlarmType"; + default: + return ""; + } + } + + public int GetOrdinal(string name) + { + switch (name) + { + case "StartTime": + return 0; + case "Source": + return 1; + case "ConditionId": + return 2; + case "AlarmText": + return 3; + case "AlarmValue": + return 4; + case "Duration": + return 5; + case "Severity": + return 6; + case "SubAlarmType": + return 7; + default: + return -1; + } + } + + public string GetString(int i) + { + return (string)GetValue(i); + } + + public object GetValue(int i) + { + switch (i) + { + case 0: + return _enumer.Current.StartTime; + case 1: + return _enumer.Current.Source; + case 2: + return _enumer.Current.ConditionId; + case 3: + return _enumer.Current.AlarmText; + case 4: + return _enumer.Current.AlarmValue; + case 5: + return _enumer.Current.Duration.Seconds; + case 6: + return _enumer.Current.Severity; + case 7: + return _enumer.Current.SubAlarmType; + default: + return null; + } + } + + public int GetValues(object[] values) + { + throw new NotImplementedException(); + } + + public bool IsDBNull(int i) + { + switch (i) + { + case 0: + return _enumer.Current.StartTime == DateTime.MinValue; + case 1: + return string.IsNullOrEmpty(_enumer.Current.Source); + case 2: + return _enumer.Current.ConditionId == 0; + case 3: + return string.IsNullOrEmpty(_enumer.Current.AlarmText); + case 4: + return _enumer.Current.AlarmValue == null; + case 5: + case 6: + case 7: + default: + return false; + } + } + + public object this[string name] + { + get + { + return GetValue(GetOrdinal(name)); + } + } + + public object this[int i] + { + get + { + return GetValue(i); + } + } + + #endregion + } + + internal class HDASqlReader : IDataReader + { + IEnumerator _enumer; + IDataServer _server; + + public HDASqlReader(IEnumerable list, IDataServer server) + { + this._enumer = list.GetEnumerator(); + _server = server; + } + + #region IDataReader Members + + public void Close() + { + + } + + public int Depth + { + get { return 0; } + } + + public DataTable GetSchemaTable() + { + DataTable table = new DataTable("Log_HData"); + table.Columns.Add("ID", typeof(short)); + table.Columns.Add("TimeStamp", typeof(DateTime)); + table.Columns.Add("Value", typeof(float)); + return table; + } + public bool IsClosed + { + get { return false; } + } + + public bool NextResult() + { + return false; + } + + public bool Read() + { + return _enumer.MoveNext(); + } + + public int RecordsAffected + { + get { throw new NotImplementedException(); } + } + + #endregion + + #region IDisposable Members + + public void Dispose() + { + } + + #endregion + + #region IDataRecord Members + + public int FieldCount + { + get { return 3; } + } + + public bool GetBoolean(int i) + { + return (bool)GetValue(i); + } + + public byte GetByte(int i) + { + return (byte)GetValue(i); + } + + public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) + { + throw new NotImplementedException(); + } + + public char GetChar(int i) + { + return (char)GetValue(i); + } + + public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) + { + throw new NotImplementedException(); + } + + public IDataReader GetData(int i) + { + return this; + } + + public string GetDataTypeName(int i) + { + throw new NotImplementedException(); + } + + public DateTime GetDateTime(int i) + { + return (DateTime)GetValue(i); + } + + public decimal GetDecimal(int i) + { + return (decimal)GetValue(i); + } + + public double GetDouble(int i) + { + return (double)GetValue(i); + } + + public Type GetFieldType(int i) + { + switch (i) + { + case 0: + return typeof(Int16); + case 1: + return typeof(DateTime); + case 2: + return typeof(Single); + default: + return typeof(Int32); + } + } + + public float GetFloat(int i) + { + return Convert.ToSingle(GetValue(i)); + } + + public Guid GetGuid(int i) + { + return (Guid)GetValue(i); + } + + public short GetInt16(int i) + { + return (short)GetValue(i); + } + public int GetInt32(int i) + { + return (int)GetValue(i); + } + + public long GetInt64(int i) + { + return (long)GetValue(i); + } + + public string GetName(int i) + { + switch (i) + { + case 0: + return "ID"; + case 1: + return "TimeStamp"; + case 2: + return "Value"; + default: + return string.Empty; + } + } + + public int GetOrdinal(string name) + { + switch (name) + { + case "ID": + return 0; + case "TimeStamp": + return 1; + case "Value": + return 2; + default: + return -1; + } + } + + public string GetString(int i) + { + return (string)GetValue(i); + } + + public object GetValue(int i) + { + switch (i) + { + case 0: + return _enumer.Current.ID; + case 1: + return _enumer.Current.TimeStamp; + case 2: + var index = _server.GetItemProperties(_enumer.Current.ID); + if (index < 0) return 0f; + switch (_server.MetaDataList[index].DataType) + { + case DataType.FLOAT: + var ff = _enumer.Current.Value.Single; + return ff > -2E-38 && ff < 2E-38 ? 0f : ff; + case DataType.BOOL: + return _enumer.Current.Value.Boolean ? 1f : 0f; + case DataType.INT: + return _enumer.Current.Value.Int32; + case DataType.WORD: + case DataType.SHORT: + return _enumer.Current.Value.Int16; + case DataType.BYTE: + return _enumer.Current.Value.Byte; + default: + return 0f; + } + default: + return 0f; ; + } + } + + public int GetValues(object[] values) + { + throw new NotImplementedException(); + } + + public bool IsDBNull(int i) + { + return false; + } + + public object this[string name] + { + get + { + return GetValue(GetOrdinal(name)); + } + } + + public object this[int i] + { + get + { + return GetValue(i); + } + } + + #endregion + } +} diff --git a/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusDriver.csproj b/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusDriver.csproj new file mode 100644 index 0000000..aa8334b --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusDriver.csproj @@ -0,0 +1,19 @@ + + + + netcoreapp2.0 + + + + true + + + + + + + + + + + diff --git a/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusRTUDriver.cs b/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusRTUDriver.cs new file mode 100644 index 0000000..dd5f896 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusRTUDriver.cs @@ -0,0 +1,563 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Text; +using System.Timers; +using DataService; +using RJCP.IO.Ports; + +namespace ModbusDriver +{ + [Description("Modbus RTU协议")] + public sealed class ModbusRTUReader : IPLCDriver + { + short _id; + public short ID + { + get + { + return _id; + } + } + + private SerialPortStream _serialPort; + public int PDU + { + get { return 0x100; } + } + + 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.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.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; + } + + string _name; + public string Name + { + get + { + return _name; + } + } + + string _port; + public string ServerName + { + get { return _port; } + set { _port = value; } + } + + public bool IsClosed + { + get + { + return _serialPort.IsOpen == false; + } + } + + private int _timeOut; + public int TimeOut + { + get { return _timeOut; } + set { _timeOut = value; } + } + + List _grps = new List(); + public IEnumerable Groups + { + get { return _grps; } + } + + IDataServer _server; + public IDataServer Parent + { + get { return _server; } + } + + public ModbusRTUReader(IDataServer server, short id, string name, string remote = null, int timeOut = 10000, string port = "COM1", string baudRate = "9600") + { + _id = id; + _name = name; + _server = server; + _port = port; + _serialPort = new SerialPortStream(port); + _timeOut = timeOut; + _serialPort.ReadTimeout = _timeOut; + _serialPort.WriteTimeout = _timeOut; + _serialPort.BaudRate = int.Parse(baudRate); + _serialPort.DataBits = 8; + _serialPort.Parity = Parity.Even; + _serialPort.StopBits = StopBits.One; + } + + public bool Connect() + { + try + { + _serialPort.Open(); + return true; + } + catch (IOException error) + { + if (OnClose != null) + { + OnClose(this, new ShutdownRequestEventArgs(error.Message)); + } + return false; + } + } + + public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false) + { + ModbusRtuGroup grp = new ModbusRtuGroup(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() + { + foreach (IGroup grp in _grps) + { + grp.Dispose(); + } + _grps.Clear(); + _serialPort.Close(); + } + + private byte[] CreateReadHeader(int startAddress, ushort length, byte function) + { + byte[] data = new byte[8]; + data[0] = (byte)_id; // 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)_id; // 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)_id; // 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)_id; // 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)_id; // 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 byte[] ReadBytes(DeviceAddress address, ushort size) + { + int area = address.Area; + try + { + byte[] header = area == Modbus.fctReadCoil ? CreateReadHeader(address.Start * 16, (ushort)(16 * size), (byte)area) : + CreateReadHeader(address.Start, size, (byte)area); + _serialPort.Write(header, 0, header.Length); + byte[] frameBytes = new byte[size * 2 + 5]; + byte[] data = new byte[size * 2]; + int numBytesRead = 0; + while (numBytesRead != size) + numBytesRead += _serialPort.Read(frameBytes, numBytesRead, size - numBytesRead); + if (frameBytes[0] == (byte)_id && Utility.CheckSumCRC(frameBytes)) + { + Array.Copy(frameBytes, 3, data, 0, size); + return data; + } + return null; + } + 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 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); + } + + 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) + { + var data = WriteMultipleRegister(address.Start, bit); + _serialPort.Write(data, 0, data.Length); + _serialPort.ReadByte(); + var chr = _serialPort.ReadByte(); + return (chr & 0x80) > 0 ? -1 : 0; + } + + public int WriteBit(DeviceAddress address, bool bit) + { + var data = WriteSingleCoils(address.Start + address.Bit, bit); + _serialPort.Write(data, 0, data.Length); + _serialPort.ReadByte(); + var chr = _serialPort.ReadByte(); + return (chr & 0x80) > 0 ? -1 : 0; + } + + public int WriteBits(DeviceAddress address, byte bits) + { + var data = WriteSingleRegister(address.Start, new byte[] { bits }); + _serialPort.Write(data, 0, data.Length); + _serialPort.ReadByte(); + var chr = _serialPort.ReadByte(); + return (chr & 0x80) > 0 ? -1 : 0; + } + + public int WriteInt16(DeviceAddress address, short value) + { + var data = WriteSingleRegister(address.Start, BitConverter.GetBytes(value)); + _serialPort.Write(data, 0, data.Length); + var chr = _serialPort.ReadByte(); + return (chr & 0x80) > 0 ? -1 : 0; + } + + public int WriteInt32(DeviceAddress address, int value) + { + var data = WriteMultipleRegister(address.Start, BitConverter.GetBytes(value)); + _serialPort.Write(data, 0, data.Length); + _serialPort.ReadByte(); + var chr = _serialPort.ReadByte(); + return (chr & 0x80) > 0 ? -1 : 0; + } + + public int WriteFloat(DeviceAddress address, float value) + { + var data = WriteMultipleRegister(address.Start, BitConverter.GetBytes(value)); + _serialPort.Write(data, 0, data.Length); + _serialPort.ReadByte(); + var chr = _serialPort.ReadByte(); + return (chr & 0x80) > 0 ? -1 : 0; + } + + public int WriteString(DeviceAddress address, string str) + { + var data = WriteMultipleRegister(address.Start, Encoding.ASCII.GetBytes(str)); + _serialPort.Write(data, 0, data.Length); + _serialPort.ReadByte(); + var chr = _serialPort.ReadByte(); + return chr == (byte)_id ? -1 : 0; + } + + public int WriteValue(DeviceAddress address, object value) + { + return this.WriteValueEx(address, value); + } + + public event ShutdownRequestEventHandler OnClose; + } + + public sealed class ModbusRtuGroup : PLCGroup + { + public ModbusRtuGroup(short id, string name, int updateRate, bool active, ModbusRTUReader 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 int 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) + { + _plcReader.Connect(); + return -1; + } + 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; + } + } + return 1; + } + + } + + + public sealed class Modbus + { + public const byte fctReadCoil = 1; + public const byte fctReadDiscreteInputs = 2; + public const byte fctReadHoldingRegister = 3; + public const byte fctReadInputRegister = 4; + public const byte fctWriteSingleCoil = 5; + public const byte fctWriteSingleRegister = 6; + public const byte fctWriteMultipleCoils = 15; + public const byte fctWriteMultipleRegister = 16; + public const byte fctReadWriteMultipleRegister = 23; + + /// Constant for exception illegal function. + public const byte excIllegalFunction = 1; + /// Constant for exception illegal data address. + public const byte excIllegalDataAdr = 2; + /// Constant for exception illegal data value. + public const byte excIllegalDataVal = 3; + /// Constant for exception slave device failure. + public const byte excSlaveDeviceFailure = 4; + /// Constant for exception acknowledge. + public const byte excAck = 5; + /// Constant for exception slave is busy/booting up. + public const byte excSlaveIsBusy = 6; + /// Constant for exception gate path unavailable. + public const byte excGatePathUnavailable = 10; + /// Constant for exception not connected. + public const byte excExceptionNotConnected = 253; + /// Constant for exception connection lost. + public const byte excExceptionConnectionLost = 254; + /// Constant for exception response timeout. + public const byte excExceptionTimeout = 255; + /// Constant for exception wrong offset. + public const byte excExceptionOffset = 128; + /// Constant for exception send failt. + public const byte excSendFailt = 100; + } + +} diff --git a/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusRTU_TCP.cs b/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusRTU_TCP.cs new file mode 100644 index 0000000..e8243f0 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusRTU_TCP.cs @@ -0,0 +1,462 @@ +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/CoreApp/DataService/ModbusDriver/ModbusTCPReader.cs b/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusTCPReader.cs new file mode 100644 index 0000000..9f9a234 --- /dev/null +++ b/SCADA/Program/CoreApp/DataService/ModbusDriver/ModbusTCPReader.cs @@ -0,0 +1,634 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Timers; +using DataService; + +namespace ModbusDriver +{ + [Description("Modbus TCP协议")] + public sealed class ModbusTCPReader : 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; + } + } + + 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; } + } + + byte _slaveId;//设备ID 单元号 字节号 + /// + /// 设备ID 单元号 字节号 + /// + public byte SlaveId + { + get { return _slaveId; } + set { _slaveId = value; } + } + + List _grps = new List(20); + public IEnumerable Groups + { + get { return _grps; } + } + + IDataServer _server; + public IDataServer Parent + { + get { return _server; } + } + + public ModbusTCPReader(IDataServer server, short id, string name, string ip, int timeOut = 500, string spare1 = null, string spare2 = null) + { + _id = id; + _name = name; + _server = server; + _ip = ip; + _timeout = timeOut; + byte.TryParse(spare1, out _slaveId); + } + + public bool Connect() + { + int port = 502; + 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 id, int startAddress, ushort length, byte function) + { + byte[] data = new byte[12]; + data[0] = 0; // Slave id high byte + data[1] = 0; // Slave id low byte + data[5] = 6; // Message size + data[6] = (byte)id; // Slave address + data[7] = function; // Function code + byte[] _adr = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)startAddress)); + data[8] = _adr[0]; // Start address + data[9] = _adr[1]; // Start address + byte[] _length = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)length)); + data[10] = _length[0]; // Number of data to read + data[11] = _length[1]; // Number of data to read + return data; + } + + private byte[] CreateWriteHeader(int id, int startAddress, ushort numData, ushort numBytes, byte function) + { + byte[] data = new byte[numBytes + 11]; + data[0] = 0; // Slave id high byte + data[1] = 0; // Slave id low byte+ + byte[] _size = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)(5 + numBytes))); + data[4] = _size[0]; // Complete message size in bytes + data[5] = _size[1]; // Complete message size in bytes + data[6] = (byte)id; // Slave address + data[7] = function; // Function code + byte[] _adr = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)startAddress)); + data[8] = _adr[0]; // Start address + data[9] = _adr[1]; // Start address + if (function >= Modbus.fctWriteMultipleCoils) + { + byte[] _cnt = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)numData)); + data[10] = _cnt[0]; // Number of bytes + data[11] = _cnt[1]; // Number of bytes + data[12] = (byte)(numBytes - 2); + } + return data; + } + + private byte[] WriteSyncData(byte[] write_data) + { + short id = BitConverter.ToInt16(write_data, 0); + if (IsClosed) CallException(id, write_data[7], Modbus.excExceptionConnectionLost); + else + { + try + { + tcpSynCl.Send(write_data, 0, write_data.Length, SocketFlags.None);//是否存在lock的问题? + int result = tcpSynCl.Receive(tcpSynClBuffer, 0, 0xFF, SocketFlags.None); + + byte function = tcpSynClBuffer[7]; + byte[] data; + + if (result == 0) CallException(id, write_data[7], Modbus.excExceptionConnectionLost); + + // ------------------------------------------------------------ + // Response data is slave ModbusModbus.exception + if (function > Modbus.excExceptionOffset) + { + function -= Modbus.excExceptionOffset; + CallException(id, function, tcpSynClBuffer[8]); + return null; + } + // ------------------------------------------------------------ + // Write response data + else if ((function >= Modbus.fctWriteSingleCoil) && (function != Modbus.fctReadWriteMultipleRegister)) + { + data = new byte[2]; + Array.Copy(tcpSynClBuffer, 10, data, 0, 2); + } + // ------------------------------------------------------------ + // Read response data + else + { + data = new byte[tcpSynClBuffer[8]]; + Array.Copy(tcpSynClBuffer, 9, data, 0, tcpSynClBuffer[8]); + } + return data; + } + catch (SocketException) + { + CallException(id, write_data[7], Modbus.excExceptionConnectionLost); + } + } + return null; + } + + public byte[] WriteSingleCoils(int id, int startAddress, bool OnOff) + { + byte[] data; + data = CreateWriteHeader(id, startAddress, 1, 1, Modbus.fctWriteSingleCoil); + if (OnOff == true) data[10] = 255; + else data[10] = 0; + return WriteSyncData(data); + } + + public byte[] WriteMultipleCoils(int id, int startAddress, ushort numBits, byte[] values) + { + byte numBytes = Convert.ToByte(values.Length); + byte[] data; + data = CreateWriteHeader(id, startAddress, numBits, (byte)(numBytes + 2), Modbus.fctWriteMultipleCoils); + Array.Copy(values, 0, data, 13, numBytes); + return WriteSyncData(data); + } + + public byte[] WriteSingleRegister(int id, int startAddress, byte[] values) + { + byte[] data; + data = CreateWriteHeader(id, startAddress, 1, 1, Modbus.fctWriteSingleRegister); + data[10] = values[0]; + data[11] = values[1]; + return WriteSyncData(data); + } + + public byte[] WriteMultipleRegister(int id, int startAddress, byte[] values) + { + ushort numBytes = Convert.ToUInt16(values.Length); + if (numBytes % 2 > 0) numBytes++; + byte[] data; + + data = CreateWriteHeader(id, startAddress, Convert.ToUInt16(numBytes / 2), Convert.ToUInt16(numBytes + 2), Modbus.fctWriteMultipleRegister); + Array.Copy(values, 0, data, 13, values.Length); + return WriteSyncData(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; + dv.Area = _slaveId; + switch (address[0]) + { + case '0': + { + dv.DBNumber = 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.DBNumber = 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.DBNumber = 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.DBNumber = 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(); + } + + internal string GetErrorString(byte exception) + { + switch (exception) + { + case Modbus.excIllegalFunction: + return "Constant for ModbusModbus.exception illegal function."; + case Modbus.excIllegalDataAdr: + return "Constant for ModbusModbus.exception illegal data address."; + case Modbus.excIllegalDataVal: + return "Constant for ModbusModbus.exception illegal data value."; + case Modbus.excSlaveDeviceFailure: + return "Constant for ModbusModbus.exception slave device failure."; + case Modbus.excAck: + return "Constant for ModbusModbus.exception acknowledge."; + case Modbus.excSlaveIsBusy: + return "Constant for ModbusModbus.exception slave is busy/booting up."; + case Modbus.excGatePathUnavailable: + return "Constant for ModbusModbus.exception gate path unavailable."; + case Modbus.excExceptionNotConnected: + return "Constant for ModbusModbus.exception not connected."; + case Modbus.excExceptionConnectionLost: + return "Constant for ModbusModbus.exception connection lost."; + case Modbus.excExceptionTimeout: + return "Constant for ModbusModbus.exception response timeout."; + case Modbus.excExceptionOffset: + return "Constant for ModbusModbus.exception wrong offset."; + case Modbus.excSendFailt: + return "Constant for ModbusModbus.exception send failt."; + } + return string.Empty; + } + + 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))); + } + } + + public byte[] ReadBytes(DeviceAddress address, ushort size) + { + int area = address.DBNumber; + return area < 2 ? WriteSyncData(CreateReadHeader(address.Area, address.Start * 16, (ushort)(16 * size), (byte)area)) + : WriteSyncData(CreateReadHeader(address.Area, address.Start, size, (byte)area)); + } + + public ItemData ReadInt32(DeviceAddress address) + { + byte[] data = WriteSyncData(CreateReadHeader(address.Area, address.Start, 2, (byte)address.DBNumber)); + if (data == null) + return new ItemData(0, 0, QUALITIES.QUALITY_BAD); + else + return new ItemData(IPAddress.HostToNetworkOrder(BitConverter.ToInt32(data, 0)), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadInt16(DeviceAddress address) + { + byte[] data = WriteSyncData(CreateReadHeader(address.Area, address.Start, 1, (byte)address.DBNumber)); + if (data == null) + return new ItemData(0, 0, QUALITIES.QUALITY_BAD); + else + return new ItemData(IPAddress.HostToNetworkOrder(BitConverter.ToInt16(data, 0)), 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadByte(DeviceAddress address) + { + byte[] data = WriteSyncData(CreateReadHeader(address.Area, address.Start, 1, (byte)address.DBNumber)); + if (data == null) + return new ItemData(0, 0, QUALITIES.QUALITY_BAD); + else + return new ItemData(data[0], 0, QUALITIES.QUALITY_GOOD); + } + + public ItemData ReadString(DeviceAddress address, ushort size) + { + byte[] data = WriteSyncData(CreateReadHeader(address.Area, address.Start, size, (byte)address.DBNumber)); + if (data == null) + return new ItemData(string.Empty, 0, QUALITIES.QUALITY_BAD); + else + return new ItemData(Encoding.ASCII.GetString(data, 0, data.Length), 0, QUALITIES.QUALITY_GOOD);//是否考虑字节序问题? + } + + public unsafe ItemData ReadFloat(DeviceAddress address) + { + byte[] data = WriteSyncData(CreateReadHeader(address.Area, address.Start, 2, (byte)address.DBNumber)); + if (data == null) + return new ItemData(0.0f, 0, QUALITIES.QUALITY_BAD); + else + { + int value = IPAddress.HostToNetworkOrder(BitConverter.ToInt32(data, 0)); + return new ItemData(*(((float*)&value)), 0, QUALITIES.QUALITY_GOOD); + } + } + + public ItemData ReadBit(DeviceAddress address) + { + byte[] data = address.DBNumber > 2 ? WriteSyncData(CreateReadHeader(address.Area, address.Start, 1, (byte)address.DBNumber)) : + WriteSyncData(CreateReadHeader(address.Area, address.Start * 16 + address.Bit, 1, (byte)address.DBNumber)); + if (data == null) + return new ItemData(false, 0, QUALITIES.QUALITY_BAD); + if (data.Length == 1) return new ItemData(data[0] > 0, 0, QUALITIES.QUALITY_GOOD); + unsafe + { + fixed (byte* p = data) + { + short* p1 = (short*)p; + return new ItemData((*p1 & (1 << address.Bit.BitSwap())) + != 0, 0, QUALITIES.QUALITY_GOOD); + } + } + } + + public ItemData ReadValue(DeviceAddress address) + { + return this.ReadValueEx(address); + } + + public int WriteBytes(DeviceAddress address, byte[] bit) + { + var data = address.DBNumber > 2 ? WriteMultipleRegister(address.Area, address.Start, bit) + : WriteMultipleCoils(address.Area, address.Start, (ushort)(8 * bit.Length), bit);//应考虑到 + return data == null ? -1 : 0; + } + + public int WriteBit(DeviceAddress address, bool bit) + { + if (address.DBNumber < 3) + { + var data = WriteSingleCoils(address.Area, address.Start + address.Bit, bit); + return data == null ? -1 : 0; + } + return -1; + } + + public int WriteBits(DeviceAddress address, byte bits) + { + var data = WriteSingleRegister(address.Area, address.Start, new byte[] { bits }); + return data == null ? -1 : 0; + } + + public int WriteInt16(DeviceAddress address, short value) + { + var data = WriteSingleRegister(address.Area, address.Start, BitConverter.GetBytes(value)); + return data == null ? -1 : 0; + } + + public int WriteInt32(DeviceAddress address, int value) + { + var data = WriteMultipleRegister(address.Area, address.Start, BitConverter.GetBytes(value)); + return data == null ? -1 : 0; + } + + public int WriteFloat(DeviceAddress address, float value) + { + var data = WriteMultipleRegister(address.Area, address.Start, BitConverter.GetBytes(value)); + return data == null ? -1 : 0; + } + + public int WriteString(DeviceAddress address, string str) + { + var data = WriteMultipleRegister(address.Area, address.Start, Encoding.ASCII.GetBytes(str)); + return data == null ? -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); + } + } + + 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 int 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) + { + //_plcReader.Connect(); + return -1; + } + 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)) > 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; + } + } + return 1; + } + + } +}