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

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

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

oleger

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #495 : 27 Октября 2017, 06:14:31 »
Так работает, спасибо.
А вот если в СМС присылать какой-либо код, вида "ABS.123.1" , что означает "Цех ABC, механизм 123 занял положение 1" - как проще разложить такое по переменным ?

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #496 : 27 Октября 2017, 09:14:03 »
Можно включить архивацию у переменной "Пуск/Стоп" оборудования, тогда можно скадой по запросу пользователя делать выборку из БД за любые интервалы времени и выводить результат в таблицу на мнемосхеме. Т.е. получится таблица с перечислением моментов пуска/остановки оборудования за заданный оператором интервал. Но такой способ не позволяет вывести доп. данные (например средн. арифметическое).

Хорошо, давайте отложим в сторону технологические параметры и остановимся только на интервалах времени. Трендами пользователь может пользоваться и в принципе этого достаточно, но мы хотим охватить мониторингом довольно большое количество оборудования и всякий раз анализировать графики не у всех есть время и, откровенно говоря, желание. Тем более этим вопросом на данный момент времени более заинтересован ОТИЗ, нежели технологи (до них еще дойдет очередь). Для ОТИЗ удобнее сделать выборку и получить готовую таблицу со всеми интересующими данными.

Вопрос такой: возможно ли сделать нечто подобное, как на рисунке? В БД я записываю переменную MyVariable процедуры ArchiveTimeOn, которая становится не равной нулю при условии включения оборудования. К примеру, я смогу "поймать" начальный и конечный фронт этой переменной и заархивировать их. Но как мне вызвать время появления этих фронтов, еще и в заданный период времени?


AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #497 : 27 Октября 2017, 10:13:39 »
Событие каждую секунду. Если in_1 > 1, то включаются счетчики начала и завершения включения оборудования.

Код
begin
  if in_1.Value > 1 then
     out_1.Value := 10
  else out_1.Value := 0;

  ArchiveCountOn(out_1, Rez_n_1, Start_time_1.AsDateTime, End_time_1.AsDateTime);
  ArchiveCountOff(out_1, Rez_n_2, Start_time_1.AsDateTime, End_time_1.AsDateTime);

end.   

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

Код
var

  time_h_1, time_m_1, time_h_2, time_m_2 : Integer;

begin
// Подсчет количества включений

  //Первое включение
  if (Rez_n_1.Value = 1) and (m_1.Value = 0) then
     begin
       time_h_1 := HourOf(Now);
       time_m_1 := MinuteOf(Now);
       t_1.Value := (IntToStr(time_h_1) + ':' + IntToStr(time_m_1)); //Время начала включения
       m_1.Value := 1;
     end;

  //Первое выключение
  if (Rez_n_2.Value = 1)  and (m_2.Value = 0) then
     begin
       time_h_2 := HourOf(Now);
       time_m_2 := MinuteOf(Now);
       t_2.Value := (IntToStr(time_h_1) + ':' + IntToStr(time_m_1)); //Время выключения
       m_2.Value := 1;
     end;
end.         

Этот путь ведет к созданию большого количества переменных, а если ,скажем, год работы оборудования, то ....
« Изменён: 27 Октября 2017, 10:14:47 от AutoCY »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #498 : 27 Октября 2017, 17:32:01 »
Не совсем понятны скрипты приведённые Вами в сообщении выше. В первом скрипте происходит подсчет количества включений и выключений переменной out_1 в переменные Rez_n_1 и Rez_n_2. Причем ArchiveCountOn и ArchiveCountOff вызываются в секундном скрипте, что плохо скажется на производительности, ведь каждый вызов архивных функции приводит к выборке из БД и вычислению результатов на основе полученных данных. Во втором скрипте проверяется: если кол-во включений равно 1, то выполняются действия. Но количество включений может быть больше 1. В этом случае скрипт не сработает.

Нужно отметить, что все решения такой задачи, основанные только на скриптах скады будут слабыми по производительности и трудоёмкими, ведь нужно работать с произвольными интервалами данных из БД, которые могут включать в себя произвольное количество подинтервалов для которых в идеале ещё нужно считать например среднее значение. По сути в скаде для этого придется написать свою систему для работы с архивными данными. И если меню трендов не подходит и нужно представление данных в виде таблицы, то лучшим решением становится использование системы отчетов, которая как раз предназначена для работы с архивными данными.

