private static void FillConfigParameters(string socketName, string nodeName, string suffix, string section) { if (mif.SectionExists(section)) { var itemName = $"{socketName}\\{nodeName}\\{suffix}"; ModbusIntegratorEventService.SetPropValue("config", "add", itemName, nodeName); // загрузка узловых параметров опроса foreach (var key in mif.ReadSectionKeys(section)) { var pointname = $"{socketName}\\{nodeName}\\{suffix}"; var propname = key; var value = mif.ReadString(section, key, ""); ModbusIntegratorEventService.SetPropValue("config", pointname, propname, value); } } }
static void LoadAndRunConfiguration() { var roots = "sources;sockets"; foreach (var root in roots.Split(';')) { // загрузка корневых разделов foreach (var socketName in mif.ReadSectionValues(root)) { if (mif.KeyExists(socketName, "IpPort")) ModbusIntegratorEventService.SetPropValue("config", socketName, "IpPort", mif.ReadString(socketName, "IpPort", "502")); var itemName = socketName; ModbusIntegratorEventService.SetPropValue("config", "add", itemName, itemName); var section = $"{socketName}_nodes"; // загрузка узлов текущего раздела foreach (var nodeName in mif.ReadSectionValues(section)) { itemName = $"{socketName}\\{mif.ReadString(section, nodeName, nodeName)}"; ModbusIntegratorEventService.SetPropValue("config", "add", itemName, nodeName); // загрузка общих параметров настройки узла foreach (var key in mif.ReadSectionKeys(nodeName)) { var pointname = $"{socketName}\\{nodeName}"; var propname = key; var value = mif.ReadString(nodeName, key, ""); ModbusIntegratorEventService.SetPropValue("config", pointname, propname, value); } // загрузка форматов перестановки байтов (для Modbus устройств) var swapFormats = new Dictionary<string, string>(); foreach (var key in mif.ReadSectionKeys($"{nodeName}_SwapFormats")) swapFormats.Add(key, mif.ReadString($"{nodeName}_SwapFormats", key, "")); byte.TryParse(mif.ReadString(nodeName, "ModbusNode", "247"), out byte modbusNode); // заполнение списка параметров опроса var fetchParams = new List<AskParamData>(); var suffix = "FetchParams"; var paramsSection = $"{nodeName}_{suffix}"; FillFetchParameters(socketName, nodeName, swapFormats, modbusNode, fetchParams, suffix, paramsSection); // заполнение списка параметров конфигурации var fetchParamsSection = $"{nodeName}_{suffix}"; FillConfigParameters(socketName, nodeName, suffix, fetchParamsSection); var fetchArchives = new List<AskParamData>(); var archives = "HourArchive;DayArchive;MonthArchive".Split(';'); // загрузка секций настройки архивирования для узла (часовых, суточных и месячных) foreach (var archiveName in archives) { // заполнение списка параметров опроса var archivesSection = $"{nodeName}_{archiveName}"; suffix = $"archives\\{archiveName}"; FillFetchParameters(socketName, nodeName, swapFormats, modbusNode, fetchArchives, suffix, archivesSection); // заполнение списка параметров конфигурации var archiveSection = $"{nodeName}_{archiveName}"; FillConfigParameters(socketName, nodeName, suffix, archiveSection); } // проверка настройки включения узла var actived = mif.ReadString(nodeName, "Active", "false").ToLower() == "true"; var modbusTcp = actived && mif.ReadString(nodeName, "LinkProtokol", "false").ToLower() == "modbus tcp"; if (modbusTcp && IPAddress.TryParse(mif.ReadString(nodeName, "IpAddress", "127.0.0.1"), out IPAddress ipAddr) && int.TryParse(mif.ReadString(nodeName, "IpPort", "502"), out int ipPort) && int.TryParse(mif.ReadString(nodeName, "SendTimeout", "5000"), out int sendTimeout) && int.TryParse(mif.ReadString(nodeName, "ReceiveTimeout", "5000"), out int receiveTimeout)) { // запуск потока для обработки устройства по протоколу Modbus Tcp var worker = new BackgroundWorker { WorkerSupportsCancellation = true, WorkerReportsProgress = true }; workers.Add(worker); worker.DoWork += ModbusWorker_DoWork; worker.RunWorkerCompleted += ModbusWorker_RunWorkerCompleted; worker.ProgressChanged += ModbusWorker_ProgressChanged; var tcptuning = new TcpTuning { Address = ipAddr, Port = ipPort, SendTimeout = sendTimeout, ReceiveTimeout = receiveTimeout, FetchParams = fetchParams, FetchArchives = fetchArchives }; worker.RunWorkerAsync(tcptuning); } } } } }