コード例 #1
0
        private int Read_SQL_data_from_meter()
        {
            try
            {
                string    sqlselect = String.Format("select * from dumpmeters where addr={0} and id={1}", comboBox_addressMeter.Text, comboBox_serialNumber.Text);
                DataTable dt        = sqlhandler_.ReadSqlTable(sqlselect);
                if (dt.Rows.Count > 0)
                {
                    string objSerStr = dt.Rows[0]["dump"].ToString();

                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Mercury230_DatabaseSignals));
                    Mercury230_DatabaseSignals meterLocal =
                        (Mercury230_DatabaseSignals)serializer.ReadObject(new System.IO.MemoryStream(Encoding.ASCII.GetBytes(objSerStr)));
                    WriteParametersFromMeter(meterLocal);
                }
                else
                {
                    MessageBox.Show("Будут взяты данные по умолчанию\n\r", "Нет информации в БД", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return(0);
                }
                return(1);
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message, "Ошибка при чтении БД", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(-1);
            }
        }
コード例 #2
0
        void WriteParametersFromMeter(Mercury230_DatabaseSignals meter)
        {
            numericUpDown_cur_hist1.Value = Convert.ToDecimal(meter.Phases[0].current.Hist);
            numericUpDown_cur_hist2.Value = Convert.ToDecimal(meter.Phases[1].current.Hist);
            numericUpDown_cur_hist3.Value = Convert.ToDecimal(meter.Phases[2].current.Hist);

            numericUpDown_cur_up1.Value = Convert.ToDecimal(meter.Phases[0].current.MaxValue);
            numericUpDown_cur_up2.Value = Convert.ToDecimal(meter.Phases[1].current.MaxValue);
            numericUpDown_cur_up3.Value = Convert.ToDecimal(meter.Phases[2].current.MaxValue);

            numericUpDown_voltUp1.Value = Convert.ToDecimal(meter.Phases[0].voltage.MaxValue);
            numericUpDown_voltUp2.Value = Convert.ToDecimal(meter.Phases[1].voltage.MaxValue);
            numericUpDown_voltUp3.Value = Convert.ToDecimal(meter.Phases[2].voltage.MaxValue);

            numericUpDown_voltDown1.Value = Convert.ToDecimal(meter.Phases[0].voltage.MinValue);
            numericUpDown_voltDown2.Value = Convert.ToDecimal(meter.Phases[1].voltage.MinValue);
            numericUpDown_voltDown3.Value = Convert.ToDecimal(meter.Phases[2].voltage.MinValue);

            numericUpDown_voltHist1.Value = Convert.ToDecimal(meter.Phases[0].voltage.Hist);
            numericUpDown_voltHist2.Value = Convert.ToDecimal(meter.Phases[1].voltage.Hist);
            numericUpDown_voltHist3.Value = Convert.ToDecimal(meter.Phases[2].voltage.Hist);

            numericUpDown_power_hist1.Value = Convert.ToDecimal(meter.CommonActivePower.Hist / 1000);
            numericUpDown_power_up1.Value   = Convert.ToDecimal(meter.CommonActivePower.MaxValue / 1000);
        }
コード例 #3
0
        void WriteMeterFromParameters(Mercury230_DatabaseSignals meter)
        {
            meter.Phases[0].current.Hist = Convert.ToSingle(numericUpDown_cur_hist1.Value);
            meter.Phases[1].current.Hist = Convert.ToSingle(numericUpDown_cur_hist2.Value);
            meter.Phases[2].current.Hist = Convert.ToSingle(numericUpDown_cur_hist3.Value);

            meter.Phases[0].current.MaxValue = Convert.ToSingle(numericUpDown_cur_up1.Value);
            meter.Phases[1].current.MaxValue = Convert.ToSingle(numericUpDown_cur_up2.Value);
            meter.Phases[2].current.MaxValue = Convert.ToSingle(numericUpDown_cur_up3.Value);

            meter.Phases[0].voltage.MaxValue = Convert.ToSingle(numericUpDown_voltUp1.Value);
            meter.Phases[1].voltage.MaxValue = Convert.ToSingle(numericUpDown_voltUp2.Value);
            meter.Phases[2].voltage.MaxValue = Convert.ToSingle(numericUpDown_voltUp3.Value);

            meter.Phases[0].voltage.MinValue = Convert.ToSingle(numericUpDown_voltDown1.Value);
            meter.Phases[1].voltage.MinValue = Convert.ToSingle(numericUpDown_voltDown2.Value);
            meter.Phases[2].voltage.MinValue = Convert.ToSingle(numericUpDown_voltDown3.Value);

            meter.Phases[0].voltage.Hist = Convert.ToSingle(numericUpDown_voltHist1.Value);
            meter.Phases[1].voltage.Hist = Convert.ToSingle(numericUpDown_voltHist2.Value);
            meter.Phases[2].voltage.Hist = Convert.ToSingle(numericUpDown_voltHist3.Value);

            meter.CommonActivePower.Hist     = Convert.ToSingle(numericUpDown_power_hist1.Value) * 1000;
            meter.CommonActivePower.MaxValue = Convert.ToSingle(numericUpDown_power_up1.Value) * 1000;
        }
