PDA

Просмотр полной версии : Варианты записи архивных данных в базу данных Firebird на MasterSCADA



Olegis
19.03.2013, 15:40
Мы получаем с удаленных объектов архивные данные в виде файлов по FTP. На MasterSCADA архивы пишутся в базу данных Firebird. В перерывах между опросами объектов данные на трендах отсутствуют. Какие есть варианты(кроме использования OPC HDA) для записи данных из этих архивных файлов в базу данных MasterSCADA? Реализовать ли это средствами MasterSCADA?

SCADAMaster
19.03.2013, 16:01
Ну вам нужно считывать данные из файла и записать в архив.
Вариантов 2:
1) Использовать наш Modbus Universal - он может читать файлы, и записывать их HDA. Скада их подтягивает.
2) Из скады, при помощи ФБ "Скрипт C#" считывать файлы и записывать в архив.
Дальше архивация идет штатными средствами MasterSCADA.

Olegis
19.03.2013, 16:18
Спасибо!

Использовать наш Modbus Universal - он может читать файлы, и записывать их HDA. Скада их подтягивает.
Каким образом синхронизировать данные из наших файлов так, чтобы наши данные попали в базу Firebird(на MasterSCADA) в соответствующем формате данных и синхронно со штампом времени MasterSCADA(чтобы сохранились наши исторические значения с тем штампом времени, с которым они были записаны в файл на контроллере удаленного объекта).
Тоже самое: получиться ли воткнуть исторические значения в существующую базу из нашего файла через Скрипт, чтобы они попали именно на место исторических данных(например, в прошлое время сохраненного тренда).

SCADAMaster
19.03.2013, 16:42
Поясните - Firebird будет использоваться какой-то сторонней программой или только для архивирования данных в MasterSCADA?

Olegis
19.03.2013, 17:00
Поясните - Firebird будет использоваться какой-то сторонней программой или только для архивирования данных в MasterSCADA?

Изначально саму базу создает у нас MasterSCADA, соответственно она ее приводит к своему формату для хранения архивов.На первом этапе будет база использоваться только для MasterSCADA, но в будущем заказчик хочет из этой базы читать получать в свою программу необходимые данные. Желательно рассмотреть оба варианта, чтобы потом не писать различных промежуточных программ, которыми все это связывать.

SCADAMaster
19.03.2013, 17:37
Архивировать данные в Firebird MasterSCADA может.
Для взаимодействия с другими программами вам нужно будет использовать экспорт. Но экспорт данных для Firebird пока не поддержан. Но возможно мы уже реализуем эту задачу когда она вам потребуется.
Также можно взаимодействовать с другими программами через хранимые процедуры, или можно читать из сторонней программы данные непосредственно из БД с архивом MasterSCADA.

Olegis
19.03.2013, 19:31
Вопрос все таки пока не понятен. Попытаюсь объяснить по-подробнее. Возможно ли вставить данные из наших архивных файлов в уже имеющееся базу MasterSCADA(Firebird) вместо старых данных? Например, при отсутствии связи по GPRS в базу пишется некая переменная. Так как связь пока отсутствует, то в архивные тренды(таблицы) пишется какое-то BAD значение(допустим 0). При подключении к удаленному объекту считываются файл с архивом этой переменной. Затем надо,чтобы в базу вместо старых BAD-значений записались архивные значения, считанные из файла, считанного с удаленного объекта,как здесь сделать, чтобы эти данные попали в базу именно с теми штампами времени, как в нашем файле.Т.е. как здесь синхронизировать данные в прошедшем времени, чтобы не было различий от режима непрерывного опроса.

SCADAMaster
19.03.2013, 19:46
Например, при отсутствии связи по GPRS в базу пишется некая переменная. Так как связь пока отсутствует, то в архивные тренды(таблицы) пишется какое-то BAD значение(допустим 0). При подключении к удаленному объекту считываются файл с архивом этой переменной. Затем надо,чтобы в базу вместо старых BAD-значений записались архивные значения, считанные из файла, считанного с удаленного объекта,как здесь сделать, чтобы эти данные попали в базу именно с теми штампами времени, как в нашем файле.Т.е. как здесь синхронизировать данные в прошедшем времени, чтобы не было различий от режима непрерывного опроса.
Так сделать нельзя.
А зачем записывать в базу значение с плохим признаком? Какой смысл отображать на тренде недостоверные значения?
Чем не устраивает, что пока данных нет - тренд пустой, данные поступили - отобразились на тренде.
А так - считать из файла архив с метками времени, и записать его в архив MasterSCADA можно.

Olegis
19.03.2013, 20:22
Так сделать нельзя.
А зачем записывать в базу значение с плохим признаком? Какой смысл отображать на тренде недостоверные значения?
Чем не устраивает, что пока данных нет - тренд пустой, данные поступили - отобразились на тренде.

Спасибо! Вы абсолютно верно сказали. Я неправильно выразился. Тоже имел ввиду, что тренд при отсутствии связи не будет остановлен, а будут на нем типа недостоверные значения.


