public int BatchWrite(SortedDictionary <ITag, object> items, bool isSync = true) { int rev = ExtMethods.BatchWrite(items); if (DataChange != null && rev >= 0) { int len = items.Count; 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 void Update() { DateTime dt = DateTime.Now; FileData[] list = _fileReader.ReadAll(_id); if (list != null) { if (DataChange != null) { List <HistoryData> hdata = new List <HistoryData>(); foreach (ITag tag in _items) { int index = Array.BinarySearch(list, new FileData { ID = tag.ID }); if (index >= 0) { FileData data = list[index]; if (tag.Address.VarType == DataType.STR) { if (data.Text != tag.ToString()) { (tag as StringTag).String = data.Text; tag.Update(Storage.Empty, dt, QUALITIES.QUALITY_GOOD); } continue; } if (tag.Value != data.Value) { tag.Update(data.Value, dt, QUALITIES.QUALITY_GOOD); hdata.Add(new HistoryData(data.ID, QUALITIES.QUALITY_GOOD, data.Value, dt)); } } } foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList()) { deleg.BeginInvoke(this, new DataChangeEventArgs(1, hdata), null, null); } } else { foreach (ITag tag in _items) { int index = Array.BinarySearch(list, new FileData { ID = tag.ID }); if (index >= 0) { if (tag.Value != list[index].Value) { tag.Update(list[index].Value, dt, QUALITIES.QUALITY_GOOD); } } } } } }
public virtual int BatchWrite(SortedDictionary <ITag, object> 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); }
/// <summary> /// 主通信流程:Step 6:根据数据更新上位机相关信息 /// </summary> 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();//这是从缓存Cache中读取的数据 if (item.Active) { item.Update(itemData, dt, QUALITIES.QUALITY_GOOD); } /* * 下面的语言判断是否要更新有变化的Itag: * 1.对敏感度为零的,只要有任何变化都要更新;??浮点数和零 比较大小 * 2.对于浮点数,新值的变化要超过敏感的 百分比 */ 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); //只在这个地方,才去调用绑定的事件,对那些更新周期为零的变量进行存储,存储周期随Group } } else { foreach (int index in _changedList) { ITag item = _items[index]; if (item.Active) { item.Update(item.Read(), dt, QUALITIES.QUALITY_GOOD); } } } }
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 bool RecieveData(string data) //when sendmessge arrived WM_COPYDATA { int index = data.IndexOf('#'); //格式:GroupID#TagID:Value|TagID:Value|TagID:Value if (index > 0 && data.Substring(0, index) == _id.ToString()) { string[] strs = data.Right(index).Split('|'); HistoryData[] hdata = new HistoryData[strs.Length]; DateTime date = DateTime.Now; int i = 0; foreach (string d in strs) { int ind = d.IndexOf(':'); if (ind > 0) { short tid; if (short.TryParse(data.Substring(0, ind), out tid)) { ITag tag = _server[tid]; if (tag != null) { Storage value = Storage.Empty; DataType type = tag.Address.VarType; switch (type) { case DataType.BOOL: value.Boolean = Convert.ToBoolean(d.Right(ind)); break; case DataType.BYTE: value.Byte = Convert.ToByte(d.Right(ind)); break; case DataType.WORD: case DataType.SHORT: value.Int16 = Convert.ToInt16(d.Right(ind)); break; case DataType.TIME: case DataType.INT: value.Int32 = Convert.ToInt32(d.Right(ind)); break; case DataType.FLOAT: value.Single = Convert.ToSingle(d.Right(ind)); break; case DataType.STR: break; } tag.Update(value, date, QUALITIES.QUALITY_GOOD);//也可以不传值,tag自身refresh hdata[i].ID = tag.ID; hdata[i].Value = value; hdata[i].TimeStamp = date; hdata[i].Quality = QUALITIES.QUALITY_GOOD; } } } i++; } if (DataChange != null) { foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList()) { deleg.BeginInvoke(this, new DataChangeEventArgs(1, hdata), null, null); } } return(true); } return(false); }