コード例 #4
0
        static void RefreshMetersLimits()
        {
            refreshTimer.Enabled = false;
            if (Sqlhandler_ == null)
            {
                return;
            }
            try
            {
                var sqlhandlerlocal_ = new SQLhandler(Sqlhandler_.database, Sqlhandler_.DataSource, Sqlhandler_.UserId, Sqlhandler_.Password);
                //sqlhandler2_.myConnec.

                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Mercury230_DatabaseSignals));

                foreach (Mercury230_DatabaseSignals meter in Meter230_arr)
                {
                    string    sqlselect = String.Format("select * from dumpmeters where addr={0} and id={1}", meter.address, meter.serial_number);
                    DataTable dt        = sqlhandlerlocal_.ReadSqlTable(sqlselect);
                    if (dt.Rows.Count > 0)
                    {
                        string objSerStr = dt.Rows[0]["dump"].ToString();
                        try
                        {
                            Mercury230_DatabaseSignals meterLocal =
                                (Mercury230_DatabaseSignals)serializer.ReadObject(new System.IO.MemoryStream(Encoding.ASCII.GetBytes(objSerStr)));
                            meter.Phases[0].current.CopyLimits(meterLocal.Phases[0].current);
                            meter.Phases[1].current.CopyLimits(meterLocal.Phases[1].current);
                            meter.Phases[2].current.CopyLimits(meterLocal.Phases[2].current);
                            meter.Phases[0].voltage.CopyLimits(meterLocal.Phases[0].voltage);
                            meter.Phases[1].voltage.CopyLimits(meterLocal.Phases[1].voltage);
                            meter.Phases[2].voltage.CopyLimits(meterLocal.Phases[2].voltage);
                            meter.Phases[0].power.CopyLimits(meterLocal.Phases[0].power);
                            meter.Phases[1].power.CopyLimits(meterLocal.Phases[1].power);
                            meter.Phases[2].power.CopyLimits(meterLocal.Phases[2].power);
                            meter.CommonActivePower.CopyLimits(meterLocal.CommonActivePower);
                            meter.CommonPower.CopyLimits(meterLocal.CommonPower);
                        }
                        catch (Exception exc)
                        {
                            Console.WriteLine("Ошибка чтения БД : {0}", exc.Message);
                        }
                    }
                }
                //else
                //{
                //    MessageBox.Show("Будут взяты данные по умолчанию\n\r", "Нет информации в БД", MessageBoxButtons.OK, MessageBoxIcon.Error);

                //}
            }
            catch (Exception exc)
            {
                logger.Error("Ошибка при чтении БД " + exc.Message);
                return;
            }
            logger.Debug("-----------Лимиты счетчиков обновлены--------------");
        }