А так - считать из файла архив с метками времени, и записать его в архив MasterSCADA можно.
Где можно найти подробное описание структуры базы данных Firebird, которую формирует именно MasterSCADA при ее создании? Записать новые значения в созданную базу возможно только через процедуры Interbase или есть еще варианты(через Скрипты C#,например,пока не представляю как это реализовать)?

SCADAMaster
19.03.2013, 21:27
Вам не нужно знать структуру хранения Firebird - просто архивируете значение выхода скрипта и все. Данные сами попадут в базу данных штатными средствами.
Вам сначала нужно определиться - будете вы читать данные через HDA или же через скрипт.

Если будут использовать скрипт, то вам нужно будет открыть ваш файл, считать и разобрать его. Затем записывать значения на выход скрипта при помощи команды SetValue. В библиотеке, в разделе "Примеры скриптов" есть пример "Добавление произвольной метки времени" - там идет работа с этой функцией. Выход скрипта должен архивироваться (поставьте галочку на закладке "Архив") - он и будет хранить считанные данные.
Единственное требование - данные должны монотонными, то есть нельзя записывать значение с меткой времени 21:20, а потом 21:19.

В ОРС сервере делается аналогично но используя стандартные Lua функции. Открываете файл, считываете, разбираете, сортируете записываете в HDA тег. Скада эти данные получает.

Olegis
19.03.2013, 23:49
Спасибо! Буду пробовать через скрипт. Кроме как через скрипт можно ли разобрать наш файл на составляющие средствами MasterSCADA?

SCADAMaster
20.03.2013, 08:07
По другому нельзя.

Olegis
20.03.2013, 09:04
По другому нельзя.

В MS 3.5 есть блок "Сохранить в файл", там переменная "Читать". Данный блок позволит решить задачу по разбору нашего файла или там какие-то ограничения?

SCADAMaster
20.03.2013, 10:08
Он не сможет этого сделать. Файл у вас наверняка сложной структуры, кроме того считанные значения нужно записывать в архив. Используйте Скрипт C#.

Olegis
20.03.2013, 17:57
Если будут использовать скрипт, то вам нужно будет открыть ваш файл, считать и разобрать его. Затем записывать значения на выход скрипта при помощи команды SetValue. В библиотеке, в разделе "Примеры скриптов" есть пример "Добавление произвольной метки времени" - там идет работа с этой функцией. Выход скрипта должен архивироваться (поставьте галочку на закладке "Архив") - он и будет хранить считанные данные.
Единственное требование - данные должны монотонными, то есть нельзя записывать значение с меткой времени 21:20, а потом 21:19.

Сделал архивирование переменной используя "Добавление произвольной метки времени". Правильно ли я думаю, что если данные некой переменной уже есть в архиве, например есть данные для штампа времени 20.00 20.03.2013, то в этот архив я уже не могу поместить значения этой переменной для штампа времени 19.00 20.03.2013? Потому что получается тогда некорректное отображение на тренде, линия рисуется из будущего в прошлое. Как правильно поступить, накопить данные с последовательным увеличением меток времени в промежуточный буфер, а потом скинуть их по очереди в базу?

SCADAMaster
20.03.2013, 18:29
Правильно ли я думаю, что если данные некой переменной уже есть в архиве, например есть данные для штампа времени 20.00 20.03.2013, то в этот архив я уже не могу поместить значения этой переменной для штампа времени 19.00 20.03.2013?
Да. Мы вам написали - архив должен быть монотонным.


Как правильно поступить, накопить данные с последовательным увеличением меток времени в промежуточный буфер, а потом скинуть их по очереди в базу?
А у вас что данные в файле в разнобой идут? Довольно странно.
Тогда вам нужно считать данные, записать их в коллекцию, отсортировать по времени, и уже потом записывать на выход.

Olegis
20.03.2013, 22:05
А у вас что данные в файле в разнобой идут? Довольно странно.

Нет, просто часть данных, когда не доступен GPRS(когда невозможно передать данные целым файлом), поступает через СМС, а СМС часто приходят не в той очередности как отправили, соответственно, данные к диспетчеру поступают не по порядку увеличения штампа времени.

kao
21.03.2013, 07:37
Если будут использовать скрипт, то вам нужно будет открыть ваш файл, считать и разобрать его. Затем записывать значения на выход скрипта при помощи команды SetValue. В библиотеке, в разделе "Примеры скриптов" есть пример "Добавление произвольной метки времени" - там идет работа с этой функцией. Выход скрипта должен архивироваться (поставьте галочку на закладке "Архив") - он и будет хранить считанные данные.
Единственное требование - данные должны монотонными, то есть нельзя записывать значение с меткой времени 21:20, а потом 21:19.
Реализую подобную задачу. Если выход скрипта архивируется, то при остановке Master SCADA, в архив записывается последнее известное значение с новой меткой времени - что не допустимо. Возможно не записывать в архив данные при остановке Master SCADA?

SCADAMaster
21.03.2013, 08:38
Нет, просто часть данных, когда не доступен GPRS(когда невозможно передать данные целым файлом), поступает через СМС, а СМС часто приходят не в той очередности как отправили, соответственно, данные к диспетчеру поступают не по порядку увеличения штампа времени.
Тогда да - нужно накапливать значения, сортировать и выдавать на выход.
Для накопления лучше тогда будет использовать файл - записывать в него данные при поступлении СМС, а когда получены все данные, считать файл в коллекцию, отсортировать и записать на выход.

SCADAMaster
21.03.2013, 08:41
Реализую подобную задачу. Если выход скрипта архивируется, то при остановке Master SCADA, в архив записывается последнее известное значение с новой меткой времени - что не допустимо. Возможно не записывать в архив данные при остановке Master SCADA?
Вы также записываете на выход скрипта значение с собственной меткой времени? Тогда вам нужно включить архивирование "Периодически", период - 00:00:00. Тогда флаг остановки в архив записываться не будет.