Добрый день. Есть ли возможность, используя существующее API добавить в архивный срез канал, если он ранее в этом срезе не существовал? Или для этого нужно лезть в закрытые методы скады?
Имеется ввиду написать соответствующее приложение, утилиту или драйвер своими силами. Если да, то куда посмотреь?
Данная операция не частая, но уже несколько раз возникала такая необходимость.
Добрый день!
Вы правильно написали, что для этого нужно написать утилиту. Она будет создавать новые таблицы архива, а затем копировать в них данные из старых таблиц. Все методы, которые нужны для утилиты, находятся в ScadaData.dll
Наверное, нужно начать с того, что научиться открывать существующие таблицы *.dat. Потом научиться создавать новые таблицы. А затем скопировать данные.
Если напишите такую утилиту, она будет очень полезна.
Спасибо за ответ, принцип вроде понял. Т.е. алгоритм примерно следующий:
1. Создаем временную папку(папки) под новые файлы архивов
2. Берем архивный файл, перебираем срезы. Получаем из них время каждого среза и данные каналов, ну и также имя файла.
3. На основе текущего среза(из current.dat) создаём новые архивные срезы. Присваиваем им время и данные от старых архивных срезов.
4. Сохраняем новый архивный во временной папке.
5. Повторяем 1-4 для всех файлов.
6. Заменяем файлы архивов на новые из временной паки.
Кое-что получилось. По крайней мере делает то что мне нужно. Конечно для большого кол-ва данных нужно сделать какой-нибудь асинхронный прогресс или лог, чтобы форма не подвисала. Ну и может нужно дать возможность задавать глубину обновления в днях.
Приложение обновляет архивные файлы (часовые и минутные) в соответствии с кол-вом каналов в текущем срезе.
Данные существовавших каналов сохраняются, добавленные вставляются со значением 0 и статусом 0.
ВАЖНО!!!
Архивы тех каналов, которых нет в текущем срезе — исчезнут (по идее так правильно, что-то вроде чистки)
ВАЖНО!!!
Пробовать или на ArchiveDATCopy или скопировать ArchiveDAT в отдельную папку и там эксперементировать.