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

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

Автор Тема: Вопросы по скриптам в Simple-Scada 2  (Прочитано 319814 раз)

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #435 : 01 Июля 2017, 09:17:58 »
Миханик, допустим у нас в БД есть таблица с именем `my_table` и в этой таблице есть столбец `val_date`, который хранит дату. Также в Редакторе переменных была создана переменная vrDate с типом данных DateTime, в неё мы будем читать дату из БД. Поставим в проект кнопку и на событие OnClick напишем код для выборки из БД:

Код
var
  aQuery: string;
begin
  aQuery := 'SELECT * FROM `my_table`;';    // формируем запрос на выборку всех строк из таблицы `my_table`
  RunSQL(aQuery, nil, 77);                  // запускаем запрос на выполнение с тегом 77
end.

Для обработки результата запросов используются скрипты с типом события "Выполнен SQL-запрос". Поэтому переходим в меню "Скрипты" и создаем новый скрипт с типом события "Выполнен SQL-запрос" и пишем следующий код:

Код
var
  aField: TM_DBField;
begin
  if DataSet.IsEmpty then Exit;   // прерываем выполнение если набор данных пуст
 
  { если это набор данных с тегом 77 }
  if DataSet.Tag = 77 then
  begin
    { ищем в наборе данных столбец с именем "val_date" }
    aField := DataSet.FieldByName('val_date');
    { если столбец найден }
    if aField <> nil then
      vrDate.Value := aField.AsDateTime;    // читаем дату из набора данных в vrDate
  end;
end.

Готово. Теперь после выполнения запроса будет произведён поиск столбца "val_date" и из него будет извлечена дата в переменную "vrDate".

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #436 : 21 Июля 2017, 14:19:12 »
Я столкнулся с интересной работой скрипта и стал разбираться. Дело касается локальных переменных объявляемых в скриптах. Я написал простой проект-тест. Кнопка и текстовое поле. По нажатию на кнопку (OnClick) выполняется скрипт
Код
var
  aCount : integer;
begin
  aCount := aCount + 1;
  Text1.Text := IntToStr(aCount);
end.   
Если я правильно понимаю, как работают локальные переменные (каждый раз при запуске скрипта для локальной переменной ищется свободное место в памяти, выделяется и инициализируется по умолчанию нулем), то при нажатии на кнопку в текстовом поле всегда должна выводиться 1. Но не тут то было. В SS2 локальная переменная работает не так. При повторном выполнении скрипта переменная сохраняет значение,  поскольку при каждом нажатии на кнопку значение в текстовом поле увеличивается на 1, т.е. aCount работает как счетчик. По-моему это неправильно. Так должна работать виртуальная переменная объявленная в списке переменных проекта. А это же локальная переменная созданная только на время работы скрипта, и при новом вызове скрипта ее значение утрачивается или я неправильно что-то понимаю?
И второй вопрос. У меня вызывается процедура AddMessageToGroup(), далее по программе присваивается значение переменной связанной со списком сообщений. Но в журнал первой попадает сообщение из списка, а уже потом сообщение созданное процедурой, иногда и с задержкой в секунду. Почему так получается?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #437 : 21 Июля 2017, 15:02:58 »
Цитировать
Если я правильно понимаю, как работают локальные переменные (каждый раз при запуске скрипта для локальной переменной ищется свободное место в памяти, выделяется и инициализируется по умолчанию нулем)
Локальные переменные в Pascal, Delphi, C, C++, C# и т.п. языках не инициализируются компилятором и это забота программиста. При каждом очередном вызове скрипта переменной выделяется область памяти и её структура может быть любой (зависит от того, что в ней хранилось ранее), соответственно и значение переменных после выделения памяти может быть каким угодно. Компилятор в Simple-Scada работает аналогично, но при первой инициализации все-таки обнуляет переменную, а при последующих выделяет ту же самую область памяти, что и в первый раз. Поэтому в переменной значение сохраняется (не касается динамических типов данных, например строк). При этом мы рекомендовали бы работать с локальными переменными как и в других языках, т.е. сначала инициализировать, а затем использовать, чтобы значение переменной всегда было очевидным.

