Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

Rymaks

#135
Подскажите, как реализовать задержку по времени. Например я хочу чтобы одна переменная на 2 секунды принимала одно значение, а по про шествию 2 секунд - другое.

Вот такой вариант почему то не работает - зависает:

Код: pascal
 
var
   A: TDateTime;
begin
   A := Now;
   repeat
     Field1.Color := clGreen;
   until SecondsBetween(Now, A) > 2 ;
   
  Field1.Color := clRed;
end.    
   

Simple-Scada

#136
Rymaks, дело в том, что Вы сначала записываете в A текущее время, а затем в цикле сравниваете его с текущим временем, т.е. по сути получается сравнение одинакового времени и цикл крутится бесконечно. Для правильной реализации таймеров через скрипты придется использовать глобальные переменные и делать это нужно так:
  • создайте новую внутреннюю (виртуальную) переменную в Редакторе переменных. Тип данных DateTime, шкала от -2147483648 до 2147483648. Имя например vrTime;
  • создайте скрипт с типом события "Прошла секунда" и вставьте в него код представленный ниже;

Код: pascal
begin
  { прерываем процедуру, если прошло меньше 2 секунд }
  if SecondsBetween(Now, vrTime.AsDateTime) < 2 then
    Exit;

  vrTime.Value := Now;

  { Весь код далее будет выполнен с частотой 2 секунды  }
  // ...
  // ...
end.

Учитывайте, что все скрипты выполняются на сервере, а на клиенты информация передается каждые пол секунды, а значит в некоторые моменты, при просмотре значения на клиенте будет казаться что прошло больше 2 секунд, но частота выполнения таймера на сервере при этом будет правильной. Также ни в коем случае не используйте подобные таймеры для управления важными или опасными процессами, т.к. это поставит процессы в зависимость от скады. В этом случае реализуйте таймер на уровне контроллера.

EnterDownload

#137
Есть ли возможность управлять свойствами страниц? Допустим, нужно сделать некоторые страницы неактивными, чтоб они вообще изчезли из списка или при нажатии на них ничего не происходило бы? Свойства Enabled и Visible есть, но первое вроде ничего не меняет совсем, а второе read-only.

Simple-Scada

EnterDownload, сейчас практически все свойства страниц не влияют на их поведение. Постараемся разрешить работу со свойствами Enabled и Visible в следующем обновлении.

mikl182

Добрый день.
На могу разложить байт с OPC сервера на биты, использую getbit и присваиваю значение внутренней переменной, при компиляции пишет Incompatible types "TM_Variable" and "BOOLEAN", хотя переменная булевая.

Simple-Scada

mikl182, вероятно Вы выполняете присваивание так: MyVariable := GetBit(...); Это неправильно, ведь переменная имеет тип TM_Variable (описание типа здесь) и включает в себя множество свойств, одно из которых Value (значение переменной). Его и нужно использовать.

Например:
Код: pascal
  MyVariable.Value := GetBit(...);

mikl182

#141
Да действительно, теперь скрипт компилируется, но значение бита не возвращает. Написал так
Код: pascal
begin
  svet1.Value := GetBit(tag1.Value, 0);
end.

Simple-Scada

mikl182, Ваш скрипт должен работать, только что проверили его в разных вариациях, работает. Может быть нулевой бит переменной tag1 в вашем случае просто равен 0 (False) и не меняется, поэтому скрипт пишет в svet1 значение 0 (False)? Или же переменная svet1 перезаписывается ещё где-то?

Dimon

Здравствуйте. Заметил такую вещь, что на время работы скрипта не работают другие скрипты и сервер. У вас это что реализовано в одном потоке?  :o Не получается запустить 2-ва скрипта одновременно.

Simple-Scada

Здравствуйте, Dimon.

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

Dimon

Достаточно в скрипте "Запуск проекта" вставить бесконечный цикл типа While (1) {} запустить прект и наблюдать как все повисло. А сервер в диспетчере задач начинает уничтожать свободную память.
Вариант номер два. В пустом проекте  ставим кнопку. К этой кнопке прикручиваем универсальный скрипт с бесконечным циклом While (1) {}. Запускаем проект жмем кнопку и весь проект замирает.

Simple-Scada

#146
Dimon, не нужно так никогда делать. Любую задачу можно решить без использования бесконечных циклов, для этого в Simple-Scada есть система событий. Какую задачу Вы пытаетесь решить? Опишите её, мы предложим Вам решение без использования бесконечного цикла. Зависание сервера при использовании бесконечных циклов исправим в след. обновлении.

Dimon

#147
вопрос:
Какую задачу Вы пытаетесь решить?

ответ:
Требуется запустить два скрипта одновременно (виртуально)!!! 

Цитироватьне нужно так никогда делать
Что это значит >:( (? Вы предусмотрели возможность бесконечных (или не бесконечных while (A < B)) циклов, так будьте добры реализовать эту функцию (только в  разных потоках, или один скрипт один поток ПК) и все будет ОК.

Короче надо функцию:

main
  {
    while (1)
     {
         ....
         тут управляем другими скриптами
         ....
     }
   }

Simple-Scada

#148
ЦитироватьЧто это значит >:( (?
Как мы и написали в предыдущем сообщении, работа скриптов в Simple-Scada 2 основана на системе событий которые возникают в процессе работы сервера скады (Server.exe). Сервер сам по себе является бесконечным циклом во время работы которого возникают события и выполняются соответствующие им скрипты. Если Вам нужно обрабатывать какие-то данные постоянно (или на протяжении какого-то времени), то нужно делать это на основе таймеров (+ это хорошо скажется на производительности), а не бесконечных циклов, т.к. это противоречит системе которая используется в Simple-Scada 2.

ЦитироватьКороче надо функцию:
main
  {
    ...
Исходя из того, что описано выше - ничего подобного мы не планируем и если для Вас критически важно организовать обработку в бесконечном цикле, то стоит присмотреться к другим SCADA-системам.

Yuriy

#149
Добрый день! Вопрос следующий. Мне нужно  реализовать таймер времени (обьект Текст - txtTime) в формате минуты:секунды, привязанный к переменной с OPC-сервера (выводится в Скаде в обьекте Поле = field1). При установке переменной в 1 - запуск счета и останов таймера при значении переменной 0. Следуя аналогии DemoProject, в событии OnDataChange обьекта field1 пишем скрипт:
Код: pascal
if field.value :=0 then 
  vrTimerState.Value := 0; 
else 
  vrTimerState.Value := 1; 

Далее пишем скрипт OnSecondTimer:
Код: pascal
begin
  if vrTimerState.ValueAsInt = 1 then
    txtTimer.Text := TimeToStr(Now - vrTime.Value);
end.

Т.е индикация идет каждую секунду (только добавляются еще часы, которые мне не нужны)
А вот где сам счет идет переменной vrTime - я так и не понял:
Код: pascal
vrTime.Value := IncSecond(Now, -vrIntervalInSec.ValueAsInt);

И можно ли убрать из индикации Часы? Спасибо