Esempio n. 1
0
        /// <summary>
        /// Выполнить действия после добавления КП на линию связи
        /// </summary>
        public override void OnAddedToCommLine()
        {
            // получение или загрузка шаблона устройства
            string fileName = ReqParams.CmdLine.Trim();

            PrepareTemplate(fileName);

            // инициализация тегов КП на основе шаблона устройства
            floatSignals = new HashSet <int>();
            int             tagInd    = 0;
            List <TagGroup> tagGroups = CreateTagGroups(deviceTemplate, ref tagInd);

            InitKPTags(tagGroups);

            // определение режима передачи данных
            transMode = CustomParams.GetEnumParam("TransMode", false, TransMode.RTU);

            if (deviceTemplate == null)
            {
                elemGroups   = null;
                elemGroupCnt = 0;
            }
            else
            {
                // получение активных групп элементов
                elemGroups   = deviceTemplate.GetActiveElemGroups();
                elemGroupCnt = elemGroups.Count;

                // формирование PDU и ADU
                devAddr = (byte)Address;
                foreach (ElemGroup elemGroup in elemGroups)
                {
                    elemGroup.InitReqPDU();
                    elemGroup.InitReqADU(devAddr, transMode);
                }

                foreach (ModbusCmd cmd in deviceTemplate.Cmds)
                {
                    cmd.InitReqPDU();
                    cmd.InitReqADU(devAddr, transMode);
                }
            }

            // определение возможности отправки команд
            CanSendCmd = deviceTemplate != null && deviceTemplate.Cmds.Count > 0;
        }
Esempio n. 2
0
        /// <summary>
        /// Выполнить действия при запуске линии связи
        /// </summary>
        public override void OnCommLineStart()
        {
            // инициализация запрашиваемых элементов и команд
            // располагается в OnCommLineStart, т.к. здесь Address окончательно определён
            if (deviceTemplate == null)
            {
                elemGroups   = null;
                elemGroupCnt = 0;
            }
            else
            {
                // получение активных групп элементов
                elemGroups   = deviceTemplate.GetActiveElemGroups();
                elemGroupCnt = elemGroups.Count;

                // формирование PDU и ADU
                devAddr = (byte)Address;
                foreach (ElemGroup elemGroup in elemGroups)
                {
                    elemGroup.InitReqPDU();
                    elemGroup.InitReqADU(devAddr, transMode);
                }

                foreach (ModbusCmd cmd in deviceTemplate.Cmds)
                {
                    cmd.InitReqPDU();
                    cmd.InitReqADU(devAddr, transMode);
                }
            }

            // инициализация объекта для опроса КП
            InitModbusPoll();

            // выбор метода запроса
            request = modbusPoll.GetRequestMethod(transMode);
        }
Esempio n. 3
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;
            }
        }