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

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

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

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #150 : 11 Октября 2016, 10:44:06 »
Здравствуйте.

Итак, у нас есть объект текст с именем "txtTime" в который мы будем выводить время в формате "ММ:СС". Есть поле "Filed1", которое связано с переменной таймера. Переменная таймера имеет имя "vrTimerState".

В результате у нас должны быть следующие переменные:
  • vrTime, хранит время старта таймера и имеет тип данных DateTime и неограниченную шкалу;
  • vrTimerState, сама переменная таймера. 1 - таймер запущен, 0 - выключен;
В событие OnDataChange для поля "Field1" пишем следующий код:
Код
begin
  { запуск таймера }
  if vrTimerState.AsInt = 1 then
    vrTime.Value := Now
  else
    { остановка таймера }
    txtTime.Text := '00:00';
end.

Далее создаём новый скрипт с типом события "Прошла секунда". Такой скрипт будет выполняться каждую секунду. Пишем в него следующий код:
Код
var
  aTime: TDateTime;
begin
  { Если таймер запущен, то обновляем время каждую секунду }
  if vrTimerState.AsInt = 1 then
  begin
    aTime := Now - vrTime.Value;
    SetTimeFormat('nn:ss');  // формат минуты:секунды
    txtTime.Text := TimeToStr(aTime);
  end;
end.
« Изменён: 11 Октября 2016, 10:45:02 от Simple-Scada »

Yuriy

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #151 : 12 Октября 2016, 00:02:18 »
Спасибо ОГРОМНОЕ! Завтра попробую на работе. Еще хотел описать задачу, которую я пытаюсь реализовать в Скаде. Есть переменная в OPC-сервере, которая может принимать значения 0 или 1. Таймер должен считать время в Сек (максимум до 200 Сек) в течении которого переменная принимает значение 1. При значении переменной 0 - счет останавливается и оператор снимает показание таймера. Попробую переменную vrTimerState заменить на переменную с OPC-сервера. И можно ли реализовать формат ('sss') - Секунды как 3 цифры?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #152 : 12 Октября 2016, 10:28:53 »
Цитировать
Таймер должен считать время в Сек в течении которого переменная принимает значение 1. При значении переменной 0 - счет останавливается и оператор снимает показание таймера.
Здесь все то же самое, как в примере выше, как Вы правильно поняли нужно только заменить переменную vrTimerState.

Цитировать
И можно ли реализовать формат ('sss') - Секунды как 3 цифры?
Если нужно представление только в секундах, то можно изменить секундный таймер вот так:

Код
var
  aTime: TDateTime;
begin
  { Если таймер запущен, то обновляем время каждую секунду }
  if vrTimerState.AsInt = 1 then
    txtTime.Text := IntToStr(SecondsBetween(Now, vrTime.Value));  // выводим количество секунд
end.

596039

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #153 : 13 Октября 2016, 22:58:10 »
Добрый день, у нас почему то после добавления нового скрипта перестал запускаться проект. Не открывается ни в клиенте, ни в редакторе, тот же проект без нового скрипта открывается всем. Сейчас в наличии демо-версия, проект во вложении.
« Изменён: 13 Октября 2016, 23:00:16 от 596039 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #154 : 14 Октября 2016, 00:40:59 »
Здравствуйте.

Почему-то в проекте отсутствуют следующие два файла:
  • ..\Simple-Scada 2\Projects\БЦ Октябрьский\Servers.ssr
  • ..\Simple-Scada 2\Projects\БЦ Октябрьский\Scripts\Scripts.ssc
Возможно они как-то потерялись при копировании проекта или подобных действиях? Либо были блокированы/удалены антивирусом, или подобным ПО? Есть ли у Вас резервные копии проекта?
Мы можем восстановить проект завтра, но для этого нам нужно знать какой OPC-сервер Вы использовали для внешних тегов. Лучше всего для нас получить полные параметры OPC-сервера. Для этого создайте новый пустой проект в Редакторе. Войдите в меню "Проект - OPC-серверы" и добавьте OPC-сервер, который Вы использовали в проекте "БЦ Октябрьский". Далее сохраните проект и отправьте его нам.
« Изменён: 14 Октября 2016, 00:42:15 от Simple-Scada »

596039

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #155 : 14 Октября 2016, 12:13:33 »
Спасибо, скопировал файлы из резервной копии и все заработало. Причина скорее всего в том что у нас все проекты лежат на яндекс-диске, и он не успел синхронизироваться до того как я  выключил компьютер.

596039

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #156 : 16 Октября 2016, 18:24:21 »
Здравствуйте, есть необходимость читать состояние нескольких битов из внешней переменной общей для двух установок ("Alarm_PV1"). И записывать значение аварии во внутреннюю переменную привязанную к одной из них ("Alarm_P1"). Написал скрипт, но значение переменной "Alarm_P1" присваивается только когда выполняется первая строка, при выполнении условий других строк значение не "Alarm_P1" остается прежним. Объясните пожалуйста где я ошибся. 

