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))
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); } }
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); } }
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))
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; } }
// -- 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 }); } } }
// -- 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 }); } } }
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 в маске Веса импульсов } } } } }