Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Запись массива типа Double в таблицу  (Прочитано 12820 раз)

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Запись массива типа Double в таблицу
« : 11 Января 2018, 13:50:27 »
Добрый день,
hda клиента для чтения с opc hda сервера "Логика" я так понимаю нет в simple scada?

И так суть вопроса: для передачи hda тега с opc hda сервера пришлось установить Multi-Protocol MasterOPC Server через который передаю hda тэг в simple scada. тэг формата double - его нужно записать в таблицу для формирования посуточного архива показаний потребления пара.

загвоздка в том что в MasterOPC server полученные данные в виде таблицы вижу, а при передаче в simple scada всегда 0....даже последнее значение не показывает из всего массива.

если непонятно выразился накидаю скриншотов. Голова уже сегодня :-\
« Изменён: 12 Января 2018, 14:51:32 от Simple-Scada »

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: запись переменной типа double в таблицу
« Ответ #1 : 12 Января 2018, 12:28:31 »
продолжаем разговор, сделал запись DA тэгов скриптом (Запись в БД по таймеру) в mySql, вопрос как заполнить таблицу из 6 строк расположенную в скаде. И обновлять показания из таблицы mysql/ Необходимо вывести показания за последние 6 часов


грубо говоря есть ли возможность отображать таблицу из MySql в таблице скады. С привязкой к последним 6 строкам
« Изменён: 12 Января 2018, 13:11:31 от asutpvit »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: запись переменной типа double в таблицу
« Ответ #2 : 12 Января 2018, 13:33:12 »
Здравствуйте.

Если мы правильно поняли, то у Вас в "Multi-Protocol MasterOPC" тег считанный с OPC-HDA представляет собой массив значений типа Double. В Simple-Scada 2 можно работать с такими переменными. Для этого в меню редактирования переменных нужно создать (или импортировать с OPC-сервера) переменную. В Simple-Scada у такой переменной должен быть тип данных "Double array". Объекты (такие как Поле, Уровень, Текст и т.д) не могут работать напрямую с переменной-массивом. Сначала нужно "разложить" массив по другим переменным с типом данных Double.

Рассмотрим простой пример. Допустим у нас есть переменная массив (Double array) с именем vrMyArray и нам нужно разложить массив по трём отдельным внутренним переменным vrDouble1, vrDouble2, vrDouble3. Тогда решение будет таким:

1. Переходим в меню скриптов и создаем новый скрипт с типом события "Изменились переменные". В список переменных добавляем нашу переменную-массив vrMyArray (как в этой инструкции). Теперь этот скрипт будет вызываться каждый раз когда переменная-массив изменилась.

2. Пишем такой код в скрипт:
Код: (delphi)
begin
  vrDouble1.Value := Variable.Values[0];
  vrDouble2.Value := Variable.Values[1];
  vrDouble3.Value := Variable.Values[2];
end.

Готово. В скрипте мы в vrDouble1 записываем первое значение из массива. В vrDouble2 второе значение из массива и так далее. Теперь эти переменные сожно взяаться с полями, уровнями, или  другими объектами. Этот способ подходит если нам точно известно, что массив содержит три элемента. Если массив может содержать любое количество элементов, или его размер меняется во время работы проекта, то нужно проходить по элементам массива в цикле, например так:
Код: (delphi)
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 таблицы. Пример для вашей задачи:
Код: (delphi)
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.
« Изменён: 20 Ноября 2018, 11:01:03 от Simple-Scada »

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: запись переменной типа double в таблицу
« Ответ #3 : 12 Января 2018, 14:44:23 »
Спасибо, испытаю данные действа в понедельник. Пока пусть на тренды бдят)

п.с. А есть возможность не закрывая клиент (сочетание клавиш там...) проверить изменения сделанные в editor? уж ооочень неудобно сохраняться, выключать редактор, выключать клиент, запускать клиент и проверять изменения. В Scada iFix реальзовано путем перехода из режима редактирования в режим run-time через комбинацию клавиш.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Запись массива типа Double в таблицу
« Ответ #4 : 13 Января 2018, 10:49:41 »
Здравствуйте!

Созданный проект выполняется на сервере Simple-Scada (Server.exe). После внесения изменений в проект его необходимо перезапустить на сервере(см. скриншот). При этом, закрывать редактор и клиент не обязательно. Клиенты автоматически подключатся к обновленному проекту. Для удобства разработки в настройках Options.exe по-умолчанию установлена опция "Автоматически деактивировать проект, если у него нет клиентов", поэтому при закрытии клиента происходит деактивация проекта, а при запуске клиента происходит запуск обновленного проекта. Поэтому для проверки изменений можно либо перезапускать клиент, либо перезапускать проект на сервере (клиент при этом закрывать не обязательно).

