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

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

emoxristov

#810
Simple Scada как я могу изменить 1,2,8,9,15,18 секунды, чтобы стать миллисекундами 100,200,300,400,500,600.
Код: pascal
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.

Simple_Scada

Здравствуйте.

ЦитироватьКак можно отключить (завершить работу) 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мс., то правильнее всего это делать на контроллере.

Кумар

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

kolya_asu

#813
Добрый день. Подскажите пожалуйста, как правильно преобразовать переменную типа ShortInt в float.
Есть внешняя переменная Temperature(ShortInt) с значением 2395, а надо  преобразовать в внутр. переменную Temp_float(Single), чтобы значение отображалось как  23,95.
Вот пробовал таким образом: В первом варианте хотел просто поделить на 100, но почему-то результат равен нулю, а второй вариант не компилируется, ошибка в строке (Temp_float := ShortIntToFloat (Temperature);
1.
Код: pascal
var
  Temp_float: Single;
  Temperature: ShortInt;
begin
 Temp_float := (Temperature / 100);
end.        
2.
Код: pascal
var
  Temp_float: Single;
  Temperature: ShortInt;
begin
 Temp_float := ShortIntToFloat (Temperature);
end.
Помогите добрые люди.

Simple_Scada

Здравствуйте.

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

kolya_asu

Да точно, совсем забыл! Обязательно попробую завтра. А скажите пожалуйста, для моего развития, что не так я написал в скриптах? Почему не работает первый, а второй не компилится из-за ошибки? Спасибо.

Simple_Scada

Здравствуйте.

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

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

EvgeniySM

Всем привет.

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

Simple-Scada

Здравствуйте.

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

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


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

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

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

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

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

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

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

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



deldemo

Здравствуйте.
Подскажите пожалуйста деревянному почему не работает функция GetClienName в скриптах ниже

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


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

Simple_Scada

Здравствуйте.

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

deldemo


Олег Печёнов

Добрый день. помню тема была - не могу найти.

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

Благодарю.

pan2000

Цитата: Олег Печёнов от 02 апреля 2019, 14:04:09нужен скрипт, который подсчитывает количество изменений состояний переменной DI_01 за интервал 10 секунд.
Здравствуйте!

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

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

Второй скрипт по событию "Прошла секунда":
Код: pascal
// переменная статическая и сохраняется между обращением к скрипту, однако в рабочем проекте желательно использовать внутреннею переменную
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. 

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