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

Просмотр 15 сообщений - с 1 по 15 (из 56 всего)
  • Автор
    Записи
  • #39415
    manjey73
    Участник

    куда повернешь, то и вышло… 🙂

    Ситуация — читаю время записи архива из прибора (Логика) — стоит 0x0F — 15 часов

    Вывожу в лог Log.WriteLine($»Время прибора {DevDt}»);
    Время прибора 15.07.2025 15:23:06 — время прибора — часы 15. Все отлично.

    Формирую slice для записи архива

    DeviceSlice slice = new DeviceSlice(DevDt, ArcValue.Value.Count, ArcValue.Value.Count); // Здесь DevDt превращается в +3 по Москве, хотя указано время прибора

    И видим такую картину маслом в логе устройства Время почему-то сделало +3 по Москве, но при этом в Описании указаны наши 15 часов.

    Недавние исторические данные
    +---------------------+---------------------------------------------------------+
    | Время               | Описание                                                |
    +---------------------+---------------------------------------------------------+
    | 15.07.2025 18:21:06 | Запись Часовой архив, Время архива: 15.07.2025 15:21:06 |
    +---------------------+---------------------------------------------------------+
    | 15.07.2025 18:21:36 | Запись Часовой архив, Время архива: 15.07.2025 15:21:36 |
    +---------------------+---------------------------------------------------------+
    

    Да, время прибора +7 часов от UTC по факту, и +4 по Москве. 🙂

    А тут я видимо пишу в будущее?

    #39416
    manjey73
    Участник

    Вот вопрос — как правильно записать архив в правильное время?

    В общем нужен правильный мед, чтобы неправильные пчёлы не тасовали время как им вздумается 🙂

    #39417
    manjey73
    Участник
    Недавние исторические данные
    +---------------------+---------------------------------------------------------+
    | Время               | Описание                                                |
    +---------------------+---------------------------------------------------------+
    | 15.07.2025 15:41:12 | Запись Часовой архив, Время архива: 15.07.2025 12:41:12 |
    +---------------------+---------------------------------------------------------+
    | 15.07.2025 15:41:36 | Запись Часовой архив, Время архива: 15.07.2025 12:41:36 |
    

    Да не в 12 часов мне надо записать данные, а в 8:00 блин клинтон, в ВОСЕМЬ НУЛЬ:НУЛЬ согласно времени UTC, раз база в UTC.

    Прибор в Новосибирске +7ч от UTC, я в Краснодаре +3ч по UTC…. опрос от меня идет, но данные то могут смотреть ото всюду…

    #39418
    manjey73
    Участник

    Москва — Новосибирск + 4 часа
    UTC — Новосибирск + 7 часов

    Опрос ведет Коммуникатор по Москве, время прибора по Новосибирску.
    Подставьте сюда любой город вместо Новосибирска, проблемы непонятных манипуляций времени это не изменит.

    В логе Устройства по сохранению в БД будет каша …

    • Ответ изменён 1 год, 1 месяц назад пользователем manjey73.
    #39420
    manjey73
    Участник

    Проблема заключается в том, что опрос устройств с архивами при помощи облачных серверов это обычное дело. Но сам сервер в одном часовом поясе, прибор в другом часовом поясе а время архива для UTC получается третий часовой пояс.

    Как тут быть с точки зрения работы драйвера? подгонять что-ли или как?

    #39421
    JurasskPark
    Участник

    Может сделать в конфигураци хранение часовых поясов? И при выполнении операции вызывать . addHour(-7) или .addHour(+19)?
    Где переменная будет разница часового пояса.

    #39422
    manjey73
    Участник

    Возможно математические манипуляции с указанием разницы времени в конфигураторе это и решит проблему.

    Но это не решит проблемы slice — где переменная времени ОДНА на все и в варианте мат расчета времени просто будет некорректно отображать в логах.

    Чтобы записать архив на 8:00 мне в slice нужно подставить время Москвы и тогда в последних 10-ти записях в логе устройства будет отображаться

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

    Хотя время прибора будет отображаться как 15:00 в таблице переменных устройства.

    Вот такая вот БЯКА со временем и отображением в логах получится. Видишь одно, получаешь другое, а хочешь получать нужное, будешь видеть другое… — ахинею 🙂

    • Ответ изменён 1 год, 1 месяц назад пользователем manjey73.
    #39424
    manjey73
    Участник

    и в конфиге мало прописать +7, придется еще вычислять и разницу между временем прибора (который + 7) и временем ПК, на котором крутится опрос.

    #39425
    manjey73
    Участник

    Еще веселее… Прибор отстает на пару минут (из логов опроса)

    Время прибора 15.07.2025 16:59:36
    
    Дата Архивной записи 15.07.2025 16:00:00 - 45853,666666666664
    
    datetime 15.07.2025 16:00:00    Разница в часах 2 и минутах 58
    Время архивной записи 15.07.2025 16:00:00

    Время сохраненного архива только на 16:00 по времени прибора — разницу считает всего 3 часа, хотя по факту между Москвой и Новосибом +4 часа

    И тут время в приборе перешагивает час (догоняет, у меня на часах уже 2 минуты)

    Время прибора 15.07.2025 17:00:06
    
    Дата Архивной записи 15.07.2025 17:00:00 - 45853,708333333336
    datetime 15.07.2025 17:00:00    Разница в часах 3 и минутах 57
    Время архивной записи 15.07.2025 17:00:00

    и надо же, разница уже практически 4 часа 🙂

    жесть… как с этим бороться ? 🙂

    #39426
    manjey73
    Участник

    Вопрос, а Slice должен работать БЕЗ DeviceData.Set?

    То есть если я заношу в Slice данные, зачем еще делать DeviceData.Set? я же и так туда данные положил на метку времени…

    Без этого, в запись попали нули и статусы 0, хотя указан архивный.

    • Ответ изменён 1 год, 1 месяц назад пользователем manjey73.
    #39428
    JurasskPark
    Участник

    Если критично время, то на приборах выставляют время на -2 минуты.
    Больше никак.
    Мы тоже мучались с двухчасовками и суточными т.к. время на опрос + время формирования в самом контроллере.

    #39430
    manjey73
    Участник

    Время, когда надо считать очередной архив часовых данных из прибора, я контролирую по времени прибора. Начался новый «день» 🙂 точнее час, читаю.
    С этим проблем вроде нет.

    Проблема с определением времени, когда запрашиваю данные за определенные часы.

    И вопрос Михаилу. Каковы должны быть настройки Архива Коммуникатора, чтобы передать данные ТОЛЬКО при помощи Slice, не используя DeviceData.Set вообще.
    Не нужна мне запись этих данных, кроме использования Slice. Или я опять нашел то, что не предусмотрено системой ? 🙂

    • Ответ изменён 1 год, 1 месяц назад пользователем manjey73.
    #39433
    manjey73
    Участник

    Похоже я действительно нашел режим, при котором работает неверно или не работает вообще… 🙁

    #39434
    manjey73
    Участник
    DeviceSlice slice = new DeviceSlice(ArcDateTime.AddHours(-1).ToUniversalTime(), ArcValue.Value.Count, ArcValue.Value.Count); // Здесь DevDt превращается в +3 по Москве, хотя указано время прибора // TEST
    
    for (int arc = 0; arc < ArcValue.Value.Count; arc++)
    {
    //DeviceData.Set($"{prefix}{ArcValue.Value[arc].Code}", ArcValue.Value[arc].Value, CnlStatusID.Defined);
    
    Log.WriteLine($"{ArcValue.Value[arc].Code}  -  {prefix}{ArcValue.Value[arc].Code} Value = {ArcValue.Value[arc].Value}");
    slice.DeviceTags[arc] = DeviceTags[$"{prefix}{ArcValue.Value[arc].Code}"];
    slice.CnlData[arc] = new CnlData(ArcValue.Value[arc].Value, CnlStatusID.Archival);
                                        }
    
    slice.Descr = $"Запись в {ArcValue.Name}, Время архива: {ArcDateTime.AddHours(-1).ToUniversalTime()}";
    DeviceData.EnqueueSlice(slice);
    

    Без DeviceData.Set в БД ничего не попадает, при этом если запись slice вроде как по коду ниже, но переписать данные не может (или оно не попадает туда в принципе), так как статус каналов в БД 1 при наличии DeviceData.Set

    slice.CnlData[arc] = new CnlData(ArcValue.Value[arc].Value, CnlStatusID.Archival);

    Сюда же попадают все прочитанные данные и в том числе новый статус (архивный) а в БД пусто 🙁

    • Ответ изменён 1 год, 1 месяц назад пользователем manjey73.
    #39437
    manjey73
    Участник

    Без DeviceData.Set

    slice

    1

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