Пример #1
0
        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;
        }
Пример #2
0
        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;
        }