private void numGrElemCnt_ValueChanged(object sender, EventArgs e) { // изменение количества элементов в группе if (elemGroup != null) { int oldElemCnt = elemGroup.Elems.Count; int newElemCnt = (int)numGrElemCnt.Value; if (oldElemCnt < newElemCnt) { // добавление новых элементов ElemTypes elemType = elemGroup.DefElemType; for (int elemInd = oldElemCnt; elemInd < newElemCnt; elemInd++) { elemGroup.Elems.Add(new Elem() { ElemType = elemType }); } } else if (oldElemCnt > newElemCnt) { // удаление лишних элементов for (int i = newElemCnt; i < oldElemCnt; i++) { elemGroup.Elems.RemoveAt(newElemCnt); } } OnObjectChanged(TreeUpdateTypes.UpdateSignals); } }
/// <summary> /// Получить количество элементов (количество адресов) в зависимости от типа элемента /// </summary> public static int GetElemCount(ElemTypes elemType) { switch (elemType) { case ElemTypes.ULong: case ElemTypes.Long: case ElemTypes.Double: return(4); case ElemTypes.UInt: case ElemTypes.Int: case ElemTypes.Float: return(2); default: return(1); } }
private void cbGrTableType_SelectedIndexChanged(object sender, EventArgs e) { // изменение типа таблицы данных группы элементов if (elemGroup != null) { TableTypes tableType = (TableTypes)cbGrTableType.SelectedIndex; int maxElemCnt = DataUnit.GetMaxElemCnt(tableType); bool cancel = elemGroup.Elems.Count > maxElemCnt && MessageBox.Show(string.Format(KpPhrases.ElemRemoveWarning, maxElemCnt), CommonPhrases.QuestionCaption, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes; if (cancel) { cbGrTableType.SelectedIndexChanged -= cbGrTableType_SelectedIndexChanged; cbGrTableType.SelectedIndex = (int)elemGroup.TableType; cbGrTableType.SelectedIndexChanged += cbGrTableType_SelectedIndexChanged; } else { // ограничение макс. количества элементов в группе if (numGrElemCnt.Value > maxElemCnt) { numGrElemCnt.Value = maxElemCnt; } numGrElemCnt.Maximum = maxElemCnt; // установка типа таблицы данных elemGroup.TableType = tableType; elemGroup.UpdateFuncCode(); ShowFuncCode(elemGroup); // установка типа элементов группы по умолчанию ElemTypes elemType = elemGroup.DefElemType; foreach (Elem elem in elemGroup.Elems) { elem.ElemType = elemType; } OnObjectChanged(TreeUpdateTypes.CurrentNode | TreeUpdateTypes.ChildNodes); } } }
private void cbCmdElemType_SelectedIndexChanged(object sender, EventArgs e) { // изменение типа элементов if (modbusCmd != null) { ElemTypes newElemType = (ElemTypes)cbCmdElemType.SelectedIndex; if (modbusCmd.TableType == TableTypes.HoldingRegisters && newElemType == ElemTypes.Bool) { // отмена выбора типа Bool для регистров хранения cbCmdElemType.SelectedIndexChanged -= cbCmdElemType_SelectedIndexChanged; cbCmdElemType.SelectedIndex = (int)modbusCmd.ElemType; cbCmdElemType.SelectedIndexChanged += cbCmdElemType_SelectedIndexChanged; } else { modbusCmd.ElemType = newElemType; numCmdElemCnt.Value = ModbusUtils.GetElemCount(modbusCmd.ElemType); OnObjectChanged(TreeUpdateTypes.None); } } }
/// <summary> /// Получить длину элемента (количество адресов) в зависимости от типа элемента /// </summary> public static int GetElemLength(ElemTypes elemType) { switch (elemType) { case ElemTypes.ULong: case ElemTypes.Long: case ElemTypes.Double: return 4; case ElemTypes.UInt: case ElemTypes.Int: case ElemTypes.Float: return 2; default: return 1; } }
/// <summary> /// Загрузить шаблон устройства /// </summary> public bool Load(string fileName, out string errMsg) { SetToDefault(); try { // загрузка шаблона устройства XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); // загрузка настроек шаблона XmlNode settingsNode = xmlDoc.DocumentElement.SelectSingleNode("Settings"); if (settingsNode != null) { Sett.LoadFromXml((XmlElement)settingsNode); } // загрузка групп элементов XmlNode elemGroupsNode = xmlDoc.DocumentElement.SelectSingleNode("ElemGroups"); if (elemGroupsNode != null) { int kpTagInd = 0; foreach (XmlElement elemGroupElem in elemGroupsNode.ChildNodes) { TableTypes tableType = elemGroupElem.GetAttrAsEnum <TableTypes>("tableType"); ElemGroup elemGroup = new ElemGroup(tableType); elemGroup.Name = elemGroupElem.GetAttribute("name"); elemGroup.Address = (ushort)elemGroupElem.GetAttrAsInt("address"); elemGroup.Active = elemGroupElem.GetAttrAsBool("active", true); elemGroup.StartKPTagInd = kpTagInd; elemGroup.StartSignal = kpTagInd + 1; XmlNodeList elemNodes = elemGroupElem.SelectNodes("Elem"); ElemTypes defElemType = elemGroup.DefElemType; foreach (XmlElement elemElem in elemNodes) { Elem elem = new Elem(); elem.Name = elemElem.GetAttribute("name"); elem.ElemType = elemElem.GetAttrAsEnum("type", defElemType); if (elemGroup.ByteOrderEnabled) { elem.ByteOrderStr = elemElem.GetAttribute("byteOrder"); elem.ByteOrder = ModbusUtils.ParseByteOrder(elem.ByteOrderStr); if (elem.ByteOrder == null) { elem.ByteOrder = Sett.GetDefByteOrder(elem.Length); } } elemGroup.Elems.Add(elem); } if (0 < elemGroup.Elems.Count && elemGroup.Elems.Count <= DataUnit.GetMaxElemCnt(tableType)) { ElemGroups.Add(elemGroup); kpTagInd += elemGroup.Elems.Count; } } } // загрузка команд XmlNode cmdsNode = xmlDoc.DocumentElement.SelectSingleNode("Cmds"); if (cmdsNode != null) { foreach (XmlElement cmdElem in cmdsNode.ChildNodes) { ModbusCmd cmd = new ModbusCmd( cmdElem.GetAttrAsEnum <TableTypes>("tableType"), cmdElem.GetAttrAsBool("multiple"), cmdElem.GetAttrAsInt("elemCnt", 1)); cmd.ElemType = cmdElem.GetAttrAsEnum("elemType", cmd.DefElemType); cmd.Address = (ushort)cmdElem.GetAttrAsInt("address"); cmd.Name = cmdElem.GetAttribute("name"); cmd.CmdNum = cmdElem.GetAttrAsInt("cmdNum"); if (cmd.ByteOrderEnabled) { cmd.ByteOrderStr = cmdElem.GetAttribute("byteOrder"); cmd.ByteOrder = ModbusUtils.ParseByteOrder(cmd.ByteOrderStr); if (cmd.ByteOrder == null) { cmd.ByteOrder = Sett.GetDefByteOrder(cmd.ElemCnt); } } if (0 < cmd.CmdNum && cmd.CmdNum <= ushort.MaxValue) { Cmds.Add(cmd); } } } errMsg = ""; return(true); } catch (Exception ex) { errMsg = ModbusPhrases.LoadTemplateError + ":" + Environment.NewLine + ex.Message; return(false); } }
/// <summary> /// Отобразить свойства элемента /// </summary> private void ShowElemProps(ElemInfo elemInfo) { if (elemInfo == null) { txtElemName.Text = ""; txtElemAddress.Text = ""; txtElemSignal.Text = ""; rbBool.Checked = true; txtElemByteOrder.Text = ""; gbElem.Enabled = false; } else { txtElemName.Text = elemInfo.Elem.Name; txtElemAddress.Text = elemInfo.AddressRange; txtElemSignal.Text = elemInfo.Signal.ToString(); ElemTypes elemType = elemInfo.Elem.ElemType; if (elemType == ElemTypes.Bool) { rbUShort.Enabled = rbShort.Enabled = rbUInt.Enabled = rbInt.Enabled = rbULong.Enabled = rbLong.Enabled = rbFloat.Enabled = rbDouble.Enabled = false; rbBool.Enabled = true; txtElemByteOrder.Text = ""; txtElemByteOrder.Enabled = false; } else { rbUShort.Enabled = rbShort.Enabled = rbUInt.Enabled = rbInt.Enabled = rbULong.Enabled = rbLong.Enabled = rbFloat.Enabled = rbDouble.Enabled = true; rbBool.Enabled = false; txtElemByteOrder.Text = elemInfo.Elem.ByteOrderStr; txtElemByteOrder.Enabled = true; } switch (elemType) { case ElemTypes.UShort: rbUShort.Checked = true; break; case ElemTypes.Short: rbShort.Checked = true; break; case ElemTypes.UInt: rbUInt.Checked = true; break; case ElemTypes.Int: rbInt.Checked = true; break; case ElemTypes.ULong: rbULong.Checked = true; break; case ElemTypes.Long: rbLong.Checked = true; break; case ElemTypes.Float: rbFloat.Checked = true; break; case ElemTypes.Double: rbDouble.Checked = true; break; default: rbBool.Checked = true; break; } gbElem.Enabled = true; } }
/// <summary> /// Получить длину элемента (количество адресов) в зависимости от типа элемента /// </summary> public static int GetElemLength(ElemTypes elemType) { return elemType == ElemTypes.UInt || elemType == ElemTypes.Int || elemType == ElemTypes.Float ? 2 : 1; }