Цитировать
И второй вопрос. У меня вызывается процедура AddMessageToGroup(), далее по программе присваивается значение переменной связанной со списком сообщений. Но в журнал первой попадает сообщение из списка, а уже потом сообщение созданное процедурой, иногда и с задержкой в секунду. Почему так получается?
Т.е. первое сообщение Вы создаёте процедурой AddMessageToGroup, а второе это обычное сообщение из меню "Проект -> Сообщения" которое генерирует скада при изменении переменной, мы правильно поняли? Причина, возможно, в последовательности записи в БД, хотя у нас такого не наблюдается и последовательность правильная. Вы уверены что событие OnDataChange переменной не наступает раньше чем Вы вызываете AddMessageToGroup?

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #438 : 21 Июля 2017, 15:18:20 »
Цитировать
При этом мы рекомендовали бы работать с локальными переменными как и в других языках, т.е. сначала инициализировать, а затем использовать, чтобы значение переменной всегда было очевидным.
Ясно. Значит буду явно ициализировать.

Цитировать
Вы уверены что событие OnDataChange переменной не наступает раньше чем Вы вызываете AddMessageToGroup?
Да. Это один длинный скрипт. Вначале идет условный вызов AddMessageToGroup, далее в операторе case идут варианты сообщений из списка. Скрипт выполняется один раз по-изменению.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #439 : 21 Июля 2017, 15:20:02 »
Цитировать
далее в операторе case идут варианты сообщений из списка
А как именно выглядит этот case? Можете показать код скрипта?

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #440 : 21 Июля 2017, 15:25:41 »
Я вам проект на почту вышлю. А то я не знаю, как сворачивать текст на форуме.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #441 : 21 Июля 2017, 15:26:54 »
Цитировать
А то я не знаю, как сворачивать текст на форуме.
Кнопка с иконкой решетки в форме ответа.

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #442 : 21 Июля 2017, 15:52:08 »
У меня с редактором какая-то ерунда творится. Перехожу на этот скрипт и редактор подвисает.  Пробую выделить фрагмент и снова подвисание.  Я думал проблема с компьютером, перезагрузился. И снова то же самое. А на других скриптах подвисаний нет. Это на новой версии 2.2.3.0. А раньше такого не было.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #443 : 21 Июля 2017, 15:53:34 »
Пришлите проект и укажите скрипт, мы проверим.

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #444 : 21 Июля 2017, 16:24:24 »
С порядком сообщений разобрался. Я был не прав. Порядок верный, как вызываются, так и попадают в журнал. Сам уже забыл как сделал)
Подвисание при выделении - выслал проект.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #445 : 22 Июля 2017, 12:50:39 »
Цитировать
Подвисание при выделении - выслал проект.
Спасибо. Исправили. Скачать обновлённую версию можно по последней ссылке (2.2.3.0). Проект нужно пересохранить обновленной версией.

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #446 : 25 Июля 2017, 09:46:31 »
Здравствуйте.
Почему сообщения в списках Неподтвержденные и Все сообщения/Сообщения в группах имеют разный порядок? В неподтвержденных я считаю порядок правильный. (Выбор программы и шага/Номер программы изменен/Останов) Как вызываются, так и показываются. А в группах и во всех сообщениях применена какая-то сортировка (у сообщений одинаковое время)?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #447 : 26 Июля 2017, 09:29:19 »
TeNQ, здравствуйте. Да, это из-за одинакового времени. Для ускорения выборки данных из БД все таблицы индексируются по нескольким полям. Если время у сообщений одинаковое, то индекс будет проходить по ID, соответственно порядок может измениться. Если Вы создаёте эти сообщения при помощи процедуры AddMessage, то можно регулировать порядок вычитая миллисекунды, например так:

Код
begin
  AddMessage(IncMilliSecond(Now, -2), mkAlarm, 'Первое сообщение', True, True);
  AddMessage(IncMilliSecond(Now, -1), mkAlarm, 'Второе сообщение', True, True);
  AddMessage(Now, mkAlarm, 'Третье сообщение', True, True);
end.

Т.е. время каждого сообщения теперь уникально и оно определяет порядок сообщений.

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #448 : 02 Августа 2017, 07:59:31 »
Добрый день.
Существует необходимость читать биты в слове состояния типа LongWord. Функцией GetBit удаётся считать только первые 16. 17 и далее биты воспринимаются как 0-15. Есть ли возможность корректно считать весь LongWord по битам или придётся его "резать" на части?
Заранее спасибо.

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #449 : 02 Августа 2017, 08:28:13 »
Здравствуйте.
Функция GetBit достаточно корректно работает с LongWord(по крайней мере у меня). Данный тип взаимодействия с переменной использую очень интенсивно.
Практически все аварии, сообщения, кнопки.
Возможно что то с OPC сервером?.
« Изменён: 02 Августа 2017, 08:29:20 от deldemo »