Esempio n. 1
0
        private void GetInAndOutOffset(int shortNodeNumber,
                                       IO.IOModuleInfo moduleInfo, out int inOffset, out int outOffset)
        {
            inOffset  = 0;
            outOffset = 0;
            switch (moduleInfo.AddressSpaceType)
            {
            case IO.IOModuleInfo.ADDRESS_SPACE_TYPE.DI:
                inOffset = IOManager[shortNodeNumber].DI_count;
                break;

            case IO.IOModuleInfo.ADDRESS_SPACE_TYPE.DO:
                outOffset = IOManager[shortNodeNumber].DO_count;
                break;

            case IO.IOModuleInfo.ADDRESS_SPACE_TYPE.AI:
                inOffset = IOManager[shortNodeNumber].AI_count;
                break;

            case IO.IOModuleInfo.ADDRESS_SPACE_TYPE.AO:
                outOffset = IOManager[shortNodeNumber].AO_count;
                break;

            case IO.IOModuleInfo.ADDRESS_SPACE_TYPE.AOAI:
            case IO.IOModuleInfo.ADDRESS_SPACE_TYPE.AOAIDODI:
                inOffset  = IOManager[shortNodeNumber].AI_count;
                outOffset = IOManager[shortNodeNumber].AO_count;
                break;

            case IO.IOModuleInfo.ADDRESS_SPACE_TYPE.DODI:
                inOffset  = IOManager[shortNodeNumber].DI_count;
                outOffset = IOManager[shortNodeNumber].DO_count;
                break;
            }
        }
Esempio n. 2
0
 /// <summary>
 /// Возвращает словарь, содержащий привязку конкретного канала для
 /// его сброса
 /// </summary>
 public Dictionary<string, string> GetBindingForResettingChannel(
     Function deviceClampFunction, IO.IOModuleInfo moduleInfo, 
     string devicesDescription = "")
 {
     Dictionary<string, string> binding = deviceReader
         .GetBindingForResettingChannel(deviceClampFunction,
         moduleInfo, devicesDescription);
     return binding;
 }