Цитировать
Вопрос такой: возможно ли сделать нечто подобное, как на рисунке?
Да, можно получить очень близкий результат. И проще всего это сделать используя систему отчетов. Достаточно правильно настроить архивацию в БД времени старта и остановки оборудования. Кроме того система отчетов позволяет строить Master-Detail отчеты, которые близки к тому, о чем Вы писали изначально. В таком отчете можно вывести данные каждого подинтервала и доп. расчеты для него (среднее, мин., макс., кол-во, сумму). Для примера мы взяли процесс который периодически запускается и останавливается и построили для него Master-Detail отчет. В отчет выводится отдельно период каждого цикла работы и расчетные данные для каждого цикла (см. скрин во вложении). Если вариант с отчетами подходит, то можем в ближайшее время написать отдельную статью с примером создания такого отчета.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #499 : 27 Октября 2017, 19:13:41 »
А вот если в СМС присылать какой-либо код, вида "ABS.123.1" , что означает "Цех ABC, механизм 123 занял положение 1" - как проще разложить такое по переменным ?
Разложить можно используя например такой скрипт:
Код
var
  aWord: string;
  I, aNumber, aLength: Integer;

  procedure OnWord;
  begin
    case aNumber of
      1: Text1.Text := aWord;  // первое слово записываем в Text1
      2: Text2.Text := aWord;  // второе слово записываем в Text2
      3: Text3.Text := aWord;  // третье слово записываем в Text3
    end;
  end;
begin
  aWord := '';
  aNumber := 1;
  aLength := Length(smsMsg); // получаем длину текста сообщения
  if aLength > 0 then
    for I := 1 to aLength do  // проходим по символам сообщения
    begin
      if smsMsg[I] <> '.' then 
        aWord := aWord + smsMsg[I];

      if (smsMsg[I] = '.') or (I = aLength)  then
      begin
        OnWord;
        aWord := '';
        Inc(aNumber);
      end;
    end;
end.

Здесь фраза разделяется на слова точками. Подпроцедура OnWord вызывается для каждого слова.

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #500 : 30 Октября 2017, 09:34:21 »
Если вариант с отчетами подходит, то можем в ближайшее время написать отдельную статью с примером создания такого отчета.

По всей видимости это как раз то, что нужно.
1. Master-Detail - это новый параметр ОТЧЕТА? Есть ли он в описании руководства?
2. Я могу в скриптах создать две переменных типа BOOL, которые будут становиться TRUE при включении и выключении оборудования, беря данные из ArchiveTimeOn переменной MyVariable. По ним можно будет формировать выборку.

Да, пример очень нужен.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #501 : 30 Октября 2017, 15:32:00 »
Цитировать
Master-Detail - это новый параметр ОТЧЕТА? Есть ли он в описании руководства?
Это отчет, в котором одному выводимому значению из Master источника данных, соответствует какое-то количество значений из Detail источника данных. В руководстве его нет, нам нужно будет написать статью с примером создания такого отчета. Кроме того нужно будет внести мелкие изменения в редактор отчетов, поэтому потребуется время. Внесём изменения и опубликуем статью к концу недели.

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #502 : 30 Октября 2017, 16:57:33 »
Внесём изменения и опубликуем статью к концу недели.

Большое спасибо, буду ждать.

georgy

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #503 : 30 Октября 2017, 17:33:41 »
Как можно обрабатывать нажатие клавиш с клавиатуры, что-бы переходить с одной страницы на другую ( панель страниц скрыта для увеличения полезной площади экрана) и прыгать из одного поля ввода в другое? К примеру клавиша PgUp для перехода с одной страницы на другую по возрастающей, а PgDn по понижающей, и Tab между полями ввода-вывода.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #504 : 30 Октября 2017, 19:22:52 »
Здравствуйте!

Для этого используются следующие сочетания клавиш:

Ctrl + →     Перейти на следующую страницу/подстраницу;
Ctrl + ←     Перейти на предыдущую страницу/подстраницу;
Tab             Переместить фокус ввода к следующему объекту;

Ознакомиться с другими горячими клавишами можно здесь.

Если панель страниц скрыта, то сочетания клавиш для перехода по страницам работать не будут. В этом случае можно создать две кнопки: "На следующую страницу" и "На предыдущую страницу" и написать скрипт на событие OnClick:

Для кнопки "На следующую страницу"
Код
begin
  GoToNextPageClient(GetClientName); // переход на следующую страницу на клиенте, который вызвал скрипт
end.

Для кнопки "На предыдущую страницу"
Код
begin
  GoToPrevPageClient(GetClientName); // переход на предыдущую страницу на клиенте, который вызвал скрипт
