Beispiel #1
0
 /// <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) + ")");
 }
Beispiel #2
0
 /// <summary>
 /// Отобразить свойства команды
 /// </summary>
 private void ShowCmdProps(ModbusCmd modbusCmd)
 {
     ctrlElemGroup.Visible = false;
     ctrlElem.Visible      = false;
     ctrlCmd.Visible       = true;
     ctrlCmd.Settings      = template.Sett;
     ctrlCmd.ModbusCmd     = modbusCmd;
 }
Beispiel #3
0
        /// <summary>
        /// Создать узел команды
        /// </summary>
        private TreeNode NewCmdNode(ModbusCmd modbusCmd)
        {
            TreeNode cmdNode = new TreeNode(GetCmdCaption(modbusCmd));

            cmdNode.ImageKey = cmdNode.SelectedImageKey = "cmd.png";
            cmdNode.Tag      = modbusCmd;
            return(cmdNode);
        }
Beispiel #4
0
        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;
        }
Beispiel #5
0
 /// <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;
     }
 }
Beispiel #6
0
        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"];
        }
Beispiel #7
0
        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;
        }
Beispiel #8
0
        /// <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);
        }
Beispiel #9
0
        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;
        }
Beispiel #10
0
        /// <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);
        }
Beispiel #11
0
        /// <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;
            }
        }
Beispiel #12
0
        /// <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();
        }
Beispiel #13
0
        /// <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();
        }
Beispiel #14
0
 /// <summary>
 /// Конструктор
 /// </summary>
 public CtrlCmd()
 {
     InitializeComponent();
     modbusCmd = null;
     Settings  = null;
 }
Beispiel #15
0
 /// <summary>
 /// Отобразить код функции команды
 /// </summary>
 private void ShowFuncCode(ModbusCmd modbusCmd)
 {
     txtCmdFuncCode.Text = modbusCmd == null ? "" :
                           string.Format("{0} ({1}H)", modbusCmd.FuncCode, modbusCmd.FuncCode.ToString("X2"));
 }