Beispiel #1
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;
            }
        }
Beispiel #2
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);
        }
Beispiel #3
0
        public KpTestLogic(int number)
            : base(number)
        {
            random = new Random();

            List <TagGroup> tagGroups = new List <TagGroup>();
            TagGroup        tagGroup  = new TagGroup("Group 1");

            tagGroup.KPTags.Add(new KPTag(1, "Tag 1"));
            tagGroup.KPTags.Add(new KPTag(2, "Tag 2"));
            tagGroup.KPTags.Add(new KPTag(3, "Tag 3"));
            tagGroup.KPTags.Add(new KPTag(4, "Tag 4"));
            tagGroup.KPTags.Add(new KPTag(5, "Tag 5"));
            tagGroups.Add(tagGroup);

            tagGroup = new TagGroup("Group 2");
            tagGroup.KPTags.Add(new KPTag(6, "Tag 6"));
            tagGroup.KPTags.Add(new KPTag(7, "Tag 7"));
            tagGroup.KPTags.Add(new KPTag(8, "Tag 8"));
            tagGroup.KPTags.Add(new KPTag(9, "Tag 9"));
            tagGroup.KPTags.Add(new KPTag(10, "Tag 10"));
            tagGroups.Add(tagGroup);

            InitKPTags(tagGroups);
        }
Beispiel #4
0
        /// <summary>
        /// Creates tag groups according to the specified template.
        /// </summary>
        protected virtual List <TagGroup> CreateTagGroups(DeviceTemplate deviceTemplate, ref int tagInd)
        {
            List <TagGroup> tagGroups = new List <TagGroup>();

            if (deviceTemplate != null)
            {
                foreach (ElemGroup elemGroup in deviceTemplate.ElemGroups)
                {
                    TagGroup tagGroup = new TagGroup(elemGroup.Name);
                    tagGroups.Add(tagGroup);
                    elemGroup.StartKPTagInd = tagInd;

                    foreach (Elem elem in elemGroup.Elems)
                    {
                        int signal = ++tagInd;
                        tagGroup.AddNewTag(signal, elem.Name);

                        if (elem.ElemType == ElemType.Float || elem.ElemType == ElemType.Double)
                        {
                            floatSignals.Add(signal);
                        }
                    }
                }
            }

            return(tagGroups);
        }
Beispiel #5
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();
        }
Beispiel #6
0
        private const int GPIO_REFRESH = 100;      // expressed in milliseconds

        //private static Connection baseConnection;

        public KpWiznetLogic(int number)
            : base(number)
        {
            config        = new Config();
            wiznetSerCfg  = new SerConfig();
            wiznetGpioCfg = new gpioConfig();
            random        = new Random();
            CanSendCmd    = true;

            List <TagGroup> tagGroups = new List <TagGroup>();
            TagGroup        tagGroup  = new TagGroup("Group 1");

            tagGroup.KPTags.Add(new KPTag(1, "Tag 1"));
            tagGroup.KPTags.Add(new KPTag(2, "Tag 2"));
            tagGroup.KPTags.Add(new KPTag(3, "Tag 3"));
            tagGroup.KPTags.Add(new KPTag(4, "Tag 4"));
            tagGroup.KPTags.Add(new KPTag(5, "Tag 5"));
            tagGroups.Add(tagGroup);

            tagGroup = new TagGroup("Group 2");
            tagGroup.KPTags.Add(new KPTag(6, "Tag 6"));
            tagGroup.KPTags.Add(new KPTag(7, "Tag 7"));
            tagGroup.KPTags.Add(new KPTag(8, "Tag 8"));
            tagGroup.KPTags.Add(new KPTag(9, "Tag 9"));
            tagGroup.KPTags.Add(new KPTag(10, "Tag 10"));
            tagGroups.Add(tagGroup);

            InitKPTags(tagGroups);
        }
        /// <summary>
        /// Converts the group of channel prototypes to a group of device tags.
        /// </summary>
        public TagGroup ToTagGroup()
        {
            TagGroup tagGroup = new TagGroup(Name)
            {
                Hidden = Hidden
            };

            CnlPrototypes.ForEach(c => tagGroup.DeviceTags.Add(c.ToDeviceTag()));
            return(tagGroup);
        }
