/// <summary> /// Экспорт базы каналов, поток. /// </summary> /// <param name="param">Параметр потока</param> private void SaveAsXMLThread(object param) { var data = param as DataForSaveAsXML; Logs.Show(); Logs.DisableButtons(); Logs.Clear(); Logs.SetProgress(0); try { Logs.SetProgress(1); XMLReporter.SaveAsXML(data.pathToFile, data.rewrite, data.cdbxTagView, data.cdbxNewNames); Logs.SetProgress(50); Logs.AddMessage("Done."); } catch (System.Exception ex) { Logs.AddMessage("Exception - " + ex); } finally { if (Logs.IsNull() == false) { Logs.EnableButtons(); Logs.SetProgress(100); } } }
/// <summary> /// Экспорт технологических объектов в Excel. /// </summary> /// <param name="path">Путь к директории сохранения</param> /// <param name="projectName">Имя проекта</param> private void ExportToExcel(object param) { var par = param as string; Logs.Show(); Logs.DisableButtons(); Logs.Clear(); Logs.SetProgress(0); try { Logs.SetProgress(1); ExcelRepoter.ExportTechDevs(par); Logs.AddMessage("Done."); } catch (System.Exception ex) { Logs.AddMessage("Exception - " + ex); } finally { if (Logs.IsNull() == false) { Logs.EnableButtons(); Logs.SetProgress(100); } } }
/// <summary> /// Обновление подписей к клеммам модулей IO /// в соответствии с актуальным названием устройств. /// </summary> public void UpdateModulesBinding() { var errors = ""; try { Logs.Clear(); Logs.Show(); Logs.AddMessage("Выполняется синхронизация.."); errors = ModulesBindingUpdater.GetInstance().Execute(); Logs.Clear(); } catch (System.Exception ex) { Logs.AddMessage("Exception - " + ex); } finally { if (errors != "") { Logs.AddMessage(errors); } if (Logs.IsNull() == false) { Logs.AddMessage("Синхронизация завершена. "); Logs.SetProgress(100); Logs.EnableButtons(); } } }
/// <summary> /// Проверка имени проекта /// </summary> /// <param name="name">Имя проекта</param> public void CheckProjectName(ref string name) { const int MaxProjectNameLength = 70; if (name.Length > MaxProjectNameLength) { string errorMessage = $"Некорректно задано имя проекта - " + $"длина не должна превышать {MaxProjectNameLength} символов. "; Logs.AddMessage(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-Название-проекта). "; Logs.AddMessage(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 != "") { Logs.AddMessage(error); } } deviceManager.Sort(); }
/// <summary> /// Проверка конфигурации. /// </summary> /// <param name="silentMode">Тихий режим (без окна логов)</param> public void Check(bool silentMode = false) { configurationChecker.Check(); string errors = configurationChecker.Errors; if (errors != "" && silentMode == false) { Logs.AddMessage(errors); } }
/// <summary> /// Получить информацию о модуле ввода-вывода /// </summary> /// <param name="function">Функция</param> /// <param name="type">Тип модуля ввода-вывода</param> /// <returns></returns> private IO.IOModuleInfo GetIOModuleInfo(Function function, string type) { bool isStub; var moduleInfo = IO.IOModuleInfo.GetModuleInfo(type, out isStub); if (isStub && type != "") { Logs.AddMessage($"Неизвестный " + $"модуль \"{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) { Logs.AddMessage($"Не найден ни один узловой модуль " + $"(A100, A200, ...)."); return; } ReadModules(isContainsNodes); }
/// <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 { Logs.AddMessage($"У узла \"" + $"{function.VisibleName}\" не задан IP-адрес."); } return(ipAddress); }
/// <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 { Logs.AddMessage($"У модуля \"" + $"{function.VisibleName}\" не задан параметр изделия" + $" (номер типа изделия)."); } } }
/// <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 { Logs.AddMessage($"У модуля \"" + $"{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) { Logs.AddMessage($"У модуля \"" + $"{function.VisibleName}\" не задано изделие."); skip = true; return(skip); } return(skip); }
/// <summary> /// Сохранить описание проекта /// </summary> /// <param name="param">Параметры</param> public static void Save(object param) { var par = param as ParametersForSave; if (!par.silentMode) { Logs.Show(); Logs.DisableButtons(); Logs.SetProgress(0); } try { try { if (!Directory.Exists(par.path)) { Directory.CreateDirectory(par.path); } } catch (DriveNotFoundException) { if (!par.silentMode) { Logs.AddMessage("Ошибка подключения к диску с " + "проектами. Подключите диск!"); Logs.SetProgress(100); } return; } SaveIOFile(par); if (par.silentMode == false) { Logs.SetProgress(50); } SaveTechObjectsFile(par); SaveTechDevicesFile(par); SaveRestrictionsFile(par); SaveMainFile(par); SaveModbusFile(par); SaveProfibusFile(par); SavePrgFile(par); SaveSharedFile(par); if (par.silentMode == false) { if (!Logs.IsEmpty()) { Logs.AddMessage("Done."); Logs.ShowLastLine(); } else { Logs.Hide(); } } } catch (Exception ex) { if (par.silentMode == false) { Logs.AddMessage("Exception - " + ex); Logs.AddMessage(""); Logs.AddMessage(""); Logs.ShowLastLine(); } } finally { if (!par.silentMode && Logs.IsNull() == false) { Logs.EnableButtons(); Logs.SetProgress(100); } } }
/// <summary> /// Расчет идентификаторов для базы каналов /// </summary> private static void CalculateIdentificatorsForChannelBase( TreeNode subtype, XmlElement elm, XmlNamespaceManager nsmgr, string baseId, List <string> subTypesId, XmlDocument xmlDoc) { const int maxTagsCount = 65535; string xpath = "//subtypes:subtype[subtypes:sdrvname='" + subtype.Text + "']"; var subElm = elm.SelectSingleNode(xpath, nsmgr) as XmlElement; if (subElm != null) { nsmgr.AddNamespace("channels", "http://brestmilk.by/channels/"); var channelsElm = subElm.ChildNodes[9] as XmlElement; var channelsId = new List <long>(); foreach (TreeNode channel in subtype.Nodes) { string xpathChan = xpath + "//channels:channel[channels:descr='" + channel.Text + "']"; if (channelsElm.SelectSingleNode(xpathChan, nsmgr) == null) { // Нахождение адреса канала среди свободных if (channelsId.Count == 0) { long beginId = long .Parse((long.Parse(baseId).ToString("X2") + long.Parse(subElm.ChildNodes[0].InnerText) .ToString("X2") + "0000"), System.Globalization.NumberStyles.HexNumber); for (int i = 0; i < maxTagsCount; i++) { channelsId.Add(beginId + i); } foreach (XmlElement channId in channelsElm .ChildNodes) { long id = long.Parse( channId.FirstChild.InnerText); if (channelsId.Contains(id)) { channelsId.Remove(id); } } } long channelId = channelsId[0]; channelsId.RemoveAt(0); AddChannel(xmlDoc, channel, channelsElm, channelId); } } } else { if (subTypesId.Count > 0) { long subtypeId = long.Parse(subTypesId[0]); subTypesId.RemoveAt(0); XmlElement newSubtype = AddSubType(xmlDoc, elm, subtype, subtypeId); string hex = long.Parse(baseId).ToString("X2") + subtypeId.ToString("X2"); for (int i = 0; i < subtype.Nodes.Count; i++) { long channelId = long.Parse((hex + i.ToString("X4")), System.Globalization.NumberStyles.HexNumber); AddChannel(xmlDoc, subtype.Nodes[i], newSubtype, channelId); } } else { Logs.AddMessage("Превышено количество подтипов " + "в базе каналов."); return; } } }
/// <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}."); } } }
/// <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)) { Logs.AddMessage($"\"{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); Logs.AddMessage(error); } } }
/// <summary> /// Формирование общей структуры базы каналов /// </summary> private static XmlElement WriteCommonXMLPart(XmlDocument xmlDoc) { string nsDriver = "http://brestmilk.by/driver/"; string prefixDriver = "driver"; XmlElement firstLevel = xmlDoc.CreateElement(prefixDriver, "inf", nsDriver); firstLevel.InnerText = "BASE F11F3DCC-09F8-4D04-BCB7-81D5D7C48C78"; xmlDoc.DocumentElement.AppendChild(firstLevel); firstLevel = xmlDoc.CreateElement(prefixDriver, "dbbuild", nsDriver); firstLevel.InnerText = "4"; xmlDoc.DocumentElement.AppendChild(firstLevel); firstLevel = xmlDoc.CreateElement(prefixDriver, prefixDriver, nsDriver); xmlDoc.DocumentElement.AppendChild(firstLevel); XmlElement secondLevel = xmlDoc.CreateElement(prefixDriver, "id", nsDriver); secondLevel.InnerText = "1"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "tid", nsDriver); secondLevel.InnerText = "0"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "dllname", nsDriver); secondLevel.InnerText = "PAC_easy_drv_LZ.dll"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "access", nsDriver); secondLevel.InnerText = "2"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "maxsubtypescount", nsDriver); secondLevel.InnerText = "10"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "enabled", nsDriver); secondLevel.InnerText = "-1"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "descr", nsDriver); secondLevel.InnerText = "Система PLC-X1"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "drvname", nsDriver); secondLevel.InnerText = Path.GetFileNameWithoutExtension(xmlDoc.BaseURI); firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "defname", nsDriver); secondLevel.InnerText = "Opc Driver"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "defdescr", nsDriver); secondLevel.InnerText = "Универсальный драйвер для протоколов Modbus и SNMP"; firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "communication", nsDriver); secondLevel.SetAttribute( "xmlns:communication", "http://brestmilk.by/communication/"); firstLevel.AppendChild(secondLevel); string nsParam = "http://brestmilk.by/parameters/"; string pefixParam = "parameters"; XmlElement thirdLevel = xmlDoc.CreateElement( "communication", pefixParam, "http://brestmilk.by/communication/"); thirdLevel.SetAttribute("xmlns:parameters", nsParam); secondLevel.AppendChild(thirdLevel); XmlElement forthLevel = xmlDoc.CreateElement( pefixParam, "parameter", nsParam); thirdLevel.AppendChild(forthLevel); XmlElement fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "TYPE"; forthLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "COM"; forthLevel.AppendChild(fifthLevel); forthLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); thirdLevel.AppendChild(forthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "PORTNAME"; forthLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "COM4"; forthLevel.AppendChild(fifthLevel); forthLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); thirdLevel.AppendChild(forthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "SPEED"; forthLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "12"; forthLevel.AppendChild(fifthLevel); forthLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); thirdLevel.AppendChild(forthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "PARITY"; forthLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "0"; forthLevel.AppendChild(fifthLevel); forthLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); thirdLevel.AppendChild(forthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "DATABITS"; forthLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "4"; forthLevel.AppendChild(fifthLevel); forthLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); thirdLevel.AppendChild(forthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "STOPBITS"; forthLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "0"; forthLevel.AppendChild(fifthLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "init_parameters", nsDriver); secondLevel.SetAttribute("xmlns:parameters", nsParam); firstLevel.AppendChild(secondLevel); thirdLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); secondLevel.AppendChild(thirdLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "IP"; thirdLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "IP127.0.0.1"; thirdLevel.AppendChild(fifthLevel); thirdLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); secondLevel.AppendChild(thirdLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "PLC_NAME"; thirdLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); if (string.IsNullOrEmpty(EProjectManager.GetInstance().GetCurrentProjectName())) { Logs.AddMessage("Не задано PLC_NAME."); fifthLevel.InnerText = "PLC_NAME"; } else { string projectName = EProjectManager.GetInstance().GetCurrentProjectName(); EProjectManager.GetInstance().CheckProjectName(ref projectName); fifthLevel.InnerText = projectName; } thirdLevel.AppendChild(fifthLevel); thirdLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); secondLevel.AppendChild(thirdLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "PORT"; thirdLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "10000"; thirdLevel.AppendChild(fifthLevel); thirdLevel = xmlDoc.CreateElement(pefixParam, "parameter", nsParam); secondLevel.AppendChild(thirdLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "name", nsParam); fifthLevel.InnerText = "Kontroller"; thirdLevel.AppendChild(fifthLevel); fifthLevel = xmlDoc.CreateElement(pefixParam, "value", nsParam); fifthLevel.InnerText = "LINUX"; thirdLevel.AppendChild(fifthLevel); secondLevel = xmlDoc.CreateElement( prefixDriver, "common_parameters", nsDriver); secondLevel.SetAttribute("xmlns:parameters", nsParam); firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement( prefixDriver, "final_parameters", nsDriver); secondLevel.SetAttribute("xmlns:parameters", nsParam); firstLevel.AppendChild(secondLevel); secondLevel = xmlDoc.CreateElement(prefixDriver, "subtypes", nsDriver); secondLevel.SetAttribute("xmlns:subtypes", "http://brestmilk.by/subtypes/"); firstLevel.AppendChild(secondLevel); return(secondLevel); }
/// <summary> /// Сохранить привязку объектов к объектам в prg.lua /// </summary> /// <param name="attachedObjects">Словарь привязанных объектов</param> /// <returns></returns> private static string SaveObjectsBindingToPrgLua( Dictionary <int, string> attachedObjects) { var res = ""; var temp = ""; string previouslyObjectName = ""; bool isDigit = false; foreach (var val in attachedObjects) { var techObj = techObjectManager.GetTObject(val.Key); var attachedObjs = val.Value.Split(' '); foreach (string value in attachedObjs) { isDigit = int.TryParse(value, out _); if (isDigit) { var attachedTechObject = techObjectManager.GetTObject( Convert.ToInt32(value)); if (attachedTechObject == null) { string objName = techObj.Name + techObj.TechNumber .ToString(); string msg = $"Для объекта {objName} не найден " + $"привязанный агрегат под номером {value}.\n"; Logs.AddMessage(msg); continue; } var attachedTechObjectType = attachedTechObject .NameEplanForFile.ToLower(); var attachedTechObjNameForFile = attachedTechObjectType + attachedTechObject.TechNumber; var techObjNameForFile = "prg." + techObj.NameEplanForFile.ToLower() + techObj.TechNumber; if (previouslyObjectName != techObj.NameEplanForFile .ToLower() && previouslyObjectName != "") { temp += "\n"; } temp += techObjNameForFile + "." + attachedTechObject.BaseTechObject.BindingName + " = prg." + attachedTechObjNameForFile + "\n"; previouslyObjectName = techObj.NameEplanForFile .ToLower(); } else { string msg = $"В объекте \"{techObj.EditText[0]} " + $"{techObj.TechNumber}\" ошибка заполнения поля " + $"\"Привязанные устройства\"\n"; Logs.AddMessage(msg); } } } if (temp != "") { res += "\n" + temp + "\n"; } return(res); }