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

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

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

Rymaks

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #135 : 09 Августа 2016, 08:29:34 »
Подскажите, как реализовать задержку по времени. Например я хочу чтобы одна переменная на 2 секунды принимала одно значение, а по про шествию 2 секунд - другое.

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

Код
 
var
   A: TDateTime;
begin
   A := Now;
   repeat
     Field1.Color := clGreen;
   until SecondsBetween(Now, A) > 2 ;
   
  Field1.Color := clRed;
end.   
   
« Изменён: 09 Августа 2016, 22:15:13 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3211
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #136 : 09 Августа 2016, 22:10:37 »
Rymaks, дело в том, что Вы сначала записываете в A текущее время, а затем в цикле сравниваете его с текущим временем, т.е. по сути получается сравнение одинакового времени и цикл крутится бесконечно. Для правильной реализации таймеров через скрипты придется использовать глобальные переменные и делать это нужно так:
  • создайте новую внутреннюю (виртуальную) переменную в Редакторе переменных. Тип данных DateTime, шкала от -2147483648 до 2147483648. Имя например vrTime;
  • создайте скрипт с типом события "Прошла секунда" и вставьте в него код представленный ниже;

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

  vrTime.Value := Now;

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

Учитывайте, что все скрипты выполняются на сервере, а на клиенты информация передается каждые пол секунды, а значит в некоторые моменты, при просмотре значения на клиенте будет казаться что прошло больше 2 секунд, но частота выполнения таймера на сервере при этом будет правильной. Также ни в коем случае не используйте подобные таймеры для управления важными или опасными процессами, т.к. это поставит процессы в зависимость от скады. В этом случае реализуйте таймер на уровне контроллера.
« Изменён: 09 Августа 2016, 22:15:39 от Simple-Scada »

EnterDownload

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #137 : 15 Августа 2016, 09:41:19 »
Есть ли возможность управлять свойствами страниц? Допустим, нужно сделать некоторые страницы неактивными, чтоб они вообще изчезли из списка или при нажатии на них ничего не происходило бы? Свойства Enabled и Visible есть, но первое вроде ничего не меняет совсем, а второе read-only.
« Изменён: 15 Августа 2016, 11:21:58 от EnterDownload »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3211
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #138 : 15 Августа 2016, 22:30:32 »
EnterDownload, сейчас практически все свойства страниц не влияют на их поведение. Постараемся разрешить работу со свойствами Enabled и Visible в следующем обновлении.

mikl182

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #139 : 16 Августа 2016, 07:38:43 »
Добрый день.
На могу разложить байт с OPC сервера на биты, использую getbit и присваиваю значение внутренней переменной, при компиляции пишет Incompatible types "TM_Variable" and "BOOLEAN", хотя переменная булевая.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3211
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #140 : 16 Августа 2016, 09:01:34 »
mikl182, вероятно Вы выполняете присваивание так: MyVariable := GetBit(...); Это неправильно, ведь переменная имеет тип TM_Variable (описание типа здесь) и включает в себя множество свойств, одно из которых Value (значение переменной). Его и нужно использовать.

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

mikl182

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #141 : 16 Августа 2016, 10:19:36 »
Да действительно, теперь скрипт компилируется, но значение бита не возвращает. Написал так
Код
begin
  svet1.Value := GetBit(tag1.Value, 0);
end.
« Изменён: 16 Августа 2016, 10:44:19 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3211
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #142 : 16 Августа 2016, 10:43:58 »
mikl182, Ваш скрипт должен работать, только что проверили его в разных вариациях, работает. Может быть нулевой бит переменной tag1 в вашем случае просто равен 0 (False) и не меняется, поэтому скрипт пишет в svet1 значение 0 (False)? Или же переменная svet1 перезаписывается ещё где-то?

Dimon

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #143 : 13 Сентября 2016, 23:50:37 »
Здравствуйте. Заметил такую вещь, что на время работы скрипта не работают другие скрипты и сервер. У вас это что реализовано в одном потоке?  :o Не получается запустить 2-ва скрипта одновременно.

Simple-Scada

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

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

Dimon

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #145 : 19 Сентября 2016, 09:11:39 »
Достаточно в скрипте "Запуск проекта" вставить бесконечный цикл типа While (1) {} запустить прект и наблюдать как все повисло. А сервер в диспетчере задач начинает уничтожать свободную память.
Вариант номер два. В пустом проекте  ставим кнопку. К этой кнопке прикручиваем универсальный скрипт с бесконечным циклом While (1) {}. Запускаем проект жмем кнопку и весь проект замирает.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3211
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #146 : 19 Сентября 2016, 09:33:02 »
Dimon, не нужно так никогда делать. Любую задачу можно решить без использования бесконечных циклов, для этого в Simple-Scada есть система событий. Какую задачу Вы пытаетесь решить? Опишите её, мы предложим Вам решение без использования бесконечного цикла. Зависание сервера при использовании бесконечных циклов исправим в след. обновлении.
« Изменён: 19 Сентября 2016, 09:33:52 от Simple-Scada »

Dimon

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #147 : 20 Сентября 2016, 22:18:56 »
вопрос:
Какую задачу Вы пытаетесь решить?

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

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

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

main
  {
    while (1)
     {
         ....
         тут управляем другими скриптами
         ....
     }
   }
« Изменён: 20 Сентября 2016, 22:39:40 от Dimon »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3211
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #148 : 21 Сентября 2016, 00:29:09 »
Цитировать
Что это значит >:( (?
Как мы и написали в предыдущем сообщении, работа скриптов в Simple-Scada 2 основана на системе событий которые возникают в процессе работы сервера скады (Server.exe). Сервер сам по себе является бесконечным циклом во время работы которого возникают события и выполняются соответствующие им скрипты. Если Вам нужно обрабатывать какие-то данные постоянно (или на протяжении какого-то времени), то нужно делать это на основе таймеров (+ это хорошо скажется на производительности), а не бесконечных циклов, т.к. это противоречит системе которая используется в Simple-Scada 2.

Цитировать
Короче надо функцию:
main
  {
    ...
Исходя из того, что описано выше - ничего подобного мы не планируем и если для Вас критически важно организовать обработку в бесконечном цикле, то стоит присмотреться к другим SCADA-системам.
« Изменён: 14 Октября 2016, 21:12:05 от Simple-Scada »

Yuriy

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #149 : 10 Октября 2016, 23:03:07 »
Добрый день! Вопрос следующий. Мне нужно  реализовать таймер времени (обьект Текст - txtTime) в формате минуты:секунды, привязанный к переменной с OPC-сервера (выводится в Скаде в обьекте Поле = field1). При установке переменной в 1 - запуск счета и останов таймера при значении переменной 0. Следуя аналогии DemoProject, в событии OnDataChange обьекта field1 пишем скрипт:
Код
if field.value :=0 then 
  vrTimerState.Value := 0;
else
  vrTimerState.Value := 1;

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

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

И можно ли убрать из индикации Часы? Спасибо                               
« Изменён: 11 Октября 2016, 09:06:24 от Simple-Scada »