Beispiel #8
0
        /// <summary>
        /// Adds the status tag.
        /// </summary>
        public void AddStatusTag()
        {
            TagGroup tagGroup = new TagGroup(CommUtils.StatusTagCode)
            {
                Hidden = true
            };

            StatusTag = tagGroup.AddTag(CommUtils.StatusTagCode, CommUtils.StatusTagCode);
            AddGroup(tagGroup);
        }
Beispiel #9
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;
            }
        }
Beispiel #10
0
        /// <summary>
        /// Adds the tag group and calculates the tag indexes.
        /// </summary>
        public void AddGroup(TagGroup tagGroup)
        {
            int tagIndex = tags.Count;

            foreach (DeviceTag deviceTag in tagGroup.DeviceTags)
            {
                deviceTag.Index = tagIndex++;
                tags.Add(deviceTag);

                if (!string.IsNullOrEmpty(deviceTag.Code) && !tagByCode.ContainsKey(deviceTag.Code))
                {
                    tagByCode.Add(deviceTag.Code, deviceTag);
                }
            }
        }
Beispiel #11
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;
        }
Beispiel #12
0
        /// <summary>
        /// Initializes the device tags.
        /// </summary>
        private void InitDeviceTags()
        {
            List <TagGroup> tagGroups = new List <TagGroup>();

            TagGroup tagGroup = new TagGroup("Inputs");

            tagGroup.KPTags.Add(new KPTag(1, "Sine"));
            tagGroup.KPTags.Add(new KPTag(2, "Square"));
            tagGroup.KPTags.Add(new KPTag(3, "Triangle"));
            tagGroups.Add(tagGroup);

            tagGroup = new TagGroup("Outputs");
            tagGroup.KPTags.Add(new KPTag(4, "Relay State"));
            tagGroup.KPTags.Add(new KPTag(5, "Analog Output"));
            tagGroups.Add(tagGroup);

            InitKPTags(tagGroups);
        }
Beispiel #13
0
        private void InitDeviceTags()
        {
            List <TagGroup> tagGroups = new List <TagGroup>();
            int             signal    = 1;

            if (deviceConfig.SubTopics.Count > 0)
            {
                TagGroup tagGroup = new TagGroup("Subscriptions");
                tagGroups.Add(tagGroup);

                foreach (MqttSubTopic subTopic in deviceConfig.SubTopics)
                {
                    subTopic.TagIndex = signal - 1;

                    tagGroup.KPTags.Add(new KPTag
                    {
                        Signal = signal++,
                        Name   = subTopic.TopicName
                    });
                }
            }

            if (deviceConfig.SubJSs.Count > 0)
            {
                TagGroup tagGroup = new TagGroup("JS Subscriptions");
                tagGroups.Add(tagGroup);

                foreach (MqttSubJS subJS in deviceConfig.SubJSs)
                {
                    subJS.TagIndex = signal - 1;

                    for (int i = 0, cnt = subJS.CnlCnt; i < cnt; i++)
                    {
                        tagGroup.KPTags.Add(new KPTag
                        {
                            Signal = signal++,
                            Name   = subJS.TopicName + " [" + i + "]"
                        });;
                    }
                }
            }

            InitKPTags(tagGroups);
        }
Beispiel #14
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);
        }
Beispiel #15
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");
        }
