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

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

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

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #975 : 18 Ноября 2019, 22:38:46 »
Здравствуйте. Чтение с жесткого диска (файл) намного затратнее, чем чтение из оперативной памяти (глобальный модуль). Ещё есть третий вариант: объявить в глобальном модуле массив и один раз при запуске проекта считывать в него из файла список строковых переменных и затем брать значения через этот массив (т.е. через оперативную память). Тогда можно формировать список строк в текстовом файле не теряя в производительности.

lengast

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #976 : 26 Ноября 2019, 19:19:47 »
Здравствуйте. Подскажите пожалуйста где ошибка. При компиляции получаю ошибку "Incompatible types "TM_Vatiable" and "PWIDECHAR".
Переменная HeadReport - String.
Код
 
Begin
  if NameReportMake.AsInt = 1 then
    HeadReport := "Kultura 1" ;
  if NameReportMake.AsInt = 2 then
    HeadReport := "Kultura 2" ;
end.   

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #977 : 26 Ноября 2019, 19:24:52 »
Значение переменных меняется через свойство Value:
Код: (delphi)
begin
  if NameReportMake.AsInt = 1 then
    HeadReport.Value := 'Kultura 1';
  if NameReportMake.AsInt = 2 then
    HeadReport.Value := 'Kultura 2';
end.

YurySh

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #978 : 05 Декабря 2019, 21:24:24 »
Всем здравствуйте.

Подскажите как написать скрипт по проверке состояния флажков
К примеру есть 4 флажка:
1-ый - а
2-ый - b
3-ий - с
4 -ый - d
Хочу создать отчет по параметрам,чьи флажки активированы,  к примеру если активированы флажки 1.2.4 то создавать отчет по этим параметрам.
Подскажите как это сделать ?
Спасибо заранее.

lipvasko

  • Пользователь
  • **
  • Сообщений: 64
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #979 : 06 Декабря 2019, 08:46:57 »
подскажите как правильно расставить енды и ;
Код: (delphi)
case a.value of
  1: begin
       a:= 0;
       b := 1;  end
else    begin
a:= 1;
b:= 0; end

end;
так нормально будет выполняться скрипт?                       
« Изменён: 06 Декабря 2019, 10:43:18 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #980 : 06 Декабря 2019, 10:57:18 »
Подскажите как написать скрипт по проверке состояния флажков
Каждый флажок нужно привязать к отдельной переменной. По нажатию на флажок значение переменной будет меняться 0 <-> 1 (или FALSE <-> TRUE). Соответственно по значению переменной можно понять включен флажок или нет. Если значение переменной True, значит включен. Пример проверки:
Код: (delphi)
begin
  // если флажки A, B и D включены
  if (cbA.AsBool) and (cbB.AsBool) and (cbD.AsBool) then
  begin
    // здесь выполняем какие-то действия
  end;
end.

подскажите как правильно расставить енды и ;                   
Вот правильный вариант:
Код: (delphi)
case a of
  1: // если значение "а" равно единице
  begin
    a := 0;
    b := 1; 
  end;
else  // для любых других значений переменной "а"
  a := 1;
  b := 0; 
end;

Но здесь проще было бы написать через if..then:
Код: (delphi)
if a = 1 then
begin
  a := 0;
  b := 1; 
end else
  begin
    a := 1;
    b := 0;
  end;

Но если переменная а - внешняя, то нужно везде при присвоении писать "a.Value := значение;", а если локальная, то можно писать "a := значение;". У Вас в коде смешаны оба варианта, сначала значение берётся "a.value" будто переменная глобальная, а потом присвоение идёт "a := 0;" будто переменная локальная. Нужно определиться с какой переменной Вы работаете и использовать соответствующий вариант обращения к значению.

YurySh

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #981 : 06 Декабря 2019, 11:37:56 »
Подскажите как написать скрипт по проверке состояния флажков
Каждый флажок нужно привязать к отдельной переменной. По нажатию на флажок значение переменной будет меняться 0 <-> 1 (или FALSE <-> TRUE). Соответственно по значению переменной можно понять включен флажок или нет. Если значение переменной True, значит включен. Пример проверки:
Код: (delphi)
begin
  // если флажки A, B и D включены
  if (cbA.AsBool) and (cbB.AsBool) and (cbD.AsBool) then
  begin
    // здесь выполняем какие-то действия
  end;
end.
Спасибо за ответ.
Это я понимаю, просто не до конца могу понять алгоритм проверки всех флажков, просто при наличии 4 флажков, количество комбинаций с различным состоянием флажков получается, если правильно посчитал, 15 и на каждую комбинацию выполнять какое то действие ? А если флажков 5, то комбинаций становиться еще больше. И все это проверять при помощи if ?

lipvasko

  • Пользователь
  • **
  • Сообщений: 64
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #982 : 06 Декабря 2019, 12:07:26 »
возник очень интересный вопрос , скажем есть 2 скрипта выполняемые  каждую секунду , в одном из них используются данные рассчитанные в другом (данные простые если  число а= число б то число с =число д, типа того)  так вот  данные не рассчитываются , равны всегда 0, но если перенести в один скрипт то все отлично и данные рассчитываются как надо , теги соответственно описаны в переменных как внутренние , просто чем глубже  создаю проект ,тем более  лезут глюки на ровном месте , вчера например  несколько часов ловил глюк какого не было , использовал описанные в скрипте  временные  переменные , так вот пока перед самым использованием я их не обнулил , лезли непонятные числа. Еще хотелось бы знать как происходит обработка секундных тегов

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #983 : 06 Декабря 2019, 15:01:50 »
Это я понимаю, просто не до конца могу понять алгоритм проверки всех флажков, просто при наличии 4 флажков, количество комбинаций с различным состоянием флажков получается, если правильно посчитал, 15 и на каждую комбинацию выполнять какое то действие ? А если флажков 5, то комбинаций становиться еще больше. И все это проверять при помощи if ?
Если разных ситуаций 15, то описывать их придётся отдельно, ведь они разные и уникальная комбинация не сформируется сама по себе. Можно под флажки выделить одну целочисленную переменную и каждому флажку назначить какой-то свой бит, который нужно менять (т.е. чтобы каждый флажок работал со своим битом этой переменной). Тогда любая  комбинация флажков будет формировать уникальное целое число в переменной и можно будет использовать конструкцию case..of для проверки, например:
Код: (delphi)
begin
  case myVar.AsInt of
    0: // все флажки выключены 0x0000
    1: // включен первый флажок 0x0001
    2: // включен второй флажок 0x0010 
    3: // включен первый и второй флажок 0x0011
    // и так далее 
  end;
