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

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

дрю

#1200
Добрый день! Подскажите пожалуста. Хочу использовать в проекте ЛАМПА накаливания, чтобы она начала мигать когда переменная = TRUE. Использовал скрипт для её анимацииЖ
Код: pascal
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(т.е. имитация не зажённой лампы).  И второё как изменить цвет ,,горящей,, лампы на красный, а потухшей оставитьт серым? Спасибо. 

Simple Scada

Код: pascal
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.

дрю

Как просто! Спасибо. Уточните пожалуста где можно узнать побольше об этом языке чтобы понимать структуру написания этих скриптов?

дрю

#1203
Прошу не пинать, пытаюсь разобраться но не зная об этом языке ничего перебираю комбинации кода и они как правило не работают, вот так и рождаются вопросы... Вставил картинку и присвоил скрипт её исчезновения по булевой переменной -работает. Хотел её в момент отображения заставить мигать, чтобы привлечь внимание оператора, и объединил первый скрипт со скриптом анимации. Она по-прежнему исчезает - появляется , но вот в момент появления мигать отказывается. Попрате меня пожалуйста:
Код: pascal
 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.

Simple Scada

Руководство по скриптам
Дополнительно можно прочесть в интернете на сайтах связанных с языками Pascal/Delphi.

Код: pascal
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

Цитата: nikolai_mikhailov от 03 мая 2021, 15:56:00Если я переименую "UserSound.ogg" (который идет с демо-проектом) в '2.ogg', то всё работает. Если же я использую свой собственный файл с таким названием (или любым другим, то при запуске скрипта ничего не происходит, в ответ тишина)
Вы уверены, что звуковой файл, который Вы используете действительно сохранён в формате ogg? Также убедитесь, что проигрываемый звук не слишком тихий. Можно повторить проблему, затем выключить клиент скады и проверить лог-файл "Client-log.txt" из папки "Logs\", нет ли в нём сообщений о неудачной загрузке файла звука. Можете выслать файл на support@simple-scada, мы проверим его у себя.

дрю

Извиняюсь за назойливость, скопировал Ваш скрипт исчезает-появляется исправно, но мигать отказывается. Может он работает с анимироваными обектами (в которых есть nколичиство кадров, а с простыми обектами ни как? На всякий случай прикладываю скрин свойсва (стрелка импортированая в формате PNG) 

Simple Scada

Цитата: дрю от 06 мая 2021, 10:57:26Может он работает с анимироваными обектами в которых есть nколичиство кадров
Всё верно, для мигание цветом, будет такой скрипт:

Код: pascal
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.
Или в инспекторе объектов у изображения выбрать "Цвет мигания", тогда скрипт будет такой:

Код: pascal
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.



дрю


Игорь32

#1209
 Добрый день . Такая проблема  . Есть 3 Воздуходувки  они работают по очереди и если  не хватает мощности включается 2 или 3 сразу (в зависимости что показывает датчик )  на все 3 сдедал 3 переменых  от одного источника и написал скрипты
для 1 вентилятора
Код: pascal
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 вентилятора
Код: pascal
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 вентилятора
Код: pascal
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 вентиляторе поочерёдно  вместо паузы сброс.

Можно как то исправить  что бы просто работало на пузу когда  нет включения и считало без скачков  ?

pan2000

     Здравствуйте, Игорь32.

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

Для таймера нежелательны повторные старты, пример универсального скрипта для объекта "Текст". Основная переменная - управление таймером. Событие "Изменилась значение основной переменной".
Код: pascal
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

#1211
Здравствуйте pan2000

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

Код: pascal
 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. Хотелось бы конечно что бы разработчики исправили это неприятную вещь со сбросом таймеров при перезагрузке клиента или пк  хотя бы в платных версиях .

pan2000

#1212
Цитата: Игорь32 от 11 мая 2021, 13:37:52Осталась вторая проблема -  это  откат времени после работы  2 или 3  одновременно вентилятора и переход в обычный режим. нашол один интересный факт если сделать тайм аут  приходяшего сигнала   Допустим приходит 2 потом 7  и между ними сделать 0 то все работает корректно (Возможно стоит поставить задержку на приходящий сигнал в 1 секунду да и всё или можно реализовать как то в скаде межу переключениями ?
По опыту работы с таймером можно отметить три его особенности:
1. Не пытаться повторно запустить таймер.
2. Новое начальное значение таймера можно установить только из состояния "Сброс".
3. Работающий таймер только пишет в таймерную переменную.
Все остальное это видимость принудительного изменения значения таймерных переменных на значения из файла при изменении состояния любого вентилятора.
ЦитироватьВообще операторы жалуются на сброс таймеров после рестарта пк или проекта
Это не сброс таймеров, а банальное переписывание нулевого значения из файла (было создано при первом запуске проекта).

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


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

Цитировать...есть вариант  забирать время из контролера  и передавать на скаду... Правда не знаю как реализовать вытягивание битов  с 3 воздуходувок  через 1 тег...
Правильно получать значения времени наработки непосредственно из контроллера. Но у модуля SR3NET01 только по четыре шестнадцатиразрядных регистра для записи и для чтения. Т.е. всего-навсего по 64 бита. Можно увеличить количество путем страничного доступа к данным. Но это уже вопрос к автору программы и вычислительными ресурсами контроллера.

Игорь32

Посмотрел Ваш проект, очень много для себя открыл , особенно работу с шаблонами . Спасибо большое

metamorphogenesis

Есть глобальный скрипт, в нем объявлена глобальная константа, значение которой берется из результата выполнения описанной тут же глобальной функции.
Код: pascal
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?