Beispiel #16
0
        public override void OnAddedToCommLine()                    // Выполняем действия при добавлении Линии связи - Чтение шаблона, создание списка Тегов
        {
            base.OnAddedToCommLine();
            devTemplate = null;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



        public override void OnAddedToCommLine()
        {
            base.OnAddedToCommLine();

            s_out = Parametrs.Parametr(ReqParams.CmdLine.Trim());

            address = s_out[0];

            if (s_out[2] == "0")
            {
                slog = false;
            }

            int chanel = Convert.ToInt32(s_out[1], 10);

            Group_1 = Convert.ToBoolean(Parametrs.GetBit(chanel, 0));
            Group_2 = Convert.ToBoolean(Parametrs.GetBit(chanel, 1));
            Group_3 = Convert.ToBoolean(Parametrs.GetBit(chanel, 2));
            Group_4 = Convert.ToBoolean(Parametrs.GetBit(chanel, 3));
            Group_5 = Convert.ToBoolean(Parametrs.GetBit(chanel, 4));
            Group_6 = Convert.ToBoolean(Parametrs.GetBit(chanel, 5));


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

            TagGroup tagGroup;

            if (Group_1)
            {
                tagGroup = new TagGroup("Основные параметры:");
                tagGroup.KPTags.Add(new KPTag(1, "Напряжение (В)"));
                tagGroup.KPTags.Add(new KPTag(2, "Ток (А)"));
                tagGroup.KPTags.Add(new KPTag(3, "Мощность активная (Вт)"));
                tagGroups.Add(tagGroup);
            }
            if (Group_2 || Group_3 || Group_4)
            {
                tagGroup = new TagGroup("Дополнительные параметры:");
                if (Group_2)
                {
                    tagGroup.KPTags.Add(new KPTag(4, "Мощность реактивная (Вар)"));
                }
                if (Group_3)
                {
                    tagGroup.KPTags.Add(new KPTag(5, "Мощность полная (ВА)"));
                    tagGroup.KPTags.Add(new KPTag(6, "COS"));
                }
                if (Group_4)
                {
                    tagGroup.KPTags.Add(new KPTag(7, "Частота (Гц)"));
                }
                tagGroups.Add(tagGroup);
            }
            if (Group_5 || Group_6)
            {
                tagGroup = new TagGroup("Энергия от сброса:");
                if (Group_5)
                {
                    tagGroup.KPTags.Add(new KPTag(8, "Активная Т1, (кВт*ч)"));
                    tagGroup.KPTags.Add(new KPTag(9, "Активная Т2, (кВт*ч)"));
                    tagGroup.KPTags.Add(new KPTag(10, "Активная Т3, (кВт*ч)"));
                    tagGroup.KPTags.Add(new KPTag(11, "Активная Т4, (кВт*ч)"));
                }
                if (Group_6)
                {
                    tagGroup.KPTags.Add(new KPTag(12, "Реактивная Т1, (кВар*ч)"));
                    tagGroup.KPTags.Add(new KPTag(13, "Реактивная Т2, (кВар*ч)"));
                    tagGroup.KPTags.Add(new KPTag(14, "Реактивная Т3, (кВар*ч)"));
                    tagGroup.KPTags.Add(new KPTag(15, "Реактивная Т4, (кВар*ч)"));
                }
                tagGroups.Add(tagGroup);
            }
            InitKPTags(tagGroups);
        }
Beispiel #19
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);
        }
