Время что дышло

Просмотр 15 сообщений - с 16 по 30 (из 56 всего)
  • Автор
    Записи
  • #39441
    Mikhail
    Модератор

    Время, которое передаётся приложению Сервер должно быть в UTC. Если прибор работает в другом часовом поясе, драйвер должен преобразовать время из часового пояса прибора в UTC.
    Пример создания архивного среза в драйвере здесь.

    #39442
    manjey73
    Участник

    Я видел этот пример, но проблема в том, что на данный канал в драйвере присутствует devicedata.set.
    А у меня его нет вообще. Только slice.

    #39444
    Romiros
    Участник

    А у меня его нет вообще. Только slice.
    По идее это не должно никак влиять. Канал же существует и ему просто отправляется архивный срез.

    #39445
    manjey73
    Участник

    Вот в него и отправляются НУЛИ.
    Хотя вывожу и код тега и значение, все там присутствует.
    Если код тега и значение тут же отправить (см заклментированную строчку), то значение в бд появляются и соответствуют действительности, за исключением, что там статус = 1.

    И думаю, Толи я дурак, и что-то не так и не там настроил, Толи где-то ошибка, но я не знаю, как ее искать в данном случае.

    #39447
    Romiros
    Участник

    Скорее всего в коде есть ошибка. Завтра буду на работе, пришлю работающий вариант. Давно делал не помню сейчас, но уже третий год все пишется и часы и сутки.

    #39448
    manjey73
    Участник

    Сравнивал код с примером из Симулятора, кроме того, что драйвер никак не использует DeviceData.Set отличий нет.

    #39452
    manjey73
    Участник

    А вот если указать ArchiveMask то запись происходит, но тут вмешивается локальное ВРЕМЯ…

    Еще раз. Время в приборе — Х часовой пояс, в данном случае +7 от UTC
    Вывод в лог устройства

    Недавние исторические данные
    +---------------------+-----------------------------------------------------------+
    | Время               | Описание                                                  |
    +---------------------+-----------------------------------------------------------+
    | 15.07.2025 20:00:00 | Запись в Часовой архив, Время архива: 15.07.2025 17:00:00 |

    20:00 — это реальное время по UTC архива то есть там сейчас 3 с лишним часа ночи, архив для 3-х ночи это по UTC 20:00 предыдущего дня.
    В slice мы можем указать только одно время.
    DeviceSlice slice = new DeviceSlice(ArcDateTime.AddHours(-7).ToUniversalTime()

    забавно, что надо отнимать 7 часов и еще переводить время в UTC ? почему так?
    slice.Descr = $"Запись в {ArcValue.Name}, Время архива: {ArcDateTime.AddHours(-7).ToUniversalTime()}";

    Ну и смотрите что выводит в лог — в левой колонке он пишет реальное время, в правой отнимает еще 3 часа (мое локальное).

    И как вот все это программировать в драйвере и модулях ? угадывать?

    #39457
    a80808
    Участник

    А в настройках указать? Как в OwenCloud. У них при заведении прибора есть параметр «Часовой пояс в приборе» (как то)

    #39458
    manjey73
    Участник

    Ну это в конфиге и придется указывать. Потому что получая из прибора время — просто время, мы не знаем откуда оно появилось (часовой пояс), значит надо явно указать где-то, что это именно столько то и столько то, относительно UTC, и уже потом как-то работать со временем.

    з.ы. больше всего сейчас бесит, что Администратор тоже прибавляет время в сторону локального, там где мы открыли Администратор.

    Ну и лажа со временем при создании среза.
    Фактически в 1-й колонке это что? время запроса архива в логе?, так я могу запросить архив в 12:48 но за период с 0:00 по 6:00 но я не могу при этом в срезе указать два времени, время запроса и реальное время архива. в его параметрах есть только одно время.
    Я могу что-то свое написать только в правой колонке лога и всё.

    #39459
    manjey73
    Участник

    А, собственно для чего все это творится — так за тем, что у организации приборы Логика разбросаны по России в разных городах, в разных часовых поясах, при этом Сервер скорее всего будет в одном часовом поясе, а клиенты будут так же в разных часовых поясах, при чем не совпадающими возможно с часовым поясом установки прибора.

    И тут со временем мы приплываем по полной программе…

    #39460
    Romiros
    Участник

    Вот кусок кода. Время везде приводится к UTC. Я думаю Михаил написал правильно, нужно плясать от времени прибора по UTC и хранить его в UTC. В драйвере использовать только время прибора, не привязываясь к системному.

     DateTime sliceTime = typeData == TypeData.Hour? reader.GetDateTime("DTime").ToUniversalTime(): reader.GetDateTime("DTime").ToUniversalTime().Date;
    
     Dictionary<DeviceTag, CnlData> dict = new Dictionary<DeviceTag, CnlData>();
     for (int i = 0; i < cnt; i++)
     {
         var property = reader[group.DeviceTags[i].Code.Split('.')[1]];
         if (property != DBNull.Value)
         {
             dict.Add(group.DeviceTags[i], Utils.DecodeTag(property, typeData));                            
         }                       
     }
     DeviceSlice slice = new DeviceSlice(sliceTime, dict.Keys.ToArray(), dict.Values.ToArray())
     {
         DataSentCallback = DataSent,
         FailedToSendCallback = FailedToSend,
         ArchiveMask = typeData == TypeData.Hour ? 4 : 8,                        
         Descr = typeData == TypeData.Hour ? "Часовой" : "Дневной"
     };                    
     DeviceData.EnqueueSlice(slice);                        
    #39461
    manjey73
    Участник

    @romiros
    Вот, у тебя тоже есть ArchiveMask в коде
    Тут очень странно, мне придется через конфиг задавать еще и маску. Так как предполагал, что маску архива должен задать Администратор в свойствах канала, куда записывать после создания архива и настройки системы и Сервер сам определяет куда писать. В драйвере уже не потребуется указывать маску, а оказалось что не тут то было…

    #39462
    manjey73
    Участник

    Пока так, буду дальше облагораживать.
    Часовой архив

    1

    но со временем точно надо что-то делать, чтобы это корректно отображалось в логах в том числе. И так как система может быть очень распределенной…

    Например в настройках опроса возможность указать часовой пояс.
    з.ы. можно конечно использовать и общие данные и т.д…… кстати да. Даже лучше, чтобы при этом сохранить один конфиг, а не плодить их в плане наличия нескольких часовых поясов.

    #39463
    a80808
    Участник

    Не в тему — а как вы так делаете, что картинка сразу видна в топике?

    #39464
    manjey73
    Участник

    IMG — если применительно к https://imgbb.com после загрузки выбрать
    ссылку на BB-код со ссылкой. Вставить и добавить любое название

Просмотр 15 сообщений - с 16 по 30 (из 56 всего)
  • Для ответа в этой теме необходимо авторизоваться.