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

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

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

дрю

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1200 : 05 Мая 2021, 15:45:03 »
Добрый день! Подскажите пожалуста. Хочу использовать в проекте ЛАМПА накаливания, чтобы она начала мигать когда переменная = TRUE. Использовал скрипт для её анимацииЖ
Код: (delphi)
begin
    if Sender is TM_Image then      // если скрипт вызван каким-то изображением
  with Sender as TM_Image do    // далее будем работать с объектом Sender, как с изображением
    if AsBool = True then
      AnimSpeed := 10
    else
      AnimSpeed := 0;
end.
Работает, но есть неприятный момент - кога переменная переходит в FALSE и в этот момент кадр2 (т.е. имитации горения лампы) то этот кадр и остаётся активным хотя переменая вызвавшая это событие = FALSE . Какдописать скрипт чтобы при пременной FALSE  номер кадра возврощался к 1(т.е. имитация не зажённой лампы).  И второё как изменить цвет ,,горящей,, лампы на красный, а потухшей оставитьт серым? Спасибо. 
« Изменён: 06 Мая 2021, 10:42:44 от Simple-Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 271
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1201 : 05 Мая 2021, 15:59:29 »
Код: (delphi)
begin
if Sender is TM_Image then      // если скрипт вызван каким-то изображением
with Sender as TM_Image do    // далее будем работать с объектом Sender, как с изображением
    if AsBool = True then
      AnimSpeed := 10
    else
    begin
      AnimSpeed := 0;
      Frame := 1;   // показать первый кадр изображения
    end;
end.

дрю

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1202 : 06 Мая 2021, 08:10:00 »
Как просто! Спасибо. Уточните пожалуста где можно узнать побольше об этом языке чтобы понимать структуру написания этих скриптов?

дрю

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1203 : 06 Мая 2021, 09:04:53 »
Прошу не пинать, пытаюсь разобраться но не зная об этом языке ничего перебираю комбинации кода и они как правило не работают, вот так и рождаются вопросы... Вставил картинку и присвоил скрипт её исчезновения по булевой переменной -работает. Хотел её в момент отображения заставить мигать, чтобы привлечь внимание оператора, и объединил первый скрипт со скриптом анимации. Она по-прежнему исчезает - появляется , но вот в момент появления мигать отказывается. Попрате меня пожалуйста:
Код: (delphi)
 begin         
         if Sender is TM_Object then    // проверяем, что Sender это объект
    with Sender as TM_Object do  // приводим Sender к типу "TM_Object"
      if AsBool = True then          // если значение переменной объекта = 1
        Visible := True          // показать объект
      else
      begin                      // иначе
        Visible := False;        // скрыть объект
       end;
       begin
        if Sender is TM_Image then      // если скрипт вызван каким-то изображением
  with Sender as TM_Image do    // далее будем работать с объектом Sender, как с изображением
    if AsBool = True then
      AnimSpeed := 10
    else
    begin
      AnimSpeed := 0;
       end;
    end;
end.
« Изменён: 06 Мая 2021, 10:43:40 от Simple-Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 271
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1204 : 06 Мая 2021, 09:31:17 »
Руководство по скриптам
Дополнительно можно прочесть в интернете на сайтах связанных с языками Pascal/Delphi.

Код: (delphi)
begin
  if Sender is TM_Image then      // если скрипт вызван каким-то изображением
  with Sender as TM_Image do    // далее будем работать с объектом Sender, как с изображением
    if AsBool = True then
     begin
      Visible := True;
      AnimSpeed := 10;
     end
       else
     begin
       Visible := False;
       AnimSpeed := 0;
     end;
end.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3195
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1205 : 06 Мая 2021, 10:49:15 »
Если я переименую "UserSound.ogg" (который идет с демо-проектом) в '2.ogg', то всё работает. Если же я использую свой собственный файл с таким названием (или любым другим, то при запуске скрипта ничего не происходит, в ответ тишина)
Вы уверены, что звуковой файл, который Вы используете действительно сохранён в формате ogg? Также убедитесь, что проигрываемый звук не слишком тихий. Можно повторить проблему, затем выключить клиент скады и проверить лог-файл "Client-log.txt" из папки "Logs\", нет ли в нём сообщений о неудачной загрузке файла звука. Можете выслать файл на support@simple-scada, мы проверим его у себя.

