Exemplo n.º 1
0
        public async Task <byte[]> GetData(Roc809 roc, byte[] request)
        {
            var portName = _statuses.FirstOrDefault(s => s.Value.Status == PortStatus.CONNECTED && s.Value.Phone.Equals(roc.Phone)).Key;

            if (string.IsNullOrEmpty(portName))
            {
                return(new byte[1024]);
            }

            var port = _statuses[portName].Port;

            var retries = Retries;
            var stream  = port.BaseStream;

            do
            {
                var response = new byte[1024];

                port.DiscardInBuffer();
                port.DiscardOutBuffer();

                await Task.Delay(WriteDelay * 1000);

                SetStatus(new ModemLogEntry {
                    Message = BytesToString(request), Status = Common.ModemStatus.SEND, Port = port.PortName
                });

                var task = Task.Factory.StartNew(async() =>
                {
                    await stream.WriteAsync(request, 0, request.Length);

                    await Task.Delay(ReadDelay * 1000);

                    var result = await stream.ReadAsync(response, 0, response.Length);

                    SetStatus(new ModemLogEntry
                    {
                        Message = $"Отримано {result} байтів",
                        Status  = Common.ModemStatus.RECEIVE,
                        Port    = port.PortName
                    });
                }).Unwrap();

                if (await Task.WhenAny(task, Task.Delay(Timeout * 1000)) == task)
                {
                    return(response);
                }

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

            await Disconnect(roc.Phone);

            throw new Exception("Таймаут читання даних через GPRS");
        }
Exemplo n.º 2
0
 private void ProcessRoc(RocScanMember member, Roc809 roc, IClient client)
 {
     if (member.ScanEventData)
     {
         ScanEventData(roc, client);
     }
     if (member.ScanAlarmData)
     {
         ScanAlarmData(roc, client);
     }
 }
Exemplo 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
                });
            });
        }
Exemplo n.º 4
0
 public async Task GetAlarmData(IClient client, Roc809 roc, Action <List <Roc809AlarmData> > onSuccess, Action <Exception> onException)
 {
     await _rocPlusProtocol.GetAlarmData(roc, client)
     .ContinueWith(result =>
     {
         if (result.Exception != null)
         {
             onException?.Invoke(result.Exception.InnerException);
         }
         else
         {
             onSuccess?.Invoke(result.Result);
         }
     }, TaskScheduler.FromCurrentSynchronizationContext());
 }
Exemplo n.º 5
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);
     }
 }
 /// <summary>
 /// Возвращает полную информацию о вычислителе ROC809
 /// </summary>
 public static string Info(this Roc809 roc)
 {
     return($"Id:\t\t\t{roc.Id}\n" +
            $"Назва:\t\t\t{roc.Name}\n" +
            $"Опис:\t\t\t{roc.Description}\n" +
            $"ROC Unit:\t\t{roc.RocUnit}\n" +
            $"ROC Group:\t\t{roc.RocGroup}\n" +
            $"Host Unit:\t\t{roc.HostUnit}\n" +
            $"Host Group:\t\t{roc.HostGroup}\n" +
            $"IP-адреса:\t\t{roc.Address}\n" +
            $"Порт:\t\t\t{roc.Port}\n" +
            $"Номер телефону:\t{roc.Phone}\n" +
            "Опитування:\t\t" + (roc.IsScannedViaGPRS ? "По GPRS" : "По TCP/IP") + "\n" +
            $"Створено:\t\t{roc.DateCreated.ToString("dd.MM.yyyy HH:mm")}\n" +
            $"Змінено:\t\t{roc.DateModified.ToString("dd.MM.yyyy HH:mm")}");
 }
Exemplo n.º 7
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 EstimatorBase estimator)
        {
            Floutec floutec = estimator as Floutec;

            if (floutec != null)
            {
                return($"{floutec.Name} (ФЛОУТЕК, Адреса = {floutec.Address})");
            }

            Roc809 roc = estimator as Roc809;

            if (roc != null)
            {
                return(roc.IsScannedViaGPRS ?
                       $"{roc.Name} (ROC, Телефон = {roc.Phone})" :
                       $"{roc.Name} (ROC, Адреса = {roc.Address})");
            }

            return(string.Empty);
        }
Exemplo n.º 9
0
        public async Task <byte[]> GetData(Roc809 roc, byte[] request)
        {
            var client = new TcpClient();

            // Если соединение не было установлено, то установить
            if (!client.Connected)
            {
                client.Connect(roc.Address, roc.Port);
            }

            // Получение потока
            var stream = client.GetStream();

            // Запись запроса в поток
            await stream.WriteAsync(request, 0, request.Length);

            await stream.FlushAsync();

            // Чтение ответа из потока
            var response = new byte[1024];
            await stream.ReadAsync(response, 0, response.Length);

            return(response);
        }
