Пример #1
0
        private void btnSend_Click(object sender, EventArgs e)
        {
            // send a command to Server
            int  userID     = decimal.ToInt32(numUserID.Value);
            int  ctrlCnlNum = decimal.ToInt32(numCtrlCnlNum.Value);
            bool cmdSent    = false;
            bool sendOK     = false;

            if (rbStandard.Checked)
            {
                double cmdVal = ScadaUtils.StrToDouble(txtCmdVal.Text);
                if (double.IsNaN(cmdVal))
                {
                    ScadaUiUtils.ShowError(CommonPhrases.IncorrectCmdVal);
                }
                else
                {
                    sendOK  = serverComm.SendStandardCommand(userID, ctrlCnlNum, cmdVal, out bool result);
                    cmdSent = true;
                }
            }
            else if (rbBinary.Checked)
            {
                if (rbString.Checked)
                {
                    byte[] cmdData = Command.StrToCmdData(txtCmdData.Text);
                    sendOK  = serverComm.SendBinaryCommand(userID, ctrlCnlNum, cmdData, out bool result);
                    cmdSent = true;
                }
                else if (ScadaUtils.HexToBytes(txtCmdData.Text, out byte[] cmdData, true))
Пример #2
0
        private void btnSend_Click(object sender, EventArgs e)
        {
            // create event to send
            double oldCnlVal = ScadaUtils.StrToDouble(txtOldCnlVal.Text);

            if (double.IsNaN(oldCnlVal))
            {
                ScadaUiUtils.ShowError(ServerShellPhrases.IncorrectOldCnlVal);
                return;
            }

            double newCnlVal = ScadaUtils.StrToDouble(txtNewCnlVal.Text);

            if (double.IsNaN(newCnlVal))
            {
                ScadaUiUtils.ShowError(ServerShellPhrases.IncorrectNewCnlVal);
                return;
            }

            EventTableLight.Event ev = new EventTableLight.Event
            {
                DateTime   = dtpDate.Value.Date.Add(dtpTime.Value.TimeOfDay),
                ObjNum     = decimal.ToInt32(numObjNum.Value),
                KPNum      = decimal.ToInt32(numKPNum.Value),
                ParamID    = decimal.ToInt32(numParamID.Value),
                CnlNum     = decimal.ToInt32(numCnlNum.Value),
                OldCnlVal  = oldCnlVal,
                OldCnlStat = decimal.ToInt32(numOldCnlStat.Value),
                NewCnlVal  = newCnlVal,
                NewCnlStat = decimal.ToInt32(numNewCnlStat.Value),
                Checked    = numUserID.Value > 0,
                UserID     = decimal.ToInt32(numUserID.Value),
                Descr      = txtDescr.Text,
                Data       = txtData.Text
            };

            // send event
            if (serverComm.SendEvent(ev, out bool result))
            {
                DialogResult = DialogResult.OK;
            }
            else
            {
                errLog.WriteError(serverComm.ErrMsg);
                ScadaUiUtils.ShowError(serverComm.ErrMsg);
            }
        }
Пример #3
0
        private void btnSend_Click(object sender, EventArgs e)
        {
            // retrieve data to send
            if (!int.TryParse(cbCnlNum.Text, out int cnlNum))
            {
                ScadaUiUtils.ShowError(ServerShellPhrases.IncorrectCnlNum);
                return;
            }

            double cnlVal = ScadaUtils.StrToDouble(txtCnlVal.Text);

            if (double.IsNaN(cnlVal))
            {
                ScadaUiUtils.ShowError(ServerShellPhrases.IncorrectCnlVal);
                return;
            }

            DateTime srezDT = rbCurData.Checked ?
                              DateTime.MinValue :
                              dtpArcDate.Value.Date.Add(dtpArcTime.Value.TimeOfDay);

            SrezTableLight.Srez srez = new SrezTableLight.Srez(srezDT, 1);
            srez.CnlNums[0] = cnlNum;
            srez.CnlData[0] = new SrezTableLight.CnlData(cnlVal, decimal.ToInt32(numCnlStat.Value));

            // send data
            if (rbCurData.Checked ?
                serverComm.SendSrez(srez, out bool result) :
                serverComm.SendArchive(srez, out result))
            {
                cbCnlNum.Items.Remove(cnlNum);
                cbCnlNum.Items.Insert(0, cnlNum);
                DialogResult = DialogResult.OK;
            }
            else
            {
                errLog.WriteError(serverComm.ErrMsg);
                ScadaUiUtils.ShowError(serverComm.ErrMsg);
            }
        }
Пример #4
0
        private void btnSend_Click(object sender, EventArgs e)
        {
            // initialize a command
            Command cmd = new Command()
            {
                KPNum = kp.Number
            };
            bool cmdOK = false;

            if (rbStandard.Checked)
            {
                cmd.CmdTypeID = BaseValues.CmdTypes.Standard;
                cmd.CmdNum    = decimal.ToInt32(numCmdNum.Value);

                double cmdVal = ScadaUtils.StrToDouble(txtCmdVal.Text);
                if (double.IsNaN(cmdVal))
                {
                    ScadaUiUtils.ShowError(CommonPhrases.IncorrectCmdVal);
                }
                else
                {
                    cmd.CmdVal = cmdVal;
                    cmdOK      = true;
                }
            }
            else if (rbBinary.Checked)
            {
                cmd.CmdTypeID = BaseValues.CmdTypes.Binary;
                cmd.CmdNum    = decimal.ToInt32(numCmdNum.Value);

                if (rbString.Checked)
                {
                    cmd.CmdData = Command.StrToCmdData(txtCmdData.Text);
                    cmdOK       = true;
                }
                else if (ScadaUtils.HexToBytes(txtCmdData.Text, out byte[] cmdData, true))
Пример #5
0
        protected void btnExecute_Click(object sender, EventArgs e)
        {
            // проверка пароля
            if (pnlPassword.Visible)
            {
                int    roleID;
                string errMsg;
                AppData.MainData.CheckUser(UserData.GetUserData().UserLogin, txtPassword.Text, true,
                                           out roleID, out errMsg);
                if (errMsg != "")
                {
                    lblMessage.Text = string.Format(WebPhrases.ErrorFormat, errMsg);
                }
            }

            // получение и проверка параметров команды
            int    ctrlCnlNum = (int)ViewState["CtrlCnlNum"];
            double cmdVal     = 0.0;

            byte[] cmdData    = null;
            View   activeView = mvCommand.Visible ? mvCommand.GetActiveView() : null;

            if (lblMessage.Text == "")
            {
                if (activeView == viewStandCmd1)
                {
                    if (!double.TryParse(rblCmdVal.SelectedValue, out cmdVal))
                    {
                        lblMessage.Text = string.Format(WebPhrases.ErrorFormat, WebPhrases.CmdNotSelected);
                    }
                }
                else if (activeView == viewStandCmd2)
                {
                    cmdVal = ScadaUtils.StrToDouble(txtCmdVal.Text);
                    if (double.IsNaN(cmdVal))
                    {
                        lblMessage.Text = string.Format(WebPhrases.ErrorFormat, WebPhrases.IncorrectCmdVal);
                    }
                }
                else if (activeView == viewBinCmd)
                {
                    if (txtCmdData.Text.Length > 0)
                    {
                        if (rbStr.Checked)
                        {
                            cmdData = Encoding.Default.GetBytes(txtCmdData.Text);
                        }
                        else
                        {
                            if (!ScadaUtils.HexToBytes(txtCmdData.Text, out cmdData))
                            {
                                lblMessage.Text = string.Format(WebPhrases.ErrorFormat,
                                                                WebPhrases.IncorrectCmdData);
                            }
                        }
                    }
                    else
                    {
                        lblMessage.Text = string.Format(WebPhrases.ErrorFormat, WebPhrases.EmptyCmdData);
                    }
                }
            }

            // отправка команды
            if (lblMessage.Text == "")
            {
                SendCmd(ctrlCnlNum, cmdVal, cmdData);
            }

            // отображение сообщения об ошибке
            if (lblMessage.Text != "")
            {
                lblMessage.Visible = true;
            }
        }
Пример #6
0
        // -- incoming publish events --

        void OnPublishReceived(PublishPacket packet)
        {
            //WriteToLog (Encoding.UTF8.GetString(packet.Message));
            //WriteToLog (packet.Topic);

            string pv   = Encoding.UTF8.GetString(packet.Message);
            Regex  reg  = new Regex(@"^[-]?\d+[,.]?\d+$");
            Regex  reg2 = new Regex(@"^[-\d]+$");


            if (SubJSs.Count > 0)
            {
                Engine jsEng = new Engine();

                foreach (MQTTSubJS mqttjs in SubJSs)
                {
                    if (mqttjs.TopicName == packet.Topic)
                    {
                        SrezTableLight.Srez srez   = new SrezTableLight.Srez(DateTime.Now, mqttjs.CnlCnt);
                        List <JSVal>        jsvals = new List <JSVal>();
                        for (int i = 0; i < srez.CnlNums.Length; i++)
                        {
                            JSVal jsval = new JSVal();

                            jsvals.Add(jsval);
                        }

                        jsEng.SetValue("mqttJS", mqttjs);
                        jsEng.SetValue("InMsg", Encoding.UTF8.GetString(packet.Message));
                        jsEng.SetValue("jsvals", jsvals);
                        jsEng.SetValue("mylog", new Action <string>(WriteToLog));

                        bool sndres;
                        try
                        {
                            jsEng.Execute(mqttjs.JSHandler);
                            int i = 0;

                            foreach (JSVal jsvl in jsvals)
                            {
                                SrezTableLight.CnlData cnlData = new SrezTableLight.CnlData();
                                cnlData.Stat    = jsvl.Stat;
                                cnlData.Val     = jsvl.Val;
                                srez.CnlNums[i] = jsvl.CnlNum;
                                srez.SetCnlData(jsvl.CnlNum, cnlData);
                                i++;
                            }

                            bool snd = RSrv.SendSrez(srez, out sndres);
                        }
                        catch
                        {
                            WriteToLog(Localization.UseRussian ? "Ошибка обработки JS" : "Error execute JS");
                        }
                        break;
                    }
                }
            }


            if (SubCmds.Count > 0)
            {
                bool IsResSendCmd;
                bool IsSendCmd;
                foreach (MQTTSubCmd mqttcmd in SubCmds)
                {
                    if (mqttcmd.TopicName == packet.Topic)
                    {
                        if (mqttcmd.CmdType == "St")
                        {
                            if (reg.IsMatch(pv))
                            {
                                pv = pv.Replace('.', ',');
                            }
                            mqttcmd.CmdVal = ScadaUtils.StrToDouble(pv);
                            IsSendCmd      = RSrv.SendStandardCommand(mqttcmd.IDUser, mqttcmd.NumCnlCtrl, mqttcmd.CmdVal, out IsResSendCmd);
                            break;
                        }
                        if (mqttcmd.CmdType == "BinTxt")
                        {
                            IsSendCmd = RSrv.SendBinaryCommand(mqttcmd.IDUser, mqttcmd.NumCnlCtrl, packet.Message, out IsResSendCmd);
                            break;
                        }
                        if (mqttcmd.CmdType == "BinHex")
                        {
                            byte[] cmdData;
                            bool   IsHexToByte = ScadaUtils.HexToBytes(pv.Trim(), out cmdData);
                            if (IsHexToByte)
                            {
                                IsSendCmd = RSrv.SendBinaryCommand(mqttcmd.IDUser, mqttcmd.NumCnlCtrl, cmdData, out IsResSendCmd);
                            }
                            break;
                        }
                        if (mqttcmd.CmdType == "Req")
                        {
                            IsSendCmd = RSrv.SendRequestCommand(mqttcmd.IDUser, mqttcmd.NumCnlCtrl, mqttcmd.KPNum, out IsResSendCmd);
                            break;
                        }
                    }
                }
            }


            if (KPTags.Length > 0)
            {
                int tagInd = 0;
                foreach (KPTag kpt in KPTags)
                {
                    if (kpt.Name == packet.Topic)
                    {
                        if (reg.IsMatch(pv))
                        {
                            pv = pv.Replace('.', ',');
                            SetCurData(tagInd, ScadaUtils.StrToDouble(pv), 1);
                            WriteToLog(pv);
                            break;
                        }
                        if (reg2.IsMatch(pv))
                        {
                            SetCurData(tagInd, ScadaUtils.StrToDouble(pv), 1);
                            WriteToLog(pv);
                            break;
                        }
                    }
                    tagInd++;
                }
            }


            if (packet.QosLevel == MqttQos.ExactlyOnce)
            {
                OnQos2PublishReceived(packet);
            }
            else
            {
                if (packet.QosLevel == MqttQos.AtLeastOnce)
                {
                    Send(new PubackPacket()
                    {
                        PacketId = packet.PacketId
                    });
                }
            }
        }
Пример #7
0
        // -- incoming publish events --

        void OnPublishReceived(PublishPacket packet)
        {
            //WriteToLog (Encoding.UTF8.GetString(packet.Message));
            //WriteToLog (packet.Topic);

            string pv   = Encoding.UTF8.GetString(packet.Message);
            Regex  reg  = new Regex(@"^[-]?\d+[,.]?\d+$");
            Regex  reg2 = new Regex(@"^[-\d]+$");


            if (SubCmds.Count > 0)
            {
                bool IsResSendCmd;
                bool IsSendCmd;
                foreach (MQTTSubCmd mqttcmd in SubCmds)
                {
                    if (mqttcmd.TopicName == packet.Topic)
                    {
                        if (mqttcmd.CmdType == "St")
                        {
                            if (reg.IsMatch(pv))
                            {
                                pv = pv.Replace('.', ',');
                            }
                            mqttcmd.CmdVal = ScadaUtils.StrToDouble(pv);
                            IsSendCmd      = RSrv.SendStandardCommand(mqttcmd.IDUser, mqttcmd.NumCnlCtrl, mqttcmd.CmdVal, out IsResSendCmd);
                            break;
                        }
                        if (mqttcmd.CmdType == "BinTxt")
                        {
                            IsSendCmd = RSrv.SendBinaryCommand(mqttcmd.IDUser, mqttcmd.NumCnlCtrl, packet.Message, out IsResSendCmd);
                            break;
                        }
                        if (mqttcmd.CmdType == "BinHex")
                        {
                            byte[] cmdData;
                            bool   IsHexToByte = ScadaUtils.HexToBytes(pv.Trim(), out cmdData);
                            if (IsHexToByte)
                            {
                                IsSendCmd = RSrv.SendBinaryCommand(mqttcmd.IDUser, mqttcmd.NumCnlCtrl, cmdData, out IsResSendCmd);
                            }
                            break;
                        }
                        if (mqttcmd.CmdType == "Req")
                        {
                            IsSendCmd = RSrv.SendRequestCommand(mqttcmd.IDUser, mqttcmd.NumCnlCtrl, mqttcmd.KPNum, out IsResSendCmd);
                            break;
                        }
                    }
                }
            }


            if (KPTags.Length > 0)
            {
                int tagInd = 0;
                foreach (KPTag kpt in KPTags)
                {
                    if (kpt.Name == packet.Topic)
                    {
                        if (reg.IsMatch(pv))
                        {
                            pv = pv.Replace('.', ',');
                            SetCurData(tagInd, ScadaUtils.StrToDouble(pv), 1);
                            WriteToLog(pv);
                            break;
                        }
                        if (reg2.IsMatch(pv))
                        {
                            SetCurData(tagInd, ScadaUtils.StrToDouble(pv), 1);
                            WriteToLog(pv);
                            break;
                        }
                    }
                    tagInd++;
                }
            }


            if (packet.QosLevel == MqttQos.ExactlyOnce)
            {
                OnQos2PublishReceived(packet);
            }
            else
            {
                if (packet.QosLevel == MqttQos.AtLeastOnce)
                {
                    Send(new PubackPacket()
                    {
                        PacketId = packet.PacketId
                    });
                }
            }
        }
Пример #8
0
        public override void OnAddedToCommLine()                    // Выполняем действия при добавлении Линии связи - Чтение шаблона, создание списка Тегов
        {
            base.OnAddedToCommLine();
            devTemplate = null;

            fileName = ReqParams.CmdLine == null ? "" : ReqParams.CmdLine.Trim();
            string filePath = AppDirs.ConfigDir + fileName;

            if (fileName == "")
            {
                WriteToLog(string.Format(Localization.UseRussian ?
                                         "{0} Ошибка: Не задан шаблон устройства для {1}" :
                                         "{0} Error: Template is undefined for the {1}", CommUtils.GetNowDT(), Caption));
            }
            else
            {
                try
                {
                    devTemplate = FileFunc.LoadXml(typeof(DevTemplate), filePath) as DevTemplate;
                    fileyes     = true;
                }
                catch (Exception err)
                {
                    WriteToLog(string.Format(Localization.UseRussian ?
                                             "Ошибка: " + err.Message :
                                             "Error: " + err.Message, CommUtils.GetNowDT(), Caption));
                }
            }

            // Проверка на наличие конфигурации XML
            if (devTemplate != null)
            {
                // Определить Номера активных запросов, посылку команд проводить согласно списку активных запросов.

                if (devTemplate.SndGroups.Count != 0) // Определить активные запросы и записать в массив номера запросов для создания тегов по номерам телеграмм
                                                      // Можно упростить до определения индекса
                {
                    for (int snd = 0; snd < devTemplate.SndGroups.Count; snd++)
                    {
                        if (devTemplate.SndGroups[snd].SndActive)                                                       // Если запрос активен, заносим его номер Cnt в Словарь
                        {
                            if (!ActiveSnd.ContainsKey(devTemplate.SndGroups[snd].SndCnt))                              // Ключ = SndCnt - Значение = Индекс Активного запроса SndCnt
                            {
                                ActiveSnd.Add(devTemplate.SndGroups[snd].SndCnt, devTemplate.SndGroups.FindIndex(x => x.SndCnt == devTemplate.SndGroups[snd].SndCnt));
                            }

                            byte[] sndcode = ScadaUtils.HexToBytes(devTemplate.SndGroups[snd].SndCode, true);            // Чтение строки HEX из параметра SndCode
                            sndcode_ = sndcode[0];

                            if (sndcode_ == 0x01)                                                                        // Проверяем какой номер запроса у параметра SndCode - F=0x01 Текущие параметры
                            {
                                xValCnt01 = devTemplate.SndGroups[snd].SndCnt;                                           // Сохраняем номер запроса (SndCnt)
                                if (devTemplate.SndGroups[snd].SndData != "")
                                {
                                    startCnl = Convert.ToInt32(ScadaUtils.StrToDouble(devTemplate.SndGroups[snd].SndData.Trim())); // Сохранить начальный номер сигнала Текущих параметров
                                }
                            }
                            else if (sndcode_ == 0x07)                                                                   // Или F=0x07 (Вес импульса для Регистратора импульсов)
                            {
                                xValCnt07 = devTemplate.SndGroups[snd].SndCnt;                                           // Сохраняем номер запроса (SndCnt)
                                if (devTemplate.SndGroups[snd].SndData != "")
                                {
                                    startCnlv = Convert.ToInt32(ScadaUtils.StrToDouble(devTemplate.SndGroups[snd].SndData.Trim())); // Сохранить начальный номер сигнала Весов импульсов (Регистратор импульсов)
                                }
                            }
                            activeuse = true;                                                                            // Есть активные запросы
                        }
                    }
                }

                if (devTemplate.CmdGroups.Count != 0) // Определяем наличие активных команд и заносим в словарь Индексов команд
                {
                    for (int cmd = 0; cmd < devTemplate.CmdGroups.Count; cmd++)
                    {
                        if (devTemplate.CmdGroups[cmd].CmdActive)
                        {
                            if (!ActiveCmd.ContainsKey(devTemplate.CmdGroups[cmd].CmdCnl))                              // Ключ = номер команды CmdCnl - Значение = Индекс Активной команды CmdCnl
                            {
                                ActiveCmd.Add(devTemplate.CmdGroups[cmd].CmdCnl, devTemplate.CmdGroups.FindIndex(x => x.CmdCnl == devTemplate.CmdGroups[cmd].CmdCnl));
                            }
                        }
                    }
                }

                if (devTemplate.Values.Count != 0) // Проверка наличия записей переменных в конфигурации
                {
                    if (activeuse)
                    {
                        // ------------------- Сформировать Список параметров по меню ------------------
                        for (int ac = 0; ac < ActiveSnd.Count; ac++)
                        {
                            var valCnt_ = devTemplate.Values.FindIndex(x => x.ValCnt == ActiveSnd.ElementAt(ac).Key);

                            for (int val = 0; val < devTemplate.Values[valCnt_].Vals.Count; val++) // МЕНЯЕМ valCnt_ на уже проиндексированный Словарь
                            {
                                if (devTemplate.Values[valCnt_].Vals[val].SigActive)               // Проверяем переменную на активность
                                {
                                    sigN = devTemplate.Values[valCnt_].Vals[val].SigCnl;           // читаем номер сигнала переменной

                                    ActiveCnl.Add(new ActiveCnlList()
                                    {
                                        Cnl      = sigN,                                          // Номер текущего активного сигнала
                                        Name     = devTemplate.Values[valCnt_].Vals[val].SigName, // Имя текущего активного сигнала
                                        Format   = devTemplate.Values[valCnt_].Vals[val].SigType, // Тип переменной активного сигнала
                                        IdxValue = valCnt_,                                       // Индекс группы ответа (ValCnt), в которой находится сигнал
                                        MenuName = devTemplate.Values[valCnt_].ValMenu
                                    });

                                    // Проверяем номер запроса с параметром SndCode = F=0x01 и создаем маску запросов
                                    if (devTemplate.Values[valCnt_].ValCnt == xValCnt01)
                                    {   // Заносим в маску номер сигнала - startCnl (1 по умолчанию) бит по расположению.
                                        mask_ch = BitFunc.SetBit(mask_ch, devTemplate.Values[valCnt_].Vals[val].SigCnl - startCnl, devTemplate.Values[valCnt_].Vals[val].SigActive);
                                        //maxch = ActiveCnl.FindLast(s => s.IdxValue == ActiveCnl.Find(d => d.Cnl == sigN).IdxValue).Cnl; //  Поиск Максимального номер канала для Текущих параметров
                                    }   // SigCnl - startCnl (1 по умолчанию) определяет какой бит 32-х разрядного числа выставить в 1 (единицу)

                                    if (devTemplate.Values[valCnt_].ValCnt == xValCnt07)
                                    {   // Заносим в маску номер сигнала - startCnlv (41 по умолчанию) бит по расположению.
                                        // Номера сигналов для запроса F=0x07, Вес импульса Регистратора импульсов должны начинаться с 41-ого если не задан в SndData
                                        mask_chv = BitFunc.SetBit(mask_chv, devTemplate.Values[valCnt_].Vals[val].SigCnl - startCnlv, devTemplate.Values[valCnt_].Vals[val].SigActive);
                                    }   // SigCnl - startCnlv (41 по умолчанию) определяет какой бит 32-х разрядного числа выставить в 1 (единицу)
                                }
                            }
                        }

                        // ------------ Создание тегов на основе созданного Списка Активных переменных  ------------

                        List <TagGroup> tagGroups = new List <TagGroup>();
                        TagGroup        tagGroup;

                        var categoryCounts =                                            // Считаем количество Меню и количество переменных в Меню в шаблоне
                                             from p in ActiveCnl
                                             group p by p.MenuName into g
                                             select new { NameMenu = g.Key, counts = g.Count() };

                        int cnt = 0;
                        foreach (var menu in categoryCounts)
                        {
                            tagGroup = new TagGroup(menu.NameMenu);                                                 // Создание меню Тегов

                            var actcnl = ActiveCnl.FindAll(s => s.MenuName == menu.NameMenu).OrderBy(d => d.Cnl);   // Сортировка активных каналов по каждому меню

                            foreach (var tags in actcnl)
                            {
                                sigN = ActiveCnl.Find(f => f.Cnl == tags.Cnl).Cnl;
                                tagGroup.KPTags.Add(new KPTag(sigN, ActiveCnl.Find(f => f.Cnl == tags.Cnl).Name));  // Заносим в тег Коммуникатора
                                ActiveCnl.Find(s => s.Cnl == sigN).IdxTag = cnt;                                    // Заносим номер тега Коммуникатора в Список
                                cnt++;                                                                              // Увеличиваем счетчик тегов
                            }
                            tagGroups.Add(tagGroup);                                                                // Добавляем группу тегов
                        }
                        InitKPTags(tagGroups);                                                                      // Инициализация всех тегов

                        // Определяем диапазон каналов в группах  Текущие параметры и Вес импульса

                        if (xValCnt01 != 0) // Если запрос с кодом 0x01 активен, переменная xValCnt01 содержит номер запроса
                        {
                            int idx = devTemplate.SndGroups.FindIndex(f => f.SndCnt == xValCnt01);
                            maxch  = ActiveCnl.FindLast(d => d.IdxValue == idx).Cnl;    // Максимальный номер канала для Текущих параметров
                            res_ch = BitFunc.CountBit32(mask_ch);                       // Определяем количество бит = 1 в маске текущих параметров
                            string format = ActiveCnl.Find(d => d.IdxValue == idx).Format;

                            if (format == "float" || format == "uint32")
                            {
                                col = 4;
                            }
                            if (format == "double")
                            {
                                col = 8;
                            }
                        }

                        if (xValCnt07 != 0) // Если запрос с кодом 0x07 активен, переменная xValCnt07 содержит номер запроса
                        {
                            int idx = devTemplate.SndGroups.FindIndex(f => f.SndCnt == xValCnt07);
                            maxchv  = ActiveCnl.FindLast(d => d.IdxValue == idx).Cnl;   // Максимальный номер канала для Веса импульсов
                            res_chv = BitFunc.CountBit32(mask_chv);                     // Определяем количество бит = 1 в маске Веса импульсов
                        }
                    }
                }
            }
        }