コード例 #5
0
ファイル: SQLhandler.cs プロジェクト: r0mer/electric-meter
    public DataTable GiveSQLrecordingPeriod(Mercury230_DatabaseSignals device, string table, Mercury230.peroidQuery period, byte month, byte tariff)
    {
        ConnectionState firstSTate = ConnectionState.Open;
        DateTime        dt         = DateTime.Now;

        try
        {
            if (myConnec.State != ConnectionState.Open)
            {
                myConnec.Open();
                firstSTate = ConnectionState.Closed;
            }

            DateTime dt_beginday = new DateTime();
            DateTime dt_ending   = new DateTime();
            if (month == 0)
            {
                dt_beginday = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
                dt          = DateTime.Now.AddDays(1);
                dt_ending   = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);
            }
            else
            {
                dt_beginday = (month > dt.Month) ? new DateTime(dt.AddYears(-1).Year, month, 1, 0, 0, 0) : new DateTime(dt.Year, month, 1, 0, 0, 0);

                dt_ending = (month > dt.Month) ? new DateTime(dt.Year, 1, 1, 0, 0, 0) : new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);
            }

            string          CommandText = "SELECT * FROM " + table + "  WHERE `addr` =" + device.address.ToString() + " AND `oleDT` >= " + dt_beginday.ToOADate() + " AND `oleDT` <= " + dt_ending.ToOADate() + " AND `period` = " + (int)period + " AND `month` = " + month + " AND `tariff` = " + tariff;
            MySqlCommand    myCommand   = new MySqlCommand(CommandText, myConnec);
            DataTable       dtable      = new DataTable();
            MySqlDataReader dr          = myCommand.ExecuteReader();
            dtable.Load(dr);
            if (firstSTate == ConnectionState.Closed)
            {
                myConnec.Close();
            }
            return(dtable);
        }
        catch (Exception e)
        {
            Console.WriteLine("Ошибка БД {0}", e.Message);
            return(null);
        }
    }
コード例 #6
0
        private int Refresh_data_meters()
        {
            // Console.WriteLine("Пуск события опроса");

            //Action<MetersParameterDataGridBoxCell, MetersParameter> ParAssignment = (ParBoxCell, Par) =>
            //{
            //    ParBoxCell.Parametr.Hist = Par.Hist;
            //    ParBoxCell.Parametr.MinValue = Par.MinValue;
            //    ParBoxCell.Parametr.MaxValue = Par.MaxValue;

            //    //ParBoxCell.Parametr.RefreshData();
            //};
            TcpClient newClient = new TcpClient(TCP_Host_s, TCP_port_i);



            try
            {
                if (!newClient.Connected)
                {
                    Console.WriteLine("Соединение...");
                    // пошлём на установку соединения
                    if (newClient.Client != null)
                    {
                        newClient.Client.Close();
                    }
                    newClient = new TcpClient(TCP_Host_s, TCP_port_i);
                    Console.WriteLine("Успешно");
                }
                //Console.WriteLine(DateTime.Now.ToString() + "... Обновление данных");

                newClient.ReceiveTimeout = 1500;
                newClient.SendTimeout    = 800;
                // порождает исключение, если
                // при соединении возникают проблемы
                NetworkStream tcpStream = newClient.GetStream();
                //string str_badformat = "<Error>badformat</Error>";
                //string str_null = "<Error>null</Error>";
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Mercury230_DatabaseSignals));
                XmlDocument xmlquery = new XmlDocument();
                //int count_normalMeter = 0;

                byte[] sendBytes = Encoding.UTF8.GetBytes("<query><type>readmeter</type><model>Merc230</model><add_meter>" + comboBox_addressMeter.Text
                                                          + "</add_meter><id_meter>"
                                                          + comboBox_serialNumber.Text
                                                          + "</id_meter></query>");

                tcpStream.Write(sendBytes, 0, sendBytes.Length);

                byte[] bytes     = new byte[newClient.ReceiveBufferSize];
                int    bytesRead = tcpStream.Read(bytes, 0, newClient.ReceiveBufferSize);

                // Строка, содержащая ответ от сервера
                string answer = Encoding.ASCII.GetString(bytes, 0, bytesRead);

                try
                {
                    xmlquery.LoadXml(answer);
                }
                catch (XmlException exc)
                {
                    MessageBox.Show("Ошибочный ответ сервера\n\r" + exc.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    System.Threading.Thread.Sleep(50);
                    return(-1);
                    //continue;
                }
                XmlNodeList nodeList = xmlquery.SelectNodes("Error");
                if (nodeList.Count == 0)
                {
                    nodeList = xmlquery.SelectNodes("answer/meter");
                    if (nodeList.Count == 1)
                    {
                        string objSerStr = nodeList[0].InnerText;
                        Mercury230_DatabaseSignals meterLocal =
                            (Mercury230_DatabaseSignals)serializer.ReadObject(new System.IO.MemoryStream(Encoding.ASCII.GetBytes(objSerStr)));
                        //elem.DateTime_lastTime_connection = meterLocal.DateTime_lastTime_connection;
                        //elem.error_meter = meterLocal.error_meter;
                        //if (elem.error_meter == MeterDevice.error_type.none)
                        //    count_normalMeter++;

                        WriteParametersFromMeter(meterLocal);

                        //ParAssignment(elem.volt_phase1_dgvCell, meterLocal.Phases[0].voltage);
                        //ParAssignment(elem.volt_phase2_dgvCell, meterLocal.Phases[1].voltage);
                        //ParAssignment(elem.volt_phase3_dgvCell, meterLocal.Phases[2].voltage);
                        //ParAssignment(elem.cur_phase1_dgvCell, meterLocal.Phases[0].current);
                        //ParAssignment(elem.cur_phase2_dgvCell, meterLocal.Phases[1].current);
                        //ParAssignment(elem.cur_phase3_dgvCell, meterLocal.Phases[2].current);
                        //ParAssignment(elem.power_dgvCell, meterLocal.CommonPower);
                    }
                }
            }
            //RefreshTimer.Interval = 3000;
            //Console.WriteLine("Нормально опрошены: {0}", count_normalMeter);
            catch (SocketException ex)
            {
                MessageBox.Show("Ошибка\n\r" + ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(-10);
                //newClient.Close();
                //Console.WriteLine("Перезапуск соединения через {0} сек", this.intervalRestartConnection / 1000);
                //RefreshTimer.Interval = this.intervalRestartConnection;
            }
            return(1);
        }
