public void SaveDocsElectricity(ElectricityXmlDoc post) { ElectricityMongoNode mongoNode = new ElectricityMongoNode(); ModbusIpMaster master = null; TcpClient tcpClient = null; string ipAddress = post.IP; int tcpPort = 502; PAC3200_Power A1 = new PAC3200_Power(); // попытка подключения for (int i = 0; i <= 2; i++) { // программа время от времени не читает несколько значений электричества, если создавать // новый tcpClient при подключении, ошибки становятся минимальными. Я так не понял в чем дело tcpClient = new TcpClient(); try { tcpClient.Connect(ipAddress, tcpPort); if (tcpClient.Connected) { //успех master = ModbusIpMaster.CreateIp(tcpClient); master.Transport.Retries = 0; //don't have to do retries master.Transport.ReadTimeout = 1500; A1.Registers = master.ReadHoldingRegisters(1, 2801, 20); A1.ConvertValues(); // конвертация значений break; } } catch { //неудача string error = "Electricity: ID = " + post.id + " " + post.IP + " date - " + DateTime.Now.ToString() + " Ошибка подключения TCP"; Console.WriteLine(error); if (post.id != 999) { // 999 это тестовый IP Log.logNodeElictricityTestID(error); Log.logNodeElictricity(error); } else { Log.logNodeElictricity(error); return; } } if (i == 2) { return; // если 3 итерации не помогло } tcpClient.Close(); tcpClient.Dispose(); } tcpClient.Close(); tcpClient.Dispose(); /* Хитрая система во избежания перегрузки БД. Создаем новую коллекцию в базе данных каждый месяц * первого числа. Иначе запрос к БД будет выполняться бесконечность. */ int month = DateTime.Now.Month; int year = DateTime.Now.Year; string date = new DateTime(year, month, 1).ToShortDateString(); DateTime time = DateTime.Now; // передаем значения классу записи mongoNode.ID = post.id; mongoNode.wP_in = A1.Values[0]; mongoNode.WP_out = A1.Values[1]; mongoNode.WQ_in = A1.Values[2]; mongoNode.WQ_oup = A1.Values[3]; mongoNode.WQ = A1.Values[4]; mongoNode.dateTime = time; IMongoCollection <ElectricityMongoNode> collection = null; try { // попытка подключения к ДБ MongoClient client = new MongoClient("mongodb://localhost"); IMongoDatabase DB = client.GetDatabase("Electricity"); collection = DB.GetCollection <ElectricityMongoNode>(date); } catch (Exception e) { string error = "Electricity: ID = " + post.id + " " + post.IP + "Не удалось подключиться к базе данных " + e.Message; Console.WriteLine(error); Log.logNodeElictricity(error); return; } try { // запись в БД collection.InsertOne(mongoNode); } catch (Exception e) { string error = "Electricity: ID = " + post.id + " " + post.IP + "Ошибка записи в MongoDB:" + time + " " + e.Message; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(error); Console.ForegroundColor = ConsoleColor.White; Log.logNodeElictricity(error); return; } Console.WriteLine("Electricity: ID = " + post.id + " " + post.IP + " " + mongoNode.wP_in + " " + mongoNode.WP_out + " " + mongoNode.WQ_in + " " + mongoNode.WQ_oup + " " + mongoNode.WQ + "Запить произведена: " + time); return; }
public void SaveDocsWater(Water_XmlDoc parametrs) { DateTime time = DateTime.Now; Water_MongoNode water_MongoNode = new Water_MongoNode(); //проверка на тип подключения, если AddressOfRemoteSlave = 0, подключение tcp, если нет, то через дб if (parametrs.AddressOfRemoteSlave != 0) { ModbusIpMaster master = null; TcpClient tcpClient = null; PAC3200_Power A1 = new PAC3200_Power(); // попытка подключения for (int i = 1; i <= 3; i++) { // программа время от времени не читает несколько значений электричества, если создавать // новый tcpClient при подключении, ошибки становятся минимальными. Я так не понял в чем дело tcpClient = new TcpClient(); try { tcpClient.Connect(parametrs.IP, parametrs.port); if (tcpClient.Connected) { //успех master = ModbusIpMaster.CreateIp(tcpClient); master.Transport.Retries = 0; //don't have to do retries master.Transport.ReadTimeout = 1500; A1.Registers = master.ReadHoldingRegisters((byte)parametrs.AddressOfRemoteSlave, (ushort)parametrs.address, (ushort)parametrs.length); A1.intConvertValue(); // конвертация значений //передача данных в экземпляр класса water_MongoNode.ID = parametrs.id; water_MongoNode.name = parametrs.name; water_MongoNode.value = A1.intValue; water_MongoNode.dateTime = time; break; } } catch { tcpClient.Close(); tcpClient.Dispose(); //неудача string error = "WaterTCP: ID = " + parametrs.id + " " + parametrs.IP + " date - " + DateTime.Now.ToString() + " Ошибка подключения TCP"; Console.WriteLine(error); if (parametrs.id != 999) { // 999 это тестовый IP Log.logNodeElictricityTestID(error); Log.logNodeElictricity(error); } } if (i == 2) { return; // если 3 итерации не помогло } } tcpClient.Close(); tcpClient.Dispose(); } else { S7Client s7Client = new S7Client(); float value = 0; byte[] Buffer = new byte[parametrs.length]; for (int i = 0; i <= 2; i++) { s7Client.ConnectTo(parametrs.IP, parametrs.rack, parametrs.slot); if (s7Client.Connected) { s7Client.DBRead(parametrs.DB, parametrs.address, parametrs.length, Buffer); value = S7.GetRealAt(Buffer, 0); //передача данных в экземпляр класса water_MongoNode.ID = parametrs.id; water_MongoNode.name = parametrs.name; water_MongoNode.value = value; water_MongoNode.dateTime = time; break; } else { string error = "Water: ID = " + parametrs.id + " " + parametrs.name + " " + time + " " + "не удалось подключиться к адресу " + parametrs.IP; Console.WriteLine(error); Log.logWaterNode(error); return; } } //Console.WriteLine(parametrs.id + " " + parametrs.name + " " + value.ToString() + " " + time); s7Client.Disconnect(); } int month = DateTime.Now.Month; int year = DateTime.Now.Year; string date = new DateTime(year, month, 1).ToShortDateString(); IMongoCollection <Water_MongoNode> collection = null; try { MongoClient client = new MongoClient("mongodb://localhost"); IMongoDatabase DB = client.GetDatabase("Water"); collection = DB.GetCollection <Water_MongoNode>(date); } catch (Exception e) { string error = "Water: ID = " + parametrs.id + " " + parametrs.name + time + " Не удалось подключиться к базе данных " + e.Message; Console.WriteLine(error); Log.logWaterNode(error); return; } try { collection.InsertOne(water_MongoNode); //collection.InsertOne(post); } catch (Exception e) { string error = "Water: ID = " + parametrs.id + " " + parametrs.name + "Ошибка записи в MongoDB:" + time + " " + e.Message; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(error); Console.ForegroundColor = ConsoleColor.White; Log.logWaterNode(error); return; } Console.WriteLine("Water: ID = " + parametrs.id + " " + water_MongoNode.name + " " + water_MongoNode.value + " " + "Запить произведена: " + time); return; }