Exemplo n.º 1
0
        private void timerPlcDataPolling_Tick(object sender, EventArgs e)
        {
            if (!ReadArea(client, dbNumber, dbSize, Buffer))
            {
                listBox1.Items.Add(string.Format("{0:dd.MM.yyyy HH:mm:ss}", DateTime.Now) + " Ошибка чтения DB. PLC:" + plc.Id + "; DB:" + dbNumber + "; dbSize:" + dbSize);
            }
            else
            {
                foreach (Sensor s in sensorList)
                {
                    int S7Type = 0;
                    int Pos    = 0;
                    if (!GetAddress(s.Address, ref S7Type, ref Pos))
                    {
                        //Переход к следующему элементу в списке сенсоров sensorList
                        listBox1.Items.Add(string.Format("{0:dd.MM.yyyy HH:mm:ss}", DateTime.Now) + " Ошибка парсинга адреса. PLC:" + plc.Id + "; address:" + s.Address);
                        continue;
                    }
                    else
                    {
                        string txtValue = string.Empty;
                        if (!GetValue(S7Type, Pos, Buffer, ref txtValue))
                        {
                            //Переход к следующему элементу в списке сенсоров sensorList
                            listBox1.Items.Add(string.Format("{0:dd.MM.yyyy HH:mm:ss}", DateTime.Now) + " Ошибка чтения зн-я по адресу. PLC:" + plc.Id + "; address:" + s.Address);
                            continue;
                        }
                        else //! Успешное чтение зн-я переменной
                        {
                            double value = 0;

                            if (txtValue == "False")
                            {
                                value = 0.0;
                            }
                            else if (txtValue == "True")
                            {
                                value = 1.0;
                            }
                            else
                            {
                                if (s.IsLine == 1)
                                {
                                    int val = double.Parse(txtValue) <= 0 ? 0 : Int32.Parse((Math.Log(double.Parse(txtValue), 2) + 1).ToString());

                                    if (val == 17 || val == 26 || val == 28 || val == 31 || val == 32)
                                    {
                                        value = 0;
                                    }
                                    else if (val == 9 || val == 24)
                                    {
                                        value = 1;
                                    }
                                    else if (val == 23)
                                    {
                                        value = 2;
                                    }
                                    else if (val == 18 || val == 19 || val == 20)
                                    {
                                        value = 3;
                                    }
                                    else if (val == 21 || val == 22 || val == 29)
                                    {
                                        value = 4;
                                    }
                                    else if (val == 27 || val == 30)
                                    {
                                        value = 5;
                                    }
                                    else if (val == 25)
                                    {
                                        value = 6;
                                    }

                                    currLineState = Int32.Parse(value.ToString());
                                }
                                else
                                {
                                    if (s.SensorId == 6 || s.SensorId == 7 || s.SensorId == 8)
                                    {
                                        value = double.Parse(txtValue) / 1000.0;
                                    }
                                    else
                                    {
                                        value = double.Parse(txtValue);
                                    }
                                }
                            }

                            //Последняя запись для данного sensor.id в текущем json (2-х минутном). Вычисляется ниже
                            SensorValueModel lastCounterValue2m = new SensorValueModel()
                            {
                                CounterId = -1
                            };

                            double diffValue = 0;

                            if (s.IsLine == 1)
                            {
                                if (lineStateInsertList.Count > 0)
                                {
                                    diffValue = Math.Abs(value - lineStateInsertList.Last().idState);

                                    if (diffValue >= s.Deadband)
                                    {
                                        lineStateInsertList.Add(
                                            new LineStateInsertModel()
                                        {
                                            connectionStringName = cnnString,
                                            dtFrom   = _dateTimeService.UnixTimeNow(),
                                            idLine   = s.IdLine,
                                            idState  = Int32.Parse(value.ToString()),
                                            typeInfo = s.typeLine.Trim()
                                        });
                                    }
                                }
                                else
                                {
                                    lineStateInsertList.Add(
                                        new LineStateInsertModel()
                                    {
                                        connectionStringName = cnnString,
                                        dtFrom   = _dateTimeService.UnixTimeNow(),
                                        idLine   = s.IdLine,
                                        idState  = Int32.Parse(value.ToString()),
                                        typeInfo = s.typeLine.Trim()
                                    });
                                }
                            }
                            else if (s.IsLine == 0)
                            {
                                #region Заполение коллекций (sensorId1Val1m, sensorId2Val1m) для вычисления производительности в минуту
                                if (s.SensorId == 1)
                                {
                                    for (int i = sensorId1Val1m.Count - 1; i >= 0; i--)
                                    {
                                        if ((DateTime.UtcNow - _dateTimeService.UnixTimeToDateTime(sensorId1Val1m[i].Time)).TotalSeconds >= 60)
                                        {
                                            sensorId1Val1m.Remove(sensorId1Val1m[i]);
                                        }
                                    }

                                    sensorId1Val1m.Add(
                                        new Model.SensorValueModel()
                                    {
                                        CounterId = s.SensorId,
                                        Value     = value,
                                        Time      = _dateTimeService.UnixTimeNow()
                                    }
                                        );
                                }

                                if (s.SensorId == 2)
                                {
                                    for (int i = sensorId2Val1m.Count - 1; i >= 0; i--)
                                    {
                                        if ((DateTime.UtcNow - _dateTimeService.UnixTimeToDateTime(sensorId2Val1m[i].Time)).TotalSeconds >= 60)
                                        {
                                            sensorId2Val1m.Remove(sensorId2Val1m[i]);
                                        }
                                    }

                                    sensorId2Val1m.Add(
                                        new Model.SensorValueModel()
                                    {
                                        CounterId = s.SensorId,
                                        Value     = value,
                                        Time      = _dateTimeService.UnixTimeNow()
                                    }
                                        );
                                }
                                #endregion

                                if (sensorValue2mList.Where(x => x.CounterId == s.SensorId).Count() > 0)
                                {//Если запись присутствует в коллекции, которая набивается в течение 2мин., то сравнить текущее зн-е с последним значением этого id из коллекции
                                 //если оно больше или равно deadband этого сенсора, то внести его в коллекции 2мин и 20сек /json/ для отправки на сервер

                                    //Удаление из коллекции counterValue2mList элементов старше 2-х минут
                                    //((sender as Timer).Tag as Model.PlcData).counterValue2mList.RemoveAll(x => (DateTime.UtcNow - _dateTimeService.UnixTimeToDateTime(x.Time)).Seconds >= 120); //удобнее, но в 10 раз дольше
                                    //Циклом удаление элемента из коллекции в 10 раз быстрее //http://www.dotnetblog.ru/2014/03/blog-post_23.html
                                    for (int i = sensorValue2mList.Count - 1; i >= 0; i--)
                                    {
                                        if ((DateTime.UtcNow - _dateTimeService.UnixTimeToDateTime(sensorValue2mList[i].Time)).TotalSeconds >= 120)
                                        {
                                            sensorValue2mList.Remove(sensorValue2mList[i]);
                                        }
                                    }

                                    if (sensorValue2mList.Where(x => x.CounterId == s.SensorId).Count() > 0)
                                    {
                                        //Выбрать последнюю запись для данного сенсора из коллекции 2мин
                                        lastCounterValue2m = sensorValue2mList.Where(x => x.CounterId == s.SensorId).Last();

                                        diffValue = Math.Abs(value - lastCounterValue2m.Value);

                                        if (diffValue >= s.Deadband)
                                        {
                                            //Вставка в коллекцию 20сек для отправки на сервер
                                            sensorValueInsert.counterValue.Add(
                                                new Model.SensorValueModel()
                                            {
                                                CounterId = s.SensorId,
                                                Value     = value,
                                                Time      = _dateTimeService.UnixTimeNow()
                                            }
                                                );

                                            //Вставка в коллекцию 2мин
                                            sensorValue2mList.Add(
                                                new Model.SensorValueModel()
                                            {
                                                CounterId = s.SensorId,
                                                Value     = value,
                                                Time      = _dateTimeService.UnixTimeNow()
                                            }
                                                );

                                            if (s.SensorId == 7)
                                            {
                                                currActualPower = value;
                                            }
                                        }
                                    }
                                    else //Если записи для этого сенсора, после удаления старых зн-й >2мин, нет в коллекции 2мин.
                                    {    //то вставить в коллекции 2мин и 20сек /json/ для отправки на сервер
                                        //Вставка в коллекцию 20сек для отправки на сервер
                                        sensorValueInsert.counterValue.Add(
                                            new Model.SensorValueModel()
                                        {
                                            CounterId = s.SensorId,
                                            Value     = value,
                                            Time      = _dateTimeService.UnixTimeNow()
                                        }
                                            );

                                        //Вставка в коллекцию 2мин
                                        sensorValue2mList.Add(
                                            new Model.SensorValueModel()
                                        {
                                            CounterId = s.SensorId,
                                            Value     = value,
                                            Time      = _dateTimeService.UnixTimeNow()
                                        }
                                            );

                                        if (s.SensorId == 7)
                                        {
                                            currActualPower = value;
                                        }
                                    }
                                }
                                else //Если записи для этого сенсора нет в коллекции 2мин.
                                {    //то вставить в коллекции 2мин и 20сек /json/ для отправки на сервер
                                    //Вставка в коллекцию 20сек для отправки на сервер
                                    sensorValueInsert.counterValue.Add(
                                        new Model.SensorValueModel()
                                    {
                                        CounterId = s.SensorId,
                                        Value     = value,
                                        Time      = _dateTimeService.UnixTimeNow()
                                    }
                                        );

                                    //Вставка в коллекцию 2мин
                                    sensorValue2mList.Add(
                                        new Model.SensorValueModel()
                                    {
                                        CounterId = s.SensorId,
                                        Value     = value,
                                        Time      = _dateTimeService.UnixTimeNow()
                                    }
                                        );

                                    if (s.SensorId == 7)
                                    {
                                        currActualPower = value;
                                    }
                                }
                            }
                            lastCounterValue2m = null;
                        }
                    }
                }
            }

            listBox1.SelectedIndex = listBox1.Items.Count - 1;

            //TODO: очистить Buffer
            Array.Clear(Buffer, 0, Buffer.Length);
        }