コード例 #7
0
        private int WriteDumpToSQL()
        {
            try
            {
                byte addr = byte.Parse(comboBox_addressMeter.Text);
                int  id   = Int32.Parse(comboBox_serialNumber.Text);

                string objSerStr;
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Mercury230_DatabaseSignals));
                byte[][] bytemas = new byte[3][];
                Mercury230_DatabaseSignals meterlocal = new Mercury230_DatabaseSignals(new SerialPort(), addr, id, bytemas);

                WriteMeterFromParameters(meterlocal);

                using (var memorystream = new System.IO.MemoryStream())
                {
                    serializer.WriteObject(memorystream, meterlocal);
                    objSerStr = Encoding.ASCII.GetString(memorystream.ToArray());
                }
                objSerStr = MySqlHelper.EscapeString(objSerStr);

                StringBuilder strb = new StringBuilder();

                string    sqlselect = String.Format("select * from dumpmeters where addr={0} and id={1}", addr, id);
                DataTable dt        = sqlhandler_.ReadSqlTable(sqlselect);

                if (dt.Rows.Count == 0)
                {
                    // insert into

                    strb.AppendFormat("INSERT INTO dumpmeters (addr,id,dump) VALUES({0},{1},'{2}')", addr, id, objSerStr);

                    sqlhandler_.SendData(strb.ToString());

                    MessageBox.Show("Данные записаны в БД\n\r", "Успешно", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    // update

                    strb.AppendFormat("UPDATE dumpmeters SET dump='{0}' WHERE addr={1} and id={2}", objSerStr, addr, id);

                    sqlhandler_.SendData(strb.ToString());

                    MessageBox.Show("Данные изменены\n\r", "Успешно", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return(0);
                }

                // Пока посылку обновления не исспользуем
                // можно добавить потом
                //if (sendRefreshSignal() > 0)
                //{
                //    MessageBox.Show("Успешно", "Посылка обновления данных", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //}
                return(1);
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message, "Ошибка при работе с БД", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(-1);
            }
        }
