PDA

Просмотр полной версии : Запись в архив по изменению состояния дискретной переменной



MoZg
24.06.2014, 15:01
MasterSCADA производит опрос архива ПЛК посредством OPC сервера HDA. Значение HDA - десятичное. Раскладываем его на биты и получаем дискретные значения(логическое состояние отдельных процессов записанных в архив ПЛК). Теперь задача записать в SQL архив отдельных дискретных значений с меткой времени изменения данных битов. В SQL 2 поля: время(берем время HDA переменной) и значение(значение отдельного дискрета после разложения). Время HDA тега изменяется при любом изменении HDA тега, а нам нужно отследить именно время изменения данного бита. Eсли не подавать сигнал "Выполнить" процедуре на запись в SQL, а просто выбрать запись "по изменению входов", то получаем кучу одинаковых значений с разным временем, или даже разные значения с одним и тем же временем. Нужен сигнал на запись в базу только при изменении логического состояния данного бита. Каким образом можно реализовать данный сигнал?
Также в дальнейшем потребуется тренд и/или таблица со всеми архивными значениями данных битов за заданный промежуток времени, например, сутки или месяц. Как это можно реализовать?

SCADAMaster
24.06.2014, 15:16
Поясните.
Вы читаете архив по HDA, после этого полученные значения вы разбираете на биты - каким образом? ФБ "Распаковка" будет работать только с дейсвующим значением, а не с архивом. Или вы написали скрипт?
Или же у вас по HDA сразу приходит биты?

По передаче данных в SQL у нас есть документация.
http://www.masterscada.ru/services/support/art_step_by_step/BD/BD_Part_1.pdf
http://www.masterscada.ru/services/support/art_step_by_step/BD/BD_Part_2.pdf
Вам нужно посмотреть режим экспорта. Экспорт можно включить как у конкретных объектов, так и HDA серверов.

MoZg
24.06.2014, 19:13
Помещаю HDA в SQL из него посредством процедуры читаю архивные данные и распаковываю функцией "распаковка аналогового 32 значения". Далее нужно взять отдельный бит и поместить его процедурой в архив, но без формирования сигнала выполнить правильного заполнение таблицы SQL не получается, как я уже написал. Как определить изменение состояния данного бита и по этому условию сформировать сигнал "Выполнить" в процедуре?
Как сформировать тренд по архивным данным?

SCADAMaster
24.06.2014, 19:58
Помещаю HDA в SQL из него посредством процедуры читаю архивные данные и распаковываю функцией "распаковка аналогового 32 значения". Далее нужно взять отдельный бит и поместить его процедурой в архив, но без формирования сигнала выполнить правильного заполнение таблицы SQL не получается, как я уже написал. Как определить изменение состояния данного бита и по этому условию сформировать сигнал "Выполнить" в процедуре?

А зачем вообще в данном нужен SQL? Какой у вас используется HDA сервер? Нельзя сделать разбор на биты на этапе ОРС сервера, а уже затем записывать в отдельные HDA теги?
Если разобрать значение заранее нельзя, то тогда единственный вариант - это скрипт C#. С помощью скрипта читать архив значения, анализировать изменение значения (изменилось значение - изменился бит), а затем записывать значения битов на выходы скрипта.
В принципе скрипт не очень сложный.



Как сформировать тренд по архивным данным?
А в чем возникла трудность? Добавляете нужные переменные на тренд.
Посмотрите видео по трендам.
http://www.masterscada.ru/?additional_section_id=233

MoZg
25.06.2014, 04:16
HDA сервер - Master OPC universal modbus server. Подскажите, как должен выглядеть срипт в OPC сервере, либо, как должен выглядеть скрипт на C# в MasterSCADA.

SCADAMaster
25.06.2014, 07:23
А в OPC сервере у вас формируется архив с помощью скрипта или вы просто включили автоматическую запись? Если у вас автоматическая запись, то можно обойтись без скрипта - создайте нужное количество тегов, включите у каждого из них извлечение бита. Включите у этих тегов автоматическую запись HDA, по изменению.

Готового скрипта для скады у нас нет. Но есть пример - поиск максимального значения в архиве, в нем есть пример работы с архивом. Вы можете адаптировать этот скрипт под вашу задачу.

MoZg
25.06.2014, 19:57
В OPC сервере архив формируется с помощью скрипта.
Сигнал на запись в архив по изменению состояния логической переменной написал посредством ST скрипта, но столкнулся с проблемой обработки архивных значений. Скрипт обрабатывает только те изменения значений которые приходят из OPC сервера после запуска программы, а мне необходимо обработать и все архивные значения за предыдущий период, которые накоплены в архиве ПЛК. Как мне добиться обработки всего архива ПЛК?
Программу прикладываю. https://yadi.sk/d/s7JeiDJSUroye

SCADAMaster
25.06.2014, 20:22
Из ST нельзя обратится к архиву - это можно делать только на C#.
Вам нужно адаптировать скрипт C# который мы приложили.

MoZg
25.06.2014, 20:30
Посмотрел Ваш скрипт, Вы получаете массив значений, а мне необходимо получать штамп времени + значение. Можете подсказать как получить элемент архива со всеми полями (мне необходимо вытягивать Value и штамп времени). С ходу не смог найти в документации как пробежаться по архиву получая все данные элементов.

SCADAMaster
25.06.2014, 21:32
Получается массив архивный значений, а каждое значение содержит три атрибута - значение, метка времени, признак качества.
В этой строке получается значение:
Val=(double)element.Value;
Можно также получить и атрибут времени:
element.Time
Признак качества:
element.Quality

MoZg
25.06.2014, 21:39
Спасибо! Попробую.