예제 #1
0
        /// <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();
            }
        }
예제 #2
0
        /// <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();
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
            }
        }
예제 #5
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}.");
                }
            }
        }
예제 #6
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);
        }
예제 #7
0
        /// <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);
        }
예제 #8
0
        /// <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);
        }
예제 #9
0
        /// <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);
        }
예제 #10
0
        /// <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);
        }
예제 #11
0
        /// <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);
        }
예제 #12
0
        /// <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}\" не задан параметр изделия" +
                                                               $" (номер типа изделия).");
                }
            }
        }
예제 #13
0
        /// <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);
        }
예제 #14
0
        /// <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);
        }
예제 #15
0
        /// <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);
 }
예제 #18
0
        /// <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);
 }
예제 #20
0
        /// <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);
        }
예제 #21
0
 public ProjectHealthChecker()
 {
     projectManager  = ProjectManager.GetInstance();
     eProjectManager = EProjectManager.GetInstance();
 }
예제 #22
0
        /// <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);
                }
            }
        }