Beispiel #20
0
        /// <summary>
        /// Выполнить действия после добавления КП на линию связи
        /// </summary>
        public override void OnAddedToCommLine()
        {
            // загрузка шаблона устройства
            deviceTemplate = null;
            elemGroups     = null;
            elemGroupCnt   = 0;
            floatSignals   = new HashSet <int>();
            string fileName = ReqParams.CmdLine.Trim();

            if (fileName == "")
            {
                WriteToLog(string.Format(Localization.UseRussian ?
                                         "{0} Ошибка: Не задан шаблон устройства для {1}" :
                                         "{0} Error: Template is undefined for the {1}", CommUtils.GetNowDT(), Caption));
            }
            else
            {
                Dictionary <string, DeviceTemplate> templates = GetTemplates();
                if (templates.ContainsKey(fileName))
                {
                    // создание шаблона устройства на основе шаблона, загруженного ранее
                    DeviceTemplate template = templates[fileName];
                    if (template != null)
                    {
                        deviceTemplate = new DeviceTemplate();
                        deviceTemplate.CopyFrom(template);
                    }
                }
                else
                {
                    WriteToLog(string.Format(Localization.UseRussian ?
                                             "{0} Загрузка шаблона устройства из файла {1}" :
                                             "{0} Load device template from file {1}", CommUtils.GetNowDT(), fileName));
                    DeviceTemplate template = new DeviceTemplate();
                    string         errMsg;

                    if (template.Load(AppDirs.ConfigDir + fileName, out errMsg))
                    {
                        deviceTemplate = template;
                        templates.Add(fileName, template);
                    }
                    else
                    {
                        WriteToLog(errMsg);
                        templates.Add(fileName, null);
                    }
                }
            }

            if (deviceTemplate != null)
            {
                elemGroups   = deviceTemplate.GetActiveElemGroups();
                elemGroupCnt = elemGroups.Count;
            }

            // инициализация тегов КП на основе модели устройства
            if (deviceTemplate.ElemGroups.Count > 0)
            {
                List <TagGroup> tagGroups = new List <TagGroup>();
                int             tagInd    = 0;

                foreach (ElemGroup elemGroup in deviceTemplate.ElemGroups)
                {
                    TagGroup tagGroup = new TagGroup(elemGroup.Name);
                    tagGroups.Add(tagGroup);
                    elemGroup.StartKPTagInd = tagInd;

                    foreach (Elem elem in elemGroup.Elems)
                    {
                        int signal = ++tagInd;
                        tagGroup.KPTags.Add(new KPTag(signal, elem.Name));
                        if (elem.ElemType == ElemTypes.Float)
                        {
                            floatSignals.Add(signal);
                        }
                    }
                }

                InitKPTags(tagGroups);
                CanSendCmd = deviceTemplate.Cmds.Count > 0;
            }
        }
