public bool AddItems(IList <TagMetaData> items) { int count = items.Count; if (_items == null) { _items = new Dictionary <short, ITag>(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: dataItem = new UShortTag(meta.ID, addr, this); break; case DataType.SHORT: dataItem = new ShortTag(meta.ID, addr, this); break; case DataType.INT: dataItem = new IntTag(meta.ID, addr, this); break; case DataType.DWORD: dataItem = new UIntTag(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 void WhenRawStringIsEmpty_ShouldIgnore() { TagMetaData metadata = null; var act = new Action(() => metadata = _testee.Parse(string.Empty)); act.ShouldNotThrow(); metadata.Comment.Should().BeEmpty(); }
public bool AddItems(IList <TagMetaData> items) { int count = items.Count; if (_items == null) { _items = new List <ITag>(); } lock (_server.SyncRoot) { int j = 0; for (int i = 0; i < count; i++) { ITag dataItem = null; TagMetaData meta = items[i]; if (meta.GroupID == this._id) { DeviceAddress addr = new DeviceAddress(-1, (ushort)meta.GroupID, (ushort)meta.ID, j++, 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(dataItem); _server.AddItemIndex(meta.Name, dataItem); } } } return(true); }
public TagItem(TagMetaData metadata) { _tagname = metadata.Name; _addr = metadata.Address; _tag = App.Server[_tagname]; if (_tag != null) { _tagValue = _tag.ToString(); _timestamp = _tag.TimeStamp; _tag.ValueChanged += new ValueChangedEventHandler(TagValueChanged); } }
private void AddTag() { TagMetaData tag = new TagMetaData((short)(list.Count == 0 ? 1 : list.Max(x => x.ID) + 1), short.Parse(treeView1.SelectedNode.Name), "", "", DataType.INT, 1); bindingSource1.Add(tag); int index = list.BinarySearch(tag); if (index < 0) { index = ~index; } list.Insert(index, tag); dataGridView1.FirstDisplayedScrollingRowIndex = bindingSource1.Count - 1; }
public TagItem(TagMetaData metadata, ITag tag, DataGridView dataGrid, int index) { _tagname = metadata.Name; _addr = metadata.Address; _tag = tag; _dataGrid = dataGrid; _index = index; if (_tag != null) { _tagValue = _tag.ToString(); _timestamp = _tag.TimeStamp; _tag.ValueChanged += new ValueChangedEventHandler(TagValueChanged); } }
void InitServerByDatabase() { using (var dataReader = DataHelper.Instance.ExecuteProcedureReader("InitServer")) { if (dataReader == null) { return; // Stopwatch sw = Stopwatch.StartNew(); } dataReader.Read(); int count = dataReader.GetInt32(0); _list = new List <TagMetaData>(count);//把所有激活的 数据库记录 都导入 _list<TagMetaData> 里面 _mapping = new Dictionary <string, ITag>(count); dataReader.NextResult(); while (dataReader.Read()) { var meta = new TagMetaData(dataReader.GetInt16(0), dataReader.GetInt16(1), dataReader.GetString(2), dataReader.GetString(3), dataReader.GetString(10), (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) { //Id 和Cycle 其实就是归档的时间,归档周期没有设定(0),则置为 null _archiveTimes.Add(meta.ID, meta.Cycle == 0 ? null : new ArchiveTime(meta.Cycle, DateTime.MinValue)); } } _list.Sort();//只是id 排序就好了 dataReader.NextResult(); while (dataReader.Read()) { if (_driver != null) { IGroup grp = _driver.AddGroup(dataReader.GetString(1), dataReader.GetInt16(2), dataReader.GetInt32(3), dataReader.GetFloat(4), dataReader.GetBoolean(5)); if (grp != null) { grp.AddItems(_list);//这里完成 从 _list<TagMetaData> 到 _list<ITag>的转换 } } } } //待归档的列表里面 有 超过一个的 变量,就开启归档 if (_archiveTimes.Count > 0) { _hasHda = true; _hda.Capacity = MAXHDACAP; } }
private void contextMenuStrip2_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { switch (e.ClickedItem.Text) { case "变量编辑": { if (bindingSource1.Count > 0) { TagParam frm = new TagParam(bindingSource1); frm.ShowDialog(); } } break; case "复制": { selectedTags.Clear(); var rows = dataGridView1.SelectedRows; if (rows != null) { short maxid = list.Max(x => x.ID); for (int i = 0; i < rows.Count; i++) { TagMetaData tag = rows[i].DataBoundItem as TagMetaData; TagMetaData newtag = new TagMetaData((short)++maxid, tag.GroupID, tag.Name, tag.Address, tag.DataType, tag.Size, tag.Active, tag.Maximum, tag.Minimum, tag.Cycle); selectedTags.Add(newtag); } } isCut = false; } break; case "剪切": { selectedTags.Clear(); var rows = dataGridView1.SelectedRows; if (rows != null) { for (int i = 0; i < rows.Count; i++) { TagMetaData tag = rows[i].DataBoundItem as TagMetaData; selectedTags.Add(tag); } } isCut = true; } break; case "粘贴CSV": break; case "粘帖": { if (treeView1.SelectedNode == null || treeView1.SelectedNode.Level != 2) { return; } if (isCut) { foreach (var tag in selectedTags) { tag.GroupID = curgroupId; bindingSource1.Add(tag); } } else { foreach (var tag in selectedTags) { tag.GroupID = curgroupId; bindingSource1.Add(tag); list.Add(tag); } } if (bindingSource1.Count > 0) { dataGridView1.FirstDisplayedScrollingRowIndex = bindingSource1.Count - 1; list.Sort(); } selectedTags.Clear(); } break; case "批量删除": { var rows = dataGridView1.SelectedRows; if (rows != null) { for (int i = 0; i < rows.Count; i++) { TagMetaData tag = rows[i].DataBoundItem as TagMetaData; bindingSource1.Remove(tag); list.Remove(tag); } } } break; } tspCount.Text = bindingSource1.Count.ToString(); }
private void toolStrip3_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { switch (e.ClickedItem.Text) { case "前缀": { string front = txtFront.Text; if (treeView1.SelectedNode.Level == 0) { foreach (var item in list) { item.Name = front + item.Name; } } else if (treeView1.SelectedNode.Level == 1) { var rows = dataGridView1.Rows; if (rows != null) { for (int i = 0; i < rows.Count; i++) { TagMetaData tag = rows[i].DataBoundItem as TagMetaData; tag.Name = front + tag.Name; } } } else if (treeView1.SelectedNode.Level == 2) { foreach (var item in list.FindAll(x => x.GroupID == curgroupId)) { item.Name = front + item.Name; } } } break; case "替换地址": { string filter = txtReplaceAddr1.Text; string replace = txtReplaceAddr2.Text; foreach (var item in list.FindAll(x => x.GroupID == curgroupId)) { item.Address = item.Address.Replace(filter, replace); } } break; case "偏移": { string offset = tspOffset.Text; int baseaddr; if (int.TryParse(offset, out baseaddr)) { foreach (DataGridViewRow item in dataGridView1.SelectedRows) { var tag = item.DataBoundItem as TagMetaData; var index = tag.Address.LastIndexOf('W'); if (index < 0) { index = tag.Address.LastIndexOf('D'); } if (index >= 0) { var ad = Convert.ToDecimal(tag.Address.Substring(index + 1)); ad = ad + baseaddr; tag.Address = tag.Address.Substring(0, index + 1) + ad.ToString(); } } } } break; case "替换名称": { string filter = txtReplace1.Text; string replace = txtReplace2.Text; foreach (var item in list.FindAll(x => x.GroupID == curgroupId)) { item.Name = item.Name.Replace(filter, replace); } } break; } }
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { switch (e.ClickedItem.Text) { case "增加": if (treeView1.SelectedNode != null && treeView1.SelectedNode.Level == 2) { AddTag(); } break; case "删除": { TagMetaData tag = bindingSource1.Current as TagMetaData; bindingSource1.Remove(tag); list.Remove(tag); } break; case "清除": if (MessageBox.Show("将清除所有的标签,是否确定?", "警告", MessageBoxButtons.YesNo) == DialogResult.Yes) { bindingSource1.Clear(); list.Clear(); } break; case "保存": if (Save()) { MessageBox.Show("保存成功!"); } break; case "注册": { RegisterSet frm = new RegisterSet(); frm.ShowDialog(); } break; case "查找": { string filter = txtFind.Text.ToUpper(); for (int i = 0; i < dataGridView1.Rows.Count; i++) { if (dataGridView1[0, i].Value.ToString() == filter) { dataGridView1.Rows[i].Selected = true; dataGridView1.FirstDisplayedScrollingRowIndex = i; return; } } } break; case "名称过滤": { dataGridView1.ClearSelection(); string filter = txtFilter.Text.ToUpper(); var tags = GetTagNames(filter); if (tags != null) { foreach (int index in tags) { dataGridView1.Rows[index].Selected = true; dataGridView1.FirstDisplayedScrollingRowIndex = index; } } } break; case "描述过滤": { dataGridView1.ClearSelection(); string filter = txtFilter1.Text.ToUpper(); var tags = GetTags(filter); if (tags != null) { foreach (int index in tags) { dataGridView1.Rows[index].Selected = true; dataGridView1.FirstDisplayedScrollingRowIndex = index; } } } break; case "退出": this.Close(); break; } tspCount.Text = bindingSource1.Count.ToString(); }
void InitServerBySqlite() { string sql = "select * from Protocol"; List <Protocol> protocolList = DataHelper.Instance.ExecuteList <Protocol>(sql); if (protocolList.Count == 0) { MessageBox.Show("数据库读取失败!"); return; } int count = protocolList.Count(); _list = new List <TagMetaData>(count);//把所有激活的 数据库记录 都导入 _list<TagMetaData> 里面 _mapping = new Dictionary <string, ITag>(count); foreach (Protocol protocol in protocolList) { var meta = new TagMetaData((short)protocol.TagID, (short)protocol.GroupID, protocol.TagName, protocol.Address, protocol.Description, (DataType)protocol.DataType, (ushort)protocol.DataSize, protocol.Archive == 1 ? true : false, (float)protocol.Maximum, (float)protocol.Minimum, protocol.Cycle); _list.Add(meta); if (meta.Archive) { //Id 和Cycle 其实就是归档的时间,归档周期没有设定(0),则置为 null _archiveTimes.Add(meta.ID, meta.Cycle == 0 ? null : new ArchiveTime(meta.Cycle, DateTime.MinValue)); //归档的ID,归档的时间 } _list.Sort(); //只是id 排序就好了 } sql = "select * from ProtocolGroup"; List <ProtocolGroup> groupList = DataHelper.Instance.ExecuteList <ProtocolGroup>(sql); foreach (ProtocolGroup pgroup in groupList) { if (_driver != null) { IGroup grp = _driver.AddGroup(pgroup.GroupName, (short)pgroup.GroupID, pgroup.UpdateRate, pgroup.DeadBand, pgroup.IsActive == 1 ? true : false); if (grp != null) { grp.AddItems(_list);//这里完成 从 _list<TagMetaData> 到 _list<ITag>的转换 ,这个地方是需要根据 GroupID 的不同,生成不同的组别,对应于不同的页面?? } } } //using (var dataReader = DataHelper.Instance.ExecuteProcedureReader("InitServer")) //{ // if (dataReader == null) return;// Stopwatch sw = Stopwatch.StartNew(); // dataReader.Read(); // int count = dataReader.GetInt32(0); // _list = new List<TagMetaData>(count);//把所有激活的 数据库记录 都导入 _list<TagMetaData> 里面 // _mapping = new Dictionary<string, ITag>(count); // dataReader.NextResult(); // while (dataReader.Read()) // { // var meta = new TagMetaData(dataReader.GetInt16(0), dataReader.GetInt16(1), dataReader.GetString(2), dataReader.GetString(3), dataReader.GetString(10), (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) // { // //Id 和Cycle 其实就是归档的时间,归档周期没有设定(0),则置为 null // _archiveTimes.Add(meta.ID, meta.Cycle == 0 ? null : new ArchiveTime(meta.Cycle, DateTime.MinValue));//归档的ID,归档的时间 // } // } // _list.Sort();//只是id 排序就好了 // dataReader.NextResult(); // while (dataReader.Read()) // { // if (_driver != null) // { // IGroup grp = _driver.AddGroup(dataReader.GetString(1), dataReader.GetInt16(2), dataReader.GetInt32(3), // dataReader.GetFloat(4), dataReader.GetBoolean(5)); // if (grp != null) // grp.AddItems(_list);//这里完成 从 _list<TagMetaData> 到 _list<ITag>的转换 ,这个地方是需要根据 GroupID 的不同,生成不同的组别,对应于不同的页面?? // } // } //} //待归档的列表里面 有 超过一个的 变量,就开启归档 if (_archiveTimes.Count > 0) { _hasHda = true; _hda.Capacity = MAXHDACAP;//单次归档的最大数据 1 万条; } }
public bool AddItems(IList <TagMetaData> items) { FxSerialReader fxReader = _plcReader as FxSerialReader; if (fxReader == null) { return(false); } int count = items.Count; if (_items == null) { _items = new List <ITag>(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 = fxReader.GetDeviceAddress(meta); 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: dataItem = new UShortTag(meta.ID, addr, this); break; case DataType.SHORT: dataItem = new ShortTag(meta.ID, addr, this); break; case DataType.DWORD: dataItem = new UIntTag(meta.ID, addr, this); break; 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((x, y) => x.Address.CompareTo(y.Address)); UpdatePDUArea(); return(true); }
public DeviceAddress GetDeviceAddress(TagMetaData meta) { string newaddress = ParseAddress(meta); return(GetDeviceAddress(newaddress)); }
//将三菱PLC的地址解析为modbus地址格式,参考bcnet的地址解析方式 //T/C暂存器分为bool类型和word类型,采用地址的第二码区分,第二码A表示bool,第二码为B表示word, 默认则为读取word值 private string ParseAddress(TagMetaData meta) { string address = meta.Address; int m, n; string newaddress = ""; switch (address[0]) { case 'Y': case 'y': int.TryParse(address.Substring(1, address.Length - 2), out m); int.TryParse(address.Substring(address.Length - 1), out n); newaddress = '0' + (m * 8 + n).ToString().PadLeft(5, '0'); break; case 'M': case 'm': int.TryParse(address.Substring(1, address.Length - 1), out m); if (m >= 8000) { newaddress = '0' + (5001 + (m - 8000)).ToString().PadLeft(5, '0'); } else { newaddress = '0' + (10001 + m).ToString().PadLeft(5, '0'); } break; case 'T': case 't': if (meta.DataType == DataType.BOOL) { int.TryParse(address.Substring(1, address.Length - 1), out m); newaddress = '0' + (6001 + m).ToString().PadLeft(5, '0'); } else { int.TryParse(address.Substring(1, address.Length - 1), out m); newaddress = '4' + (1 + m).ToString().PadLeft(5, '0'); } break; case 'C': case 'c': if (meta.DataType == DataType.BOOL) { int.TryParse(address.Substring(1, address.Length - 1), out m); newaddress = '0' + (7001 + m).ToString().PadLeft(5, '0'); } else { int.TryParse(address.Substring(1, address.Length - 1), out m); newaddress = '4' + (1001 + m).ToString().PadLeft(5, '0'); } break; case 'S': case 's': int.TryParse(address.Substring(1, address.Length - 1), out m); newaddress = '0' + (30001 + m).ToString().PadLeft(5, '0'); break; case 'X': case 'x': int.TryParse(address.Substring(1, address.Length - 2), out m); int.TryParse(address.Substring(address.Length - 1), out n); newaddress = '1' + (1 + m * 8 + n).ToString().PadLeft(5, '0'); break; case 'D': case 'd': int.TryParse(address.Substring(1, address.Length - 1), out m); if (m >= 8000) { newaddress = '4' + (1301 + m - 8000).ToString().PadLeft(5, '0'); } else { newaddress = '4' + (2001 + m).ToString().PadLeft(5, '0'); } break; } return(newaddress); }
public bool AddItems(IList <TagMetaData> items) { int count = items.Count; if (_items == null) { _items = new List <ITag>(count); _mapping = new Dictionary <short, string>(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 = new DeviceAddress { Start = meta.ID, DataSize = meta.Size, VarType = 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.DWORD: 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); _plcReader.TransactItem(meta.Name); _mapping.Add(meta.ID, meta.Address); _server.AddItemIndex(meta.Name, dataItem); } } } return(true); } }