Exemplo n.º 10
0
        public EditRocForm()
        {
            InitializeComponent();

            Load += (sender, args) =>
            {
                if (!IsEdit)
                {
                    Roc  = new Roc809();
                    Text = TITLE_CREATE;
                    Icon = Resources.Add;
                }
                else
                {
                    Text                = TITLE_EDIT;
                    txtName.Text        = Roc.Name;
                    txtDescription.Text = Roc.Description;
                    numRocUnit.Value    = Roc.RocUnit;
                    numRocGroup.Value   = Roc.RocGroup;
                    numHostUnit.Value   = Roc.HostUnit;
                    numHostGroup.Value  = Roc.HostGroup;
                    rbGPRS.Checked      = Roc.IsScannedViaGPRS;
                    rbTCPIP.Checked     = !rbGPRS.Checked;
                    txtAddress.Text     = ConvertIpToMask(Roc.Address);
                    txtPhone.Text       = Roc.Phone;
                    numPort.Value       = Roc.Port;
                    Icon                = Resources.Estimator1;
                }

                txtAddress.Enabled = rbTCPIP.Checked;
                numPort.Enabled    = rbTCPIP.Checked;
                txtPhone.Enabled   = rbGPRS.Checked;
            };

            btnCancel.Select();
        }
Exemplo n.º 11
0
        public async Task <List <Roc809AlarmData> > GetAlarmData(Roc809 roc, IClient client)
        {
            var request = new byte[11];
            var data    = new List <Roc809AlarmData>();

            request[0] = (byte)roc.RocUnit;
            request[1] = (byte)roc.RocGroup;
            request[2] = (byte)roc.HostUnit;
            request[3] = (byte)roc.HostGroup;
            request[4] = 0x76;
            request[5] = 0x03;
            request[6] = 0x0a;
            request[7] = 0x00;
            request[8] = 0x00;

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

            request[9]  = crc[0];
            request[10] = crc[1];

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

            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 = response.GetInt16(9);
                var alarmsToProcess = totalIndex - startIndex >= 10 ? 10 : totalIndex - startIndex;

                for (var i = 0; i < alarmsToProcess; i++)
                {
                    var offset = i * 23;

                    var record = new Roc809AlarmData();
                    var time   = new DateTime(1970, 1, 1, 0, 0, 0, 0);

                    record.SRBX      = (response[11 + offset] & (1 << 7)) != 0;
                    record.Condition = (response[11 + offset] & (1 << 6)) != 0;
                    record.Type      = response[11 + offset] & 63;

                    record.Time = time.AddSeconds(response.GetUInt32(12 + offset));

                    switch (record.Type)
                    {
                    case 0:
                        break;

                    case 1:
                        record.Code        = response[16 + offset];
                        record.T           = response[17 + offset];
                        record.L           = response[18 + offset];
                        record.P           = response[19 + offset];
                        record.Description = response.GetASCII(20 + offset, 10);
                        record.Value       = response.GetSingle(30 + offset).ToString(CultureInfo.InvariantCulture);
                        break;

                    case 2:
                        record.FST         = response[16 + offset];
                        record.Description = response.GetASCII(17 + offset, 13);
                        record.Value       = response.GetSingle(30 + offset).ToString(CultureInfo.InvariantCulture);
                        break;

                    case 3:
                        record.Description = response.GetASCII(16 + offset, 18);
                        break;

                    case 4:
                        record.Description = response.GetASCII(16 + offset, 14);
                        record.Value       = response.GetSingle(30 + offset).ToString(CultureInfo.InvariantCulture);
                        break;
                    }

                    data.Add(record);
                }

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

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

                crc = Crc16.Compute(request, 9);

                request[9]  = crc[0];
                request[10] = crc[1];
            } while (startIndex < totalIndex);

            if (gprsClient != null)
            {
                await gprsClient.Disconnect(roc.Phone);
            }
            return(data);
        }
Exemplo n.º 12
0
        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());
        }
