/// <summary> /// Инициализировать теги КП, их текущие данные и признаки изменения /// </summary> /// <remarks>В результате работы метода элементы списка KPTags не могут быть null</remarks> protected void InitKPTags(List <KPTag> srcKPTags) { if (srcKPTags == null) { throw new ArgumentNullException("srcKPTags"); } TagGroups = new TagGroup[0]; int tagCnt = srcKPTags.Count; KPTags = new KPTag[tagCnt]; curData = new SrezTableLight.CnlData[tagCnt]; curDataModified = new bool[tagCnt]; tagTable = null; int tagIndex = 0; foreach (KPTag kpTag in srcKPTags) { KPTags[tagIndex++] = kpTag == null ? new KPTag() : kpTag; } for (int i = 0; i < tagCnt; i++) { curData[i] = SrezTableLight.CnlData.Empty; curDataModified[i] = true; } }
/// <summary> /// Инициализировать теги КП и группы переменных на основе конфигурации /// </summary> private void InitKPTags() { int groupCnt = config.VarGroups.Count; List <TagGroup> tagGroups = new List <TagGroup>(groupCnt); varGroups = new VarGroup[groupCnt]; int signal = 1; for (int i = 0; i < groupCnt; i++) { Config.VarGroup configVarGroup = config.VarGroups[i]; int varCnt = configVarGroup.Variables.Count; TagGroup tagGroup = new TagGroup(configVarGroup.Name); VarGroup varGroup = new VarGroup(configVarGroup.Name, varCnt, signal); for (int j = 0; j < varCnt; j++) { Config.Variable configVar = configVarGroup.Variables[j]; KPTag kpTag = new KPTag(signal++, configVar.Name); tagGroup.KPTags.Add(kpTag); varGroup.VarNames[j] = configVar.Name; varGroup.Variables[j] = CreateVariable(configVar); } tagGroups.Add(tagGroup); varGroups[i] = varGroup; } InitKPTags(tagGroups); }
public KpTestLogic(int number) : base(number) { random = new Random(); List <TagGroup> tagGroups = new List <TagGroup>(); TagGroup tagGroup = new TagGroup("Group 1"); tagGroup.KPTags.Add(new KPTag(1, "Tag 1")); tagGroup.KPTags.Add(new KPTag(2, "Tag 2")); tagGroup.KPTags.Add(new KPTag(3, "Tag 3")); tagGroup.KPTags.Add(new KPTag(4, "Tag 4")); tagGroup.KPTags.Add(new KPTag(5, "Tag 5")); tagGroups.Add(tagGroup); tagGroup = new TagGroup("Group 2"); tagGroup.KPTags.Add(new KPTag(6, "Tag 6")); tagGroup.KPTags.Add(new KPTag(7, "Tag 7")); tagGroup.KPTags.Add(new KPTag(8, "Tag 8")); tagGroup.KPTags.Add(new KPTag(9, "Tag 9")); tagGroup.KPTags.Add(new KPTag(10, "Tag 10")); tagGroups.Add(tagGroup); InitKPTags(tagGroups); }
/// <summary> /// Creates tag groups according to the specified template. /// </summary> protected virtual List <TagGroup> CreateTagGroups(DeviceTemplate deviceTemplate, ref int tagInd) { List <TagGroup> tagGroups = new List <TagGroup>(); if (deviceTemplate != null) { foreach (ElemGroup elemGroup in deviceTemplate.ElemGroups) { TagGroup tagGroup = new TagGroup(elemGroup.Name); tagGroups.Add(tagGroup); elemGroup.StartKPTagInd = tagInd; foreach (Elem elem in elemGroup.Elems) { int signal = ++tagInd; tagGroup.AddNewTag(signal, elem.Name); if (elem.ElemType == ElemType.Float || elem.ElemType == ElemType.Double) { floatSignals.Add(signal); } } } } return(tagGroups); }
/// <summary> /// Инициализировать теги КП и группы переменных на основе конфигурации /// </summary> private void InitKPTags() { int groupCnt = config.VarGroups.Count; List <TagGroup> tagGroups = new List <TagGroup>(groupCnt); List <bool> isBitsList = new List <bool>(); varGroups = new VarGroup[groupCnt]; int signal = 1; for (int i = 0; i < groupCnt; i++) { KpConfig.VarGroup configVarGroup = config.VarGroups[i]; int varCnt = configVarGroup.Variables.Count; TagGroup tagGroup = new TagGroup(configVarGroup.Name); VarGroup varGroup = new VarGroup(configVarGroup.Name, varCnt, signal); for (int j = 0; j < varCnt; j++) { KpConfig.Variable configVar = configVarGroup.Variables[j]; KPTag kpTag = new KPTag(signal++, configVar.Name); tagGroup.KPTags.Add(kpTag); varGroup.Variables[j] = CreateVariable(configVar); isBitsList.Add(configVar.IsBits); } tagGroups.Add(tagGroup); varGroups[i] = varGroup; } InitKPTags(tagGroups); strVals = new string[KPTags.Length]; Array.Clear(strVals, 0, strVals.Length); isBitsArr = isBitsList.ToArray(); }
private const int GPIO_REFRESH = 100; // expressed in milliseconds //private static Connection baseConnection; public KpWiznetLogic(int number) : base(number) { config = new Config(); wiznetSerCfg = new SerConfig(); wiznetGpioCfg = new gpioConfig(); random = new Random(); CanSendCmd = true; List <TagGroup> tagGroups = new List <TagGroup>(); TagGroup tagGroup = new TagGroup("Group 1"); tagGroup.KPTags.Add(new KPTag(1, "Tag 1")); tagGroup.KPTags.Add(new KPTag(2, "Tag 2")); tagGroup.KPTags.Add(new KPTag(3, "Tag 3")); tagGroup.KPTags.Add(new KPTag(4, "Tag 4")); tagGroup.KPTags.Add(new KPTag(5, "Tag 5")); tagGroups.Add(tagGroup); tagGroup = new TagGroup("Group 2"); tagGroup.KPTags.Add(new KPTag(6, "Tag 6")); tagGroup.KPTags.Add(new KPTag(7, "Tag 7")); tagGroup.KPTags.Add(new KPTag(8, "Tag 8")); tagGroup.KPTags.Add(new KPTag(9, "Tag 9")); tagGroup.KPTags.Add(new KPTag(10, "Tag 10")); tagGroups.Add(tagGroup); InitKPTags(tagGroups); }
/// <summary> /// Converts the group of channel prototypes to a group of device tags. /// </summary> public TagGroup ToTagGroup() { TagGroup tagGroup = new TagGroup(Name) { Hidden = Hidden }; CnlPrototypes.ForEach(c => tagGroup.DeviceTags.Add(c.ToDeviceTag())); return(tagGroup); }
/// <summary> /// Adds the status tag. /// </summary> public void AddStatusTag() { TagGroup tagGroup = new TagGroup(CommUtils.StatusTagCode) { Hidden = true }; StatusTag = tagGroup.AddTag(CommUtils.StatusTagCode, CommUtils.StatusTagCode); AddGroup(tagGroup); }
/// <summary> /// Инициализировать группы тегов, теги КП, их текущие данные и признаки изменения /// </summary> /// <remarks>В результате работы метода элементы списков TagGroups и KPTags не могут быть null</remarks> protected void InitKPTags(List <TagGroup> srcTagGroups) { if (srcTagGroups == null) { throw new ArgumentNullException("srcTagGroups"); } // подсчёт количества тегов int tagCnt = 0; foreach (TagGroup tagGroup in srcTagGroups) { if (tagGroup != null) { tagCnt += tagGroup.KPTags.Count; } } // инициализация данных TagGroups = srcTagGroups.ToArray(); KPTags = new KPTag[tagCnt]; curData = new SrezTableLight.CnlData[tagCnt]; curDataModified = new bool[tagCnt]; tagTable = null; int groupCnt = TagGroups.Length; int tagIndex = 0; for (int groupIndex = 0; groupIndex < groupCnt; groupIndex++) { TagGroup tagGroup = TagGroups[groupIndex]; if (tagGroup == null) { TagGroups[groupIndex] = new TagGroup(); } else { foreach (KPTag kpTag in tagGroup.KPTags) { KPTags[tagIndex++] = kpTag == null ? new KPTag() : kpTag; } } } for (int i = 0; i < tagCnt; i++) { curData[i] = SrezTableLight.CnlData.Empty; curDataModified[i] = true; } }
/// <summary> /// Adds the tag group and calculates the tag indexes. /// </summary> public void AddGroup(TagGroup tagGroup) { int tagIndex = tags.Count; foreach (DeviceTag deviceTag in tagGroup.DeviceTags) { deviceTag.Index = tagIndex++; tags.Add(deviceTag); if (!string.IsNullOrEmpty(deviceTag.Code) && !tagByCode.ContainsKey(deviceTag.Code)) { tagByCode.Add(deviceTag.Code, deviceTag); } } }
/// <summary> /// Конструктор /// </summary> public KPLogic(int number) { // private fields conn = null; appDirs = new AppDirs(); writeToLog = text => { }; // заглушка terminated = false; caption = ""; sessText = ""; sendCmdText = ""; tagTable = null; tagTableColLen = null; // protected fields curData = new SrezTableLight.CnlData[0]; curDataModified = new bool[0]; arcSrezList = new List <TagSrez>(); eventList = new List <KPEvent>(); lastArcSrezList = new List <TagSrez>(); lastEventList = new List <KPEvent>(); lastCmdList = new List <Command>(); lastCommSucc = false; kpStats.Reset(); // public properties Bind = false; Number = number; Name = ""; Dll = Assembly.GetCallingAssembly().GetName().Name; Address = 0; CallNum = ""; ReqParams = KPReqParams.Default; ReqTriesCnt = 1; SerialPort = null; CustomParams = null; CommonProps = null; CommLineSvc = null; CanSendCmd = false; ConnRequired = true; KPTags = new KPTag[0]; TagGroups = new TagGroup[0]; WorkState = WorkStates.Undefined; LastSessDT = DateTime.MinValue; LastCmdDT = DateTime.MinValue; }
/// <summary> /// Initializes the device tags. /// </summary> private void InitDeviceTags() { List <TagGroup> tagGroups = new List <TagGroup>(); TagGroup tagGroup = new TagGroup("Inputs"); tagGroup.KPTags.Add(new KPTag(1, "Sine")); tagGroup.KPTags.Add(new KPTag(2, "Square")); tagGroup.KPTags.Add(new KPTag(3, "Triangle")); tagGroups.Add(tagGroup); tagGroup = new TagGroup("Outputs"); tagGroup.KPTags.Add(new KPTag(4, "Relay State")); tagGroup.KPTags.Add(new KPTag(5, "Analog Output")); tagGroups.Add(tagGroup); InitKPTags(tagGroups); }
private void InitDeviceTags() { List <TagGroup> tagGroups = new List <TagGroup>(); int signal = 1; if (deviceConfig.SubTopics.Count > 0) { TagGroup tagGroup = new TagGroup("Subscriptions"); tagGroups.Add(tagGroup); foreach (MqttSubTopic subTopic in deviceConfig.SubTopics) { subTopic.TagIndex = signal - 1; tagGroup.KPTags.Add(new KPTag { Signal = signal++, Name = subTopic.TopicName }); } } if (deviceConfig.SubJSs.Count > 0) { TagGroup tagGroup = new TagGroup("JS Subscriptions"); tagGroups.Add(tagGroup); foreach (MqttSubJS subJS in deviceConfig.SubJSs) { subJS.TagIndex = signal - 1; for (int i = 0, cnt = subJS.CnlCnt; i < cnt; i++) { tagGroup.KPTags.Add(new KPTag { Signal = signal++, Name = subJS.TopicName + " [" + i + "]" });; } } } InitKPTags(tagGroups); }
/// <summary> /// Initializes the device tags. /// </summary> private void InitDeviceTags() { tagsByCnlNum = new Dictionary <int, KPTag>(); List <TagGroup> tagGroups = new List <TagGroup>(deviceConfig.Subscriptions.Count); int signal = 1; foreach (SubscriptionConfig subscriptionConfig in deviceConfig.Subscriptions) { TagGroup tagGroup = new TagGroup(subscriptionConfig.DisplayName); tagGroups.Add(tagGroup); foreach (ItemConfig itemConfig in subscriptionConfig.Items) { bool cnlNumSpecified = itemConfig.CnlNum > 0; if (itemConfig.IsArray) { for (int i = 0, n = itemConfig.ArrayLen; i < n; i++) { KPTag kpTag = tagGroup.AddNewTag(signal++, itemConfig.DisplayName + "[" + i + "]"); itemConfig.Tag = itemConfig.Tag ?? kpTag; // store a reference to the 1st tag if (cnlNumSpecified) { tagsByCnlNum[itemConfig.CnlNum + i] = kpTag; } } } else { KPTag kpTag = tagGroup.AddNewTag(signal++, itemConfig.DisplayName); itemConfig.Tag = kpTag; if (cnlNumSpecified) { tagsByCnlNum[itemConfig.CnlNum] = kpTag; } } } } InitKPTags(tagGroups); }
public override void OnAddedToCommLine() { List <TagGroup> tagGroups = new List <TagGroup> (); TagGroup tagGroup = new TagGroup("GroupMQTT"); TagGroup tagGroupJS = new TagGroup("GoupJS"); XmlDocument xmlDoc = new XmlDocument(); string filename = ReqParams.CmdLine.Trim(); xmlDoc.Load(AppDirs.ConfigDir + filename); XmlNode MQTTSubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttSubTopics"); XmlNode MQTTPubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttPubTopics"); XmlNode MQTTPubCmds = xmlDoc.DocumentElement.SelectSingleNode("MqttPubCmds"); XmlNode MQTTSubCmds = xmlDoc.DocumentElement.SelectSingleNode("MqttSubCmds"); XmlNode MQTTSubJSs = xmlDoc.DocumentElement.SelectSingleNode("MqttSubJSs"); XmlNode RapSrvCnf = xmlDoc.DocumentElement.SelectSingleNode("RapSrvCnf"); XmlNode MQTTSettings = xmlDoc.DocumentElement.SelectSingleNode("MqttParams"); CommSettings cs = new CommSettings() { ServerHost = RapSrvCnf.Attributes.GetNamedItem("ServerHost").Value, ServerPort = Convert.ToInt32(RapSrvCnf.Attributes.GetNamedItem("ServerPort").Value), ServerUser = RapSrvCnf.Attributes.GetNamedItem("ServerUser").Value, ServerPwd = RapSrvCnf.Attributes.GetNamedItem("ServerPwd").Value }; RSrv = new RapSrvEx(cs); RSrv.Conn(); MQTTPTs = new List <MQTTPubTopic> (); MQTTCmds = new List <MQTTPubCmd> (); foreach (XmlElement MqttPTCnf in MQTTPubTopics) { MQTTPubTopic MqttPT = new MQTTPubTopic() { NumCnl = Convert.ToInt32(MqttPTCnf.GetAttribute("NumCnl")), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), TopicName = MqttPTCnf.GetAttribute("TopicName"), PubBehavior = MqttPTCnf.GetAttribute("PubBehavior"), NumberDecimalSeparator = MqttPTCnf.GetAttribute("NDS"), Value = 0 }; MQTTPTs.Add(MqttPT); } foreach (XmlElement MqttPTCnf in MQTTPubCmds) { MQTTPubCmd MqttPTCmd = new MQTTPubCmd() { NumCmd = MqttPTCnf.GetAttrAsInt("NumCmd"), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), Retain = false, TopicName = MqttPTCnf.GetAttribute("TopicName") }; MQTTCmds.Add(MqttPTCmd); } sp = new SubscribePacket(); int i = 0; int spCnt = MQTTSubTopics.ChildNodes.Count; spCnt += MQTTSubCmds.ChildNodes.Count; spCnt += MQTTSubJSs.ChildNodes.Count; sp.Topics = new string[spCnt]; sp.QosLevels = new MqttQos[spCnt]; foreach (XmlElement elemGroupElem in MQTTSubTopics.ChildNodes) { sp.Topics [i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels [i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); KPTag KPt = new KPTag() { Signal = i + 1, Name = sp.Topics [i], CnlNum = Convert.ToInt32(elemGroupElem.GetAttribute("NumCnl")) }; tagGroup.KPTags.Add(KPt); i++; } tagGroups.Add(tagGroup); InitKPTags(tagGroups); SubCmds = new List <MQTTSubCmd> (); foreach (XmlElement elemGroupElem in MQTTSubCmds.ChildNodes) { sp.Topics [i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels [i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); MQTTSubCmd cmd = new MQTTSubCmd() { TopicName = sp.Topics[i], CmdNum = elemGroupElem.GetAttrAsInt("NumCmd", 0), CmdType = elemGroupElem.GetAttribute("CmdType"), KPNum = elemGroupElem.GetAttrAsInt("KPNum", 0), IDUser = elemGroupElem.GetAttrAsInt("IDUser", 0), NumCnlCtrl = elemGroupElem.GetAttrAsInt("NumCnlCtrl", 0) }; SubCmds.Add(cmd); i++; } SubJSs = new List <MQTTSubJS>(); foreach (XmlElement elemGroupElem in MQTTSubJSs.ChildNodes) { sp.Topics[i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels[i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); MQTTSubJS msjs = new MQTTSubJS() { TopicName = sp.Topics[i], CnlCnt = elemGroupElem.GetAttrAsInt("CnlCnt", 1), JSHandlerPath = elemGroupElem.GetAttrAsString("JSHandlerPath", "") }; if (msjs.LoadJSHandler()) { SubJSs.Add(msjs); i++; } } connArgs = new MqttConnectionArgs(); connArgs.ClientId = MQTTSettings.Attributes.GetNamedItem("ClientID").Value; connArgs.Hostname = MQTTSettings.Attributes.GetNamedItem("Hostname").Value; connArgs.Port = Convert.ToInt32(MQTTSettings.Attributes.GetNamedItem("Port").Value); connArgs.Username = MQTTSettings.Attributes.GetNamedItem("UserName").Value; connArgs.Password = MQTTSettings.Attributes.GetNamedItem("Password").Value; connArgs.Keepalive = TimeSpan.FromSeconds(60); connArgs.ReadTimeout = TimeSpan.FromSeconds(10); connArgs.WriteTimeout = TimeSpan.FromSeconds(10); this.Persistence = new InMemoryPersistence(); Transport = new TcpTransport(connArgs.Hostname, connArgs.Port); Transport.Version = connArgs.Version; Transport.SetTimeouts(connArgs.ReadTimeout, connArgs.WriteTimeout); Send(MakeConnectMessage(connArgs)); ReceiveConnack(); ResumeOutgoingFlows(); if (sp.Topics.Length > 0) { Subscribe(sp); } WriteToLog(Localization.UseRussian ? "Инициализация линии связи выполнена успешно." : "Communication line initialized successfully"); }
public override void OnAddedToCommLine() // Выполняем действия при добавлении Линии связи - Чтение шаблона, создание списка Тегов { base.OnAddedToCommLine(); devTemplate = null; fileName = ReqParams.CmdLine == null ? "" : ReqParams.CmdLine.Trim(); string filePath = AppDirs.ConfigDir + fileName; if (fileName == "") { WriteToLog(string.Format(Localization.UseRussian ? "{0} Ошибка: Не задан шаблон устройства для {1}" : "{0} Error: Template is undefined for the {1}", CommUtils.GetNowDT(), Caption)); } else { try { devTemplate = FileFunc.LoadXml(typeof(DevTemplate), filePath) as DevTemplate; fileyes = true; } catch (Exception err) { WriteToLog(string.Format(Localization.UseRussian ? "Ошибка: " + err.Message : "Error: " + err.Message, CommUtils.GetNowDT(), Caption)); } } // Проверка на наличие конфигурации XML if (devTemplate != null) { // Определить Номера активных запросов, посылку команд проводить согласно списку активных запросов. if (devTemplate.SndGroups.Count != 0) // Определить активные запросы и записать в массив номера запросов для создания тегов по номерам телеграмм // Можно упростить до определения индекса { for (int snd = 0; snd < devTemplate.SndGroups.Count; snd++) { if (devTemplate.SndGroups[snd].SndActive) // Если запрос активен, заносим его номер Cnt в Словарь { if (!ActiveSnd.ContainsKey(devTemplate.SndGroups[snd].SndCnt)) // Ключ = SndCnt - Значение = Индекс Активного запроса SndCnt { ActiveSnd.Add(devTemplate.SndGroups[snd].SndCnt, devTemplate.SndGroups.FindIndex(x => x.SndCnt == devTemplate.SndGroups[snd].SndCnt)); } byte[] sndcode = ScadaUtils.HexToBytes(devTemplate.SndGroups[snd].SndCode, true); // Чтение строки HEX из параметра SndCode sndcode_ = sndcode[0]; if (sndcode_ == 0x01) // Проверяем какой номер запроса у параметра SndCode - F=0x01 Текущие параметры { xValCnt01 = devTemplate.SndGroups[snd].SndCnt; // Сохраняем номер запроса (SndCnt) if (devTemplate.SndGroups[snd].SndData != "") { startCnl = Convert.ToInt32(ScadaUtils.StrToDouble(devTemplate.SndGroups[snd].SndData.Trim())); // Сохранить начальный номер сигнала Текущих параметров } } else if (sndcode_ == 0x07) // Или F=0x07 (Вес импульса для Регистратора импульсов) { xValCnt07 = devTemplate.SndGroups[snd].SndCnt; // Сохраняем номер запроса (SndCnt) if (devTemplate.SndGroups[snd].SndData != "") { startCnlv = Convert.ToInt32(ScadaUtils.StrToDouble(devTemplate.SndGroups[snd].SndData.Trim())); // Сохранить начальный номер сигнала Весов импульсов (Регистратор импульсов) } } activeuse = true; // Есть активные запросы } } } if (devTemplate.CmdGroups.Count != 0) // Определяем наличие активных команд и заносим в словарь Индексов команд { for (int cmd = 0; cmd < devTemplate.CmdGroups.Count; cmd++) { if (devTemplate.CmdGroups[cmd].CmdActive) { if (!ActiveCmd.ContainsKey(devTemplate.CmdGroups[cmd].CmdCnl)) // Ключ = номер команды CmdCnl - Значение = Индекс Активной команды CmdCnl { ActiveCmd.Add(devTemplate.CmdGroups[cmd].CmdCnl, devTemplate.CmdGroups.FindIndex(x => x.CmdCnl == devTemplate.CmdGroups[cmd].CmdCnl)); } } } } if (devTemplate.Values.Count != 0) // Проверка наличия записей переменных в конфигурации { if (activeuse) { // ------------------- Сформировать Список параметров по меню ------------------ for (int ac = 0; ac < ActiveSnd.Count; ac++) { var valCnt_ = devTemplate.Values.FindIndex(x => x.ValCnt == ActiveSnd.ElementAt(ac).Key); for (int val = 0; val < devTemplate.Values[valCnt_].Vals.Count; val++) // МЕНЯЕМ valCnt_ на уже проиндексированный Словарь { if (devTemplate.Values[valCnt_].Vals[val].SigActive) // Проверяем переменную на активность { sigN = devTemplate.Values[valCnt_].Vals[val].SigCnl; // читаем номер сигнала переменной ActiveCnl.Add(new ActiveCnlList() { Cnl = sigN, // Номер текущего активного сигнала Name = devTemplate.Values[valCnt_].Vals[val].SigName, // Имя текущего активного сигнала Format = devTemplate.Values[valCnt_].Vals[val].SigType, // Тип переменной активного сигнала IdxValue = valCnt_, // Индекс группы ответа (ValCnt), в которой находится сигнал MenuName = devTemplate.Values[valCnt_].ValMenu }); // Проверяем номер запроса с параметром SndCode = F=0x01 и создаем маску запросов if (devTemplate.Values[valCnt_].ValCnt == xValCnt01) { // Заносим в маску номер сигнала - startCnl (1 по умолчанию) бит по расположению. mask_ch = BitFunc.SetBit(mask_ch, devTemplate.Values[valCnt_].Vals[val].SigCnl - startCnl, devTemplate.Values[valCnt_].Vals[val].SigActive); //maxch = ActiveCnl.FindLast(s => s.IdxValue == ActiveCnl.Find(d => d.Cnl == sigN).IdxValue).Cnl; // Поиск Максимального номер канала для Текущих параметров } // SigCnl - startCnl (1 по умолчанию) определяет какой бит 32-х разрядного числа выставить в 1 (единицу) if (devTemplate.Values[valCnt_].ValCnt == xValCnt07) { // Заносим в маску номер сигнала - startCnlv (41 по умолчанию) бит по расположению. // Номера сигналов для запроса F=0x07, Вес импульса Регистратора импульсов должны начинаться с 41-ого если не задан в SndData mask_chv = BitFunc.SetBit(mask_chv, devTemplate.Values[valCnt_].Vals[val].SigCnl - startCnlv, devTemplate.Values[valCnt_].Vals[val].SigActive); } // SigCnl - startCnlv (41 по умолчанию) определяет какой бит 32-х разрядного числа выставить в 1 (единицу) } } } // ------------ Создание тегов на основе созданного Списка Активных переменных ------------ List <TagGroup> tagGroups = new List <TagGroup>(); TagGroup tagGroup; var categoryCounts = // Считаем количество Меню и количество переменных в Меню в шаблоне from p in ActiveCnl group p by p.MenuName into g select new { NameMenu = g.Key, counts = g.Count() }; int cnt = 0; foreach (var menu in categoryCounts) { tagGroup = new TagGroup(menu.NameMenu); // Создание меню Тегов var actcnl = ActiveCnl.FindAll(s => s.MenuName == menu.NameMenu).OrderBy(d => d.Cnl); // Сортировка активных каналов по каждому меню foreach (var tags in actcnl) { sigN = ActiveCnl.Find(f => f.Cnl == tags.Cnl).Cnl; tagGroup.KPTags.Add(new KPTag(sigN, ActiveCnl.Find(f => f.Cnl == tags.Cnl).Name)); // Заносим в тег Коммуникатора ActiveCnl.Find(s => s.Cnl == sigN).IdxTag = cnt; // Заносим номер тега Коммуникатора в Список cnt++; // Увеличиваем счетчик тегов } tagGroups.Add(tagGroup); // Добавляем группу тегов } InitKPTags(tagGroups); // Инициализация всех тегов // Определяем диапазон каналов в группах Текущие параметры и Вес импульса if (xValCnt01 != 0) // Если запрос с кодом 0x01 активен, переменная xValCnt01 содержит номер запроса { int idx = devTemplate.SndGroups.FindIndex(f => f.SndCnt == xValCnt01); maxch = ActiveCnl.FindLast(d => d.IdxValue == idx).Cnl; // Максимальный номер канала для Текущих параметров res_ch = BitFunc.CountBit32(mask_ch); // Определяем количество бит = 1 в маске текущих параметров string format = ActiveCnl.Find(d => d.IdxValue == idx).Format; if (format == "float" || format == "uint32") { col = 4; } if (format == "double") { col = 8; } } if (xValCnt07 != 0) // Если запрос с кодом 0x07 активен, переменная xValCnt07 содержит номер запроса { int idx = devTemplate.SndGroups.FindIndex(f => f.SndCnt == xValCnt07); maxchv = ActiveCnl.FindLast(d => d.IdxValue == idx).Cnl; // Максимальный номер канала для Веса импульсов res_chv = BitFunc.CountBit32(mask_chv); // Определяем количество бит = 1 в маске Веса импульсов } } } } }
public override void OnAddedToCommLine() { List <TagGroup> tagGroups = new List <TagGroup>(); TagGroup tagGroup = new TagGroup("GroupMQTT"); TagGroup tagGroupJS = new TagGroup("GoupJS"); XmlDocument xmlDoc = new XmlDocument(); string filename = ReqParams.CmdLine.Trim(); xmlDoc.Load(AppDirs.ConfigDir + filename); XmlNode MQTTSubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttSubTopics"); XmlNode MQTTPubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttPubTopics"); XmlNode MQTTPubCmds = xmlDoc.DocumentElement.SelectSingleNode("MqttPubCmds"); XmlNode MQTTSubCmds = xmlDoc.DocumentElement.SelectSingleNode("MqttSubCmds"); XmlNode MQTTSubJSs = xmlDoc.DocumentElement.SelectSingleNode("MqttSubJSs"); XmlNode RapSrvCnf = xmlDoc.DocumentElement.SelectSingleNode("RapSrvCnf"); MQTTSettings = xmlDoc.DocumentElement.SelectSingleNode("MqttParams"); CommSettings cs = new CommSettings() { ServerHost = RapSrvCnf.Attributes.GetNamedItem("ServerHost").Value, ServerPort = Convert.ToInt32(RapSrvCnf.Attributes.GetNamedItem("ServerPort").Value), ServerUser = RapSrvCnf.Attributes.GetNamedItem("ServerUser").Value, ServerPwd = RapSrvCnf.Attributes.GetNamedItem("ServerPwd").Value }; RSrv = new RapSrvEx(cs); RSrv.Conn(); MQTTPTs = new List <MQTTPubTopic>(); MQTTCmds = new List <MQTTPubCmd>(); foreach (XmlElement MqttPTCnf in MQTTPubTopics) { MQTTPubTopic MqttPT = new MQTTPubTopic() { NumCnl = Convert.ToInt32(MqttPTCnf.GetAttribute("NumCnl")), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), TopicName = MqttPTCnf.GetAttribute("TopicName"), PubBehavior = MqttPTCnf.GetAttribute("PubBehavior"), NumberDecimalSeparator = MqttPTCnf.GetAttribute("NDS"), Value = 0 }; MQTTPTs.Add(MqttPT); } foreach (XmlElement MqttPTCnf in MQTTPubCmds) { MQTTPubCmd MqttPTCmd = new MQTTPubCmd() { NumCmd = MqttPTCnf.GetAttrAsInt("NumCmd"), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), Retain = false, TopicName = MqttPTCnf.GetAttribute("TopicName") }; MQTTCmds.Add(MqttPTCmd); } sp = new SubscribePacket(); int i = 0; int spCnt = MQTTSubTopics.ChildNodes.Count; spCnt += MQTTSubCmds.ChildNodes.Count; spCnt += MQTTSubJSs.ChildNodes.Count; sp.Topics = new string[spCnt]; sp.QosLevels = new MqttQos[spCnt]; foreach (XmlElement elemGroupElem in MQTTSubTopics.ChildNodes) { sp.Topics[i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels[i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); KPTag KPt = new KPTag() { Signal = i + 1, Name = sp.Topics[i], CnlNum = Convert.ToInt32(elemGroupElem.GetAttribute("NumCnl")) }; tagGroup.KPTags.Add(KPt); i++; } tagGroups.Add(tagGroup); InitKPTags(tagGroups); SubCmds = new List <MQTTSubCmd>(); foreach (XmlElement elemGroupElem in MQTTSubCmds.ChildNodes) { sp.Topics[i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels[i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); MQTTSubCmd cmd = new MQTTSubCmd() { TopicName = sp.Topics[i], CmdNum = elemGroupElem.GetAttrAsInt("NumCmd", 0), CmdType = elemGroupElem.GetAttribute("CmdType"), KPNum = elemGroupElem.GetAttrAsInt("KPNum", 0), IDUser = elemGroupElem.GetAttrAsInt("IDUser", 0), NumCnlCtrl = elemGroupElem.GetAttrAsInt("NumCnlCtrl", 0) }; SubCmds.Add(cmd); i++; } SubJSs = new List <MQTTSubJS>(); foreach (XmlElement elemGroupElem in MQTTSubJSs.ChildNodes) { sp.Topics[i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels[i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); MQTTSubJS msjs = new MQTTSubJS() { TopicName = sp.Topics[i], CnlCnt = elemGroupElem.GetAttrAsInt("CnlCnt", 1), JSHandlerPath = elemGroupElem.GetAttrAsString("JSHandlerPath", "") }; if (msjs.LoadJSHandler()) { SubJSs.Add(msjs); i++; } } Connect(MQTTSettings); }
//------------------------- public override void OnAddedToCommLine() { base.OnAddedToCommLine(); s_out = Parametrs.Parametr(ReqParams.CmdLine.Trim()); address = s_out[0]; if (s_out[2] == "0") { slog = false; } int chanel = Convert.ToInt32(s_out[1], 10); Group_1 = Convert.ToBoolean(Parametrs.GetBit(chanel, 0)); Group_2 = Convert.ToBoolean(Parametrs.GetBit(chanel, 1)); Group_3 = Convert.ToBoolean(Parametrs.GetBit(chanel, 2)); Group_4 = Convert.ToBoolean(Parametrs.GetBit(chanel, 3)); Group_5 = Convert.ToBoolean(Parametrs.GetBit(chanel, 4)); Group_6 = Convert.ToBoolean(Parametrs.GetBit(chanel, 5)); List <TagGroup> tagGroups = new List <TagGroup>(); TagGroup tagGroup; if (Group_1) { tagGroup = new TagGroup("Основные параметры:"); tagGroup.KPTags.Add(new KPTag(1, "Напряжение (В)")); tagGroup.KPTags.Add(new KPTag(2, "Ток (А)")); tagGroup.KPTags.Add(new KPTag(3, "Мощность активная (Вт)")); tagGroups.Add(tagGroup); } if (Group_2 || Group_3 || Group_4) { tagGroup = new TagGroup("Дополнительные параметры:"); if (Group_2) { tagGroup.KPTags.Add(new KPTag(4, "Мощность реактивная (Вар)")); } if (Group_3) { tagGroup.KPTags.Add(new KPTag(5, "Мощность полная (ВА)")); tagGroup.KPTags.Add(new KPTag(6, "COS")); } if (Group_4) { tagGroup.KPTags.Add(new KPTag(7, "Частота (Гц)")); } tagGroups.Add(tagGroup); } if (Group_5 || Group_6) { tagGroup = new TagGroup("Энергия от сброса:"); if (Group_5) { tagGroup.KPTags.Add(new KPTag(8, "Активная Т1, (кВт*ч)")); tagGroup.KPTags.Add(new KPTag(9, "Активная Т2, (кВт*ч)")); tagGroup.KPTags.Add(new KPTag(10, "Активная Т3, (кВт*ч)")); tagGroup.KPTags.Add(new KPTag(11, "Активная Т4, (кВт*ч)")); } if (Group_6) { tagGroup.KPTags.Add(new KPTag(12, "Реактивная Т1, (кВар*ч)")); tagGroup.KPTags.Add(new KPTag(13, "Реактивная Т2, (кВар*ч)")); tagGroup.KPTags.Add(new KPTag(14, "Реактивная Т3, (кВар*ч)")); tagGroup.KPTags.Add(new KPTag(15, "Реактивная Т4, (кВар*ч)")); } tagGroups.Add(tagGroup); } InitKPTags(tagGroups); }
public override void OnAddedToCommLine() { List <TagGroup> tagGroups = new List <TagGroup> (); TagGroup tagGroup = new TagGroup("GroupMQTT"); XmlDocument xmlDoc = new XmlDocument(); string filename = ReqParams.CmdLine.Trim(); xmlDoc.Load(AppDirs.ConfigDir + filename); XmlNode MQTTSubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttSubTopics"); XmlNode MQTTPubTopics = xmlDoc.DocumentElement.SelectSingleNode("MqttPubTopics"); XmlNode RapSrvCnf = xmlDoc.DocumentElement.SelectSingleNode("RapSrvCnf"); XmlNode MQTTSettings = xmlDoc.DocumentElement.SelectSingleNode("MqttParams"); CommSettings cs = new CommSettings() { ServerHost = RapSrvCnf.Attributes.GetNamedItem("ServerHost").Value, ServerPort = Convert.ToInt32(RapSrvCnf.Attributes.GetNamedItem("ServerPort").Value), ServerUser = RapSrvCnf.Attributes.GetNamedItem("ServerUser").Value, ServerPwd = RapSrvCnf.Attributes.GetNamedItem("ServerPwd").Value }; RSrv = new RapSrvEx(cs); RSrv.Conn(); MQTTPTs = new List <MQTTPubTopic> (); foreach (XmlElement MqttPTCnf in MQTTPubTopics) { MQTTPubTopic MqttPT = new MQTTPubTopic() { NumCnl = Convert.ToInt32(MqttPTCnf.GetAttribute("NumCnl")), QosLevels = (MqttQos)Convert.ToByte(MqttPTCnf.GetAttribute("QosLevel")), TopicName = MqttPTCnf.GetAttribute("TopicName"), Value = 0 }; MQTTPTs.Add(MqttPT); } sp = new SubscribePacket(); int i = 0; sp.Topics = new string[MQTTSubTopics.ChildNodes.Count]; sp.QosLevels = new MqttQos[MQTTSubTopics.ChildNodes.Count]; foreach (XmlElement elemGroupElem in MQTTSubTopics.ChildNodes) { sp.Topics [i] = elemGroupElem.GetAttribute("TopicName"); sp.QosLevels [i] = (MqttQos)Convert.ToByte(elemGroupElem.GetAttribute("QosLevel")); KPTag KPt = new KPTag() { Signal = i + 1, Name = sp.Topics [i], CnlNum = Convert.ToInt32(elemGroupElem.GetAttribute("NumCnl")) }; tagGroup.KPTags.Add(KPt); i++; } tagGroups.Add(tagGroup); InitKPTags(tagGroups); connArgs = new MqttConnectionArgs(); connArgs.ClientId = MQTTSettings.Attributes.GetNamedItem("ClientID").Value; connArgs.Hostname = MQTTSettings.Attributes.GetNamedItem("Hostname").Value; connArgs.Port = Convert.ToInt32(MQTTSettings.Attributes.GetNamedItem("Port").Value); connArgs.Username = MQTTSettings.Attributes.GetNamedItem("UserName").Value; connArgs.Password = MQTTSettings.Attributes.GetNamedItem("Password").Value; this.Persistence = new InMemoryPersistence(); Transport = new TcpTransport(connArgs.Hostname, connArgs.Port); Transport.Version = connArgs.Version; Transport.SetTimeouts(connArgs.ReadTimeout, connArgs.WriteTimeout); Send(MakeConnectMessage(connArgs)); ReceiveConnack(); ResumeOutgoingFlows(); Subscribe(sp); }
/// <summary> /// Выполнить действия после добавления КП на линию связи /// </summary> public override void OnAddedToCommLine() { // загрузка шаблона устройства deviceTemplate = null; elemGroups = null; elemGroupCnt = 0; floatSignals = new HashSet <int>(); string fileName = ReqParams.CmdLine.Trim(); if (fileName == "") { WriteToLog(string.Format(Localization.UseRussian ? "{0} Ошибка: Не задан шаблон устройства для {1}" : "{0} Error: Template is undefined for the {1}", CommUtils.GetNowDT(), Caption)); } else { Dictionary <string, DeviceTemplate> templates = GetTemplates(); if (templates.ContainsKey(fileName)) { // создание шаблона устройства на основе шаблона, загруженного ранее DeviceTemplate template = templates[fileName]; if (template != null) { deviceTemplate = new DeviceTemplate(); deviceTemplate.CopyFrom(template); } } else { WriteToLog(string.Format(Localization.UseRussian ? "{0} Загрузка шаблона устройства из файла {1}" : "{0} Load device template from file {1}", CommUtils.GetNowDT(), fileName)); DeviceTemplate template = new DeviceTemplate(); string errMsg; if (template.Load(AppDirs.ConfigDir + fileName, out errMsg)) { deviceTemplate = template; templates.Add(fileName, template); } else { WriteToLog(errMsg); templates.Add(fileName, null); } } } if (deviceTemplate != null) { elemGroups = deviceTemplate.GetActiveElemGroups(); elemGroupCnt = elemGroups.Count; } // инициализация тегов КП на основе модели устройства if (deviceTemplate.ElemGroups.Count > 0) { List <TagGroup> tagGroups = new List <TagGroup>(); int tagInd = 0; foreach (ElemGroup elemGroup in deviceTemplate.ElemGroups) { TagGroup tagGroup = new TagGroup(elemGroup.Name); tagGroups.Add(tagGroup); elemGroup.StartKPTagInd = tagInd; foreach (Elem elem in elemGroup.Elems) { int signal = ++tagInd; tagGroup.KPTags.Add(new KPTag(signal, elem.Name)); if (elem.ElemType == ElemTypes.Float) { floatSignals.Add(signal); } } } InitKPTags(tagGroups); CanSendCmd = deviceTemplate.Cmds.Count > 0; } }
public override void OnAddedToCommLine() { base.OnAddedToCommLine(); s_out = Parametrs.Parametr(ReqParams.CmdLine.Trim()); // Чтение командной строки if (!File.Exists(AppDirs.LogDir + fileName)) { // Create a file to write to. File.WriteAllLines(AppDirs.LogDir + fileName, s_out, Encoding.UTF8); } else { string[] files_out = File.ReadAllLines(AppDirs.LogDir + fileName); // Чтение параметров из файла для режима Retain init = Enumerable.SequenceEqual(s_out, files_out); if (!init) { File.WriteAllLines(AppDirs.LogDir + fileName, s_out, Encoding.UTF8); // При измененных параметрах командной строки сохранить новый файл параметров } } mask_gpio = Convert.ToInt32(s_out[0], 10); // Битовая маска разрешенных GPIO inout_gpio = Convert.ToInt32(s_out[1], 10); // Битовая маска отпределения входов/выходов pud_gpio = Convert.ToInt32(s_out[2], 10); // Битовая маска определения подтяжки level_gpio = Convert.ToInt32(s_out[3], 10); // Битовая маска уровня выхода comand = Convert.ToInt32(s_out[4], 10); // Битовая маска дополнительных параметров active = Parametrs.GetBit(comand, 0) > 0; // Активировать уровень выхода до инициализации retain = Parametrs.GetBit(comand, 1) > 0; // Сохранять состояние выхода при перезапуске ScadaComm ? директория ScadaComm\Log должна быть в tmpfs formatNum = Parametrs.GetBit(comand, 2) > 0; // Тип нумерации GPIO - BCM или wPi if (formatNum) { Array.Copy(wPiNum, 0, gpioNum, 0, gpioNum.Length); // Нумерация согласно WiringPi GPIO FormatGpio = "wPi"; } else { Array.Copy(bcmNum, 0, gpioNum, 0, gpioNum.Length); // Нумерация согласно BCM GPIO FormatGpio = "Bcm"; } gpio_num = Parametrs.nmass_int(gpioNum, mask_gpio); // Новый массив активированных GPIO с нумерацией BCM bool[] temp_mass = new BitArray(new int[] { inout_gpio }).Cast <bool>().ToArray(); // Определение направления работы GPIO (true - OUT, false - IN) int[] temp_inout = new int[temp_mass.Length]; for (int i = 0; i < temp_mass.Length; i++) // Преобразование true, false в целочисленное 1,0 (1=OUT, 2=IN) { temp_inout[i] = Convert.ToInt32(temp_mass[i]); } gpio_inout = Parametrs.nmass_int(temp_inout, mask_gpio); // Новый массив направлений, согласно активированным GPIO temp_mass = new BitArray(new int[] { pud_gpio }).Cast <bool>().ToArray(); // Определение уровня подтяжки GPIO (true - pullup, false - pulldown) int[] temp_pud = new int[temp_mass.Length]; for (int i = 0; i < temp_mass.Length; i++) // Преобразование true, false в целочисленное 1,0 (1=PUD_DOWN, 2=PUD_UP) { temp_pud[i] = Convert.ToInt32(temp_mass[i]); } gpio_pud = Parametrs.nmass_int(temp_pud, mask_gpio); // Новый массив уровней подтяжки, согласно активированным GPIO temp_mass = new BitArray(new int[] { level_gpio }).Cast <bool>().ToArray(); // Определение уровня выхода GPIO (true - High, false - low) int[] temp_level = new int[temp_mass.Length]; for (int i = 0; i < temp_mass.Length; i++) // Преобразование true, false в целочисленное 1,0 { temp_level[i] = Convert.ToInt32(temp_mass[i]); } gpio_level = Parametrs.nmass_int(temp_level, mask_gpio); // Новый массив уровней выходов, согласно активированным GPIO result = formatNum ? WiringPi.Core.Setup() : WiringPi.Core.SetupGpio(); if (result == -1) { WriteToLog("WiringPi init failed!"); res = false; } if (!init) { for (int i = 0; i < gpio_num.Length; i++) // Инициализация используемых GPIO { WiringPi.Core.PullUpDnControl(gpio_num[i], gpio_pud[i] + 1); // Активировать PullDnUpControl if (active && gpio_inout[i] == 1) // Если необходимо записать уровень перед активацией выхода { WiringPi.Core.DigitalWrite(gpio_num[i], gpio_level[i]); } WiringPi.Core.PinMode(gpio_num[i], gpio_inout[i]); } init = true; } List <TagGroup> tagGroups = new List <TagGroup>(); TagGroup tagGroup; tagGroup = new TagGroup(Localization.UseRussian ? "Список используемых GPIO:" : "List of used GPIO:"); for (int i = 0; i < 24; i++) { if (Parametrs.GetBit(mask_gpio, i) > 0) { tagGroup.KPTags.Add(new KPTag(signal, FormatGpio + "." + gpio_num[signal - 1] + "_" + StatusGPIO(gpio_inout[signal - 1]) + "_" + pullControl(gpio_pud[signal - 1]))); signal++; } } tagGroups.Add(tagGroup); InitKPTags(tagGroups); }
public override void OnAddedToCommLine() { // загрузка конфигурации КП string errMsg; configLoaded = config.Load(Config.GetFileName(AppDirs.ConfigDir, Number), out errMsg); int dataGroupCnt = config.DataGroups.Count; List <TagGroup> tagGroups = new List <TagGroup>(dataGroupCnt); int signal = 1; if (configLoaded) { for (int i = 0; i < dataGroupCnt; i++) // browser folders { Config.DataGroup dataGroup = config.DataGroups[i]; // определение количества тегов КП в группе чтения данных int tagCntByGroup = 0; foreach (Config.DataItem dataItem in dataGroup.DataItems) { tagCntByGroup += 1; } // создание группы тегов КП if (tagCntByGroup > 0) { TagGroup tagGroup = new TagGroup(string.IsNullOrEmpty(dataGroup.Name) ? (Localization.UseRussian ? "Безымянная группа" : "Unnamed group") : dataGroup.Name); int dataItemCnt = dataGroup.DataItems.Count; List <DataItemInfo> dataGroupInfo = new List <DataItemInfo>(); dataGroup.Tag = dataGroupInfo; for (int j = 0; j < dataItemCnt; j++) // Browse Items in a folder { Config.DataItem dataItem = dataGroup.DataItems[j]; string dataItemName = string.IsNullOrEmpty(dataItem.Name) ? "" : dataItem.Name; string tagNamePrefix = dataItemName == "" ? (Localization.UseRussian ? "Безымянный тег" : "Unnamed tag") : dataItemName; int tagCntByItem = 1; DataItemInfo dataItemInfo = new DataItemInfo(dataItem.Name, dataItem.Id); dataItemInfo.KPTags = new KPTag[tagCntByItem]; //for (int k = 0; k < tagCntByItem; k++) { string tagName = tagNamePrefix; KPTag kpTag = new KPTag(signal++, tagName); tagGroup.KPTags.Add(kpTag); dataItemInfo.KPTags[0] = kpTag; //0->k } if (tagCntByItem > 0 && !kpTagsByName.ContainsKey(dataItemName)) { kpTagsByName.Add(dataItemName, dataItemInfo.KPTags[0]); } } tagGroups.Add(tagGroup); } } InitKPTags(tagGroups); } // Logs /* * string m_UtilsLogFilePath; * bool m_deleteOnLoad = true; * int m_traceMasks = Opc.Ua.Utils.TraceMasks.Error | Opc.Ua.Utils.TraceMasks.Information; * m_UtilsLogFilePath = AppDomain.CurrentDomain.BaseDirectory + "Opc.Ua.Core.Logs.txt"; * Opc.Ua.Utils.SetTraceLog(m_UtilsLogFilePath, m_deleteOnLoad); * Opc.Ua.Utils.SetTraceMask(m_traceMasks); * Opc.Ua.Utils.Trace(Opc.Ua.Utils.TraceMasks.Information, "Beginning of Opc.Ua.Core.Utils logs"); */ WriteToLog("Configuration started"); Init().Wait(); WriteToLog("Configuration finished"); }