/// <summary> /// Получить обозначение команды в дереве /// </summary> private string GetCmdCaption(ModbusCmd modbusCmd) { return((string.IsNullOrEmpty(modbusCmd.Name) ? KpPhrases.DefCmdName : modbusCmd.Name) + " (" + ModbusUtils.GetTableTypeName(modbusCmd.TableType) + ", " + ModbusUtils.GetAddressRange(modbusCmd.Address, modbusCmd.ElemCnt, template.Sett.ZeroAddr, template.Sett.DecAddr) + ")"); }
/// <summary> /// Отобразить свойства команды /// </summary> private void ShowCmdProps(ModbusCmd modbusCmd) { ctrlElemGroup.Visible = false; ctrlElem.Visible = false; ctrlCmd.Visible = true; ctrlCmd.Settings = template.Sett; ctrlCmd.ModbusCmd = modbusCmd; }
/// <summary> /// Создать узел команды /// </summary> private TreeNode NewCmdNode(ModbusCmd modbusCmd) { TreeNode cmdNode = new TreeNode(GetCmdCaption(modbusCmd)); cmdNode.ImageKey = cmdNode.SelectedImageKey = "cmd.png"; cmdNode.Tag = modbusCmd; return(cmdNode); }
private void btnMoveDown_Click(object sender, EventArgs e) { // перемещение объекта вниз TreeNode nextNode = selNode.NextNode; int nextInd = nextNode.Index; if (selElemGroup != null) { // перемещение группы элементов вниз ElemGroup nextElemGroup = nextNode.Tag as ElemGroup; template.ElemGroups.RemoveAt(nextInd); template.ElemGroups.Insert(nextInd - 1, nextElemGroup); grsNode.Nodes.RemoveAt(nextInd); grsNode.Nodes.Insert(nextInd - 1, nextNode); UpdateSignals(nextNode); } else if (selElemInfo != null) { // перемещение элемента вниз ElemInfo nextElemInfo = nextNode.Tag as ElemInfo; selElemInfo.ElemGroup.Elems.RemoveAt(nextInd); selElemInfo.ElemGroup.Elems.Insert(nextInd - 1, nextElemInfo.Elem); TreeNode grNode = selNode.Parent; grNode.Nodes.RemoveAt(nextInd); grNode.Nodes.Insert(nextInd - 1, nextNode); UpdateElemNodes(grNode); ShowElemProps(selElemInfo); } else if (selCmd != null) { // перемещение команды вниз ModbusCmd nextCmd = nextNode.Tag as ModbusCmd; template.Cmds.RemoveAt(nextInd); template.Cmds.Insert(nextInd - 1, nextCmd); cmdsNode.Nodes.RemoveAt(nextInd); cmdsNode.Nodes.Insert(nextInd - 1, nextNode); } // установка доступности кнопок btnMoveUp.Enabled = selNode.PrevNode != null; btnMoveDown.Enabled = selNode.NextNode != null; // установка признака изменения Modified = true; }
/// <summary> /// Отобразить порядок байт команды /// </summary> private void ShowByteOrder(ModbusCmd modbusCmd) { if (modbusCmd != null && modbusCmd.ByteOrderEnabled) { txtCmdByteOrder.Text = modbusCmd.ByteOrderStr; txtCmdByteOrder.Enabled = true; } else { txtCmdByteOrder.Text = ""; txtCmdByteOrder.Enabled = false; } }
private TreeNode cmdsNode; // узел дерева "Команды" /// <summary> /// Конструктор, ограничивающий создание формы без параметров /// </summary> private FrmDevTemplate() { InitializeComponent(); appDirs = null; initialFileName = ""; fileName = ""; saveOnly = false; template = null; modified = false; selElemGroup = null; selElemInfo = null; selCmd = null; selNode = null; grsNode = treeView.Nodes["grsNode"]; cmdsNode = treeView.Nodes["cmdsNode"]; }
private void btnAddCmd_Click(object sender, EventArgs e) { // создание команды и добавление в шаблон устройства ModbusCmd modbusCmd = template.CreateModbusCmd(TableType.Coils, false); int ind = selNode != null && selNode.Tag is ModbusCmd ? selNode.Index + 1 : template.Cmds.Count; template.Cmds.Insert(ind, modbusCmd); // создание узла дерева команды TreeNode cmdNode = NewCmdNode(modbusCmd); cmdsNode.Nodes.Insert(ind, cmdNode); treeView.SelectedNode = cmdNode; ctrlCmd.SetFocus(); // установка признака изменения Modified = true; }
/// <summary> /// Creates a new Modbus command based on the element configuration. /// </summary> private ModbusCmd CreateModbusCmd(DeviceTemplateOptions options, ElemGroupConfig elemGroupConfig, ElemConfig elemConfig, int elemIndex) { ModbusCmd modbusCmd = deviceModel.CreateModbusCmd(elemGroupConfig.DataBlock, false); modbusCmd.Name = elemConfig.Name; modbusCmd.Address = (ushort)(elemGroupConfig.Address + elemIndex); modbusCmd.ElemType = elemConfig.ElemType; modbusCmd.ElemCnt = 1; modbusCmd.ByteOrder = ModbusUtils.ParseByteOrder(elemConfig.ByteOrder) ?? options.GetDefaultByteOrder(ModbusUtils.GetDataLength(elemConfig.ElemType)); modbusCmd.CmdNum = 0; modbusCmd.CmdCode = elemConfig.TagCode; modbusCmd.InitReqPDU(); modbusCmd.InitReqADU(deviceModel.Addr, transMode); return(modbusCmd); }
private void treeView_AfterSelect(object sender, TreeViewEventArgs e) { // отображение выбранного объекта и его свойств selNode = e.Node; object tag = selNode.Tag; selElemGroup = tag as ElemGroup; selElemInfo = tag as ElemInfo; selCmd = tag as ModbusCmd; if (selElemGroup != null) { ShowElemGroupProps(selElemGroup); } else if (selElemInfo != null) { ShowElemProps(selElemInfo); } else if (selCmd != null) { ShowCmdProps(selCmd); } else if (selNode == grsNode) { ShowElemGroupProps(null); } else if (selNode == cmdsNode) { ShowCmdProps(null); } else // не выполняется { DisableProps(); } // установка доступности кнопок btnAddElem.Enabled = selElemGroup != null || selElemInfo != null; bool nodeIsOk = selElemGroup != null || selCmd != null || selElemInfo != null && selElemInfo.ElemGroup.Elems.Count > 1 /*последний не удалять*/; btnMoveUp.Enabled = nodeIsOk && selNode.PrevNode != null; btnMoveDown.Enabled = nodeIsOk && selNode.NextNode != null; btnDelete.Enabled = nodeIsOk; }
/// <summary> /// Creates a new Modbus command based on the command configuration. /// </summary> private ModbusCmd CreateModbusCmd(DeviceTemplateOptions options, CmdConfig cmdConfig) { ModbusCmd modbusCmd = deviceModel.CreateModbusCmd(cmdConfig.DataBlock, cmdConfig.Multiple); modbusCmd.Name = cmdConfig.Name; modbusCmd.Address = (ushort)cmdConfig.Address; modbusCmd.ElemType = cmdConfig.ElemType; modbusCmd.ElemCnt = cmdConfig.ElemCnt; modbusCmd.ByteOrder = ModbusUtils.ParseByteOrder(cmdConfig.ByteOrder) ?? options.GetDefaultByteOrder(ModbusUtils.GetDataLength(cmdConfig.ElemType) * cmdConfig.ElemCnt); modbusCmd.CmdNum = cmdConfig.CmdNum; modbusCmd.CmdCode = cmdConfig.CmdCode; if (cmdConfig.DataBlock == DataBlock.Custom) { modbusCmd.SetFuncCode((byte)cmdConfig.CustomFuncCode); } modbusCmd.InitReqPDU(); modbusCmd.InitReqADU(deviceModel.Addr, transMode); return(modbusCmd); }
/// <summary> /// Отобразить свойства команды /// </summary> private void ShowCmdProps(ModbusCmd modbusCmd) { numCmdAddress.Value = 1; numCmdAddress.Minimum = AddrShift; numCmdAddress.Maximum = ushort.MaxValue + AddrShift; numCmdAddress.Hexadecimal = !DecAddr; ShowFuncCode(modbusCmd); ShowByteOrder(modbusCmd); if (modbusCmd == null) { txtCmdName.Text = ""; cbCmdTableType.SelectedIndex = 0; numCmdAddress.Value = AddrShift; lblCmdAddressHint.Text = ""; cbCmdElemType.SelectedIndex = 0; numCmdElemCnt.Value = 1; txtCmdByteOrder.Text = ""; numCmdNum.Value = 1; gbCmd.Enabled = false; } else { txtCmdName.Text = modbusCmd.Name; cbCmdTableType.SelectedIndex = modbusCmd.TableType == TableType.Coils ? 0 : 1; chkCmdMultiple.Checked = modbusCmd.Multiple; numCmdAddress.Value = modbusCmd.Address + AddrShift; lblCmdAddressHint.Text = string.Format(KpPhrases.AddressHint, AddrNotation, AddrShift); cbCmdElemType.SelectedIndex = (int)modbusCmd.ElemType; numCmdElemCnt.Value = 1; numCmdElemCnt.Maximum = modbusCmd.MaxElemCnt; numCmdElemCnt.Value = modbusCmd.ElemCnt; cbCmdElemType.Enabled = modbusCmd.ElemTypeEnabled; numCmdElemCnt.Enabled = modbusCmd.Multiple; numCmdNum.Value = modbusCmd.CmdNum; gbCmd.Enabled = true; } }
/// <summary> /// Заполнить дерево в соответствии с шаблоном устройства /// </summary> private void FillTree() { // обнуление выбранных объектов и снятие признака изменения selElemGroup = null; selElemInfo = null; selCmd = null; selNode = null; ShowElemGroupProps(null); Modified = false; // приостановка отрисовки дерева treeView.BeginUpdate(); // очистка дерева grsNode.Nodes.Clear(); cmdsNode.Nodes.Clear(); treeView.SelectedNode = grsNode; // заполнение узла групп элементов foreach (ElemGroup elemGroup in template.ElemGroups) { grsNode.Nodes.Add(NewElemGroupNode(elemGroup)); } // заполнение узла команд foreach (ModbusCmd modbusCmd in template.Cmds) { cmdsNode.Nodes.Add(NewCmdNode(modbusCmd)); } // раскрытие основных узлов дерева grsNode.Expand(); cmdsNode.Expand(); // возобновление отрисовки дерева treeView.EndUpdate(); }
/// <summary> /// Отправить команду ТУ /// </summary> public override void SendCmd(Command cmd) { base.SendCmd(cmd); if (CanSendCmd) { ModbusCmd modbusCmd = deviceTemplate.FindCmd(cmd.CmdNum); if (modbusCmd != null && (modbusCmd.Multiple && (cmd.CmdTypeID == BaseValues.CmdTypes.Standard || cmd.CmdTypeID == BaseValues.CmdTypes.Binary) || !modbusCmd.Multiple && cmd.CmdTypeID == BaseValues.CmdTypes.Standard)) { // формирование команды Modbus if (modbusCmd.Multiple) { if (cmd.CmdTypeID == BaseValues.CmdTypes.Standard) { modbusCmd.SetCmdData(cmd.CmdVal); } else { modbusCmd.Data = cmd.CmdData; } } else { modbusCmd.Value = modbusCmd.TableType == TableType.HoldingRegisters ? (ushort)cmd.CmdVal : cmd.CmdVal > 0 ? (ushort)1 : (ushort)0; } modbusCmd.InitReqPDU(); modbusCmd.InitReqADU(devAddr, transMode); // отправка команды устройству lastCommSucc = false; int tryNum = 0; while (RequestNeeded(ref tryNum)) { // выполнение запроса if (request(modbusCmd)) { lastCommSucc = true; } // завершение запроса FinishRequest(); tryNum++; } } else { lastCommSucc = false; WriteToLog(CommPhrases.IllegalCommand); } } // расчёт статистики CalcCmdStats(); }
/// <summary> /// Конструктор /// </summary> public CtrlCmd() { InitializeComponent(); modbusCmd = null; Settings = null; }
/// <summary> /// Отобразить код функции команды /// </summary> private void ShowFuncCode(ModbusCmd modbusCmd) { txtCmdFuncCode.Text = modbusCmd == null ? "" : string.Format("{0} ({1}H)", modbusCmd.FuncCode, modbusCmd.FuncCode.ToString("X2")); }