« Изменён: 13 Января 2018, 10:56:57 от Simple-Scada »

Saveliy

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Запись массива типа Double в таблицу
« Ответ #5 : 14 Января 2018, 22:34:56 »
Здравствуйте.

Описанное решение позволяет прочитать элементы тега массива через скрипты.
Возможно ли присвоить им значения?

Данный вопрос возник в связи с особенностями работы OPC сервера kepware. При импорте тегов с OPC UA Сервера, массивы он оставляет тегами типа массив, а поэлементные теги необходимо добавлять вручную.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Запись массива типа Double в таблицу
« Ответ #6 : 15 Января 2018, 10:47:27 »
Здравствуйте!

Цитировать
Описанное решение позволяет прочитать элементы тега массива через скрипты. Возможно ли присвоить им значения?
Такой возможности нет. Возможно только чтение массивов.
« Изменён: 15 Января 2018, 10:48:31 от Simple-Scada »

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Запись массива типа Double в таблицу
« Ответ #7 : 16 Января 2018, 14:28:15 »
задам еще вопрос в "своей" теме:

оооочень сильно разочаровал 1 факт : при удалении переменный удаляется присвоение данной переменой со схемы.
Опишу ситуацию которую сегодня словил: была необходимость изменить частоту опроса у 27 переменных, выгрузил все в csv, далее изменил период опроса у необх переменных. А при загрузке мне выдает не найдено новых переменных, ну хорощо - удаляем все переменные  ( все значит все, т.к. выгружал сразу все переменные, а изменял только необходимые) - далее импортирую в проект, сохраняю. захожу в клиент и вижу "фигу" все мнемосхемы слетели, привязок к переменным нет нигде изза удаления из меню переменные.


