Стартовая страница › Форумы › Разработка и интеграция › Запись в БД в прошлое ?
- В этой теме 14 ответов, 3 участника, последнее обновление 5 месяцев, 3 недели назад сделано
Mikhail.
-
АвторСообщения
-
11.06.2025 в 09:18 #38857
manjey73УчастникСобственно что имеем. Создаем БД, подключаем ее к Серверу. Понимаем бит маски данной БД.
Возможно ли писать в созданную БД в прошлом?Пример. Подключили счетчик, он отработал Х дней(месяцев) пока мы его подключили к scada. Создали часовые и дневные БД для хранения архивных данных из этого счтечика.
Даем команду, прочитать часовые архивы, начиная с прошлого месяца — Запись в таком случае возможна? и как?Или запись в созданную БД возможна только на времена после ее создания ?
11.06.2025 в 09:19 #38859
manjey73УчастникВообще механизмы Сервера позволяют выполнять запись в БД, когда на данные период отсутствует файл данной БД ?
11.06.2025 в 12:15 #38875
MikhailМодераторКонечно, можно записывать в прошлое, которое было до установки Rapid SCADA.
Нужно учитывать реализацию архивов. Для архивов PostgreSQL потребуется вручную досоздать partition на нужный период.11.06.2025 в 12:41 #38877
manjey73Участникк Postgre еще ни разу не приступал 🙂
Тут хотя бы со внутренними разобраться. А то прикручиваю архивы к Логике и думаю как?Есть примеры по работам со Slice для 6-й версии в коде где-нибудь?
А то там очень много данных в часовые будут писаться и в дневные.
А месячных БД еще не подвезли кстати?А создать partition Postgre можно из кода драйвера каким-то образом? То есть послать что-то в БД и чтобы она создала ?
11.06.2025 в 13:52 #38881
manjey73УчастникЕще один вопрос, если я надумаю передавать архивные данные в существующие текущие каналы и в слайсе окажется тег канала, которого нет в текущих. Я получу исключение или просто Сервер проигнорирует запись, так как данного кода тега канала нет ?
Из-за некоторой особенности реализации будет, либо пишем в текущие с пометкой архивный, либо в другую БД.
-
Ответ изменён 6 месяцев назад пользователем
manjey73.
12.06.2025 в 11:15 #38885
MikhailМодератор> А создать partition Postgre можно из кода драйвера каким-то образом?
Нужно выполнить SQL-запрос. Т.к. это делается один раз, то проще его вручную выполнить.> Есть примеры по работам со Slice для 6-й версии в коде где-нибудь?
Не помню. Сделайте поиск по исходному коду. Поиск можно запустить в GitHub или скачать исходники и выполнить поиск по файлам в Far Manager.> передавать архивные данные в существующие текущие каналы и в слайсе окажется тег канала, которого нет в текущих
Проигнорируется. Ошибки не будет.12.06.2025 в 12:20 #38887
manjey73УчастникС точки зрения логики все процедуры для записи данных каналов должен выполнять драйвер, только не устройства, а ModArcPostgreSql.
Ведь БД под каналы мы формируем в принципе руками.
Драйвер устройства формирует только набор данных, а текущие это или в прошлое, не его дальнейшая забота как бы.
-
Ответ изменён 6 месяцев назад пользователем
manjey73.
13.06.2025 в 08:51 #38889
MikhailМодераторДрайвер Коммуникатора создает данные. За их запись он не отвечает.
13.06.2025 в 09:16 #38890
manjey73УчастникНу так кто отвечает? Почему надо руками что-то создавать, чтобы записать в прошлое?
По такому принципу работает масса приборов, никому не надо, читаем текущие данные. Понадобилось, указываем период архива для чтение и тут оп-па, будьте любезны руками что-то там исполнить, чтобы вообще была возможность их сохранить? Ну как-то бредово выглядит 🙂13.06.2025 в 23:09 #38895
JurasskParkУчастник// history 3 years ago Publish project try { for (int i = 0; i < Math.Min(tagCnt, rowCnt); i++) { //create a historical data slice if (dtData.Rows[i][1].ToString() == string.Empty || dtData.Rows[i][2] is null || dtData.Rows.Count < 3) { Log.WriteLine(Locale.IsRussian ? "Столбец номер 3 с датой и временем тега пустой или равен null. Номер тега и номер строки таблицы - " + (i + 1) : "Column number 3 with the date time of the tag is empty or null. Tag number and table row number - " + (i + 1)); } else { 3 years ago Release 6.0.0.1 // if the driver has a list of tags to use if (config.DeviceTags.Count > 0) { try { DeviceTag deviceTag = (DeviceTag)DeviceTags.Where(x => x.Name == dtData.Rows[i][0].ToString()).FirstOrDefault(); if (deviceTag == null) { Log.WriteLine(Locale.IsRussian ? "[Исторические данные] В списке тегов конфигурации драйвера не обнаружен тег с названием '" + dtData.Rows[i][0].ToString() + "'" : "[Historical data] No tag with the name was found in the list of driver configuration tags '" + dtData.Rows[i][0].ToString() + "'"); } DateTime dtSSlice = (DateTime)dtData.Rows[i][2]; DeviceSlice deviceSlice = new DeviceSlice( new DateTime(dtSSlice.Year, dtSSlice.Month, dtSSlice.Day, dtSSlice.Hour, dtSSlice.Minute, dtSSlice.Second, DateTimeKind.Utc), 1, 1); deviceSlice.DeviceTags[0] = DeviceTags["DBTAG" + (deviceTag.Index + 1).ToString() + ""]; string Descr = Locale.IsRussian ? " Значение = " : " Value = "; deviceSlice.Descr = deviceTag.Name + Descr + dtData.Rows[i][1]; DeviceData.EnqueueSlice(deviceSlice); } catch { } } else // otherwise we insert all the values that we found in the database { DateTime dtSSlice = (DateTime)dtData.Rows[i][2]; DeviceSlice deviceSlice = new DeviceSlice( new DateTime(dtSSlice.Year, dtSSlice.Month, dtSSlice.Day, dtSSlice.Hour, dtSSlice.Minute, dtSSlice.Second, DateTimeKind.Utc), 1, 1); deviceSlice.DeviceTags[0] = DeviceTags["DBTAG" + (i + 1).ToString() + ""]; string Descr = Locale.IsRussian ? " Значение = " : " Value = "; deviceSlice.Descr = DeviceTags[i].Name + Descr + dtData.Rows[i][1]; DeviceData.EnqueueSlice(deviceSlice); } 3 years ago Publish project } } } 3 years ago Release 6.0.0.1 catch 3 years ago Publish project { InvalidateData(); }Откопал как писал исторические данные в DbImportPlus
13.06.2025 в 23:11 #38896
JurasskParkУчастникНо смысл в том, что один тег — это один срез данных и со временем он переполнялся, поэтому эту возможность я отключил.
Как говорил Михаил — один срез — это одна дата с несколькими тегами.
В варианте выше — один срез — это один тег с датой. Так делать нельзя.14.06.2025 в 00:46 #38897
manjey73УчастникА какая разница, один тег, 4 тега или пару десятков на одну точку времени?
14.06.2025 в 21:32 #38902
JurasskParkУчастникНе одна точка времени, а один срез.
50 тегов и 1 срез или 50 срезов с 1 тегом — вот про что я говорю.
Через 60 секунд будет 3000 срезов вместо 60. И так очередь будет расти и расти, пока сервер не скажет «время срезов уже не актуальное, я их писать не буду и потом через некоторое время упадёт» 🙂14.06.2025 в 22:26 #38903
manjey73УчастникНу так срез это же набор данных на одну точку времени, нет?
Не важно, сколько данных мы кладём в этот срез, один тег или 10.
Задача положить данные в определенную точку времени в БД.16.06.2025 в 14:43 #38931
MikhailМодераторС точки зрения разработки драйвера нужно создать срез данных и отдать его наверх.
-
Ответ изменён 6 месяцев назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.