Example #1
0
        /// <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);
        }
Example #2
0
        /// <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();
        }
Example #3
0
        /// <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;
            }
        }
Example #4
0
            /// <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);
            }
Example #5
0
            /// <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    = "";
            }
Example #6
0
 /// <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     = "";
 }
Example #7
0
        /// <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;
                }
            }
        }
Example #8
0
        /// <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;
            }
        }
Example #9
0
            /// <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);
            }
Example #10
0
        /// <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));
        }
Example #11
0
        /// <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));
        }
Example #12
0
        /// <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;
        }
Example #13
0
        /// <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);
        }
Example #14
0
            /// <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 = "";
            }
Example #15
0
        /// <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);
                }
            }
        }
Example #16
0
        /// <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;
            }
        }
Example #17
0
        /// <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;
            }
        }
Example #18
0
        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);
        }
Example #19
0
        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");
        }
Example #20
0
        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");
        }
Example #21
0
        /// <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);
        }
Example #22
0
 /// <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 = "";
 }
Example #23
0
        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;
        }
Example #24
0
 /// <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));
 }
Example #25
0
        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);
        }