Esempio n. 1
0
        public EditRocPointForm()
        {
            InitializeComponent();

            Load += (sender, args) =>
            {
                if (!IsEdit)
                {
                    Point = new Roc809MeasurePoint();
                    Text  = TITLE_CREATE;
                    Icon  = Resources.Add;
                }
                else
                {
                    Text                 = TITLE_EDIT;
                    txtName.Text         = Point.Name;
                    txtDescription.Text  = Point.Description;
                    numNumber.Value      = Point.Number;
                    numHistSegment.Value = Point.HistSegment;
                    Icon                 = Resources.Sensor1;
                }
            };

            btnSave.Select();
        }
 /// <summary>
 /// Возвращает полную информацию о измерительной точке вычислителя ROC809
 /// </summary>
 public static string Info(this Roc809MeasurePoint point)
 {
     return($"Id:\t\t\t{point.Id}\n" +
            $"Назва:\t\t\t{point.Name}\n" +
            $"Опис:\t\t\t{point.Description}\n" +
            $"Номер:\t\t\t{point.Number}\n" +
            $"Історичний сегмент:\t{point.HistSegment}\n" +
            $"Створено:\t\t{point.DateCreated.ToString("dd.MM.yyyy HH:mm")}\n" +
            $"Змінено:\t\t{point.DateModified.ToString("dd.MM.yyyy HH:mm")}");
 }
Esempio n. 3
0
        private async void ScanDailyData(Roc809 roc, Roc809MeasurePoint point, IClient client)
        {
            var s = roc.IsScannedViaGPRS ? $"телефоном {roc.Phone}" : $"адресою {roc.Address}";

            Logger.Log(_log, new LogEntry {
                Message = $"Опитування добових даних обчислювача ROC809 з {s} ...", Status = LogStatus.Info, Type = LogType.Roc
            });

            await _service.GetDailyData(client, roc, point, async data =>
            {
                if (data == null || !data.Any())
                {
                    Logger.Log(_log, new LogEntry {
                        Message = $"Добові дані точки №{point.Number} обчислювача ROC809 з {s} відсутні", Status = LogStatus.Warning, Type = LogType.Roc
                    });
                    return;
                }

                data.ForEach(d =>
                {
                    d.Roc809MeasurePointId = point.Id;
                });

                await _dataService.SaveDailyData(point.Id, data, saved =>
                {
                    Logger.Log(_log,
                               saved > 0
                            ? new LogEntry {
                        Message = $"Добові дані точки №{point.Number} обчислювача ROC809 з {s} успішно оновлено. Додано записів: {saved}", Status = LogStatus.Success, Type = LogType.Roc
                    }
                            : new LogEntry {
                        Message = $"Нові добові дані точки №{point.Number} обчислювача ROC809 з {s} відсутні", Status = LogStatus.Warning, Type = LogType.Roc
                    });
                }, ex =>
                {
                    Logger.Log(_log, new LogEntry {
                        Message = $"Помилка збереження добових даних точки №{point.Number} обчислювача ROC809 з {s}", Status = LogStatus.Error, Type = LogType.Roc
                    });
                    Logger.Log(_log, new LogEntry {
                        Message = ex.Message, Status = LogStatus.Error, Type = LogType.Roc
                    });
                });
            }, ex =>
            {
                Logger.Log(_log, new LogEntry {
                    Message = $"Помилка читання добових даних точки №{point.Number} обчислювача ROC809 з {s}", Status = LogStatus.Error, Type = LogType.Roc
                });
                Logger.Log(_log, new LogEntry {
                    Message = ex.Message, Status = LogStatus.Error, Type = LogType.Roc
                });
            });
        }
Esempio n. 4
0
 private void ProcessPoint(RocScanMember member, Roc809 roc, Roc809MeasurePoint point, IClient client)
 {
     if (member.ScanMinuteData)
     {
         ScanMinuteData(roc, point, client);
     }
     if (member.ScanPeriodicData)
     {
         ScanPeriodicData(roc, point, client);
     }
     if (member.ScanDailyData)
     {
         ScanDailyData(roc, point, client);
     }
 }