Код
begin
if GetBit(Alarm_PV1.Value,1) = true or
   GetBit(Alarm_PV1.Value,2) = true or                                   
   GetBit(Alarm_PV1.Value,4) = true or
   GetBit(Alarm_PV1.Value,5) = true or
   GetBit(Alarm_PV1.Value,6) = true or
   GetBit(Alarm_PV1.Value,10) = true or
   GetBit(Alarm_PV1.Value,11) = true or
   GetBit(Alarm_PV1.Value,12) = true or
   GetBit(Alarm_PV1.Value,13) = true or
   GetBit(Alarm_PV1.Value,14) = true then
   Alarm_P1.Value := 1 else
   Alarm_P1.Value := 0
end.
« Изменён: 16 Октября 2016, 18:55:42 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #157 : 16 Октября 2016, 19:00:05 »
Здравствуйте.

Правильный вариант скрипта должен быть таким:
Код
var
  aValue: Integer;
begin
  { записываем в aValue значение переменной Alarm_PV1 в виде целого числа }
  aValue := Alarm_PV1.AsInt;   
 
  { проверяем нужные биты }
  if GetBit(aValue, 1) or
     GetBit(aValue, 2) or
     GetBit(aValue, 4) or
     GetBit(aValue, 5) or
     GetBit(aValue, 6) or
     GetBit(aValue, 10) or
     GetBit(aValue, 11) or
     GetBit(aValue, 12) or
     GetBit(aValue, 13) or
     GetBit(aValue, 14) then
    Alarm_P1.Value := 1
  else
    Alarm_P1.Value := 0;
end.

Также обращаем внимание, что в функции GetBit биты нумеруются с нуля.

596039

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #158 : 16 Октября 2016, 20:56:45 »
Спасибо