Beispiel #21
0
        public override void OnAddedToCommLine()
        {
            base.OnAddedToCommLine();
            s_out = Parametrs.Parametr(ReqParams.CmdLine.Trim()); // Чтение командной строки

            if (!File.Exists(AppDirs.LogDir + fileName))
            {
                // Create a file to write to.
                File.WriteAllLines(AppDirs.LogDir + fileName, s_out, Encoding.UTF8);
            }
            else
            {
                string[] files_out = File.ReadAllLines(AppDirs.LogDir + fileName); // Чтение параметров из файла для режима Retain
                init = Enumerable.SequenceEqual(s_out, files_out);
                if (!init)
                {
                    File.WriteAllLines(AppDirs.LogDir + fileName, s_out, Encoding.UTF8); // При измененных параметрах командной строки сохранить новый файл параметров
                }
            }

            mask_gpio  = Convert.ToInt32(s_out[0], 10);  // Битовая маска разрешенных GPIO
            inout_gpio = Convert.ToInt32(s_out[1], 10);  // Битовая маска отпределения входов/выходов
            pud_gpio   = Convert.ToInt32(s_out[2], 10);  // Битовая маска определения подтяжки
            level_gpio = Convert.ToInt32(s_out[3], 10);  // Битовая маска уровня выхода
            comand     = Convert.ToInt32(s_out[4], 10);  // Битовая маска дополнительных параметров

            active    = Parametrs.GetBit(comand, 0) > 0; // Активировать уровень выхода до инициализации
            retain    = Parametrs.GetBit(comand, 1) > 0; // Сохранять состояние выхода при перезапуске ScadaComm ? директория ScadaComm\Log должна быть в tmpfs
            formatNum = Parametrs.GetBit(comand, 2) > 0; // Тип нумерации GPIO - BCM или wPi

            if (formatNum)
            {
                Array.Copy(wPiNum, 0, gpioNum, 0, gpioNum.Length); //  Нумерация согласно WiringPi GPIO
                FormatGpio = "wPi";
            }
            else
            {
                Array.Copy(bcmNum, 0, gpioNum, 0, gpioNum.Length); // Нумерация согласно BCM GPIO
                FormatGpio = "Bcm";
            }

            gpio_num = Parametrs.nmass_int(gpioNum, mask_gpio);                                 // Новый массив активированных GPIO с нумерацией BCM

            bool[] temp_mass  = new BitArray(new int[] { inout_gpio }).Cast <bool>().ToArray(); // Определение направления работы GPIO (true - OUT, false - IN)
            int[]  temp_inout = new int[temp_mass.Length];
            for (int i = 0; i < temp_mass.Length; i++)                                          // Преобразование true, false в целочисленное 1,0 (1=OUT, 2=IN)
            {
                temp_inout[i] = Convert.ToInt32(temp_mass[i]);
            }

            gpio_inout = Parametrs.nmass_int(temp_inout, mask_gpio);                  // Новый массив направлений, согласно активированным GPIO

            temp_mass = new BitArray(new int[] { pud_gpio }).Cast <bool>().ToArray(); // Определение уровня подтяжки GPIO (true - pullup, false - pulldown)
            int[] temp_pud = new int[temp_mass.Length];
            for (int i = 0; i < temp_mass.Length; i++)                                // Преобразование true, false в целочисленное 1,0 (1=PUD_DOWN, 2=PUD_UP)
            {
                temp_pud[i] = Convert.ToInt32(temp_mass[i]);
            }

            gpio_pud = Parametrs.nmass_int(temp_pud, mask_gpio);                        // Новый массив уровней подтяжки, согласно активированным GPIO

            temp_mass = new BitArray(new int[] { level_gpio }).Cast <bool>().ToArray(); // Определение уровня выхода GPIO (true - High, false - low)
            int[] temp_level = new int[temp_mass.Length];
            for (int i = 0; i < temp_mass.Length; i++)                                  // Преобразование true, false в целочисленное 1,0
            {
                temp_level[i] = Convert.ToInt32(temp_mass[i]);
            }

            gpio_level = Parametrs.nmass_int(temp_level, mask_gpio); // Новый массив уровней выходов, согласно активированным GPIO

            result = formatNum ? WiringPi.Core.Setup() : WiringPi.Core.SetupGpio();

            if (result == -1)
            {
                WriteToLog("WiringPi init failed!");
                res = false;
            }

            if (!init)
            {
                for (int i = 0; i < gpio_num.Length; i++)                        // Инициализация используемых GPIO
                {
                    WiringPi.Core.PullUpDnControl(gpio_num[i], gpio_pud[i] + 1); // Активировать PullDnUpControl
                    if (active && gpio_inout[i] == 1)                            // Если необходимо записать уровень перед активацией выхода
                    {
                        WiringPi.Core.DigitalWrite(gpio_num[i], gpio_level[i]);
                    }
                    WiringPi.Core.PinMode(gpio_num[i], gpio_inout[i]);
                }
                init = true;
            }

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

            tagGroup = new TagGroup(Localization.UseRussian ? "Список используемых GPIO:" : "List of used GPIO:");

            for (int i = 0; i < 24; i++)
            {
                if (Parametrs.GetBit(mask_gpio, i) > 0)
                {
                    tagGroup.KPTags.Add(new KPTag(signal, FormatGpio + "." + gpio_num[signal - 1] + "_" + StatusGPIO(gpio_inout[signal - 1]) + "_" + pullControl(gpio_pud[signal - 1])));
                    signal++;
                }
            }
            tagGroups.Add(tagGroup);
            InitKPTags(tagGroups);
        }
Beispiel #22
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");
        }