Esempio n. 5
0
 public async Task GetDailyData(IClient client, Roc809 roc, Roc809MeasurePoint point, Action <List <Roc809DailyData> > onSuccess, Action <Exception> onException)
 {
     await _rocPlusProtocol.GetPeriodicData(roc, point, RocHistoryType.Daily, client)
     .ContinueWith(result =>
     {
         if (result.Exception != null)
         {
             onException?.Invoke(result.Exception.InnerException);
         }
         else
         {
             onSuccess?.Invoke(result.Result.Select(d => new Roc809DailyData {
                 Period = d.DatePeriod, Value = d.Value
             }).ToList());
         }
     }, TaskScheduler.FromCurrentSynchronizationContext());
 }
        /// <summary>
        /// Возвращает текст для элемента дерева для точки измерения
        /// </summary>
        public static string NodeTitle(this MeasurePointBase point)
        {
            FloutecMeasureLine floutecLine = point as FloutecMeasureLine;

            if (floutecLine != null)
            {
                string sensor;

                switch (floutecLine.SensorType)
                {
                case 0:
                    sensor = "Діафрагма";
                    break;

                case 1:
                    sensor = "Лічильник";
                    break;

                case 2:
                    sensor = "Витратомір";
                    break;

                default:
                    sensor = "Діафрагма";
                    break;
                }

                return($"{floutecLine.Number} {floutecLine.Name} ({sensor})");
            }

            Roc809MeasurePoint rocPoint = point as Roc809MeasurePoint;

            if (rocPoint != null)
            {
                return($"{rocPoint.Number} {rocPoint.Name} (Сегмент = {rocPoint.HistSegment})");
            }

            return(string.Empty);
        }
        public async Task <List <ROC809PeriodicDataModel> > GetPeriodicData(Roc809 roc, Roc809MeasurePoint point, RocHistoryType historyType, IClient client)
        {
            var request = new byte[15];

            request[0]  = (byte)roc.RocUnit;
            request[1]  = (byte)roc.RocGroup;
            request[2]  = (byte)roc.HostUnit;
            request[3]  = (byte)roc.HostGroup;
            request[4]  = 0x88;
            request[5]  = 0x07;
            request[6]  = (byte)point.HistSegment;
            request[7]  = 0x00;
            request[8]  = 0x00;
            request[9]  = (byte)historyType;
            request[10] = (byte)(point.Number - 1);
            request[11] = 0x01;
            request[12] = 0x1e;

            var crc = Crc16.Compute(request, 13);

            request[13] = crc[0];
            request[14] = crc[1];

            int startIndex = request.GetInt16(7);
            int totalIndex;

            var data = new List <ROC809PeriodicDataModel>();

            var gprsClient = client as GprsClient;

            if (gprsClient != null)
            {
                await gprsClient.Connect(roc.Phone);
            }

            do
            {
                byte[] response;
                var    retries = client.Retries;
                var    valid   = false;
                do
                {
                    response = await client.GetData(roc, request);

                    var responseCrc = Crc16.Compute(response, 6 + response[5]);

                    if (response[6 + response[5]] == responseCrc[0] &&
                        response[6 + response[5] + 1] == responseCrc[1])
                    {
                        valid = true;
                        break;
                    }

                    retries--;
                } while (retries > 0);

                if (!valid)
                {
                    if (gprsClient != null)
                    {
                        await gprsClient.Disconnect(roc.Phone);
                    }

                    throw new Exception("Помилка читання даних через GPRS. Дані не є консистентними");
                }

                totalIndex = historyType == RocHistoryType.Minute ? 60 : response.GetInt16(9);

                int recordsToProcess;

                if (historyType == RocHistoryType.Minute)
                {
                    recordsToProcess = response[11] / 2 >= 30 ? 30 : response[11] / 2;
                }
                else
                {
                    recordsToProcess = totalIndex - startIndex >= 30 ? 30 : totalIndex - startIndex;
                }

                for (var j = 0; j < recordsToProcess; j++)
                {
                    var offset = j * 8;

                    var    period = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                    double value  = 0;

                    for (var k = 0; k < 2; k++)
                    {
                        var dataOffset = k * 4 + offset;

                        if (k == 0)
                        {
                            period = period.AddSeconds(response.GetUInt32(12 + dataOffset));
                        }
                        else
                        {
                            value = response.GetSingle(12 + dataOffset);
                        }
                    }

                    data.Add(new ROC809PeriodicDataModel {
                        DatePeriod = period, Value = value
                    });
                }

                startIndex = BitConverter.ToInt32(BitConverter.GetBytes(startIndex + 30), 0);

                request[7] = BitConverter.GetBytes(startIndex)[0];
                request[8] = BitConverter.GetBytes(startIndex)[1];

                crc = Crc16.Compute(request, 13);

                request[13] = crc[0];
                request[14] = crc[1];
            } while (startIndex < totalIndex);

            if (gprsClient != null)
            {
                await gprsClient.Disconnect(roc.Phone);
            }
            return(data.Distinct().ToList());
        }