end.
« Изменён: 30 Октября 2017, 19:36:20 от Simple_Scada »

georgy

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #505 : 31 Октября 2017, 13:26:15 »
1) Tab перемещает между полями ввода,но не очень явно видно какое поле выбрано, а тем более через несколько секунд выделение пропадает. Как сделать постоянную подсветку выделенного поля ввода?
2)Сочетание клавиш CTRL + и CTRL - не перемещает между страницами, а включает и выключает режим "Контроль качества"
В чем может быть проблема "не перехода на следующую страницу"?

Оператору автомата  нет возможности пользоваться мышью. Как все действия заменить через клавиатуру такие как: смена отображаемой страницы, выбор поля ввода для вводимых значений без запоминания в голове оператора где предыдущий раз было выбрано поле, а постоянная индикация выбранного поля ввода? Тач панель не рассматривается. Хотелось иметь возможность обработки нажатых клавиш.

Используется урезанная промышленная клавиатура с PS/2 разъемом где есть кнопки:
1234567890-=Enter,точка,стрелки вверхвнизвправовлево,PgUpPgDn,Backspace
, при выходе которой из строя заменяется на обычную.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #506 : 31 Октября 2017, 14:22:52 »
Здравствуйте!

Цитировать
Tab перемещает между полями ввода,но не очень явно видно какое поле выбрано, а тем более через несколько секунд выделение пропадает.
Добавим опцию постоянного выделения в следующем обновлении.

Цитировать
Сочетание клавиш CTRL + и CTRL - не перемещает между страницами
Если панель страниц включена, то для перехода по страницам используются сочетания клавиш Ctrl и стрелок влево/вправо:

Ctrl + (стрелка вправо)     Перейти на следующую страницу/подстраницу;
Ctrl + (стрелка влево)       Перейти на предыдущую страницу/подстраницу;

Цитировать
Хотелось иметь возможность обработки нажатых клавиш.
Такой возможности нет и пока не планируется.
« Изменён: 31 Октября 2017, 14:45:30 от Simple-Scada »

GEW

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #507 : 07 Ноября 2017, 09:26:50 »
Добрый день.
Столкнулся со следующей проблемой:
Произвожу поиск переменной по GetVariableByName в скрипте.
После чего нужно оценить качество переменной (.IsGoodQuality). Иногда получается что переменная не существует. Тогда скрипт крашится. Завёл дополнительную проверку aVariable <> nil. Думаю следует в процедуру проверки качества включить проверку на nil в автоматическом режиме, потому что возникают иногда очень неудобные конструкции в скриптах.

Хочу писать
Код
 if (aVariable <> nil) or (aVariable.IsGoodQuality = false) then...
могу:
Код
 if(aVariable <> nil) then ...
   if(aVariable.IsGoodQuality = true) then ...
   else
 else
« Изменён: 07 Ноября 2017, 09:29:34 от Simple_Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #508 : 07 Ноября 2017, 09:46:59 »
Здравствуйте.

Цитировать
Думаю следует в процедуру проверки качества включить проверку на nil в автоматическом режиме.
Это невозможно. Вы в коде работаете с указателем (aVariable), он может быть либо nil (это указатель на первый байт в памяти), либо указывать на какие-то реальные данные. В приведенном коде Вы обращаетесь к указателю и компилятор не может просто взять и не выполнить это обращение. Поэтому Вам нужно либо не обращаться к указателю вовсе, либо обращаться предварительно проверяя его на равенство nil.

Правильный вариант кода:
Код
var
  aVar: TM_Variable;
begin
  aVar := GetVariableByName('myVariable');  // ищем переменную
  if aVar <> nil then     // если переменная найдена
    aVar.Value := 1;      // работаем с ней
end.

Если у Вас много однотипного кода и нужно его сократить, то можно воспользоваться подпроцедурами, как описано здесь (т.е. вынести проверку на nil и работу с переменной в подпроцедуру).

JonyBest

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #509 : 07 Ноября 2017, 23:20:33 »
Доброго дня! прошу помочь разобраться.
В редакторе в событие "Field2_OnDataChange" пишу код:
значение переменной = 5772

Код
var
q:single;
i:int64;
begin
i:=Field2.AsInt64 mod 222;
q:=w/10;
Field2.Text := FloatToStr(q,1);
end.
При запуске выводит правильно 26, но как только значение переменной поменялось - выводит необработанное математикой значение 5772
Где ошибка?