Yuriy

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #159 : 17 Октября 2016, 17:26:47 »
Добрый день!
По ходу изучения Скады появилось еще несколько вопросов.
  • В OPC-сервере имеется переменная U, кот. представляет собой напряжение, снятое с АЦП и имеющее диапазон значений 0 (0.00В) до 600 (6.00В). В скаде я создаю переменную adc0, в которой сдвигаю запятую влево на 2 знака. Индикацию переменной делаю в обьекте Текст со скриптом по событию OnDataChange:
    begin
      Text1.Text := adc0.AsStr;
      case adc0.AsInt of
        0.00..4.29: Text1.FontColor := clRed;      // Красный
        4.30..5.19: Text1.FontColor := clBlack; // Черный
        5.20..6.00: Text1.FontColor := clRed;   // Красный
      end;
    end.

    В результате - не работает (вернее, работает, но не в том диапазоне) изменение цвета шрифта при уходе значения переменной за допустимый диапазон. Таких переменных
    в проекте предполагается порядка 100 штук и все они имеют свой диапазон допустимых значений. Или придется вводить по 2 переменных на каждый тег OPC-сервера - одна для индикации значения со сдвигом запятой, вторая - без сдвига для индикации допустимого диапазона.
  • Цветовая схема моего проекта - сизый (в идеале бы хотелось - черный).Добавляю обьект Page. Здесь я хотел бы выводить Таблицу на всю страницу для отображения значений переменных с последующей печатью. Фон страницы нужен Белый. Как лучше это реализовать?
  • Как я писал выше, в проекте предполагается порядка 100 переменных (т.е. нужно сформировать таблицу 1 столбец x 100 строк. Далее предполагается поместить устройство в камеру холода и вновь снять значения 100 переменных. Можно ли все эти значения экспортировать в таблицу EXCEL или в БД MySQL? Или экспорт работает только с Трендами?
  • Нигде не мог найти, какие арифметические и логические функции можно использовать в скриптах. В предыдущем посте вот только увидел  функцию "or". Почему имя переменной при обьявлении в скриптах начинается с буквы "a" - aValue?
« Изменён: 17 Октября 2016, 18:11:51 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #160 : 17 Октября 2016, 19:34:31 »
Здравствуйте.

Цитировать
В OPC-сервере имеется переменная U, кот. представляет собой напряжение, снятое с АЦП и имеющее диапазон значений 0 (0.00В) до 600 (6.00В).
Конструкция case..of применяется только для целых чисел. Для вещественных придется писать обычные сравнения по типу "if aVar.AsFloat > 4.56 then". Но в Вашем случае, как мы поняли. переменная adc0 это целочисленная переменная со сдвигом запятой на 2 знака влево. Если это так, то вместо "adc0.AsInt" лучше использовать "adc0.OriginalAsInt". OriginalAsInt возвращает оригинальное значение переменой, без смещения запятой. И тогда можно использовать конструкцию case..of, вот так:
Код
begin
  Text1.Text := adc0.AsStr;
  case adc0.OriginalAsInt of
    0..429:   Text1.FontColor := clRed;   // Красный
    430..519: Text1.FontColor := clBlack; // Черный
    520..600: Text1.FontColor := clRed;   // Красный
  end;
end.

А т.к. таких переменных предполагается около 100, то чтобы не писать 100 по сути одинаковых скриптов, лучше всего сделать один универсальный скрипт. Для этого нужно в Редакторе у объекта "Text1" выбрать свойство "Переменная" - "adc0". Затем создать универсальный скрипт:
Код
var
  aText: TM_Text;
begin
  { прерываем процедуру, если скрипт вызван не объектом Текст }
  if not (Sender is TM_Text) then Exit;
  aText := Sender as TM_Text;

  aText.Text := aText.AsStr;
  case aText.Variable.OriginalAsInt of
    0..429:   aText.FontColor := clRed;   // Красный
    430..519: aText.FontColor := clBlack; // Черный
    520..600: aText.FontColor := clRed;   // Красный
  end;
end.

Такой скрипт можно поставить любому объекту типа Текст на событие OnDataChange и он будет работать. При этом у каждого объекта Текст можно выбрать свою переменную и скрипт будет работать именно с этой переменной. Не придется писать 100 подобных скриптов. Подробнее про универсальные скрипты можно прочесть здесь.

Цитировать
Фон страницы нужен Белый. Как лучше это реализовать?
Здесь можно посоветовать только поставить в качестве фона объект Фигура (Shape), растянуть его на нужную зону и выбрать цвет.

Цитировать
Можно ли все эти значения экспортировать в таблицу EXCEL или в БД MySQL? Или экспорт работает только с Трендами?
Сейчас Simple-Scada 2 может выполнять любые запросы к БД и Вы можете сделать что угодно используя все возможность языка SQL. Для выполнения пользовательских SQL команд используйте процедуру RunSQL. Можно создать отдельную таблицу и добавлять в неё любые данные. Здесь главное знать как правильно написать SQL запросы. Хороший пример есть в Демо-проекте (страница Скрипты - Работа с БД). там есть и создание таблицы, запись и чтение из этой таблицы. Можно также вместо БД выводить данные в текстовые, или двоичные файлы. Экспортировать в Excel сейчас можно только данные переменных, которые пишутся в тренды.

Цитировать
Нигде не мог найти, какие арифметические и логические функции можно использовать в скриптах.
В скриптах Simple-Scada 2 используется Object Pascal компилятор. Обо всех командах и операторах присущих языкам Pascal/Delphi можно прочесть в интернете на сайтах связанных с языками Pascal/Delphi. Например, описание типов данных и ключевые слова (к которым и относятся такие слова как or или and и др.).

Цитировать
Почему имя переменной при обьявлении в скриптах начинается с буквы "a" - aValue?
Это распространенный в программировании способ именования локальных переменных, или параметров методов. Буква "a" добавляется для того, чтобы имя стало уникальным, это позволяет убрать возможную путаницу в именах переменных/объектов и совпадение имён.
« Изменён: 17 Октября 2016, 19:36:10 от Simple-Scada »

Yuriy

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #161 : 17 Октября 2016, 21:18:54 »
Спасибо большое! По поводу универсального скрипта - скорее мне не подойдет, т.к. допустимые значения у всех переменных - разные. По поводу БД - обязательно попробую как установлю MySQL. По ссылке к языку Delphi - не вижу оператора умножения (или его просто нет)?  И по имени локальной переменной при обьявлении в скриптах - можно ли обозвать ее не aValue, а например bValue?

int2246

  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #162 : 18 Октября 2016, 14:28:45 »
Задача такая сделать универсальный скрипт при выполнении которого переменная привязана к объекту меняла значение.
Создал переменную лампочка с именем Imag1 и виртуальную переменную test типа Boolian, при старте проекта переменной test присваиваемым "лож"
написал вот такой скрипт который выполняется по двойному щелчку мышки

begin
  case TM_Object(Sender).AsInt of           
    0 : test.Value := 1;       
    1 : test.Value := 0;
  end;
  end.

все работает. но как бы сделать универсальный скрипт чтобы не писать имя переменной если она присвоена к объекту?

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #163 : 18 Октября 2016, 16:28:37 »
Цитировать
По ссылке к языку Delphi - не вижу оператора умножения (или его просто нет)? 
Yuriy оператор умнажения есть *

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #164 : 18 Октября 2016, 21:21:36 »
По ссылке к языку Delphi - не вижу оператора умножения (или его просто нет)?
Обычные операторы: "+" (сложение), "-" (вычитание), "/" (деление с остатком), "*" (умножение).

И по имени локальной переменной при обьявлении в скриптах - можно ли обозвать ее не aValue, а например bValue?
Да, можно использовать любое имя.

int2246, здесь все просто, любой объект (TM_Object) имеет свойство Value (значение переменной с которой он связан)

Код
begin
  with TM_Object(Sender) do  // далее будем работать с объектом Sender приведенным к типу TM_Object
    case AsInt of           
      0: Value := 1;       
      1: Value := 0;
    end;
end.