/// <summary> /// Инициализировать теги КП и группы переменных на основе конфигурации /// </summary> private void InitKPTags() { int groupCnt = config.VarGroups.Count; List <TagGroup> tagGroups = new List <TagGroup>(groupCnt); varGroups = new VarGroup[groupCnt]; int signal = 1; for (int i = 0; i < groupCnt; i++) { Config.VarGroup configVarGroup = config.VarGroups[i]; int varCnt = configVarGroup.Variables.Count; TagGroup tagGroup = new TagGroup(configVarGroup.Name); VarGroup varGroup = new VarGroup(configVarGroup.Name, varCnt, signal); for (int j = 0; j < varCnt; j++) { Config.Variable configVar = configVarGroup.Variables[j]; KPTag kpTag = new KPTag(signal++, configVar.Name); tagGroup.KPTags.Add(kpTag); varGroup.VarNames[j] = configVar.Name; varGroup.Variables[j] = CreateVariable(configVar); } tagGroups.Add(tagGroup); varGroups[i] = varGroup; } InitKPTags(tagGroups); }
/// <summary> /// Инициализировать теги КП и группы переменных на основе конфигурации /// </summary> private void InitKPTags() { int groupCnt = config.VarGroups.Count; List <TagGroup> tagGroups = new List <TagGroup>(groupCnt); List <bool> isBitsList = new List <bool>(); varGroups = new VarGroup[groupCnt]; int signal = 1; for (int i = 0; i < groupCnt; i++) { KpConfig.VarGroup configVarGroup = config.VarGroups[i]; int varCnt = configVarGroup.Variables.Count; TagGroup tagGroup = new TagGroup(configVarGroup.Name); VarGroup varGroup = new VarGroup(configVarGroup.Name, varCnt, signal); for (int j = 0; j < varCnt; j++) { KpConfig.Variable configVar = configVarGroup.Variables[j]; KPTag kpTag = new KPTag(signal++, configVar.Name); tagGroup.KPTags.Add(kpTag); varGroup.Variables[j] = CreateVariable(configVar); isBitsList.Add(configVar.IsBits); } tagGroups.Add(tagGroup); varGroups[i] = varGroup; } InitKPTags(tagGroups); strVals = new string[KPTags.Length]; Array.Clear(strVals, 0, strVals.Length); isBitsArr = isBitsList.ToArray(); }
/// <summary> /// Инициализировать теги КП, их текущие данные и признаки изменения /// </summary> /// <remarks>В результате работы метода элементы списка KPTags не могут быть null</remarks> protected void InitKPTags(List <KPTag> srcKPTags) { if (srcKPTags == null) { throw new ArgumentNullException("srcKPTags"); } TagGroups = new TagGroup[0]; int tagCnt = srcKPTags.Count; KPTags = new KPTag[tagCnt]; curData = new SrezTableLight.CnlData[tagCnt]; curDataModified = new bool[tagCnt]; tagTable = null; int tagIndex = 0; foreach (KPTag kpTag in srcKPTags) { KPTags[tagIndex++] = kpTag == null ? new KPTag() : kpTag; } for (int i = 0; i < tagCnt; i++) { curData[i] = SrezTableLight.CnlData.Empty; curDataModified[i] = true; } }
/// <summary> /// Creates and adds a new tag to the group. /// </summary> public KPTag AddNewTag(int signal, string name, object aux = null) { KPTag kpTag = new KPTag(signal, name) { Aux = aux }; KPTags.Add(kpTag); return(kpTag); }
/// <summary> /// Конструктор /// </summary> public TagSrez(int tagCnt) { if (tagCnt <= 0) { throw new ArgumentException("Tag count must be positive.", "tagCnt"); } DateTime = DateTime.MinValue; KPTags = new KPTag[tagCnt]; TagData = new SrezTableLight.CnlData[tagCnt]; Descr = ""; }
/// <summary> /// Конструктор /// </summary> public KPEvent(DateTime dateTime, int kpNum, KPTag kpTag) { DateTime = dateTime; KPNum = kpNum; KPTag = kpTag; OldData = SrezTableLight.CnlData.Empty; NewData = SrezTableLight.CnlData.Empty; Checked = false; UserID = 0; Descr = ""; Data = ""; }
/// <summary> /// Привязать тег КП к входному каналу базы конфигурации /// </summary> public virtual void BindTag(int signal, int cnlNum, int objNum, int paramID) { if (cnlNum > 0) { KPTag boundKPTag = null; if (signal > 0) { // поиск тега КП по сигналу при их последовательной нумерации if (signal <= KPTags.Length) { KPTag kpTag = KPTags[signal - 1]; if (kpTag.Signal == signal) { boundKPTag = kpTag; } } // поиск тега КП по сигналу при их произвольной нумерации if (boundKPTag == null) { foreach (KPTag kpTag in KPTags) { if (kpTag.Signal == signal) { boundKPTag = kpTag; break; } } } } else { // поиск тега КП по номеру канала foreach (KPTag kpTag in KPTags) { if (kpTag.CnlNum == cnlNum) { boundKPTag = kpTag; break; } } } // привязка тега КП if (boundKPTag != null) { boundKPTag.CnlNum = cnlNum; boundKPTag.ObjNum = objNum; boundKPTag.ParamID = paramID; } } }
/// <summary> /// Инициализировать группы тегов, теги КП, их текущие данные и признаки изменения /// </summary> /// <remarks>В результате работы метода элементы списков TagGroups и KPTags не могут быть null</remarks> protected void InitKPTags(List <TagGroup> srcTagGroups) { if (srcTagGroups == null) { throw new ArgumentNullException("srcTagGroups"); } // подсчёт количества тегов int tagCnt = 0; foreach (TagGroup tagGroup in srcTagGroups) { if (tagGroup != null) { tagCnt += tagGroup.KPTags.Count; } } // инициализация данных TagGroups = srcTagGroups.ToArray(); KPTags = new KPTag[tagCnt]; curData = new SrezTableLight.CnlData[tagCnt]; curDataModified = new bool[tagCnt]; tagTable = null; int groupCnt = TagGroups.Length; int tagIndex = 0; for (int groupIndex = 0; groupIndex < groupCnt; groupIndex++) { TagGroup tagGroup = TagGroups[groupIndex]; if (tagGroup == null) { TagGroups[groupIndex] = new TagGroup(); } else { foreach (KPTag kpTag in tagGroup.KPTags) { KPTags[tagIndex++] = kpTag == null ? new KPTag() : kpTag; } } } for (int i = 0; i < tagCnt; i++) { curData[i] = SrezTableLight.CnlData.Empty; curDataModified[i] = true; } }
/// <summary> /// Получить массив индексов тегов среза, привязанных к входным каналам /// </summary> public List <int> GetBoundTagIndexes() { List <int> indexes = new List <int>(); int len = KPTags.Length; for (int i = 0; i < len; i++) { KPTag kpTag = KPTags[i]; if (kpTag != null && kpTag.CnlNum > 0) { indexes.Add(i); } } return(indexes); }
/// <summary> /// Converts the tag data to string. /// </summary> protected override string ConvertTagDataToStr(KPTag kpTag, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0) { if (kpTag.Index == TagIndex.NotifCounter) { return(tagData.Val.ToString("N0")); } else if (kpTag.Index == TagIndex.ResponseStatus) { return(tagData.Val.ToString("N0") + " (" + (HttpStatusCode)tagData.Val + ")"); } } return(base.ConvertTagDataToStr(kpTag, tagData)); }
/// <summary> /// Converts the tag data to string. /// </summary> protected override string ConvertTagDataToStr(KPTag kpTag, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0 && kpTag.Aux is TagType tagType) { switch (tagType) { case TagType.String: return(ScadaUtils.DecodeAscii(tagData.Val)); case TagType.DateTime: return(ScadaUtils.DecodeDateTime(tagData.Val).ToLocalizedString()); } } return(base.ConvertTagDataToStr(kpTag, tagData)); }
/// <summary> /// Конструктор /// </summary> public KPLogic(int number) { // private fields conn = null; appDirs = new AppDirs(); writeToLog = text => { }; // заглушка terminated = false; caption = ""; sessText = ""; sendCmdText = ""; tagTable = null; tagTableColLen = null; // protected fields curData = new SrezTableLight.CnlData[0]; curDataModified = new bool[0]; arcSrezList = new List <TagSrez>(); eventList = new List <KPEvent>(); lastArcSrezList = new List <TagSrez>(); lastEventList = new List <KPEvent>(); lastCmdList = new List <Command>(); lastCommSucc = false; kpStats.Reset(); // public properties Bind = false; Number = number; Name = ""; Dll = Assembly.GetCallingAssembly().GetName().Name; Address = 0; CallNum = ""; ReqParams = KPReqParams.Default; ReqTriesCnt = 1; SerialPort = null; CustomParams = null; CommonProps = null; CommLineSvc = null; CanSendCmd = false; ConnRequired = true; KPTags = new KPTag[0]; TagGroups = new TagGroup[0]; WorkState = WorkStates.Undefined; LastSessDT = DateTime.MinValue; LastCmdDT = DateTime.MinValue; }
/// <summary> /// Initializes the device tags. /// </summary> private void InitDeviceTags() { tagsByCnlNum = new Dictionary <int, KPTag>(); List <TagGroup> tagGroups = new List <TagGroup>(deviceConfig.Subscriptions.Count); int signal = 1; foreach (SubscriptionConfig subscriptionConfig in deviceConfig.Subscriptions) { TagGroup tagGroup = new TagGroup(subscriptionConfig.DisplayName); tagGroups.Add(tagGroup); foreach (ItemConfig itemConfig in subscriptionConfig.Items) { bool cnlNumSpecified = itemConfig.CnlNum > 0; if (itemConfig.IsArray) { for (int i = 0, n = itemConfig.ArrayLen; i < n; i++) { KPTag kpTag = tagGroup.AddNewTag(signal++, itemConfig.DisplayName + "[" + i + "]"); itemConfig.Tag = itemConfig.Tag ?? kpTag; // store a reference to the 1st tag if (cnlNumSpecified) { tagsByCnlNum[itemConfig.CnlNum + i] = kpTag; } } } else { KPTag kpTag = tagGroup.AddNewTag(signal++, itemConfig.DisplayName); itemConfig.Tag = kpTag; if (cnlNumSpecified) { tagsByCnlNum[itemConfig.CnlNum] = kpTag; } } } } InitKPTags(tagGroups); }
/// <summary> /// Конструктор /// </summary> public TagSrez(int tagCnt) { if (tagCnt <= 0) throw new ArgumentException("Tag count must be positive.", "tagCnt"); DateTime = DateTime.MinValue; KPTags = new KPTag[tagCnt]; TagData = new SrezTableLight.CnlData[tagCnt]; Descr = ""; }
/// <summary> /// Добавить в конструктор строки информацию о тегах КП /// </summary> private void AppendKPTagsInfo(StringBuilder sb) { sb.AppendLine(); if (KPTags.Length == 0) { sb.AppendLine(Localization.UseRussian ? "Теги КП отсутствуют" : "No device tags"); } else { sb.AppendLine(Localization.UseRussian ? "Текущие данные тегов КП" : "Current device tags data"); bool writeGroups = TagGroups.Length > 0; // вывод тегов КП по группам string[] colSig; // столбец сигналов string[] colName; // столбец наименований string[] colVal; // столбец значений string[] colCnl; // столбец каналов int rowCnt; // количество строк if (tagTable == null) { // формирование таблицы текущих значений тегов КП tagTable = new string[4][]; tagTableColLen = new int[4]; rowCnt = writeGroups ? KPTags.Length + TagGroups.Length + 1 : KPTags.Length + 1; tagTable[0] = colSig = new string[rowCnt]; tagTable[1] = colName = new string[rowCnt]; tagTable[2] = colVal = new string[rowCnt]; tagTable[3] = colCnl = new string[rowCnt]; if (Localization.UseRussian) { colSig[0] = "Сигнал"; colName[0] = "Наименование"; colVal[0] = "Значение"; colCnl[0] = "Канал"; } else { colSig[0] = "Signal"; colName[0] = "Name"; colVal[0] = "Value"; colCnl[0] = "Channel"; } if (writeGroups) { int i = 1; foreach (TagGroup tagGroup in TagGroups) { colSig[i] = "*"; colName[i] = tagGroup.Name; colVal[i] = ""; colCnl[i] = ""; i++; foreach (KPTag kpTag in tagGroup.KPTags) { colSig[i] = kpTag.Signal.ToString(); colCnl[i] = kpTag.CnlNum <= 0 ? "" : kpTag.CnlNum.ToString(); i++; } } } else { for (int i = 1; i < rowCnt; i++) { KPTag kpTag = KPTags[i - 1]; colSig[i] = kpTag.Signal.ToString(); colCnl[i] = kpTag.CnlNum <= 0 ? "" : kpTag.CnlNum.ToString(); } } // вычисление ширины столбцов tagTableColLen[0] = GetMaxLength(colSig); tagTableColLen[3] = GetMaxLength(colCnl); } else { colSig = tagTable[0]; colName = tagTable[1]; colVal = tagTable[2]; colCnl = tagTable[3]; rowCnt = colSig.Length; } // заполнение столбцов наименований и значений, вычисление их ширины for (int i = 1, paramInd = 0; i < rowCnt; i++) { if (colSig[i] != "*") { KPTag kpTag = KPTags[paramInd]; colName[i] = kpTag.Name; colVal[i] = ConvertTagDataToStr(kpTag.Signal, curData[paramInd]); paramInd++; } } tagTableColLen[1] = GetMaxLength(colName); tagTableColLen[2] = GetMaxLength(colVal); // добавление текстового представления таблицы в конструктор строки int lenSig = tagTableColLen[0]; int lenName = tagTableColLen[1]; int lenVal = tagTableColLen[2]; int lenCnl = tagTableColLen[3]; string br = (new StringBuilder()).Append("+-") .Append(new string('-', lenSig)).Append("-+-") .Append(new string('-', lenName)).Append("-+-") .Append(new string('-', lenVal)).Append("-+-") .Append(new string('-', lenCnl)).Append("-+").ToString(); sb.AppendLine(br); string grBeg = new string('*', lenSig + 2) + " "; for (int i = 0; i < rowCnt; i++) { if (colSig[i] == "*") { if (colName[i] == "") { sb.Append("| ").Append(new string('*', br.Length - 4)).Append(" |").AppendLine(); } else { string s = "| " + grBeg + colName[i] + " "; sb.Append(s).Append(new string('*', br.Length - s.Length - 2)).Append(" |").AppendLine(); } } else { sb.Append("| ") .Append(colSig[i].PadLeft(lenSig)).Append(" | ") .Append(colName[i].PadRight(lenName)).Append(" | ") .Append(colVal[i].PadLeft(lenVal)).Append(" | ") .Append(colCnl[i].PadLeft(lenCnl)).Append(" |").AppendLine(); } sb.AppendLine(br); } } }
/// <summary> /// Инициализировать теги КП, их текущие данные и признаки изменения /// </summary> /// <remarks>В результате работы метода элементы списка KPTags не могут быть null</remarks> protected void InitKPTags(List<KPTag> srcKPTags) { if (srcKPTags == null) throw new ArgumentNullException("srcKPTags"); TagGroups = new TagGroup[0]; int tagCnt = srcKPTags.Count; KPTags = new KPTag[tagCnt]; curData = new SrezTableLight.CnlData[tagCnt]; curDataModified = new bool[tagCnt]; tagTable = null; int tagIndex = 0; foreach (KPTag kpTag in srcKPTags) KPTags[tagIndex++] = kpTag == null ? new KPTag() : kpTag; for (int i = 0; i < tagCnt; i++) { curData[i] = SrezTableLight.CnlData.Empty; curDataModified[i] = true; } }
/// <summary> /// Инициализировать группы тегов, теги КП, их текущие данные и признаки изменения /// </summary> /// <remarks>В результате работы метода элементы списков TagGroups и KPTags не могут быть null</remarks> protected void InitKPTags(List<TagGroup> srcTagGroups) { if (srcTagGroups == null) throw new ArgumentNullException("srcTagGroups"); // подсчёт количества тегов int tagCnt = 0; foreach (TagGroup tagGroup in srcTagGroups) { if (tagGroup != null) tagCnt += tagGroup.KPTags.Count; } // инициализация данных TagGroups = srcTagGroups.ToArray(); KPTags = new KPTag[tagCnt]; curData = new SrezTableLight.CnlData[tagCnt]; curDataModified = new bool[tagCnt]; tagTable = null; int groupCnt = TagGroups.Length; int tagIndex = 0; for (int groupIndex = 0; groupIndex < groupCnt; groupIndex++) { TagGroup tagGroup = TagGroups[groupIndex]; if (tagGroup == null) { TagGroups[groupIndex] = new TagGroup(); } else { foreach (KPTag kpTag in tagGroup.KPTags) KPTags[tagIndex++] = kpTag == null ? new KPTag() : kpTag; } } for (int i = 0; i < tagCnt; i++) { curData[i] = SrezTableLight.CnlData.Empty; curDataModified[i] = true; } }
public override void OnAddedToCommLine() { List <TagGroup> tagGroups = new List <TagGroup> (); TagGroup tagGroup = new TagGroup("GroupMQTT"); XmlDocument xmlDoc = new XmlDocument(); string filename = ReqParams.CmdLine.Trim(); xmlDoc.Load(AppDirs.ConfigDir + filename); XmlNode MQTTSubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttSubTopics"); XmlNode MQTTPubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttPubTopics"); XmlNode RapSrvCnf = xmlDoc.DocumentElement.SelectSingleNode("RapSrvCnf"); XmlNode MQTTSettings = xmlDoc.DocumentElement.SelectSingleNode("MqttParams"); CommSettings cs = new CommSettings() { ServerHost = RapSrvCnf.Attributes.GetNamedItem("ServerHost").Value, ServerPort = Convert.ToInt32(RapSrvCnf.Attributes.GetNamedItem("ServerPort").Value), ServerUser = RapSrvCnf.Attributes.GetNamedItem("ServerUser").Value, ServerPwd = RapSrvCnf.Attributes.GetNamedItem("ServerPwd").Value }; RSrv = new RapSrvEx(cs); RSrv.Conn(); MQTTPTs = new List <MQTTPubTopic> (); foreach (XmlElement MqttPTCnf in MQTTPubTopics) { MQTTPubTopic MqttPT = new MQTTPubTopic() { NumCnl = Convert.ToInt32(MqttPTCnf.GetAttribute("NumCnl")), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), TopicName = MqttPTCnf.GetAttribute("TopicName"), Value = 0 }; MQTTPTs.Add(MqttPT); } sp = new SubscribePacket(); int i = 0; sp.Topics = new string[MQTTSubTopics.ChildNodes.Count]; sp.QosLevels = new MqttQos[MQTTSubTopics.ChildNodes.Count]; foreach (XmlElement elemGroupElem in MQTTSubTopics.ChildNodes) { sp.Topics [i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels [i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); KPTag KPt = new KPTag() { Signal = i + 1, Name = sp.Topics [i], CnlNum = Convert.ToInt32(elemGroupElem.GetAttribute("NumCnl")) }; tagGroup.KPTags.Add(KPt); i++; } tagGroups.Add(tagGroup); InitKPTags(tagGroups); connArgs = new MqttConnectionArgs(); connArgs.ClientId = MQTTSettings.Attributes.GetNamedItem("ClientID").Value; connArgs.Hostname = MQTTSettings.Attributes.GetNamedItem("Hostname").Value; connArgs.Port = Convert.ToInt32(MQTTSettings.Attributes.GetNamedItem("Port").Value); connArgs.Username = MQTTSettings.Attributes.GetNamedItem("UserName").Value; connArgs.Password = MQTTSettings.Attributes.GetNamedItem("Password").Value; this.Persistence = new InMemoryPersistence(); Transport = new TcpTransport(connArgs.Hostname, connArgs.Port); Transport.Version = connArgs.Version; Transport.SetTimeouts(connArgs.ReadTimeout, connArgs.WriteTimeout); Send(MakeConnectMessage(connArgs)); ReceiveConnack(); ResumeOutgoingFlows(); Subscribe(sp); }
public override void OnAddedToCommLine() { List <TagGroup> tagGroups = new List <TagGroup> (); TagGroup tagGroup = new TagGroup("GroupMQTT"); TagGroup tagGroupJS = new TagGroup("GoupJS"); XmlDocument xmlDoc = new XmlDocument(); string filename = ReqParams.CmdLine.Trim(); xmlDoc.Load(AppDirs.ConfigDir + filename); XmlNode MQTTSubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttSubTopics"); XmlNode MQTTPubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttPubTopics"); XmlNode MQTTPubCmds = xmlDoc.DocumentElement.SelectSingleNode("MqttPubCmds"); XmlNode MQTTSubCmds = xmlDoc.DocumentElement.SelectSingleNode("MqttSubCmds"); XmlNode MQTTSubJSs = xmlDoc.DocumentElement.SelectSingleNode("MqttSubJSs"); XmlNode RapSrvCnf = xmlDoc.DocumentElement.SelectSingleNode("RapSrvCnf"); XmlNode MQTTSettings = xmlDoc.DocumentElement.SelectSingleNode("MqttParams"); CommSettings cs = new CommSettings() { ServerHost = RapSrvCnf.Attributes.GetNamedItem("ServerHost").Value, ServerPort = Convert.ToInt32(RapSrvCnf.Attributes.GetNamedItem("ServerPort").Value), ServerUser = RapSrvCnf.Attributes.GetNamedItem("ServerUser").Value, ServerPwd = RapSrvCnf.Attributes.GetNamedItem("ServerPwd").Value }; RSrv = new RapSrvEx(cs); RSrv.Conn(); MQTTPTs = new List <MQTTPubTopic> (); MQTTCmds = new List <MQTTPubCmd> (); foreach (XmlElement MqttPTCnf in MQTTPubTopics) { MQTTPubTopic MqttPT = new MQTTPubTopic() { NumCnl = Convert.ToInt32(MqttPTCnf.GetAttribute("NumCnl")), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), TopicName = MqttPTCnf.GetAttribute("TopicName"), PubBehavior = MqttPTCnf.GetAttribute("PubBehavior"), NumberDecimalSeparator = MqttPTCnf.GetAttribute("NDS"), Value = 0 }; MQTTPTs.Add(MqttPT); } foreach (XmlElement MqttPTCnf in MQTTPubCmds) { MQTTPubCmd MqttPTCmd = new MQTTPubCmd() { NumCmd = MqttPTCnf.GetAttrAsInt("NumCmd"), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), Retain = false, TopicName = MqttPTCnf.GetAttribute("TopicName") }; MQTTCmds.Add(MqttPTCmd); } sp = new SubscribePacket(); int i = 0; int spCnt = MQTTSubTopics.ChildNodes.Count; spCnt += MQTTSubCmds.ChildNodes.Count; spCnt += MQTTSubJSs.ChildNodes.Count; sp.Topics = new string[spCnt]; sp.QosLevels = new MqttQos[spCnt]; foreach (XmlElement elemGroupElem in MQTTSubTopics.ChildNodes) { sp.Topics [i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels [i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); KPTag KPt = new KPTag() { Signal = i + 1, Name = sp.Topics [i], CnlNum = Convert.ToInt32(elemGroupElem.GetAttribute("NumCnl")) }; tagGroup.KPTags.Add(KPt); i++; } tagGroups.Add(tagGroup); InitKPTags(tagGroups); SubCmds = new List <MQTTSubCmd> (); foreach (XmlElement elemGroupElem in MQTTSubCmds.ChildNodes) { sp.Topics [i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels [i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); MQTTSubCmd cmd = new MQTTSubCmd() { TopicName = sp.Topics[i], CmdNum = elemGroupElem.GetAttrAsInt("NumCmd", 0), CmdType = elemGroupElem.GetAttribute("CmdType"), KPNum = elemGroupElem.GetAttrAsInt("KPNum", 0), IDUser = elemGroupElem.GetAttrAsInt("IDUser", 0), NumCnlCtrl = elemGroupElem.GetAttrAsInt("NumCnlCtrl", 0) }; SubCmds.Add(cmd); i++; } SubJSs = new List <MQTTSubJS>(); foreach (XmlElement elemGroupElem in MQTTSubJSs.ChildNodes) { sp.Topics[i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels[i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); MQTTSubJS msjs = new MQTTSubJS() { TopicName = sp.Topics[i], CnlCnt = elemGroupElem.GetAttrAsInt("CnlCnt", 1), JSHandlerPath = elemGroupElem.GetAttrAsString("JSHandlerPath", "") }; if (msjs.LoadJSHandler()) { SubJSs.Add(msjs); i++; } } connArgs = new MqttConnectionArgs(); connArgs.ClientId = MQTTSettings.Attributes.GetNamedItem("ClientID").Value; connArgs.Hostname = MQTTSettings.Attributes.GetNamedItem("Hostname").Value; connArgs.Port = Convert.ToInt32(MQTTSettings.Attributes.GetNamedItem("Port").Value); connArgs.Username = MQTTSettings.Attributes.GetNamedItem("UserName").Value; connArgs.Password = MQTTSettings.Attributes.GetNamedItem("Password").Value; connArgs.Keepalive = TimeSpan.FromSeconds(60); connArgs.ReadTimeout = TimeSpan.FromSeconds(10); connArgs.WriteTimeout = TimeSpan.FromSeconds(10); this.Persistence = new InMemoryPersistence(); Transport = new TcpTransport(connArgs.Hostname, connArgs.Port); Transport.Version = connArgs.Version; Transport.SetTimeouts(connArgs.ReadTimeout, connArgs.WriteTimeout); Send(MakeConnectMessage(connArgs)); ReceiveConnack(); ResumeOutgoingFlows(); if (sp.Topics.Length > 0) { Subscribe(sp); } WriteToLog(Localization.UseRussian ? "Инициализация линии связи выполнена успешно." : "Communication line initialized successfully"); }
public override void OnAddedToCommLine() { // загрузка конфигурации КП string errMsg; configLoaded = config.Load(Config.GetFileName(AppDirs.ConfigDir, Number), out errMsg); int dataGroupCnt = config.DataGroups.Count; List <TagGroup> tagGroups = new List <TagGroup>(dataGroupCnt); int signal = 1; if (configLoaded) { for (int i = 0; i < dataGroupCnt; i++) // browser folders { Config.DataGroup dataGroup = config.DataGroups[i]; // определение количества тегов КП в группе чтения данных int tagCntByGroup = 0; foreach (Config.DataItem dataItem in dataGroup.DataItems) { tagCntByGroup += 1; } // создание группы тегов КП if (tagCntByGroup > 0) { TagGroup tagGroup = new TagGroup(string.IsNullOrEmpty(dataGroup.Name) ? (Localization.UseRussian ? "Безымянная группа" : "Unnamed group") : dataGroup.Name); int dataItemCnt = dataGroup.DataItems.Count; List <DataItemInfo> dataGroupInfo = new List <DataItemInfo>(); dataGroup.Tag = dataGroupInfo; for (int j = 0; j < dataItemCnt; j++) // Browse Items in a folder { Config.DataItem dataItem = dataGroup.DataItems[j]; string dataItemName = string.IsNullOrEmpty(dataItem.Name) ? "" : dataItem.Name; string tagNamePrefix = dataItemName == "" ? (Localization.UseRussian ? "Безымянный тег" : "Unnamed tag") : dataItemName; int tagCntByItem = 1; DataItemInfo dataItemInfo = new DataItemInfo(dataItem.Name, dataItem.Id); dataItemInfo.KPTags = new KPTag[tagCntByItem]; //for (int k = 0; k < tagCntByItem; k++) { string tagName = tagNamePrefix; KPTag kpTag = new KPTag(signal++, tagName); tagGroup.KPTags.Add(kpTag); dataItemInfo.KPTags[0] = kpTag; //0->k } if (tagCntByItem > 0 && !kpTagsByName.ContainsKey(dataItemName)) { kpTagsByName.Add(dataItemName, dataItemInfo.KPTags[0]); } } tagGroups.Add(tagGroup); } } InitKPTags(tagGroups); } // Logs /* * string m_UtilsLogFilePath; * bool m_deleteOnLoad = true; * int m_traceMasks = Opc.Ua.Utils.TraceMasks.Error | Opc.Ua.Utils.TraceMasks.Information; * m_UtilsLogFilePath = AppDomain.CurrentDomain.BaseDirectory + "Opc.Ua.Core.Logs.txt"; * Opc.Ua.Utils.SetTraceLog(m_UtilsLogFilePath, m_deleteOnLoad); * Opc.Ua.Utils.SetTraceMask(m_traceMasks); * Opc.Ua.Utils.Trace(Opc.Ua.Utils.TraceMasks.Information, "Beginning of Opc.Ua.Core.Utils logs"); */ WriteToLog("Configuration started"); Init().Wait(); WriteToLog("Configuration finished"); }
/// <summary> /// Инициализировать теги КП и группы переменных на основе конфигурации /// </summary> private void InitKPTags() { int groupCnt = config.VarGroups.Count; List<TagGroup> tagGroups = new List<TagGroup>(groupCnt); varGroups = new VarGroup[groupCnt]; int signal = 1; for (int i = 0; i < groupCnt; i++) { Config.VarGroup configVarGroup = config.VarGroups[i]; int varCnt = configVarGroup.Variables.Count; TagGroup tagGroup = new TagGroup(configVarGroup.Name); VarGroup varGroup = new VarGroup(configVarGroup.Name, varCnt, signal); for (int j = 0; j < varCnt; j++) { Config.Variable configVar = configVarGroup.Variables[j]; KPTag kpTag = new KPTag(signal++, configVar.Name); tagGroup.KPTags.Add(kpTag); varGroup.VarNames[j] = configVar.Name; varGroup.Variables[j] = CreateVariable(configVar); } tagGroups.Add(tagGroup); varGroups[i] = varGroup; } InitKPTags(tagGroups); }
private Log.WriteLineDelegate writeToLog; // метод записи в журнал линии связи #endregion Fields #region Constructors /// <summary> /// Конструктор /// </summary> public KPLogic(int number) { // private fields conn = null; appDirs = new AppDirs(); writeToLog = text => { }; // заглушка terminated = false; caption = ""; sessText = ""; sendCmdText = ""; tagTable = null; tagTableColLen = null; // protected fields curData = new SrezTableLight.CnlData[0]; curDataModified = new bool[0]; arcSrezList = new List<TagSrez>(); eventList = new List<KPEvent>(); lastArcSrezList = new List<TagSrez>(); lastEventList = new List<KPEvent>(); lastCmdList = new List<Command>(); lastCommSucc = false; kpStats.Reset(); // public properties Bind = false; Number = number; Name = ""; Dll = Assembly.GetCallingAssembly().GetName().Name; Address = 0; CallNum = ""; ReqParams = KPReqParams.Default; ReqTriesCnt = 1; SerialPort = null; CustomParams = null; CommonProps = null; CommLineSvc = null; CanSendCmd = false; ConnRequired = true; KPTags = new KPTag[0]; TagGroups = new TagGroup[0]; WorkState = WorkStates.Undefined; LastSessDT = DateTime.MinValue; LastCmdDT = DateTime.MinValue; }
/// <summary> /// Converts the tag data to string. /// </summary> protected override string ConvertTagDataToStr(KPTag kpTag, SrezTableLight.CnlData tagData) { return(tagData.Stat > 0 && (kpTag.Signal == 2 || kpTag.Signal == 4) ? tagData.Val > 0 ? CommPhrases.On : CommPhrases.Off : base.ConvertTagDataToStr(kpTag, tagData)); }
public override void OnAddedToCommLine() { List <TagGroup> tagGroups = new List <TagGroup>(); TagGroup tagGroup = new TagGroup("GroupMQTT"); TagGroup tagGroupJS = new TagGroup("GoupJS"); XmlDocument xmlDoc = new XmlDocument(); string filename = ReqParams.CmdLine.Trim(); xmlDoc.Load(AppDirs.ConfigDir + filename); XmlNode MQTTSubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttSubTopics"); XmlNode MQTTPubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttPubTopics"); XmlNode MQTTPubCmds = xmlDoc.DocumentElement.SelectSingleNode("MqttPubCmds"); XmlNode MQTTSubCmds = xmlDoc.DocumentElement.SelectSingleNode("MqttSubCmds"); XmlNode MQTTSubJSs = xmlDoc.DocumentElement.SelectSingleNode("MqttSubJSs"); XmlNode RapSrvCnf = xmlDoc.DocumentElement.SelectSingleNode("RapSrvCnf"); MQTTSettings = xmlDoc.DocumentElement.SelectSingleNode("MqttParams"); CommSettings cs = new CommSettings() { ServerHost = RapSrvCnf.Attributes.GetNamedItem("ServerHost").Value, ServerPort = Convert.ToInt32(RapSrvCnf.Attributes.GetNamedItem("ServerPort").Value), ServerUser = RapSrvCnf.Attributes.GetNamedItem("ServerUser").Value, ServerPwd = RapSrvCnf.Attributes.GetNamedItem("ServerPwd").Value }; RSrv = new RapSrvEx(cs); RSrv.Conn(); MQTTPTs = new List <MQTTPubTopic>(); MQTTCmds = new List <MQTTPubCmd>(); foreach (XmlElement MqttPTCnf in MQTTPubTopics) { MQTTPubTopic MqttPT = new MQTTPubTopic() { NumCnl = Convert.ToInt32(MqttPTCnf.GetAttribute("NumCnl")), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), TopicName = MqttPTCnf.GetAttribute("TopicName"), PubBehavior = MqttPTCnf.GetAttribute("PubBehavior"), NumberDecimalSeparator = MqttPTCnf.GetAttribute("NDS"), Value = 0 }; MQTTPTs.Add(MqttPT); } foreach (XmlElement MqttPTCnf in MQTTPubCmds) { MQTTPubCmd MqttPTCmd = new MQTTPubCmd() { NumCmd = MqttPTCnf.GetAttrAsInt("NumCmd"), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), Retain = false, TopicName = MqttPTCnf.GetAttribute("TopicName") }; MQTTCmds.Add(MqttPTCmd); } sp = new SubscribePacket(); int i = 0; int spCnt = MQTTSubTopics.ChildNodes.Count; spCnt += MQTTSubCmds.ChildNodes.Count; spCnt += MQTTSubJSs.ChildNodes.Count; sp.Topics = new string[spCnt]; sp.QosLevels = new MqttQos[spCnt]; foreach (XmlElement elemGroupElem in MQTTSubTopics.ChildNodes) { sp.Topics[i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels[i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); KPTag KPt = new KPTag() { Signal = i + 1, Name = sp.Topics[i], CnlNum = Convert.ToInt32(elemGroupElem.GetAttribute("NumCnl")) }; tagGroup.KPTags.Add(KPt); i++; } tagGroups.Add(tagGroup); InitKPTags(tagGroups); SubCmds = new List <MQTTSubCmd>(); foreach (XmlElement elemGroupElem in MQTTSubCmds.ChildNodes) { sp.Topics[i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels[i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); MQTTSubCmd cmd = new MQTTSubCmd() { TopicName = sp.Topics[i], CmdNum = elemGroupElem.GetAttrAsInt("NumCmd", 0), CmdType = elemGroupElem.GetAttribute("CmdType"), KPNum = elemGroupElem.GetAttrAsInt("KPNum", 0), IDUser = elemGroupElem.GetAttrAsInt("IDUser", 0), NumCnlCtrl = elemGroupElem.GetAttrAsInt("NumCnlCtrl", 0) }; SubCmds.Add(cmd); i++; } SubJSs = new List <MQTTSubJS>(); foreach (XmlElement elemGroupElem in MQTTSubJSs.ChildNodes) { sp.Topics[i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels[i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); MQTTSubJS msjs = new MQTTSubJS() { TopicName = sp.Topics[i], CnlCnt = elemGroupElem.GetAttrAsInt("CnlCnt", 1), JSHandlerPath = elemGroupElem.GetAttrAsString("JSHandlerPath", "") }; if (msjs.LoadJSHandler()) { SubJSs.Add(msjs); i++; } } Connect(MQTTSettings); }