コード例 #8
0
        /// <summary>
        /// Чтение конфигурационного файла
        /// </summary>
        static int readXMLdocument()
        {
            SerialPort  rs_port     = new SerialPort();
            XmlDocument xmlDocument = new XmlDocument();

            try
            {
                xmlDocument.Load("Meter_conf.xml");

                //meterTable = new DataTable("Meters");
                //meterTable.Columns.Add("Тип", typeof(string));
                //meterTable.Columns.Add("Адрес", typeof(string));
                //meterTable.Columns.Add("Статус", typeof(string));
                // rs_port = new System.IO.Ports.SerialPort();
                XmlNodeList devices = xmlDocument.SelectNodes("/Meters/DataBaseSQL");
                //Sqlhandler_ = new SQLhandler(devices[0].Attributes["Database"].Value, devices[0].Attributes["DataSource"].Value, devices[0].Attributes["UserId"].Value, devices[0].Attributes["Password"].Value);
                if (devices.Count > 0)
                {
                    Sqlhandler_ = new SQLhandler(devices[0].Attributes["Database"].Value, devices[0].Attributes["DataSource"].Value, devices[0].Attributes["UserId"].Value, devices[0].Attributes["Password"].Value);
                    progSettings.tblName_meter206 = devices[0].Attributes["tbl_206"].Value;
                    progSettings.tblName_meter230 = devices[0].Attributes["tbl_230"].Value;
                }

                devices = xmlDocument.SelectNodes("/Meters/autostart");

                if (devices.Count > 0)
                {
                    Console.WriteLine("Чтение параметров автозапуска");
                    string com = devices[0].Attributes["defaultCOMport"].Value;
                    progSettings.TCPport       = Convert.ToInt32(devices[0].Attributes["TCPport"].Value);
                    progSettings.timeoutSerial = Convert.ToInt32(devices[0].Attributes["timeout"].Value);
                    Int32 baudrate = Convert.ToInt32(devices[0].Attributes["baudRate"].Value);
                    System.IO.Ports.Parity   parity   = (Parity)Enum.Parse(typeof(Parity), devices[0].Attributes["parity"].Value, true);
                    System.IO.Ports.StopBits stopbits = (StopBits)Enum.Parse(typeof(StopBits), devices[0].Attributes["stopBits"].Value, true);
                    int dataBits = Convert.ToInt32(devices[0].Attributes["dataBits"].Value);
                    rs_port = new System.IO.Ports.SerialPort(com, baudrate, parity, dataBits, stopbits);
                    Console.WriteLine("Работа по последовательному порту " + com + "...");

                    // progSettings.start = devices[0].Attributes["serverStart"].Value == "yes";

                    //this.WindowState = WindowState.Normal;
                }

                int i = xmlDocument.SelectNodes("//meter[@type = 'Merc234']").Count;
                Meter230_arr = new Mercury230_DatabaseSignals[i];
                i            = xmlDocument.SelectNodes("//meter[@type = 'Merc206']").Count;
                Meter206_arr = new Mercury206_Database[i];
                i            = -1;

                foreach (XmlNode device in xmlDocument.SelectNodes("//meter[@type = 'Merc234']"))
                {
                    i++;
                    //meterTable.Rows.Add("Меркурий 234", device.Attributes["addr"].Value, "");
                    byte     addr         = Convert.ToByte(device.Attributes["addr"].Value);
                    string[] str_pasw_buf = device.Attributes["password_lvl1"].Value.Split(',');
                    byte[][] byte_pass    = new byte[2][];
                    byte_pass[0] = new byte[str_pasw_buf.Length];
                    for (int j = 0; j < str_pasw_buf.Length; j++)
                    {
                        byte_pass[0][j] = Convert.ToByte(str_pasw_buf[j]);
                    }
                    str_pasw_buf = device.Attributes["password_lvl2"].Value.Split(',');
                    byte_pass[1] = new byte[str_pasw_buf.Length];
                    for (int j = 0; j < str_pasw_buf.Length; j++)
                    {
                        byte_pass[1][j] = Convert.ToByte(str_pasw_buf[j]);
                    }
                    int serialnumber = Convert.ToInt32(device.Attributes["id"].Value);
                    Meter230_arr[i]             = new Mercury230_DatabaseSignals(rs_port, addr, serialnumber, byte_pass, progSettings.timeoutSerial);
                    Meter230_arr[i].ReloadData += ReloadDataGrid;
                    //    Meter230_arr[i].DataTime_nextPoint_recordSQL = DateTime.FromOADate(Sqlhandler_.NextTimetoSQLwrite(Meter230_arr[i], "meter230"));
                }
                i = -1;
                foreach (XmlNode device in xmlDocument.SelectNodes("//meter[@type = 'Merc206']"))
                {
                    i++;
                    uint addr         = Convert.ToUInt32(device.Attributes["addr"].Value);
                    int  serialnumber = Convert.ToInt32(device.Attributes["id"].Value);
                    Meter206_arr[i] = new Mercury206_Database(rs_port, addr, serialnumber, progSettings.timeoutSerial);
                    // Meter206_arr[i].ReloadData += ReloadDataGrid;

                    //  Meter206_arr[i].DataTime_nextPoint_recordSQL = DateTime.FromOADate(Sqlhandler_.NextTimetoSQLwrite(Meter206_arr[i], "meter206", 0));
                }



                // XmlDocument xmlDocument = new XmlDocument();
                // xmlDocument.Load("Meter_conf.xml");

                // dataGrid_meter.ItemsSource = "Meters";

                Console.WriteLine("Файл считан...");
                return(0);
            }
            catch (Exception e)
            {
                logger.Error("Ошибка загрузки настроек: {0}", e.Message);
                return(-1);
                //MessageBoxResult ti = MessageBox.Show(e.Message, "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                // ti = MessageBox.Show(e.Message, "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                // MessageBoxResult ti = MessageBox.Show("Проблема при старте сервера", "Ошибка сервера", MessageBoxButton.OK, MessageBoxImage.Error);


                //if (MessageBox.Show(e.Message, "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error) == MessageBoxResult.OK)
                //{
                //    return;
                //}
            }
        }
