/// <summary> /// Проверка имени проекта /// </summary> /// <param name="name">Имя проекта</param> public void CheckProjectName(ref string name) { const int MaxProjectNameLength = 70; if (name.Length > MaxProjectNameLength) { string errorMessage = $"Некорректно задано имя проекта - " + $"длина не должна превышать {MaxProjectNameLength} символов. "; ProjectManager.GetInstance().AddLogMessage(errorMessage); name = name.Substring(0, MaxProjectNameLength); } const string RegexPattern = "(?<plant>[A-Z]+[1-9]{1})\\-(?<project>[а-яА-Я1-9\\-]+$)"; Match match = Regex.Match(name, RegexPattern); if (!match.Success) { string errorMessage = "Некорректно задано имя проекта - " + "рекомендуется для имени площадки использовать " + "английский, а для проекта - русский, вместо пробелов - " + "знак минус (прим., LOC1-Название-проекта). "; ProjectManager.GetInstance().AddLogMessage(errorMessage); name = GetModifyingCurrentProjectName(); } }
/// <summary> /// Чтение устройств /// </summary> private void ReadDevices() { foreach (var function in deviceFunctions) { bool skip = NeedToSkip(function); if (skip == true) { continue; } string name = GetName(function); string description = GetDescription(function); string subType = GetSubType(function); string parameters = GetParameters(function); string properties = GetProperties(function); string runtimeParameters = GetRuntimeParameters(function); int deviceLocation = GetDeviceLocation(function); string articleName = GetArticleName(function); string error; deviceManager.AddDeviceAndEFunction(name, description, subType, parameters, runtimeParameters, properties, deviceLocation, function, out error, articleName); if (error != "") { ProjectManager.GetInstance().AddLogMessage(error); } } deviceManager.Sort(); }
/// <summary> ///This function is called when executing the action. /// </summary> ///<returns>true, if the action performed successfully</returns> public bool Execute(ActionCallingContext ctx) { string pVal = "no"; ctx.GetParameter("loadFromLua", ref pVal); bool loadFromLua = true; if (pVal == "no") { loadFromLua = false; } string errStr; string projectName = EProjectManager.GetInstance() .GetCurrentProjectName(); EProjectManager.GetInstance().CheckProjectName(ref projectName); int res = ProjectManager.GetInstance().LoadDescription(out errStr, projectName, loadFromLua); if (res > 0) { MessageBox.Show(errStr, "EPlaner", MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } return(true); }
/// <summary> /// Проверка конфигурации. /// </summary> /// <param name="silentMode">Тихий режим (без окна логов)</param> public void Check(bool silentMode = false) { configurationChecker.Check(); string errors = configurationChecker.Errors; if (errors != "" && silentMode == false) { ProjectManager.GetInstance().AddLogMessage(errors); } }
/// <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> /// Чтение конфигурации узлов и модулей ввода-вывода. /// /// Считывание информации о модулях из проекта. /// Информацию получаем на основе листа с шиной модулей ввода\вывода /// IO. У изделий должны быть заполнены соответствующие свойства, /// они должны соответствующим образом именоваться. /// Алгоритм: /// 1. С помощью фильтра выбираем функциональные объекты в пределах /// открытого проекта со следующими ограничениями: категория PLCBox, /// главная функция, производитель изделия WAGO/ Phoenix. /// 2. Обрабатываем функциональные объекты со следующим именем: /// -Аxxx, где А - признак элемента IO, xxx - номер. /// Также учитываем контроллер Phoenix Contact с ОУ "А1", если он есть. /// 3. Вначале обрабатываем элементы с номером, кратным 100 - это узел /// IO. Добавляем их в список узлов IO. Тип узла получаем из /// изделия. /// 4. Обрабатываем остальные элементы - модули IO. Помещаем их в /// списки согласно порядковому номеру (вставляем при этом пустые /// элементы, если длина списка короче номера нового добавляемого /// модуля). /// </summary> public void Read() { PrepareForReading(); ReadNodes(); if (isContainsNodes == false) { ProjectManager.GetInstance().AddLogMessage( $"Не найден ни один узловой модуль (A100, A200, ...)."); return; } ReadModules(isContainsNodes); }
/// <summary> ///This function is called when executing the action. /// </summary> ///<returns>true, if the action performed successfully</returns> public bool Execute(ActionCallingContext ctx) { if (EProjectManager.GetInstance().GetCurrentPrj() == null) { MessageBox.Show("Нет открытого проекта!", "EPlaner", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { //Редактирование объектов. ProjectManager.GetInstance().Edit(); } return(true); }
/// <summary> /// Получить IP-адрес из функции. /// </summary> /// <param name="function">Функция для поиска</param> /// <returns></returns> private string GetIPAdressFromFunction(Function function) { var ipAddress = ""; if (!function.Properties.FUNC_PLCGROUP_STARTADDRESS.IsEmpty) { ipAddress = function.Properties.FUNC_PLCGROUP_STARTADDRESS; } else { ProjectManager.GetInstance().AddLogMessage($"У узла \"" + $"{function.VisibleName}\" не задан IP-адрес."); } return(ipAddress); }
/// <summary> /// Загрузить скрипты для импорта объектов. /// </summary> private void LoadScriptsForImport() { const string descriptionFileName = "sys.lua"; string sysLuaPath = Path .Combine(ProjectManager.GetInstance().SystemFilesPath, descriptionFileName); lua.DoFile(sysLuaPath); string restrictionsFileName = "sys_restriction.lua"; string pathToRestrictionInitializer = Path .Combine(ProjectManager.GetInstance().SystemFilesPath, restrictionsFileName); lua.DoFile(pathToRestrictionInitializer); }
/// <summary> /// This function is called by the framework of EPLAN, when the /// framework already has initialized its graphical user interface /// (GUI) and the add-in can start to modify the GUI. /// The function only is called, if the add-in is loaded on /// system-startup. /// </summary> /// <returns>true, if function succeeds</returns> public bool OnInitGui() { Eplan.EplApi.Gui.Menu oMenu = new Eplan.EplApi.Gui.Menu(); uint menuID = oMenu.AddMainMenu( "EPlaner", Eplan.EplApi.Gui.Menu.MainMenuName.eMainMenuHelp, "Экспорт XML для EasyServer", "SaveAsXMLAction", "Экспорт XML для EasyServer", 0); menuID = oMenu.AddMenuItem( "Экспорт технологических устройств в Excel", "ExportTechDevsToExcel", "Экспорт технологических устройств в Excel", menuID, 1, false, true); menuID = oMenu.AddMenuItem("Редактировать технологические объекты", "ShowTechObjectsAction", "Редактирование технологических объектов", menuID, 1, false, false); menuID = oMenu.AddMenuItem("Устройства, параметры объектов", "ShowDevicesAction", "Отображение устройств", menuID, int.MaxValue, false, false); menuID = oMenu.AddMenuItem( "Операции, ограничения и привязка объектов", "ShowOperationsAction", "Отображение операций", menuID, 1, false, true); menuID = oMenu.AddMenuItem("Обмен сигналами между проектами", "InterprojectExchangeAction", "Настройка межпроектного обмена сигналами", menuID, 1, false, false); menuID = oMenu.AddMenuItem( "Синхронизация названий устройств и модулей", "BindingSynchronization", "Синхронизация названий устройств и модулей", menuID, 1, false, false); menuID = oMenu.AddMenuItem("О дополнении", "AboutProgramm", "", menuID, 1, true, false); ProjectManager.GetInstance().Init(); return(true); }
/// <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> ///This function is called when executing the action. /// </summary> ///<returns>true, if the action performed successfully</returns> public bool Execute(ActionCallingContext ctx) { try { string pVal = "no"; ctx.GetParameter("silentMode", ref pVal); bool silentMode = false; if (pVal == "yes") { silentMode = true; } if (EProjectManager.GetInstance().GetCurrentPrj() == null) { if (!silentMode) { MessageBox.Show("Нет открытого проекта!", "EPlaner", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } else { var currentThread = System.Threading.Thread.CurrentThread; currentThread.CurrentCulture = StaticHelper.CommonConst .CultureWithDotInsteadComma; string projectName = EProjectManager.GetInstance() .GetCurrentProjectName(); EProjectManager.GetInstance() .CheckProjectName(ref projectName); string path = ProjectManager.GetInstance() .GetPtusaProjectsPath(projectName) + projectName; ProjectManager.GetInstance().SaveAsLua(projectName, path, silentMode); SVGStatisticsSaver.Save(path); } } catch (Exception ex) { MessageBox.Show(ex.Message); } return(true); }
/// <summary> /// Получить тип модуля ввода-вывода из функции. /// </summary> /// <param name="function">Функция для проверки</param> /// <returns></returns> private string GetModuleTypeFromFunction(Function function) { var type = ""; if (!function.Articles[0].Properties[Eplan.EplApi.DataModel .Properties.Article.ARTICLE_TYPENR].IsEmpty) { type = function.Articles[0].Properties[Eplan.EplApi .DataModel.Properties.Article.ARTICLE_TYPENR] .ToString().Trim(); } else { ProjectManager.GetInstance().AddLogMessage($"У модуля \"" + $"{function.VisibleName}\" не задан параметр изделия" + $" (номер типа изделия)."); } return(type); }
/// <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> private static void LoadFilePatterns() { const string mainProgramPatternFileName = "mainPattern.plua"; string pathToSystemFiles = ProjectManager.GetInstance() .SystemFilesPath; string pathToMainPluaFile = Path .Combine(pathToSystemFiles, mainProgramPatternFileName); try { var reader = new StreamReader(pathToMainPluaFile, EncodingDetector.DetectFileEncoding(pathToMainPluaFile)); mainProgramFilePattern = reader.ReadToEnd(); reader.Close(); mainProgramFilePatternIsLoaded = true; } catch { MessageBox.Show($"Не найден шаблон {mainProgramFileName}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> ///This function is called when executing the action. /// </summary> ///<returns>true, if the action performed successfully</returns> public bool Execute(ActionCallingContext ctx) { try { Project currentProject = EProjectManager.GetInstance() .GetCurrentPrj(); if (currentProject == null) { MessageBox.Show("Нет открытого проекта!", "EPlaner", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { ProjectManager.GetInstance().SaveAsExcelDescription( currentProject.ProjectDirectoryPath + @"\DOC\" + currentProject.ProjectName + ".xlsx"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } return(true); }
/// <summary> /// Экспортировать базу каналов. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ExportBut_Click(object sender, EventArgs e) { bool pathIsValid = CheckPath(); bool combineTag = combineTagBut.Checked ? true : false; bool useNewNames = newFormatBut.Checked ? true : false; if (pathIsValid) { if (newChBaseBut.Checked == true) { string filePath = path + "\\" + projectName + chBaseFormat; bool rewrite = true; ProjectManager.GetInstance().SaveAsCDBX(filePath, combineTag, useNewNames, rewrite); } else { ProjectManager.GetInstance().SaveAsCDBX(path, combineTag, useNewNames); } this.Close(); } }
/// <summary> ///This function is called when executing the action. /// </summary> ///<returns>true, if the action performed successfully</returns> public bool Execute(ActionCallingContext ctx) { try { Project currentProject = EProjectManager.GetInstance(). GetCurrentPrj(); if (currentProject == null) { MessageBox.Show("Нет открытого проекта!", "EPlaner", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { // Синхронизация названий модулей и устройств в текущем // проекте. ProjectManager.GetInstance().UpdateModulesBinding(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } return(true); }
/// <summary> /// Создание и сохранение Excel файла с параметрами проекта /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static int ExportTechDevs(string fileName) { Excel._Application xlApp = null; Excel.Workbook xlWorkBook = null; Excel.Worksheet xlWorkSheet = null; List <int> ID = new List <int>(); GetExcelProcess(ID); try { xlApp = new Excel.Application(); xlApp.Visible = false; xlApp.UserControl = true; xlWorkBook = xlApp.Workbooks.Add(); string prjName = fileName.Remove(fileName.IndexOf(".xlsx")); prjName = prjName.Substring(prjName.LastIndexOf("\\") + 1); CreateModulesPage(prjName, ref xlWorkSheet, ref xlApp); ProjectManager.GetInstance().SetLogProgress(20); CreateInformDevicePage(ref xlWorkSheet, ref xlApp); ProjectManager.GetInstance().SetLogProgress(30); CreateTotalDevicePage(ref xlWorkSheet, ref xlApp); ProjectManager.GetInstance().SetLogProgress(40); CreateDeviceConnectionPage(ref xlWorkSheet, ref xlApp); ProjectManager.GetInstance().SetLogProgress(55); CreateObjectParamsPage(ref xlWorkSheet, ref xlApp); ProjectManager.GetInstance().SetLogProgress(70); CreateObjectDevicesPage(ref xlWorkSheet, ref xlApp); ProjectManager.GetInstance().SetLogProgress(85); xlWorkSheet = xlApp.Sheets[1] as Excel.Worksheet; xlWorkSheet.Select(); xlWorkBook.SaveAs(fileName); } finally { xlWorkBook.Close(false); xlApp.Quit(); xlWorkBook = null; xlWorkSheet = null; xlApp = null; KillExcelProcess(ID); GC.Collect(); Process.Start(fileName); } return(0); }
public ProjectHealthChecker() { projectManager = ProjectManager.GetInstance(); eProjectManager = EProjectManager.GetInstance(); }
/// <summary> /// Установить привязку устройства. /// </summary> /// <param name="description">Описание устройства</param> /// <param name="actionMatch">Действие канала</param> /// <param name="module">Модуль ввода-вывода</param> /// <param name="node">Узел ввода-вывода</param> /// <param name="clampFunction">Функция клеммы</param> /// <param name="comment">Комментарий к устройству</param> private void SetBind(string description, Match actionMatch, IO.IOModule module, IO.IONode node, Function clampFunction, string comment) { int clamp = Convert.ToInt32(clampFunction.Properties .FUNC_ADDITIONALIDENTIFYINGNAMEPART.ToString()); var descriptionMatches = Regex.Matches(description, DeviceManager.BINDING_DEVICES_DESCRIPTION_PATTERN); int devicesCount = descriptionMatches.Count; if (devicesCount < 1 && !description.Equals(CommonConst.Reserve)) { ProjectManager.GetInstance().AddLogMessage( $"\"{module.Function.VisibleName}:{clamp}\" - неверное " + $"имя привязанного устройства - \"{description}\"."); } foreach (Match descriptionMatch in descriptionMatches) { string deviceName = descriptionMatch.Groups["name"].Value; var device = deviceManager.GetDevice(deviceName); var clampComment = ""; if (actionMatch.Success) { clampComment = actionMatch.Value; if (clampComment.Contains( CommonConst.NewLineWithCarriageReturn)) { clampComment = clampComment.Replace( CommonConst.NewLineWithCarriageReturn, ""); } } var error = ""; string channelName = "IO-Link"; int logicalPort = Array .IndexOf(module.Info.ChannelClamps, clamp) + 1; int moduleOffset = module.InOffset; if (devicesCount == 1 && module.Info.AddressSpaceType == IO.IOModuleInfo.ADDRESS_SPACE_TYPE.AOAIDODI) { if (device.Channels.Count == 1) { List <IODevice.IOChannel> chanels = device.Channels; channelName = ApiHelper .GetChannelNameForIOLinkModuleFromString( chanels.First().Name); } else { channelName = ApiHelper .GetChannelNameForIOLinkModuleFromString(comment); } } DeviceManager.GetInstance().AddDeviceChannel(device, module.Info.AddressSpaceType, node.N - 1, module.PhysicalNumber % 100, clamp, clampComment, out error, module.PhysicalNumber, logicalPort, moduleOffset, channelName); if (error != "") { error = string.Format("\"{0}:{1}\" : {2}", module.Function.VisibleName, clamp, error); ProjectManager.GetInstance().AddLogMessage(error); } } }