/// <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> private void ReadNodes() { foreach (var function in functionsForSearching) { bool needToSkip = NeedSkipNode(function); if (needToSkip == true) { continue; } isContainsNodes = true; var match = IONameRegex.Match(function.VisibleName); int nodeNumber = Convert.ToInt32(match.Groups["n"].Value); string name = $"A{nodeNumber}"; string ipAdress = GetIPAdressFromFunction(function); string type = GetNodeTypeFromFunction(function); if (type != "") { if (isContainsA1 == true) { if (nodeNumber == numberA1) { IOManager.AddNode(numberA1, type, ipAdress, name); } else { IOManager.AddNode(nodeNumber / 100 + numberA1, type, ipAdress, name); } } else { IOManager.AddNode(nodeNumber / 100, type, ipAdress, name); } } else { ProjectManager.GetInstance().AddLogMessage($"У модуля \"" + $"{function.VisibleName}\" не задан параметр изделия" + $" (номер типа изделия)."); } } }
/// <summary> /// Нужно ли пропустить модуль ввода-вывода. /// </summary> /// <param name="function">Функция для проверки</param> /// <returns></returns> private bool NeedSkipModule(Function function) { bool skip = NeedSkipFunction(function); if (skip == true) { return(skip); } var match = IONameRegex.Match(function.VisibleName); int moduleNumber = Convert.ToInt32(match.Groups["n"].Value); if (moduleNumber % 100 == 0 || moduleNumber == numberA1) { skip = true; return(skip); } return(skip); }
/// <summary> /// Нужно ли пропустить узел ввода-вывода. /// </summary> /// <param name="function">Функция</param> /// <returns></returns> private bool NeedSkipNode(Function function) { bool skip = NeedSkipFunction(function); if (skip == true) { return(skip); } var match = IONameRegex.Match(function.VisibleName); int nodeNumber = Convert.ToInt32(match.Groups["n"].Value); if (nodeNumber % 100 != 0 && nodeNumber != numberA1) { skip = true; return(skip); } return(skip); }
/// <summary> /// Функция проверки наличия узлового модуля /// типа А1, на котором находится управляющая /// программа (для Phoenix Contact) /// </summary> private bool CheckA1() { List <int> theNumbers = new List <int>(); foreach (var function in functionsForSearching) { Match match = IONameRegex.Match(function.VisibleName); if (match.Success) { int number = Convert.ToInt32(match.Groups["n"].Value); theNumbers.Add(number); } } if (theNumbers.Contains(numberA1) == true) { return(true); } return(false); }
/// <summary> /// Нужно ли пропустить функцию. /// </summary> /// <param name="function">Функция для проверки</param> /// <returns></returns> private bool NeedSkipFunction(Function function) { var skip = false; var match = IONameRegex.Match(function.VisibleName); if (match.Success == false || !function.Properties.FUNC_SUPPLEMENTARYFIELD[1].IsEmpty) { skip = true; return(skip); } if (function.Articles.GetLength(0) == 0) { ProjectManager.GetInstance().AddLogMessage($"У модуля \"" + $"{function.VisibleName}\" не задано изделие."); skip = true; return(skip); } return(skip); }
/// <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}."); } } }