Стартовая страница › Форумы › Разработка и интеграция › Время что дышло
- В этой теме 55 ответов, 5 участников, последнее обновление 1 год, 1 месяц назад сделано
manjey73.
-
АвторЗаписи
-
15.07.2025 в 18:13 #39441
MikhailМодераторВремя, которое передаётся приложению Сервер должно быть в UTC. Если прибор работает в другом часовом поясе, драйвер должен преобразовать время из часового пояса прибора в UTC.
Пример создания архивного среза в драйвере здесь.15.07.2025 в 18:34 #39442
manjey73УчастникЯ видел этот пример, но проблема в том, что на данный канал в драйвере присутствует devicedata.set.
А у меня его нет вообще. Только slice.15.07.2025 в 18:43 #39444Romiros
УчастникА у меня его нет вообще. Только slice.
По идее это не должно никак влиять. Канал же существует и ему просто отправляется архивный срез.15.07.2025 в 19:35 #39445
manjey73УчастникВот в него и отправляются НУЛИ.
Хотя вывожу и код тега и значение, все там присутствует.
Если код тега и значение тут же отправить (см заклментированную строчку), то значение в бд появляются и соответствуют действительности, за исключением, что там статус = 1.И думаю, Толи я дурак, и что-то не так и не там настроил, Толи где-то ошибка, но я не знаю, как ее искать в данном случае.
15.07.2025 в 20:13 #39447Romiros
УчастникСкорее всего в коде есть ошибка. Завтра буду на работе, пришлю работающий вариант. Давно делал не помню сейчас, но уже третий год все пишется и часы и сутки.
15.07.2025 в 20:41 #39448
manjey73УчастникСравнивал код с примером из Симулятора, кроме того, что драйвер никак не использует DeviceData.Set отличий нет.
15.07.2025 в 23:55 #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 часа (мое локальное).
И как вот все это программировать в драйвере и модулях ? угадывать?
16.07.2025 в 09:09 #39457
a80808УчастникА в настройках указать? Как в OwenCloud. У них при заведении прибора есть параметр «Часовой пояс в приборе» (как то)
16.07.2025 в 09:44 #39458
manjey73УчастникНу это в конфиге и придется указывать. Потому что получая из прибора время — просто время, мы не знаем откуда оно появилось (часовой пояс), значит надо явно указать где-то, что это именно столько то и столько то, относительно UTC, и уже потом как-то работать со временем.
з.ы. больше всего сейчас бесит, что Администратор тоже прибавляет время в сторону локального, там где мы открыли Администратор.
Ну и лажа со временем при создании среза.
Фактически в 1-й колонке это что? время запроса архива в логе?, так я могу запросить архив в 12:48 но за период с 0:00 по 6:00 но я не могу при этом в срезе указать два времени, время запроса и реальное время архива. в его параметрах есть только одно время.
Я могу что-то свое написать только в правой колонке лога и всё.16.07.2025 в 09:46 #39459
manjey73УчастникА, собственно для чего все это творится — так за тем, что у организации приборы Логика разбросаны по России в разных городах, в разных часовых поясах, при этом Сервер скорее всего будет в одном часовом поясе, а клиенты будут так же в разных часовых поясах, при чем не совпадающими возможно с часовым поясом установки прибора.
И тут со временем мы приплываем по полной программе…
16.07.2025 в 10:05 #39460Romiros
УчастникВот кусок кода. Время везде приводится к 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);16.07.2025 в 10:26 #39461
manjey73Участник@romiros
Вот, у тебя тоже есть ArchiveMask в коде
Тут очень странно, мне придется через конфиг задавать еще и маску. Так как предполагал, что маску архива должен задать Администратор в свойствах канала, куда записывать после создания архива и настройки системы и Сервер сам определяет куда писать. В драйвере уже не потребуется указывать маску, а оказалось что не тут то было…16.07.2025 в 10:44 #39462
manjey73УчастникПока так, буду дальше облагораживать.
Часовой архив
но со временем точно надо что-то делать, чтобы это корректно отображалось в логах в том числе. И так как система может быть очень распределенной…
Например в настройках опроса возможность указать часовой пояс.
з.ы. можно конечно использовать и общие данные и т.д…… кстати да. Даже лучше, чтобы при этом сохранить один конфиг, а не плодить их в плане наличия нескольких часовых поясов.16.07.2025 в 12:46 #39463
a80808УчастникНе в тему — а как вы так делаете, что картинка сразу видна в топике?
16.07.2025 в 12:54 #39464
manjey73УчастникIMG — если применительно к https://imgbb.com после загрузки выбрать
ссылку на BB-код со ссылкой. Вставить и добавить любое название -
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.
