Запись в БД в прошлое ?

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

    Собственно что имеем. Создаем БД, подключаем ее к Серверу. Понимаем бит маски данной БД.
    Возможно ли писать в созданную БД в прошлом?

    Пример. Подключили счетчик, он отработал Х дней(месяцев) пока мы его подключили к scada. Создали часовые и дневные БД для хранения архивных данных из этого счтечика.
    Даем команду, прочитать часовые архивы, начиная с прошлого месяца — Запись в таком случае возможна? и как?

    Или запись в созданную БД возможна только на времена после ее создания ?

    #38859
    manjey73
    Участник

    Вообще механизмы Сервера позволяют выполнять запись в БД, когда на данные период отсутствует файл данной БД ?

    #38875
    Mikhail
    Модератор

    Конечно, можно записывать в прошлое, которое было до установки Rapid SCADA.
    Нужно учитывать реализацию архивов. Для архивов PostgreSQL потребуется вручную досоздать partition на нужный период.

    #38877
    manjey73
    Участник

    к Postgre еще ни разу не приступал 🙂
    Тут хотя бы со внутренними разобраться. А то прикручиваю архивы к Логике и думаю как?

    Есть примеры по работам со Slice для 6-й версии в коде где-нибудь?
    А то там очень много данных в часовые будут писаться и в дневные.
    А месячных БД еще не подвезли кстати?

    А создать partition Postgre можно из кода драйвера каким-то образом? То есть послать что-то в БД и чтобы она создала ?

    #38881
    manjey73
    Участник

    Еще один вопрос, если я надумаю передавать архивные данные в существующие текущие каналы и в слайсе окажется тег канала, которого нет в текущих. Я получу исключение или просто Сервер проигнорирует запись, так как данного кода тега канала нет ?

    Из-за некоторой особенности реализации будет, либо пишем в текущие с пометкой архивный, либо в другую БД.

    • Ответ изменён 6 месяцев назад пользователем manjey73.
    #38885
    Mikhail
    Модератор

    > А создать partition Postgre можно из кода драйвера каким-то образом?
    Нужно выполнить SQL-запрос. Т.к. это делается один раз, то проще его вручную выполнить.

    > Есть примеры по работам со Slice для 6-й версии в коде где-нибудь?
    Не помню. Сделайте поиск по исходному коду. Поиск можно запустить в GitHub или скачать исходники и выполнить поиск по файлам в Far Manager.

    > передавать архивные данные в существующие текущие каналы и в слайсе окажется тег канала, которого нет в текущих
    Проигнорируется. Ошибки не будет.

    #38887
    manjey73
    Участник

    С точки зрения логики все процедуры для записи данных каналов должен выполнять драйвер, только не устройства, а ModArcPostgreSql.

    Ведь БД под каналы мы формируем в принципе руками.

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

    • Ответ изменён 6 месяцев назад пользователем manjey73.
    #38889
    Mikhail
    Модератор

    Драйвер Коммуникатора создает данные. За их запись он не отвечает.

    #38890
    manjey73
    Участник

    Ну так кто отвечает? Почему надо руками что-то создавать, чтобы записать в прошлое?
    По такому принципу работает масса приборов, никому не надо, читаем текущие данные. Понадобилось, указываем период архива для чтение и тут оп-па, будьте любезны руками что-то там исполнить, чтобы вообще была возможность их сохранить? Ну как-то бредово выглядит 🙂

    #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

    #38896
    JurasskPark
    Участник

    Но смысл в том, что один тег — это один срез данных и со временем он переполнялся, поэтому эту возможность я отключил.
    Как говорил Михаил — один срез — это одна дата с несколькими тегами.
    В варианте выше — один срез — это один тег с датой. Так делать нельзя.

    #38897
    manjey73
    Участник

    А какая разница, один тег, 4 тега или пару десятков на одну точку времени?

    #38902
    JurasskPark
    Участник

    Не одна точка времени, а один срез.

    50 тегов и 1 срез или 50 срезов с 1 тегом — вот про что я говорю.
    Через 60 секунд будет 3000 срезов вместо 60. И так очередь будет расти и расти, пока сервер не скажет «время срезов уже не актуальное, я их писать не буду и потом через некоторое время упадёт» 🙂

    #38903
    manjey73
    Участник

    Ну так срез это же набор данных на одну точку времени, нет?
    Не важно, сколько данных мы кладём в этот срез, один тег или 10.
    Задача положить данные в определенную точку времени в БД.

    #38931
    Mikhail
    Модератор

    С точки зрения разработки драйвера нужно создать срез данных и отдать его наверх.

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