Возможно ли реализовать в дальнейших версиях "такой механизм" : при удалении переменной из меню, чтобы не удалялась привязка к имени переменной в мнемосхеме......Ну ооочень необходим данный функционал, т.к. проще изменить неверную ссылку на переменную если что чем переделывать весь проект.(

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Запись массива типа Double в таблицу
« Ответ #8 : 16 Января 2018, 14:48:14 »
Здравствуйте!

Цитировать
была необходимость изменить частоту опроса у 27 переменных, выгрузил все в csv
Если нужно изменить какие-либо свойства множества переменных, то не обязательно делать это через CSV-файл. Поддерживается групповое редактирование свойств переменных - для этого нужно выделить необходимые переменные и нажать кнопку "Изменить выделенные"(кнопка с иконкой карандаша). Выделить переменные можно кликая по ним ЛКМ с зажатой клавишей "Shift" или "Ctrl" или нажать сочетание клавиш "Ctrl + А" для выделения всех переменных группы. С другими сочетаниями клавиш можно ознакомиться здесь.

Цитировать
выгрузил все в csv, далее изменил период опроса у необх переменных. А при загрузке мне выдает не найдено новых переменных
Если необходимо, чтобы совпадающие по имени переменные обновили свои свойства, то при импорте из CSV файла нужно нажать кнопку "Импортировать" удерживая клавишу "Shift" на клавиатуре. Для удобства, в окошке импорта имеется подсказка(см. вложение).

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Запись массива типа Double в таблицу
« Ответ #9 : 17 Января 2018, 12:33:59 »
Здравствуйте, спасибо за наводки. Продолжаю изучать simple-scada, появился еще вопрос:

во вложении скрин, на нем видно что тренды пропали до 10 утра 17.01. Переименовывания клиента не было. В 10 утра производилась привязка переменных к трендам, к мнемосхемам и т.д. Имя переменных остались неизменны. Почему так произошло? есть возможность восстановить накопленные за месяц показания?  Так же не ведется лог сообщений и действий оператора.....куда копать?

если выбрать период 2 дня то видны тренды продолжительностью 10 мин за 16.01.....


П.с. перезагрузил АРМ и сообщения появились, а с трендами беда....
« Изменён: 17 Января 2018, 12:47:45 от asutpvit »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Запись массива типа Double в таблицу
« Ответ #10 : 17 Января 2018, 12:58:29 »
Здравствуйте.

Цитировать
В 10 утра производилась привязка переменных к трендам
Т.е. Вы связали тренды с какими-то переменными? А что было до этой привязки? Они были связаны с другими переменными?
Включено ли ограничение архива трендов или архива сообщений в вашем проекте в меню "Проект" -> "Настройки".
Выводятся ли какие-ниюудь предупреждающие сообщения в журнале сервера?
Вы используете последнюю версию Simple-Scada 2.2.7.1?

Цитировать
есть возможность восстановить накопленные за месяц показания?
Данные не могли просто так удалиться, если не включено ограничение архива трендов и если Вы не очистили таблицы трендов в БД вручную. Может быть Вы связали тренды с другими переменными? Или пересоздали переменные в редакторе переменных (тогда у них будет новый ID и архивация начнется с нуля)? Или возможно вносились какие-то изменения в работу СУБД или в настройки Базы данных в редакторе скады?
« Изменён: 17 Января 2018, 13:09:26 от Simple-Scada »

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Запись массива типа Double в таблицу
« Ответ #11 : 17 Января 2018, 13:24:03 »
сообщения пишутся и есть все сейчас после перезагрузки в полном объеме с декабря мес. Версия 2.2.7.1. Если посмотреть через workbench то таблица trends_data заполнена. Приявязка трендов была к тем же переменным что и ранее( это касается поста выше, где писал что удалив все переменные пропала привязка к трендам и мнемосхемам, в 10 утра сегодня восстановили привязку) и странным образов пишутся сейчас тренды. Есть 2 орс сервера (логика и базис) с базиса тренды с 10 утра без перерыва сегодня пишутся, а от логики пишутся с момента включения клиента. Т.е. при выключении клиента теряются все записанные за время его работы данные по тегам с орс логика, и начинается запись с момента включения клиента скады.....


период опроса только отличается у тэгов опрашиваемых с данных серверов.

арм на котором установлена скада:
win 10 professional x64,
intel core i5-7400
8gb RAM
просадок производительности не наблюдается   


вообще не понимаю что происходит, после прошествия получаса, появились тренды с 10 утра и по второму орс серверу. до 10 утра так же все пусто кроме как 10 минут за 16.01. Переменные не переименовывал, ограничений на запись трендов нет - перепроверил ( сообщения все и действия оператора появились....) Странно все как то, может попробовать очистить бд?
« Изменён: 17 Января 2018, 13:50:25 от asutpvit »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Запись массива типа Double в таблицу
« Ответ #12 : 17 Января 2018, 14:16:33 »
Цитировать
Переменные не переименовывал, ограничений на запись трендов нет - перепроверил ( сообщения все и действия оператора появились....) Странно все как то, может попробовать очистить бд?
Имена переменных никак не связаны с данными в БД. У переменных есть ID (уникальный идентификатор), который и используется в БД. Поэтому Вы можете переименовывать переменные в любое время и это никак не скажется на архивных данных или трендах, ведь ID от переименования переменной не изменяется.

Все проблемы возникли из-за этого:
...ну хорощо - удаляем все переменные (все значит все, т.к. выгружал сразу все переменные, а изменял только необходимые) - далее импортирую в проект, сохраняю.
После того как Вы удалили переменные, создать новые с такими же ID уже не получится, пусть даже с теми же именами. Так и произошло, после импорта из CSV у Вас появились переменные со старыми именами, но с новыми ID и тренды как положено начали записываться сначала.

Поэтому в данной ситуации действительно проще удалить БД и начать архивацию сначала и впредь не удалять переменные, а обновлять их свойства.
« Изменён: 17 Января 2018, 14:17:42 от Simple-Scada »

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Запись массива типа Double в таблицу
« Ответ #13 : 19 Января 2018, 12:48:14 »
Здравствуйте, подскажите почему загрузка значений трендов некоторых переменных (все с одного opc-сервера) происходит с большой задержкой до 15 минут. Разве значения трендов не хранятся в Mysql? Происходит следующее: при перезапуске клиента, нужно проверить первым делом расход пара получаемого с тэц (данные переменные идут черед opc сервер логика а в него через gprs модем.), А они не отображаются сразу....время загрузки доходит до 15 мин. Тренды переменных с opc сервера базис прогружаются моментально....(их большинство).

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Запись массива типа Double в таблицу
« Ответ #14 : 21 Января 2018, 19:11:54 »
Здравствуйте.

В MySQL хранятся архивные данные для архивных трендов, которые просматриваются в меню трендов. Тренды которые отображаются в компоненте "Временные тренды" не читаются из базы данных, они хранятся в оперативной памяти только во время работы проекта и удаляются при выключении проекта.

Цитировать
почему загрузка значений трендов некоторых переменных (все с одного opc-сервера) происходит с большой задержкой до 15 минут... они не отображаются сразу....время загрузки доходит до 15 мин.
Simple-Scada получает значения тегов от OPC-сервера и без каких-либо задержек отображает их на экране. Если значение отображается с задержкой, значит оно с задержкой приходит от OPC-сервера. Скорее всего просто OPC-сервер долго читает значения с устройства. Вы можете запустить проект, открыть OPC-сервер и посмотреть значения на нём, скорее всего на OPC-сервере значения появятся как раз с задержкой в 15 мин. Такая задержка может возникать при неправильной настройке конфигурации OPC-сервера, либо при плохом или медленном канале связи между OPC-сервером и конечным устройством.