コード例 #9
0
        public void Refresh_data_meters()
        {
            // Console.WriteLine("Пуск события опроса");

            Action <MetersParameterDataGridBoxCell, MetersParameter> ParAssignment = (ParBoxCell, Par) =>
            {
                ParBoxCell.Parametr.Hist          = Par.Hist;
                ParBoxCell.Parametr.ScalingFactor = Par.ScalingFactor;
                ParBoxCell.Parametr.MinValue      = Par.MinValue;
                ParBoxCell.Parametr.MaxValue      = Par.MaxValue;
                ParBoxCell.Parametr.Value         = Par.Value;
                //ParBoxCell.Parametr.RefreshData();
            };

            RefreshTimer.Enabled = false;
            try
            {
                if (!newClient.Connected)
                {
                    Console.WriteLine("Соединение...");
                    // пошлём на установку соединения
                    if (newClient.Client != null)
                    {
                        newClient.Client.Close();
                    }
                    newClient = new TcpClient(Host, Port);
                    Console.WriteLine("Успешно");
                }
                Console.WriteLine(DateTime.Now.ToString() + "... Обновление данных");
                //newClient.ReceiveTimeout
                // порождает исключение, если
                // при соединении возникают проблемы
                NetworkStream tcpStream = newClient.GetStream();
                tcpStream.ReadTimeout = 200;
                //string str_badformat = "<Error>badformat</Error>";
                //string str_null = "<Error>null</Error>";
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Mercury230_DatabaseSignals));
                XmlDocument xmlquery          = new XmlDocument();
                int         count_normalMeter = 0;
                foreach (ElectricMeterWinForm_forTable elem in meters)
                {
                    byte[] sendBytes = Encoding.UTF8.GetBytes("<query><type>readmeter</type><model>Merc230</model><add_meter>" + elem.meter_address
                                                              + "</add_meter><id_meter>"
                                                              + elem.meter_id
                                                              + "</id_meter></query>");
                    if (tcpStream.DataAvailable)
                    {
                        var buffer = new byte[4096];
                        tcpStream.Read(buffer, 0, buffer.Length);
                    }
                    tcpStream.Write(sendBytes, 0, sendBytes.Length);

                    byte[] bytes     = new byte[newClient.ReceiveBufferSize];
                    int    bytesRead = tcpStream.Read(bytes, 0, newClient.ReceiveBufferSize);

                    // Строка, содержащая ответ от сервера
                    string answer = Encoding.ASCII.GetString(bytes, 0, bytesRead);

                    try
                    {
                        xmlquery.LoadXml(answer);
                    }
                    catch (XmlException)
                    {
                        Console.WriteLine("Ошибочный ответ сервера");
                        System.Threading.Thread.Sleep(50);
                        continue;
                    }
                    XmlNodeList nodeList = xmlquery.SelectNodes("Error");
                    if (nodeList.Count == 0)
                    {
                        nodeList = xmlquery.SelectNodes("answer/meter");
                        if (nodeList.Count == 1)
                        {
                            string objSerStr = nodeList[0].InnerText;
                            Mercury230_DatabaseSignals meterLocal =
                                (Mercury230_DatabaseSignals)serializer.ReadObject(new System.IO.MemoryStream(Encoding.ASCII.GetBytes(objSerStr)));
                            elem.DateTime_lastTime_connection = meterLocal.DateTime_lastTime_connection;
                            elem.error_meter = meterLocal.error_meter;
                            if (elem.error_meter == MeterDevice.error_type.none)
                            {
                                count_normalMeter++;
                            }
                            if (meterLocal.serial_number.ToString() == elem.meter_id.ToString())
                            {
                                ParAssignment(elem.volt_phase1_dgvCell, meterLocal.Phases[0].voltage);
                                ParAssignment(elem.volt_phase2_dgvCell, meterLocal.Phases[1].voltage);
                                ParAssignment(elem.volt_phase3_dgvCell, meterLocal.Phases[2].voltage);
                                ParAssignment(elem.cur_phase1_dgvCell, meterLocal.Phases[0].current);
                                ParAssignment(elem.cur_phase2_dgvCell, meterLocal.Phases[1].current);
                                ParAssignment(elem.cur_phase3_dgvCell, meterLocal.Phases[2].current);
                                ParAssignment(elem.power_dgvCell, meterLocal.CommonActivePower);
                            }
                        }
                    }
                    //if (give_arg("add", answer) == elem.meter_address.ToString())
                    //{
                    //    string par;
                    //    // ток
                    //    par = give_arg("cur", answer);
                    //    elem.cur_phase1 = String_To_Float(give_elems("1", par));
                    //    elem.cur_phase2 = String_To_Float(give_elems("2", par));
                    //    elem.cur_phase3 = String_To_Float(give_elems("3", par));
                    //    par = give_arg("volt", answer);
                    //    elem.voltage_phase1 = String_To_Float(give_elems("1", par));
                    //    elem.voltage_phase2 = String_To_Float(give_elems("2", par));
                    //    elem.voltage_phase3 = String_To_Float(give_elems("3", par));
                    //CommonPower = (cur1 * volt1 + cur2 * volt2 + cur3 * volt3) / 1000;

                    // Время последнего ответа от счетчика...
                    //par = give_arg("lastCon", answer).Replace('$', ':');
                    //LastCon = DateTime.ParseExact(par, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture);
                    //TimeSpan ts = DateTime.Now - LastCon;
                    //lostDev = (ts > new TimeSpan(0, 0, timeout));

                    //PowerAlarm = CommonPower >= PowerLimit;
                    //CommonAlarm = lostDev || Cur1_Alarm || Cur2_Alarm || Cur3_Alarm || Volt1_Alarm || Volt2_Alarm || Volt3_Alarm || PowerAlarm;
                }
                RefreshTimer.Interval = 3000;
                Console.WriteLine("Нормально опрошены: {0}", count_normalMeter);
            }
            catch (SocketException ex)
            {
                Console.WriteLine("Ошибка");
                Console.WriteLine(ex.Message);
                //newClient.Close();
                Console.WriteLine("Перезапуск соединения через {0} сек", this.intervalRestartConnection / 1000);
                RefreshTimer.Interval = this.intervalRestartConnection;
            }
            finally
            {
                RefreshTimer.Enabled = true;
            }
        }
コード例 #10
0
ファイル: SQLhandler.cs プロジェクト: r0mer/electric-meter
    public void writeAccumulEnergy(Mercury230.accumulEnergy energystruct, int tarif, Mercury230.peroidQuery period, Mercury230_DatabaseSignals device, byte month)
    {
        DateTime datetime = new DateTime();

        if (month == 0)
        {
            datetime = DateTime.Now;
        }
        else
        {
            datetime = (month > DateTime.Now.Month) ? new DateTime(DateTime.Now.AddYears(-1).Year, month, 1, 0, 0, 0) : new DateTime(DateTime.Now.Year, month, 1, 0, 0, 0);
        }
        string CommandText = "INSERT INTO meter230 ( `addr`, `energy_active_in`, `energy_reactive_in`, `energy_reactive_out`, `oleDT` , `tariff`, `period` , `id`, `month`) VALUES (" + device.address.ToString() + ", " + energystruct.active_energy_in + ", " + energystruct.reactive_energy_in + ", " + energystruct.reactive_energy_out + ", " + datetime.ToOADate() + ", " + tarif.ToString() + ", '" + Convert.ToString((int)period) + "', " + device.serial_number.ToString() + " , " + month + " )";

        SendData(CommandText);
    }