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

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

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

emoxristov

  • Пользователь
  • **
  • Сообщений: 53
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #810 : 26 Февраля 2019, 21:14:21 »
Simple Scada как я могу изменить 1,2,8,9,15,18 секунды, чтобы стать миллисекундами 100,200,300,400,500,600.
Код: (delphi)
begin
  if Started.Value = 1 then
    Counter.Value := Counter.Value + 1
  else
    Counter.Value := -1;

  case Counter.Value of
    1:  ArduinoSerial0_D31.Value := 1;
    2:  ArduinoSerial0_D31.Value := 1;
    8:  ArduinoSerial0_D49.Value := 1;
    9:  ArduinoSerial0_D49.Value := 1;
    15: ArduinoSerial0_D45.Value := 1;
    18: Started.Value :=0;
  end;
end.
« Изменён: 27 Февраля 2019, 09:51:24 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #811 : 27 Февраля 2019, 16:37:00 »
Здравствуйте.

Цитировать
Как можно отключить (завершить работу) Web-клиентов?
Отключить web-клиентов можно через сервер Simple-Scada -> вкладка "Клиенты"(см. скриншот во вложении).

Цитировать
Используя процедуру CloseApplicationClient/CloseApplicationAll, скрипт срабатывает только для обычных клиентов и для web-клиентов, запущенных через созданную иконку на Android-устройстве.
Проверим и по возможности добавим отключение web-клиентов через процедуры CloseApplicationClient/CloseApplicationAll.

Цитировать
Simple Scada как я могу изменить 1,2,8,9,15,18 секунды, чтобы стать миллисекундами 100,200,300,400,500,600.
Вероятнее всего, Вы привели пример секундного скрипта - он будет выполняться 1 раз в секунду, т.е. переменная Counter будет принимать значения 1,2,3,4,5 и т.д. и условия по миллисекундам не выполнятся. Если Вам требуется по каму-либо условию записать значения в переменные контроллера с задержкой 100мс., то правильнее всего это делать на контроллере.

Кумар

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #812 : 28 Февраля 2019, 07:58:48 »
Цитировать
Проверим и по возможности добавим отключение web-клиентов через процедуры CloseApplicationClient/CloseApplicationAll.
Ок, будем ждать. Задача стоит именно в автоматическом отключении web-клиентов спустя некоторое время, при максимальном количестве подключенных клиентов.

kolya_asu

  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #813 : 07 Марта 2019, 18:54:09 »