Exemplo n.º 13
0
        public async Task <List <Roc809EventData> > GetEventData(Roc809 roc, IClient client)
        {
            var request = new byte[11];

            request[0] = (byte)roc.RocUnit;
            request[1] = (byte)roc.RocGroup;
            request[2] = (byte)roc.HostUnit;
            request[3] = (byte)roc.HostGroup;
            request[4] = 0x77;
            request[5] = 0x03;
            request[6] = 0x0a;
            request[7] = 0x01;
            request[8] = 0x00;

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

            request[9]  = crc[0];
            request[10] = crc[1];

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

            var data = new List <Roc809EventData>();

            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 = response.GetInt16(9);
                var eventsToProcess = totalIndex - startIndex >= 10 ? 10 : totalIndex - startIndex;

                for (var i = 0; i < eventsToProcess; i++)
                {
                    var offset = i * 22;

                    var record = new Roc809EventData();
                    var time   = new DateTime(1970, 1, 1, 0, 0, 0, 0);

                    record.Type = response[11 + offset];

                    record.Time = time.AddSeconds(response.GetUInt32(12 + offset));

                    switch (record.Type)
                    {
                    case 0:
                        break;

                    case 1:
                        record.OperatorId = response.GetASCII(16 + offset, 3);

                        record.T = response[19 + offset];
                        record.L = response[20 + offset];
                        record.P = response[21 + offset];

                        switch (response[22 + offset])
                        {
                        case 0:
                            record.NewValue = response.GetBool(23 + offset) ? "1" : "0";
                            record.OldValue = response.GetBool(27 + offset) ? "1" : "0";
                            break;

                        case 1:
                            record.NewValue = response[23 + offset].ToString();
                            record.OldValue = response[27 + offset].ToString();
                            break;

                        case 2:
                            record.NewValue = response.GetInt16(23 + offset).ToString();
                            record.OldValue = response.GetInt16(27 + offset).ToString();
                            break;

                        case 3:
                            record.NewValue = response.GetInt32(23 + offset).ToString();
                            record.OldValue = response.GetInt32(27 + offset).ToString();
                            break;

                        case 4:
                            record.NewValue = response[23 + offset].ToString();
                            record.OldValue = response[27 + offset].ToString();
                            break;

                        case 5:
                            record.NewValue = response.GetUInt16(23 + offset).ToString();
                            record.OldValue = response.GetUInt16(27 + offset).ToString();
                            break;

                        case 6:
                            record.NewValue = response.GetUInt32(23 + offset).ToString();
                            record.OldValue = response.GetUInt32(27 + offset).ToString();
                            break;

                        case 7:
                            record.NewValue = response.GetSingle(23 + offset).ToString(CultureInfo.InvariantCulture);
                            record.OldValue = response.GetSingle(27 + offset).ToString(CultureInfo.InvariantCulture);
                            break;

                        case 8:
                            record.NewValue = response.GetTLP(23 + offset);
                            record.OldValue = response.GetTLP(27 + offset);
                            break;

                        case 9:
                            record.NewValue = response.GetASCII(23 + offset, 3);
                            record.OldValue = response.GetASCII(27 + offset, 3);
                            break;

                        case 10:
                            record.NewValue = response.GetASCII(23 + offset, 7);
                            break;

                        case 11:
                            record.NewValue = response.GetASCII(23 + offset, 10);
                            break;

                        case 12:
                            record.NewValue = response.GetASCII(23 + offset, 10);
                            break;

                        case 13:
                            record.NewValue = response.GetASCII(23 + offset, 10);
                            break;

                        case 14:
                            record.NewValue = response.GetASCII(23 + offset, 10);
                            break;

                        case 15:
                            record.NewValue = response.GetASCII(23 + offset, 10);
                            break;

                        case 16:
                            record.NewValue = response.GetDouble(23 + offset).ToString(CultureInfo.InvariantCulture);
                            break;

                        case 17:
                            record.NewValue = time.AddSeconds(response.GetUInt32(23 + offset)).ToString("dd.MM.yyyy HH:mm:ss");
                            record.OldValue = time.AddSeconds(response.GetUInt32(27 + offset)).ToString("dd.MM.yyyy HH:mm:ss");
                            break;
                        }
                        break;

                    case 2:
                        record.Code        = response[16 + offset];
                        record.Description = response.GetASCII(17 + offset, 16);
                        break;

                    case 3:
                        record.FST   = response[16 + offset];
                        record.Value = response.GetSingle(17 + offset).ToString(CultureInfo.InvariantCulture);
                        break;

                    case 4:
                        record.OperatorId  = response.GetASCII(16 + offset, 3);
                        record.Code        = response[19 + offset];
                        record.Description = response.GetASCII(20 + offset, 13);
                        break;

                    case 5:
                        record.Value = time.AddSeconds(response.GetUInt32(16 + offset)).ToString("dd.MM.yyyy HH:mm:ss");
                        break;

                    case 6:
                        record.Value = time.AddSeconds(response.GetUInt32(16 + offset)).ToString("dd.MM.yyyy HH:mm:ss");
                        break;

                    case 7:
                        record.OperatorId      = response.GetASCII(16 + offset, 3);
                        record.T               = response[19 + offset];
                        record.L               = response[20 + offset];
                        record.P               = response[21 + offset];
                        record.RawValue        = response.GetSingle(22 + offset).ToString(CultureInfo.InvariantCulture);
                        record.CalibratedValue = response.GetSingle(26 + offset).ToString(CultureInfo.InvariantCulture);
                        break;
                    }

                    data.Add(record);
                }

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

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

                crc = Crc16.Compute(request, 9);

                request[9]  = crc[0];
                request[10] = crc[1];
            } while (startIndex < totalIndex);

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