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; } }
/// <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; }
/// <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}."); } } }
/// <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); }
/// <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); }
/// <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); }
/// <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}."); } } }