end.
, либо можно будет пройти по битам в цикле и выполнить для каждого какое-то действие.


вчера например  несколько часов ловил глюк какого не было , использовал описанные в скрипте  временные  переменные, так вот пока перед самым использованием я их не обнулил , лезли непонятные числа.
Здесь нет никаких "глюков". Если Вы объявили локальную переменную в скрипте, то в момент выполнения скрипта ей будет выделена память и значение её будет совершенно случайным  (зависит от структуры оперативной памяти в момент запуска скрипта) до тех пор, пока Вы не инициализируете переменную первым значением. Поэтому нужно обязательно инициализировать локальные переменные перед использованием. Подробнее о инициализации переменных можно прочесть на любом сайте по запросу "локальные переменные delphi" (или object pascal), например здесь, а также в этом разделе руководства по скриптам.

так вот  данные не рассчитываются , равны всегда 0, но если перенести в один скрипт то все отлично и данные рассчитываются как надо...
Значит скрипты написаны неправильно, либо Вы в расчетах используете локальные переменные, которые в каждом скрипте свои и никак друг от друга не зависят. Можем гарантировать что программа скриптов всегда выполняется скадой одинаково (ведь это программа) в соответствии с её алгоритмом, независимо от того на каком ПК её запускают и от количества запусков (в ином случае ни один проект скады не мог бы работать стабильно). Если есть желание вышлите проект на support@simple-scada.com с указанием скриптов для проверки, мы назовём более точную причину по которой данные не считаются.
« Изменён: 06 Декабря 2019, 16:16:26 от Simple_Scada »

Vitaly Demidov

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #984 : 08 Декабря 2019, 17:00:48 »
В проекте есть таймер, принимающий различные значения,  каким образом я могу архивировать его значения, в миллисекундах?  Архив либо при установке таймера на паузу( значение) , либо по нажатию кнопки.
Проблема именно в получении  числового значения таймера(отображаются  в поле "календарь"  значения нормально) 
« Изменён: 08 Декабря 2019, 17:02:30 от Vitaly Demidov »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #985 : 09 Декабря 2019, 16:06:32 »
Т.е. таймер это какая-то переменная типа DateTime в проекте? Нужно в какой-то момент получить её значение которое она принимала в прошлом? Если так, то достаточно включить у переменной архивацию по-изменению и затем можно будет получить значение переменной из архива за указанное время при помощи процедуры ArchieveValueByTime.

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #986 : 15 Декабря 2019, 14:58:07 »
Скажите, пожалуйста, если писать скрипт "По изменению переменных" с количеством переменных от 100 и выше, может ли это увеличить нагрузку на сервер? Можно ли как-то менять частоту опроса переменных в скрипте?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #987 : 16 Декабря 2019, 16:25:11 »
MaxHari, если представить что все 100 переменных меняются каждую секунду, то это аналогично циклу от 0 до 100 раз в секунду. такой цикл крайне слабо увеличит нагрузку на сервер.

Цитировать
Можно ли как-то менять частоту опроса переменных в скрипте?
Нет, частота опроса переменной задаётся на этапе разработки проекта через свойство "Частота опроса". Для каждой переменной можно задать свою частоту опроса.

Vitaly Demidov

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #988 : 17 Декабря 2019, 06:24:50 »
Т.е. таймер это какая-то переменная типа DateTime в проекте? Нужно в какой-то момент получить её значение которое она принимала в прошлом? Если так, то достаточно включить у переменной архивацию по-изменению и затем можно будет получить значение переменной из архива за указанное время при помощи процедуры ArchieveValueByTime.

Беда в том, что переменная таймера не архивируется нормально, и принимает значение, не соответствующее миллисекундам, например.

В примере ниже - график переменной таймера из демо проекта, добавлена только архивация по изменению




« Изменён: 17 Декабря 2019, 09:43:34 от Vitaly Demidov »

Neskad

  • Новичок
  • *
  • Сообщений: 31
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #989 : 17 Декабря 2019, 19:14:49 »
Беда в том, что переменная таймера не архивируется нормально, и принимает значение, не соответствующее миллисекундам, например.

В примере ниже - график переменной таймера из демо проекта, добавлена только архивация по изменению
Переменная таймера архивируется нормально, просто формат у неё - TDateTime.
Если вам надо, зачем-то, выводить в тренд значение этого таймера в миллисекундах, то придётся создать дополнительную виртуальную переменную типа Int64, выставить ей архивацию по изменению, и добавить скрипт "изменились переменные", где изменяющаяся переменная - ваш таймер.
Код: ("delphi")
// допустим переменная для миллисекунд называется MSec
MSec.Value:= MilliSecondsBetween(Variable.Value, 0);
« Изменён: 17 Декабря 2019, 19:16:41 от Neskad »