Здравствуйте.
Если мы правильно поняли, то у Вас в "Multi-Protocol MasterOPC" тег считанный с OPC-HDA представляет собой массив значений типа Double. В Simple-Scada 2 можно работать с такими переменными. Для этого в меню редактирования переменных нужно создать (https://simple-scada.com/help/manual/variable-new.html) (или импортировать с OPC-сервера (https://simple-scada.com/help/manual/variable-import-opc.html)) переменную. В Simple-Scada у такой переменной должен быть тип данных "Double array". Объекты (такие как Поле, Уровень, Текст и т.д) не могут работать напрямую с переменной-массивом. Сначала нужно "разложить" массив по другим переменным с типом данных Double.
Рассмотрим простой пример. Допустим у нас есть переменная массив (Double array) с именем vrMyArray и нам нужно разложить массив по трём отдельным внутренним переменным vrDouble1, vrDouble2, vrDouble3. Тогда решение будет таким:
1. Переходим в меню скриптов и создаем новый скрипт с типом события "Изменились переменные" (https://simple-scada.com/help/script/event-types.html). В список переменных добавляем нашу переменную-массив vrMyArray (как в этой инструкции (https://simple-scada.com/help/script/changemulvar.html)). Теперь этот скрипт будет вызываться каждый раз когда переменная-массив изменилась.
2. Пишем такой код в скрипт:
begin
vrDouble1.Value := Variable.Values[0];
vrDouble2.Value := Variable.Values[1];
vrDouble3.Value := Variable.Values[2];
end.
Готово. В скрипте мы в vrDouble1 записываем первое значение из массива. В vrDouble2 второе значение из массива и так далее. Теперь эти переменные сожно взяаться с полями, уровнями, или другими объектами. Этот способ подходит если нам точно известно, что массив содержит три элемента. Если массив может содержать любое количество элементов, или его размер меняется во время работы проекта, то нужно проходить по элементам массива в цикле, например так:
var
I: Integer;
begin
{ проходим в цикле по каждому элементу массива
и выводим весь массив в Text1 }
for I := Variable.LowBound to Variable.HighBound do
Text1.Text := Text1.Text + ', ' + Variable.ValuesStr[I];
end.
вопрос как заполнить таблицу из 6 строк расположенную в скаде. И обновлять показания из таблицы mysql/ Необходимо вывести показания за последние 6 часов
Вы можете выполнить любой SQL-запрос от таблицы к базе данных и результаты запроса автоматически будут выведены в таблице. Для этого используется процедура RunSQL (https://simple-scada.com/help/script/trunsql.html) таблицы. Пример для вашей задачи:
var
aFrom, aTo: TDateTime;
aQuery, aFromStr, aToStr: string;
begin
aTo := Now; // текущее время в переменную aTo
aFrom := IncHour(Now, -6); // 6 часов назад в переменную aFrom
aToStr := MySQLDateTime(aTo, dttFull); // переводим время aTo в строку
aFromStr := MySQLDateTime(aFrom, dttFull); // переводим время aFrom в строку
{ формируем запрос к БД на выборку }
aQuery := 'SELECT * FROM `trends_data` WHERE ' +
'(`id`=' + IntToStr(MyVariable.ID) + ') AND ' +
'(`timestamp` >= ' + aFromStr + ') AND (`timestamp` <= ' + aToStr + ')';
{ выполнить запрос и заполнить таблицу результатом выполнения }
Table1.RunSQL(aQuery, tsAll);
end.
Сначала в переменные aFrom, aTo записывается интервал в последние шесть часов. Затем интервал переводится в строку пригодную для запросов к MySQL. Далее формируется запрос на выборку архивных данных переменной MyVariable за последние шесть часов. Результат выборки отобразится в таблице с именем Table1.
Добрый день, наконец-то руки дошли до испытания Вами предложенного метода ->
Вы можете выполнить любой SQL-запрос от таблицы к базе данных и результаты запроса автоматически будут выведены в таблице. Для этого используется процедура RunSQL (https://simple-scada.com/help/script/trunsql.html) таблицы. Пример для вашей задачи:
var
aFrom, aTo: TDateTime;
aQuery, aFromStr, aToStr: string;
begin
aTo := Now; // текущее время в переменную aTo
aFrom := IncHour(Now, -6); // 6 часов назад в переменную aFrom
aToStr := MySQLDateTime(aTo, dttFull); // переводим время aTo в строку
aFromStr := MySQLDateTime(aFrom, dttFull); // переводим время aFrom в строку
{ формируем запрос к БД на выборку }
aQuery := 'SELECT * FROM `trends_data` WHERE ' +
'(`id`=' + IntToStr(MyVariable.ID) + ') AND ' +
'(`timestamp` >= ' + aFromStr + ') AND (`timestamp` <= ' + aToStr + ')';
{ выполнить запрос и заполнить таблицу результатом выполнения }
Table1.RunSQL(aQuery, tsAll);
end.
Сначала в переменные aFrom, aTo записывается интервал в последние шесть часов. Затем интервал переводится в строку пригодную для запросов к MySQL. Далее формируется запрос на выборку архивных данных переменной MyVariable за последние шесть часов. Результат выборки отобразится в таблице с именем Table1.
результат 0, не выводиться информация в таблицу.
Решил пойти простым путем, а именно вывести всю таблицу: присвоил на клик по таблице скрипт
var
aQuery: string;
begin
aQuery := 'SELECT * FROM `par`';
Table2.RunSQL(aQuery, tsAll);
end.
итог обновляется таблица в скада только после перезапуска windows (сам в шоке, но просто останов и перезапуск клиента не помогает)
в MySql таблица par обновляется как положено раз в 30 мин, .... прописал в конец скрипта по обновлению таблицы в MySql вывод инфы в таблицу скады Table2...тоже обновление идет только после перезапуска windows....
куда копать? простейший скрипт
И почему нельзя сделать в редакторе просто присвоение таблицы в скаде к таблице имеющейся в БД? Без скриптов и заморочек
Здравствуйте.
итог обновляется таблица в скада только после перезапуска windows
Не обязательно перезапускать Windows, достаточно было перезапустить сервер скады (Server.exe) или проект на сервере. Если Вы не запускаете сервер скады вручную, то он автоматически запускается клиентом скады и отображается в области уведомлений (https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D1%83%D0%B2%D0%B5%D0%B4%D0%BE%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9). Судя по описанию Вы внесли изменения в проект и не перезапустили его. Далее перезапуск Windows привёл к перезапуску сервера скады и Вы начали работать с новой версией проекта.
сам в шоке, но просто останов и перезапуск клиента не помогает
Перезапуск клиента не всегда приводит к перезапуску проекта, т.к. проект исполняется на сервере скады (https://simple-scada.com/help/manual/server-status.html) и перезапускать проект нужно на сервере (мы ранее писали об этом в этом сообщении (https://simple-scada.com/forum/index.php?topic=539.msg5002#msg5002)). Также на серверном ПК можно в Options.exe включить флажок "Автоматически деактивировать проект, если у него нет клиентов" (https://youtu.be/k4bWNkGwdv4?t=583), тогда при отключении всех клиентов от сервера проект будет автоматически выключаться и при очередном включении он запустится со всеми и изменениями.
И почему нельзя сделать в редакторе просто присвоение таблицы в скаде к таблице имеющейся в БД? Без скриптов и заморочек.
Обычная выборка всех данных из таблицы используется редко, обычно используются более сложные запросы и гибкость можно получить только формируя запрос в скрипте. А для простой выборки не требуется сложных скриптов, можно сделать выборку в одну строчку:
begin
Table1.RunSQL('SELECT * FROM `par`', tsAll);
end.