Добрый день. Подскажите пожалуйста, как правильно преобразовать переменную типа ShortInt в float.
Есть внешняя переменная Temperature(ShortInt) с значением 2395, а надо  преобразовать в внутр. переменную Temp_float(Single), чтобы значение отображалось как  23,95.
Вот пробовал таким образом: В первом варианте хотел просто поделить на 100, но почему-то результат равен нулю, а второй вариант не компилируется, ошибка в строке (Temp_float := ShortIntToFloat (Temperature);
1.
Код: (delphi)
var
  Temp_float: Single;
  Temperature: ShortInt;
begin
 Temp_float := (Temperature / 100);
end.       
2.
Код: (delphi)
var
  Temp_float: Single;
  Temperature: ShortInt;
begin
 Temp_float := ShortIntToFloat (Temperature);
end.
Помогите добрые люди.
« Изменён: 07 Марта 2019, 21:44:59 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #814 : 07 Марта 2019, 20:31:20 »
Здравствуйте.

Цитировать
Есть внешняя переменная Temperature(ShortInt) с значением 2395, а надо  преобразовать в внутр. переменную Temp_float(Single), чтобы значение отображалось как  23,95.
Это можно сделать без использования внутренней переменной и скриптов. Откройте редактор переменных, дважды кликните по переменной Temperature, перейдите на вкладку свойств "Дополнительные" и установите свойство "Сдвиг запятой" равным "-2". Также, не забудьте назначить переменной соответствующую шкалу, например если переменная Temperature может принимать значения от 0 до 10000, то у нее должна быть шкала 0-10000.

kolya_asu

  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #815 : 08 Марта 2019, 01:00:39 »
Да точно, совсем забыл! Обязательно попробую завтра. А скажите пожалуйста, для моего развития, что не так я написал в скриптах? Почему не работает первый, а второй не компилится из-за ошибки? Спасибо.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #816 : 08 Марта 2019, 10:48:30 »
Здравствуйте.

Первый не работает, потому что при объявлении в скрипте локальных переменных они будут инициализированы нулем. Т.е., у Вас получается Temp_float := (0 / 100); Как вы написали, Temperature это внешняя переменная, поэтому ее не нужно объявлять в скрипте. Для того, чтобы записать из скрипта значение в переменную, необходимо использовать свойство переменной "Value":
Код: (delphi)
var
 Temp_float: Single;
begin
 Temp_float := (Temperature.Value / 100);
end.

Второй не работает, потому что для записи целого числа в вещественное не требуется выполнять преобразования:
Код: (delphi)
var
  Temp_float: Single;
  Temperature: ShortInt;
begin
 Temp_float := Temperature;
end.

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #817 : 11 Марта 2019, 09:04:04 »
Всем привет.

Есть переменная в контроллере, тип DWORD. В ней записаны секунды, общим количеством не более чем 86400 (полное количество секунд в сутках). Как можно отобразить на скаде в полях отдельно часы, минуты и секунды данной переменной с возможностью редактирования и без использования промежуточных внутренних переменных?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3211
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #818 : 12 Марта 2019, 09:58:23 »
Здравствуйте.

Если нужна возможность редактирования, то без внутренних переменных не обойтись. Нужно создавать отдельные переменные для часов, минут и секунд.
Код: (delphi)
begin
  vrH.Value := ATime div 3600;
  vrM.Value := (ATime - vrH.AsInt * 3600) div 60;
  vrS.Value := ATime - vrH.AsInt * 3600 - vrM.AsInt * 60;
end.
, где ATime - время в секундах.

pan2000

  • Постоялец
  • ***
  • Сообщений: 225
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #819 : 12 Марта 2019, 13:23:41 »

Есть переменная в контроллере, тип DWORD. В ней записаны секунды, общим количеством не более чем 86400 (полное количество секунд в сутках). Как можно отобразить на скаде в полях отдельно часы, минуты и секунды данной переменной с возможностью редактирования и без использования промежуточных внутренних переменных?


  Редактирование времени суток с использованием объект "Календарь"

Для переменной dwTimeOPC Вашего "Внешнего тега(с ОРС сервера)" нужно установить:
- тип данных "LongWord";
- шкалу с минимумом = 0, максимумом = 86399;
- виз. минимум = 0, виз. максимум = 0.99998842 (86399/86400).
Данные параметры обеспечивают масштабирование числа секунд во время суток и наоборот.

Календарь необходимо настроить на отображение только времени суток, включая секунды.
Основная переменная - dtTime, дополнительная - dwTimeOPC.

Скрипты по изменению основной и дополнительной переменных:

Код: (delphi)
begin
  dwTimeOPC.Value := Frac(dtTime.Value);  // ограничить только временем суток
end.

begin
  dtTime.value := dwTimeOPC.Value;
end.   

Максимальное использование возможностей Simple-Scada позволяет получить компактный код.

Проект из вложения проверен с сервером arОРС и эмулятором Modbus.



deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #820 : 26 Марта 2019, 10:14:22 »
Здравствуйте.
Подскажите пожалуйста деревянному почему не работает функция GetClienName в скриптах ниже

Код
begin
  if vrSCREEN.AsInt = 0 then
    Page1.GoToPageClient(GetClientName);
  if vrSCREEN.AsInt = 1 then
    Page2.GoToPageClient(GetClientName);
  if vrSCREEN.AsInt = 2 then
    Page3.GoToPageClient(GetClientName);
end.                       


Код
begin
  CASE vrSCREEN.AsInt OF
      0:  Page1.GoToPageClient(GetClientName);
      1:  Page2.GoToPageClient(GetClientName);
      2:  Page3.GoToPageClient(GetClientName);
  END;
end.                       
Если указать явное имя клиента то скрипты работают.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #821 : 26 Марта 2019, 10:22:48 »
Здравствуйте.

Функция GetClientName не работает при вызове из события "OnDataChange", а также при вызове из системных типов событий "Запуск проекта", "Остановка проекта", "Выполнен SQL-запрос", "Прошла секунда", "Прошел час", "Отчет построен". Если указанные скрипты выполняются по одному из вышеперечисленных событий, то нужно явно указывать имя клиента.

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #822 : 26 Марта 2019, 10:27:54 »
Спасибо!!!!!!!!!!!!!

Олег Печёнов

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
прошу помощи в написании скрипта
« Ответ #823 : 02 Апреля 2019, 14:04:09 »
Добрый день. помню тема была - не могу найти.

нужен скрипт, который подсчитывает количество изменений состояний переменной DI_01 за интервал 10 секунд.

Благодарю.

pan2000

  • Постоялец
  • ***
  • Сообщений: 225
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #824 : 03 Апреля 2019, 10:51:55 »
нужен скрипт, который подсчитывает количество изменений состояний переменной DI_01 за интервал 10 секунд.
Здравствуйте!

Необходима одна внутренняя переменная cntDI_01 для подсчета изменений переменной DI_01, причем переменная cntDI_01 не должна переполняться за интервал 10 секунд.

Скрипт по событию "Изменились переменные":
Код: (delphi)
begin
  cntDI_01.Value := cntDI_01.Value + 1;     // счетчик изменений DI_01
end.

Второй скрипт по событию "Прошла секунда":
Код: (delphi)
// переменная статическая и сохраняется между обращением к скрипту, однако в рабочем проекте желательно использовать внутреннею переменную
var i: integer;    // i - отсчет интервала
begin
  i := (i + 1) mod 10;     // счетчик 0 - 9, отсчет временного интервала 10 сек
  if i <> 0 then exit;
// обработка данных за интервал 10 сек
   . . .
  cntDI_01.Value := 0;        // сброс счетчика изменений DI_01 для следующего интервала
end.

Пример проекта с обработкой данных, состоящей из построения таблицы изменений за последовательные интервалы, во вложении.