дрю

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1206 : 06 Мая 2021, 10:57:26 »
Извиняюсь за назойливость, скопировал Ваш скрипт исчезает-появляется исправно, но мигать отказывается. Может он работает с анимироваными обектами (в которых есть nколичиство кадров, а с простыми обектами ни как? На всякий случай прикладываю скрин свойсва (стрелка импортированая в формате PNG) 

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 271
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1207 : 06 Мая 2021, 11:41:37 »
Может он работает с анимироваными обектами в которых есть nколичиство кадров
Всё верно, для мигание цветом, будет такой скрипт:

Код: (delphi)
begin
  if Sender is TM_Image then      // если скрипт вызван каким-то изображением
  with Sender as TM_Image do    // далее будем работать с объектом Sender, как с изображением
    if AsBool then
          begin
        Visible := True;
        FlashColor := clRed;
        end
      else
      begin
        Visible := False;
        FlashColor := clNone;
       end;
end.
Или в инспекторе объектов у изображения выбрать "Цвет мигания", тогда скрипт будет такой:

Код: (delphi)
begin
  if Sender is TM_Object then    // проверяем, что Sender это объект
    with Sender as TM_Object do  // приводим Sender к типу "TM_Object"
      if AsBool  then          // если значение переменной объекта True         
        Visible := True          // показать объект
      else                       // иначе
        Visible := False;        // скрыть объект
end.



дрю

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1208 : 06 Мая 2021, 14:32:43 »
Спасибо уже применил! :D

Игорь32

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1209 : 09 Мая 2021, 17:14:17 »
 Добрый день . Такая проблема  . Есть 3 Воздуходувки  они работают по очереди и если  не хватает мощности включается 2 или 3 сразу (в зависимости что показывает датчик )  на все 3 сдедал 3 переменых  от одного источника и написал скрипты
для 1 вентилятора
Код
begin
       if FileOpen('SaveFile.ssf', '') then
    vrTime.Value := FileReadDateTime
  else
    vrTime.Value := 0;

     if FileRecreate('SaveFile.ssf', '') then
    FileWriteDateTime(vrTime.AsDateTime);


  with (Sender as TM_Object) do
 case AsInt of
      1: TimerStart (vrTime , vrTime.AsDateTime);
      3: TimerStart (vrTime , vrTime.AsDateTime);
      7: TimerStart (vrTime , vrTime.AsDateTime);

else
      TimerPause (vrTime );
    end;
end.
       

Для 2 вентилятора
Код
begin
       if FileOpen('SaveFile.ssf', '') then
    vrTime_1.Value := FileReadDateTime
  else
    vrTime_1.Value := 0;

     if FileRecreate('SaveFile.ssf', '') then
    FileWriteDateTime(vrTime_1.AsDateTime);





  with (Sender as TM_Object) do
 case AsInt of
      2: TimerStart (vrTime_1 , vrTime_1.AsDateTime);
      3: TimerStart (vrTime_1 , vrTime_1.AsDateTime);
      7: TimerStart (vrTime_1 , vrTime_1.AsDateTime);

else
      TimerPause (vrTime_1 );
    end;
end.                 
для 3 вентилятора
Код
begin
       if FileOpen('SaveFile.ssf', '') then
    vrTime_2.Value := FileReadDateTime
  else
    vrTime_2.Value := 0;

     if FileRecreate('SaveFile.ssf', '') then
    FileWriteDateTime(vrTime_2.AsDateTime);





  with (Sender as TM_Object) do
 case AsInt of

      4: TimerStart (vrTime_2 , vrTime_2.AsDateTime);
      7: TimerStart (vrTime_2 , vrTime_2.AsDateTime);

else
      TimerPause (vrTime_2 );
    end;
end.             
Переменных тоже 3

Суть проблемы : https://www.youtube.com/watch?v=ABV-kJAzTYo

Так вот, скачет время  после работы 2-3 вентиляторов одновременно и после работы на 3 вентиляторе поочерёдно  вместо паузы сброс.

Можно как то исправить  что бы просто работало на пузу когда  нет включения и считало без скачков  ?
« Изменён: 09 Мая 2021, 17:58:32 от Игорь32 »

pan2000

  • Постоялец
  • ***
  • Сообщений: 216
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1210 : 11 Мая 2021, 09:11:26 »
     Здравствуйте, Игорь32.

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

Для таймера нежелательны повторные старты, пример универсального скрипта для объекта "Текст". Основная переменная - управление таймером. Событие "Изменилась значение основной переменной".
Код: (delphi)
var temp: TM_Variable;
begin
  with Sender as TM_Text do begin
    temp := VariableEx;

// проверка управления по принадлежности к группе, в Tag принадлежность к группе отмечена "единицами" в битах <код группы>,
// пример: для групп 4 и 7 (вентилятор 3) Tag = (2^4) + (2^7) = 16 + 128 = 144
    if ((1 shl AsInt) and Tag) = 0 then   
      TimerPause(temp)                    // установить таймер на паузу
    else
      if TimerGetState(temp) <> 1 then TimerStart(temp, temp.AsDateTime);     // не беспокоить работающий таймер
  end;
end.
Во вложении пример с шаблоном для вентилятора и просто группой объектов.

Игорь32

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1211 : 11 Мая 2021, 13:37:52 »
Здравствуйте pan2000

мне  помогло дописать

Код
 if TimerGetState(vrTime) <> 1 then TimerStart(vrTime, vrTime.AsDateTime); 

В результате  сбросы после 3 переключения исчезли  и время останавливается.

Осталась вторая проблема -  это  откат времени после работы  2 или 3  одновременно вентилятора и переход в обычный режим. нашол один интересный факт если сделать тайм аут  приходяшего сигнала   Допустим приходит 2 потом 7  и между ними сделать 0 то все работает корректно (Возможно стоит поставить задержку на приходящий сигнал в 1 секунду да и всё или можно реализовать как то в скаде межу переключениями ?

Спасибо за помощь

Цитировать
Во вложении пример с шаблоном для вентилятора и просто группой объектов.

Я так понимаю это мне нужно закинуть в корень папки Siple Scada 2 что бы открыть проэкт или как то по другому ?


Вообще операторы жалуются на сброс таймеров после рестарта пк или проекта . Я думал может  есть вариант  забирать время из контролера  и передавать на скаду, или поставить бд удаленно или забирать время из бд . Правда не знаю как реализовать вытягивание битов  с 3 воздуходувок  через 1 тег . На контролере время работы  каждого вентилятора  прописано и выведено на дисплей Думал реализовать что бы операторы не бегали к ящику дабы вписывать и высчитывать время работы (единственный минус контролер не учитывает секунды ) (Контролер Zelio SR3B102BD c модбасом SR3NET01). Пока  сидим тестем на демоверсии (планирую рекомендовать купить стандарт на 500 тегов для  автоматизации цеха) Пока разбираюсь делаю мелкие проекты. (К сожалению не программист но модернизивувать нужно).

P/s. Хотелось бы конечно что бы разработчики исправили это неприятную вещь со сбросом таймеров при перезагрузке клиента или пк  хотя бы в платных версиях .
« Изменён: 11 Мая 2021, 16:08:26 от Игорь32 »

pan2000

  • Постоялец
  • ***
  • Сообщений: 216
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1212 : 12 Мая 2021, 01:49:52 »
Осталась вторая проблема -  это  откат времени после работы  2 или 3  одновременно вентилятора и переход в обычный режим. нашол один интересный факт если сделать тайм аут  приходяшего сигнала   Допустим приходит 2 потом 7  и между ними сделать 0 то все работает корректно (Возможно стоит поставить задержку на приходящий сигнал в 1 секунду да и всё или можно реализовать как то в скаде межу переключениями ?
По опыту работы с таймером можно отметить три его особенности:
1. Не пытаться повторно запустить таймер.
2. Новое начальное значение таймера можно установить только из состояния "Сброс".
3. Работающий таймер только пишет в таймерную переменную.
Все остальное это видимость принудительного изменения значения таймерных переменных на значения из файла при изменении состояния любого вентилятора.
Цитировать
Вообще операторы жалуются на сброс таймеров после рестарта пк или проекта
Это не сброс таймеров, а банальное переписывание нулевого значения из файла (было создано при первом запуске проекта).

Удалите из скриптов РАБОТУ С ФАЙЛОМ и объявите АВТОМАТИЧЕСКОЕ ВОССТАНОВЛЕНИЕ таймерных переменных в редакторе переменных.


Цитировать
Я так понимаю это мне нужно закинуть в корень папки Siple Scada 2 что бы открыть проэкт или как то по другому ?
Simple-Scada видит проекты, размещенные в папке Projects, которая размещена в папке пользовательских данных (выбирается во время установки Simple-Scada). Туда и нужно поместить разархивированную папку проекта.

Цитировать
...есть вариант  забирать время из контролера  и передавать на скаду... Правда не знаю как реализовать вытягивание битов  с 3 воздуходувок  через 1 тег...
Правильно получать значения времени наработки непосредственно из контроллера. Но у модуля SR3NET01 только по четыре шестнадцатиразрядных регистра для записи и для чтения. Т.е. всего-навсего по 64 бита. Можно увеличить количество путем страничного доступа к данным. Но это уже вопрос к автору программы и вычислительными ресурсами контроллера.
« Изменён: 12 Мая 2021, 05:50:10 от pan2000 »

Игорь32

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1213 : 12 Мая 2021, 12:27:54 »
Посмотрел Ваш проект, очень много для себя открыл , особенно работу с шаблонами . Спасибо большое

metamorphogenesis

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1214 : 21 Мая 2021, 19:47:17 »
Есть глобальный скрипт, в нем объявлена глобальная константа, значение которой берется из результата выполнения описанной тут же глобальной функции.
Код: (delphi)
const
    CLR_LED_ON: Int64    = RGB(67, 67, 67); // вычисляем цвет
    CLR_LED_FAULT: Int64 = clRed;           // используем готовый

...

function RGB(const r, g, b: byte): Int64;
begin
    ... // вычисляем цвет
end;
У меня вопрос. Значение первой константы будет вычисляться при каждом обращении к ней из скрипта, или только один раз, или как? И есть ли принципиальная разница в данном случае между const  и var?