Esempio n. 3
0
        /// <summary>
        /// Чтение модулей ввода-вывода
        /// </summary>
        /// <param name="isContainsNodes">Прочитаны или нет узлы</param>
        private void ReadModules(bool isContainsNodes)
        {
            foreach (var function in functionsForSearching)
            {
                bool needSkipModule = NeedSkipModule(function);
                if (needSkipModule == true)
                {
                    continue;
                }

                var match             = IONameRegex.Match(function.VisibleName);
                int moduleNumber      = Convert.ToInt32(match.Groups["n"].Value);
                int shortModuleNumber = moduleNumber % 100;
                int shortNodeNumber;
                if (isContainsA1 == true)
                {
                    shortNodeNumber = moduleNumber / 100;
                }
                else
                {
                    shortNodeNumber = moduleNumber / 100 - numberA1;
                }

                string    type = GetModuleTypeFromFunction(function);
                IO.IONode node = IOManager[shortNodeNumber];
                if (IOManager[shortNodeNumber] != null)
                {
                    IO.IOModuleInfo moduleInfo = GetIOModuleInfo(function,
                                                                 type);

                    int inOffset;
                    int outOffset;
                    GetInAndOutOffset(shortNodeNumber, moduleInfo,
                                      out inOffset, out outOffset);

                    IO.IOModule nodeModule = new IO.IOModule(inOffset,
                                                             outOffset, moduleInfo, moduleNumber, function);

                    node.DI_count += moduleInfo.DI_count;
                    node.DO_count += moduleInfo.DO_count;
                    node.AI_count += moduleInfo.AI_count;
                    node.AO_count += moduleInfo.AO_count;
                    node.SetModule(nodeModule, shortModuleNumber);
                }
                else
                {
                    ProjectManager.GetInstance().AddLogMessage($"Для" +
                                                               $" \"{function.VisibleName}\" - \"{type}\", " +
                                                               $"не найден узел номер {++shortNodeNumber}.");
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Получить информацию о модуле ввода-вывода
        /// </summary>
        /// <param name="function">Функция</param>
        /// <param name="type">Тип модуля ввода-вывода</param>
        /// <returns></returns>
        private IO.IOModuleInfo GetIOModuleInfo(Function function, string type)
        {
            bool isStub;
            var  moduleInfo = new IO.IOModuleInfo();

            moduleInfo = moduleInfo.GetIOModuleInfo(type, out isStub);
            if (isStub && type != "")
            {
                ProjectManager.GetInstance().AddLogMessage($"Неизвестный " +
                                                           $"модуль \"{function.VisibleName}\" - \"{type}\".");
            }

            return(moduleInfo);
        }
Esempio n. 5
0
        /// <summary>
        /// Необходимость в пропуске данной клеммы.
        /// </summary>
        /// <param name="module">Модуль</param>
        /// <param name="clampFunction">Функция клеммы</param>
        /// <returns></returns>
        private bool NeedToSkip(IO.IOModule module, Function clampFunction)
        {
            var skip = false;

            string clampString = clampFunction.Properties
                                 .FUNC_ADDITIONALIDENTIFYINGNAMEPART.ToString();
            int  clamp;
            bool isDigit = int.TryParse(clampString, out clamp);

            if (isDigit == false)
            {
                skip = true;
                return(skip);
            }

            IO.IOModuleInfo moduleInfo = module.Info;
            if (Array.IndexOf(moduleInfo.ChannelClamps, clamp) < 0)
            {
                skip = true;
                return(skip);
            }

            DocumentTypeManager.DocumentType documentType = clampFunction.Page
                                                            .PageType;
            if (documentType != DocumentTypeManager.DocumentType.Circuit)
            {
                skip = true;
                return(skip);
            }

            string description = ApiHelper.GetFunctionalText(
                clampFunction);

            if (description == "" || description.Contains(CommonConst.Reserve))
            {
                skip = true;
                return(skip);
            }

            return(skip);
        }
Esempio n. 6
0
        /// <summary>
        /// Получить привязку для сброса канала устройства
        /// </summary>
        /// <returns></returns>
        public Dictionary <string, string> GetBindingForResettingChannel(
            Function deviceClampFunction, IO.IOModuleInfo moduleInfo,
            string devicesDescription = "")
        {
            var    res = new Dictionary <string, string>();
            string clampNumberAsString = deviceClampFunction.Properties
                                         .FUNC_ADDITIONALIDENTIFYINGNAMEPART.ToString();

            if (deviceClampFunction.Name.Contains(DeviceManager
                                                  .ValveTerminalName))
            {
                Function IOModuleFunction = ApiHelper
                                            .GetIOModuleFunction(deviceClampFunction);
                string   bindedDevice          = deviceClampFunction.Name;
                Function IOModuleClampFunction = ApiHelper
                                                 .GetClampFunction(IOModuleFunction, bindedDevice);
                clampNumberAsString = IOModuleClampFunction.Properties
                                      .FUNC_ADDITIONALIDENTIFYINGNAMEPART.ToString();
            }

            int  clampNumber;
            bool isDigit = int.TryParse(clampNumberAsString, out clampNumber);

            if (isDigit == false)
            {
                return(res);
            }

            if (Array.IndexOf(moduleInfo.ChannelClamps, clampNumber) < 0)
            {
                return(res);
            }

            DocumentTypeManager.DocumentType pageType = deviceClampFunction
                                                        .Page.PageType;
            if (pageType != DocumentTypeManager.DocumentType.Circuit &&
                pageType != DocumentTypeManager.DocumentType.Overview)
            {
                return(res);
            }

            if (devicesDescription == "")
            {
                devicesDescription = ApiHelper.GetFunctionalText(
                    deviceClampFunction);
            }

            if (devicesDescription == "")
            {
                return(res);
            }

            var   comment      = "";
            var   clampComment = "";
            Match actionMatch;
            bool  isMultipleBinding = deviceManager.IsMultipleBinding(
                devicesDescription);

            if (isMultipleBinding == false)
            {
                int endPos = devicesDescription.IndexOf(CommonConst.NewLine);
                if (endPos > 0)
                {
                    comment            = devicesDescription.Substring(endPos + 1);
                    devicesDescription = devicesDescription.Substring(0,
                                                                      endPos);
                }

                devicesDescription = Regex.Replace(devicesDescription,
                                                   CommonConst.RusAsEngPattern, CommonConst.RusAsEnsEvaluator);

                actionMatch = Regex.Match(comment,
                                          IODevice.IOChannel.ChannelCommentPattern,
                                          RegexOptions.IgnoreCase);

                comment = Regex.Replace(comment,
                                        IODevice.IOChannel.ChannelCommentPattern,
                                        "", RegexOptions.IgnoreCase);
                comment = comment.Replace(CommonConst.NewLine, ". ").Trim();
                if (comment.Length > 0 && comment[comment.Length - 1] != '.')
                {
                    comment += ".";
                }
            }
            else
            {
                devicesDescription = Regex.Replace(devicesDescription,
                                                   CommonConst.RusAsEngPattern, CommonConst.RusAsEnsEvaluator);
                actionMatch = Regex.Match(comment,
                                          IODevice.IOChannel.ChannelCommentPattern,
                                          RegexOptions.IgnoreCase);
            }

            var descrMatch = Regex.Match(devicesDescription,
                                         DeviceManager.BINDING_DEVICES_DESCRIPTION_PATTERN);

            while (descrMatch.Success)
            {
                string devName = descrMatch.Groups["name"].Value;

                if (actionMatch.Success)
                {
                    clampComment = actionMatch.Value;
                }

                res.Add(devName, clampComment);
                descrMatch = descrMatch.NextMatch();
            }

            return(res);
        }
Esempio n. 7
0
        /// <summary>
        /// Чтение модулей ввода-вывода
        /// </summary>
        /// <param name="isContainsNodes">Прочитаны или нет узлы</param>
        private void ReadModules(bool isContainsNodes)
        {
            foreach (var function in functionsForSearching)
            {
                bool needSkipModule = NeedSkipModule(function);
                if (needSkipModule == true)
                {
                    continue;
                }

                var match             = IONameRegex.Match(function.VisibleName);
                int moduleNumber      = Convert.ToInt32(match.Groups["n"].Value);
                int shortModuleNumber = moduleNumber % 100;
                int shortNodeNumber;
                if (isContainsA1 == true)
                {
                    shortNodeNumber = moduleNumber / 100;
                }
                else
                {
                    shortNodeNumber = moduleNumber / 100 - numberA1;
                }

                string    type = GetModuleTypeFromFunction(function);
                IO.IONode node = IOManager[shortNodeNumber];
                if (IOManager[shortNodeNumber] != null)
                {
                    IO.IOModuleInfo moduleInfo = GetIOModuleInfo(function,
                                                                 type);

                    int inOffset;
                    int outOffset;
                    GetInAndOutOffset(shortNodeNumber, moduleInfo,
                                      out inOffset, out outOffset);

                    IO.IOModule nodeModule = new IO.IOModule(inOffset,
                                                             outOffset, moduleInfo, moduleNumber, function);

                    node.DI_count += moduleInfo.DICount;
                    node.DO_count += moduleInfo.DOCount;
                    node.AI_count += moduleInfo.AICount;
                    node.AO_count += moduleInfo.AOCount;

                    bool moduleNotExist = node[shortModuleNumber - 1] == null;
                    if (moduleNotExist)
                    {
                        node.SetModule(nodeModule, shortModuleNumber);
                    }
                    else
                    {
                        Logs.AddMessage($"Главная функция модуля " +
                                        $"ввода-вывода \'{function.VisibleName}\' " +
                                        $"определяется дважды, проверьте расстановку " +
                                        $"главных функций на модулях. ");
                    }
                }
                else
                {
                    Logs.AddMessage($"Для" +
                                    $" \"{function.VisibleName}\" - \"{type}\", " +
                                    $"не найден узел номер {++shortNodeNumber}.");
                }
            }
        }