Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Simple-Scada от 29 Января 2016, 15:19:20

Название: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Января 2016, 15:19:20
В этой теме будут размещаться примеры с использованием скриптов Simple-Scada 2 и подробным описанием. Задавайте вопросы, если что-то непонятно.
Название: Re: Советы по использованию скриптов в Simple-Scada 2
Отправлено: Simple_Scada от 29 Января 2016, 15:22:48
Рассмотрим случай когда нам нужно изменять цвет объекта при изменении значения связанной с ним переменной.
Код: (delphi)
begin
  // цвет можно указывать в виде констант цветов (например clRed), в виде HTML кода (например $FFFF00), в виде RGB (например RGB(0,0,255));
  case Field1.ValueAsInt of                  // если значение переменной поля равно:
    1..3: Field1.Color := clRed;             // от 1 до 3 - изменить цвет поля на красный;
    4   : Field1.BorderColor := clGreen;     // 4 - изменить цвет рамки поля на зеленый;
    5   : Field1.FontColor := $FFFF00;       // 5 - изменить цвет шрифта поля на желтый;
    6   : Field1.Color := RGB(0,0,255);      // 6 - изменить цвет поля на синий;
  end;
end.

Если Вам необходимо, например, чтобы множество однотипных объектов меняли цвет по одинаковым условиям не обязательно писать скрипт для каждого объекта отдельно. Для этого необходимо:
Код: (delphi)
begin
   // Sender - это тот объект который вызвал скрипт
   if Sender is TM_Object then                   // если Sender это компонент то(например - уровень, поле и т.д.)
       case TM_Object(Sender).ValueAsInt   of    // если значение переменной связанной с объектом равно:
           1..5: Sender.Color := clDarkBlue;     // от 1 до 5, то изменить цвет на темно синий
           6, 7: Sender.Color := clGray;         // 6 или 7 - изменить цвет на серый
           8   : Sender.Color := clYellow;       // 7 - изменить цвет на желтый
       end;
end.

Теперь можно любому объекту выбрать этот скрипт, для этого:
1. У любого объекта через инспектор объектов переходим на вкладку "События" .
2. В свойстве OnDataChange выбираем из списка наш созданный скрипт.

Теперь все объекты у которых в событии OnDataChange мы выбрали наш скрипт будут менять свой цвет в соответствии с условиями скрипта. Чтобы последний способ работал у Вас должна быть версия не позднее 29.01.2015.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 31 Января 2016, 10:52:34
Добавили несколько видеоуроков по созданию скриптов.  Задавайте вопросы если что-то непонятно.

Рассмотрено создание простых скриптов:


Рассмотрено создание универсального скрипта:
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andrey1883 от 01 Февраля 2016, 14:18:01
Может глупый вопрос, но все же...А как помигать одним цветом?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: toreto от 01 Февраля 2016, 15:29:24
По событию  OnDataChange пробую скрывать изображение с помощью прозрачности(Alpha) работает, а вот через событие видимость(Visible) нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Февраля 2016, 17:16:55
Цитировать
через событие видимость(Visible) нет.
Проверяем.

Цитировать
Может глупый вопрос, но все же...А как помигать одним цветом?
В текущей версии мигания нет. Но мы добавим всем объектам новое свойство для мигания.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Февраля 2016, 17:42:41
Цитировать
а вот через событие видимость(Visible) нет.
Проверили, все работает вот так (изображение скрывается при изменении переменной, которая с ним связана):
Код: (delphi)
begin
  Image1.Visible := False;
end.
Можете написать подробнее о последовательности Ваших действий? Вы не забыли выбрать Переменную объекту, у которого пишите OnDataCahnge скрипт?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: toreto от 01 Февраля 2016, 17:58:18
Все работает, вопрос закрыт, мой косяк. Другой вопрос в окнах почему то скрипты не работают.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Февраля 2016, 17:59:39
Какие именно? По какому событию? Если OnShow и OnClose, то они просто ограничены beta-версией
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: toreto от 01 Февраля 2016, 18:03:51
Про эти события я понял что ограничены, а не получается к примеру смена цвета по событию OnDataCahnge
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Февраля 2016, 19:08:10
Теперь понятно. Да, действительно не работает - исправим!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 01 Февраля 2016, 19:51:17
Событие OnDataChange привязано к конкретной переменной и объекту, а если мне надо использовать несколько переменных по изменению которых нужно изменить свойство объекта? Например, отобразить цвет красный на кнопке, если переменные изменились и равны M0= 1 или M1=1 соответственно  и цвет серый, если они равны 0. Или просто крутить в OnSecondTimer условие проверки и там менять цвет?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Февраля 2016, 20:02:44
Самый правильный вариант - выделить под эту задачу третью переменную на контроллере. Эта переменная должна в итоге принимать только два состояния, для красного цвета (допустим значение 0) и для серого (допустим значение 1). Вот эту переменную и нужно использовать в скаде.

Но, к примеру, если Вы не можете сделать это на контроллере, то Вы должны создать виртуальную переменную в скаде и в OnSecondTimer описать условия по которым она будет принимать эти два состояния (как в примере выше). Затем эту переменную Вы связываете со всеми объектами, которые должны менять цвет и описываете смену цвета в OnDataChange. Для этого лучше всего написать один универсальный скрипт и поставить его всем объектам в OnDatachange.

На контроллере это делать правильнее. Вообще, по возможности, нужно делать так, чтобы скада работала с переменными состояний, а не с переменными из которых нужно вычислять состояния. Если такой возможности нет, то тогда уже использовать вариант 2.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 01 Февраля 2016, 20:29:18
Спасибо, подробно и понятно, как в учебнике)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andrey1883 от 02 Февраля 2016, 09:19:39
Цитировать
В текущей версии мигания нет. Но мы добавим всем объектам новое свойство для мигания.

Спасибо!!Это свойство очень пригодится!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 04 Февраля 2016, 15:49:28
Написал простой скрипт, может кому-нибудь понадобится.
Задача. Я ввожу в поле ввода секунды, должен произойти пересчет, и в OPC должны уйти миллисекунды.
Ограничение ввода от 0 до 20 секунд.
Как это сделать.
Имеется переменная OPC: Имя Time_vibro, тип Integer, шкала от 0 до 20000, формат вывода 0 в которой будет хранится значение в миллисекундах.
Я создаю виртуальную переменную, например, a1. Тип integer, шкала от 0 до 20. Формат вывода 0. В ней будет хранится промежуточное значение в секундах.
Создаю поля ввода Field1 для ввода секунд. Переменная для этого поля будет а1. Также у него есть событие OnDoneInput. Оно будет вызвано по окончанию ввода в поле. Cоздаю следующий скрипт.
Код
Procedure Field1_OnDoneInput(Sender: TM_Control);
begin
  Time_Vibro.Value := Field1.ValueAsInt  * 1000;
end. 
Что он делает. Допустим мы ввели в поле секунд 2. Это значение будет выведено в Field1.ValueAsInt.  Умножением на 1000 переведу секунды в миллисекунды и сохраню результат в переменную OPC.
Все работает, но. Так как виртуальная переменная не хранит результат после закрытия скады, то при перезапуске скады, мы в поле ввода увидим 0. Хотя какое-то значение записано в Time_Vibro.Value.
Значит нужно считать его из OPC в поле ввода секунд с обратным преобразованием.
Я это сделал так.
Создал вспомогательное поле ввода Field2. Сделал его недоступным и невидимым. Переменной для этого поля выбрал Time_Vibro. И использовал событие OnDataChange.
Код
Procedure Field2_OnDataChange(Sender: TM_Control);
begin
  Field1.Value := Time_Vibro / 1000
end.
При загрузке скады произойдет сравнение значение переменной Time_Vibro в клиенте скады и значение переменной Time_Vibro в OPC сервере. И если будет обнаружено различие вызовется событие OnDataChange. Миллисекунды переведем в секунды делением и полученное значение присвоим полю ввода секунд.
Так можно преобразовывать любые значение при вводе, а также дополнив скрипт OnDoneInput проверять введенное значение на соответствие нужным условиям и соответственно принимать какие то действия.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 04 Февраля 2016, 17:25:43
Чуть посложнее.
Имеется функция генерирующая программно ШИМ. Есть два поля ввода. Ввод в скаде в секундах, передаем в контроллер в мс. Длительность импульса и период следования. Длительность импульса не должна превышать период следования, функция этого не переварит. Следовательно нужно ввести проверку на ввод пользователя и сделать следующее:
1) Если введенная длительность импульса(с) не превышает период следования(мс), то преобразуем в мс и передаем контроллеру.
2) Если превышает, то делаем длительность импульса(мс) равной периоду следования(мс). Получаем постоянный сигнал на выходе.
Код: (delphi)
Procedure Field43_OnDoneInput(Sender: TM_Control);
var
  Vvod_s: Integer;
  Time_ms: Integer;
  Period_ms: Integer;
begin
  Vvod_s    := Field43.ValueAsInt;
  Time_ms   := D450.ValueAsInt;
  Period_ms := D451.ValueAsInt;

  if Vvod_s < Period_ms/1000 then
    D450.Value  := Vvod_s * 1000
  else
    D450.Value  := Period_ms;
end.
Vvod_s - введенное в поле значение длительности импульса в сек. (Вирт. переменная)
Time_ms - преобразованное значение длительности импульса в мс (Переменная OPC сервера)
D450.Value оно же, но для присвоения.
Period_ms - преобразованное значение периода следования в мс (Переменная OPC сервера)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 04 Февраля 2016, 21:23:19
Отличное и неожиданное решение задач! Но, т.к. в первой задаче у вас прямая зависимость между значением переменной на OPC-сервере и значением отображаемом в поле, то здесь можно было бы обойтись и вовсе без скриптов. Решение первой задачи без скриптов выглядит так:

- добавляем новую переменную с OPC-сервера которая хранит значение времени в миллисекундах;
- ставим этой переменной смещение запятой = -3;
- ставим формат переменной = 0;
- ставим шкалу для этой переменной 0-20000;

Готово! Теперь можно добавить объект Поле в проект и связать эту переменную с ним. Таким образом мы увидим в Поле значение в секундах, а на контролере оно будет храниться и передаваться в миллисекундах.

Этой задачей Вы навели нас на мысль о том, что нужно добавить объектам Поле и Уровень два свойства: "Визуальный минимум" и "Визуальный максимум" (такие свойства были в старой версии скады, но мы их убрали). С их помощью можно было бы работать с переменными в любой собственной шкале, даже без прямой зависимости.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 04 Февраля 2016, 23:33:20
Цитировать
- добавляем новую переменную с OPC-сервера которая хранит значение времени в миллисекундах;
- ставим этой переменной смещение запятой = -3;
- ставим формат переменной = 0;
- ставим шкалу для этой переменной 0-20000;
Красиво. Но мне все равно нужна была проверка.

У меня  есть проблема. Есть два поля ввода. К ним привязаны переменные
D442 Тип Integer Шкала мин 0 макс 1 Формат 0 Сдвиг 0 - Привязано к Field28
D443 Тип Integer Шкала мин 0 макс 1 Формат 0 Сдвиг 0
Суть в чем, эти переменные отвечают за очередность выбора.
0 - первая компонента
1 - вторая компонента
Одновременно они не могут быть первыми или вторыми (допустим) Соответственно, если я ввожу 1 в первое поле мне нужно автоматически ввести 0 во второе. И также если я ввожу 0, то 1 во второе. Ручного ввода во второе поле пока не касаюсь.
Создаю простейший скрипт.

Код
Procedure Field28_OnDoneInput(Sender: TM_Control);
begin
if field28.Value = 1 then D443.Value  := 0 else D443.Value  := 1;
end.     
И он не работает. Я ввожу в поле Field28 1 и получаю 1 во втором; 0 и 0; 2(огр. до 1) = 1 и 0. Продолжаю вводить 1, получаю 0; ввожу 0, получаю 0. Вообщем я этого никак не могу понять.
Заменяю переменные на виртуальные того же типа. Все ок. 1 и 0; 0 и 1; 2(огр. до 1) = 1 и 0.
Оставляю привязанной к первому полю виртуальную переменную, а кто второму OPC переменную D443. Все ок.
Привязываю к первому опять OPC переменную и опять ерунда. Переменные при обмене не пересекаются, в контролере тоже не влияют друг на друга. Что это может быть.
Очень не хватает отладчика, где можно пошагово посмотреть, что происходит на исполнении скрипта и значения переменных во время исполнения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Февраля 2016, 00:31:46
Скрипт не работает, потому что он выполняется по событию OnDoneInput. Т.е. сразу же после того как на клиенте пользователь ввёл значение в поле, скрипт проверяет значение переменной, связанной с этим полем и в зависимости от этого значения меняет переменную другого поля. Ошибка состоит в том, что внешняя переменная не меняет свое значение моментально. После того, как клиент ввел новое значение в поле, значение переменной не изменяется! Новое значение сначала отправляется на сервер, чтобы он записал его в OPC-тег. И только после того, как значение успешно записалось в OPC-тег - клиент получает новое значение переменной. Т.е. на момент выполнения вашего скрипта, значение "field28.Value" всё ещё неизменно, несмотря на то, что пользователь ввел в поле новое значение. А вот с виртуальными переменными всё работает. Ведь им не требуется время на запись, они всегда в памяти и меняются моментально и на момент события OnDoneInput виртуальная переменная уже имеет введенное пользователем значение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 06 Февраля 2016, 17:27:10
Еще один небольшой пример.

Рассмотрим случай, когда нам нужно сделать мигание объекта при определенном значении связанной с ним переменной. Для этого:
1. В свойстве "Переменная" объекта выбираем нужную нам переменную.
2. В инспекторе объектов переходим на вкладку События и дважды кликаем по событию OnDataChange (изменение значения переменной связанной с объектом).
3. Пишем скрипт, например для изображения:

Код: (delphi)
begin
  { отключаем мигание установив цвет мигания «без цвета» - таким образом не нужно будет
    отдельно отключать мигание отдельно для каждого условия ни-же. }
  Image1.FlashColor := clNone;
  case Image1.ValueAsInt of             // если значение переменной равно:
    1: Image1.Color := clRed;           // 1 - изменить цвет на красный.
    2:
    begin
      Image1.Color := clNone;           // 2 – изменить цвет на «без цвета» - для того, чтобы мигание было только зеленым цветом, а не с красного на зеленый.   
      Image1.FlashColor := clGreen;     // и включаем мигание зеленым цветом.
    end;
    3: Image1.Color := clGreen;         // 3 - меняем цвет на зеленый.
  end;
end.
Все объекты в проекте, для которых применяется мигание будут мигать синхронно - по умолчанию с частотой 1 секунда. Управление частотой мигания будет доступно в следующих обновлениях.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 06 Февраля 2016, 17:33:55
Рассмотрим работу с файлами для ситуации, когда нам нужно сохранить различные данные в файл, а потом загрузить их в различные объекты.
Создадим две кнопки – для сохранения в файл и для загрузки из файла. В событии OnClick первой кнопки напишем скрипт для сохранения в файл, например:
Код: (delphi)
begin
  if FileOpen('Hello.sbm') then  // открыть если существует или создать файл Hello.sbm (расширение вы можете использовать любое)
  begin
    FileWriteString(Field1.ValueAsStr);      // записать в файл строку из поля
    FileWriteInteger(Field2.ValueAsInt);     // записать в файл целое число из поля
    FileWriteSingle (Field3.ValueAsFloat);   // записать в файл вещественное число из поля
    FileWriteString (Text1.Text);            // записать в файл содержимое текста
    FileWriteDateTime(Now);                  // записать в файл текущую дату и время
    // закрывать файл не обязательно, Simple-Scada сделает это автоматически. 
  end;
end.

В событии OnClick второй кнопки напишем скрипт для чтения данных из файла, например:
Код: (delphi)
begin
// нужно считывать все данные в той последовательности, в которой мы их записывали
  if FileOpen('Hello.sbm') then    // открыть файл если существует
  begin
    Field1.Value := FileReadString;     // считать в переменную поля строку
    Field2.Value := FileReadInteger;    // считать в переменную поля целое число
    Field3.Value := FileReadSingle;     // считать в переменную поля вещественное число
    Text2.Text   := FileReadString;     // считать в текст строку
    Text3.Text   := DateTimeToStr(FileReadDateTime);// считать в текст время и дату
  end;
end.

Теперь по нажатию первой кнопки данные будут сохраняться в файл, а по нажатию второй загружаться из файла.



Работа с файлами будет доступна после сегодняшнего обновления.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Al_Kuz от 08 Февраля 2016, 13:29:17
Здравствуйте! Не получается работа с файлом из окна. Файл создается, но записи и чтения не происходит. Со страницы запись/чтение в норме. Может, что не так делаю, проект прилагаю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Pr_Alex от 08 Февраля 2016, 13:54:23
Добрый день!
Возможно ли в скриптах динамически создавать объекты, что-то типа:

Код: (delphi)
procedure TForm1.Button1Click(Sender: TObject);
var
   Button : array [1..20] of TButton;
begin
  for i:=1 to 20 do
  begin
    Button[i]:=TButton.Create(Form1);
    Button[i].Parent:=Form1;
    Button[i].Left:=80;
    Button[i].Top:=80;
    Button[i].Name:='Buttons'+IntToStr(i);
  end;
end;
...и обращаться по имени к объектам, типа:
Код: (delphi)
var
  i:integer;
begin
  for i:=1 to 20 do
    (FindComponent('Edit'+IntToStr(i)) as TEdit).Text:='0';
end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Февраля 2016, 17:29:57
Не получается работа с файлом из окна. Файл создается, но записи и чтения не происходит.
Спасибо, сейчас займемся этим вопросом.

Возможно ли в скриптах динамически создавать объекты, что-то типа:
Нет, это запрещено по многим причинам (из соображений быстродействия, безопасности в коде, работы по сети и др.). Если вы хотите, чтобы 20 кнопок появились после выполнения скрипта, то их обязательно нужно предварительно создать в редакторе и, к примеру, сделать скрытыми выключив свойство "Видимость". А скриптом придется просто включать видимость, но для каждой кнопки это придется делать отдельно:

Код
begin
  Button1.Visible := True;
  Button2.Visible := True;
  ...
  Button20.Visible := True;
end;

А как в примере с FindComponent можно было бы осуществить, если мы добавим такую функцию в скрипты. Правда такая функция будет значительно медленнее, чем обращение к объекту по имени напрямую, ведь придется искать её вреди всех объектов проекта. Поэтому подобные скрипты нежелательны и по возможности их лучше избегать. Мы подумаем ещё по поводу FindComponent.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 09 Февраля 2016, 19:34:18
OnExit – скрипт выполнится при выходе из проекта.
А что считается выходом из проекта? В версии 1 можно было настроить кнопку по которой осуществляется выход. А во 2 я такой опции не нашел. По ESC из проекта не выйдешь как раньше, я просто жму ALT+F4. При этом у меня либо скрипт исполняется неверно, либо событие не происходит. И я пока не пойму почему.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 09 Февраля 2016, 21:13:14
Выходом считается реальное завершение работы проекта на сервере. Сейчас мы планируем также добавить события OnInitClient и OnExitClient, которые будут выполняться  по запуску/выходу из клиента.

Цитировать
В версии 1 можно было настроить кнопку по которой осуществляется выход. А во 2 я такой опции не нашел.
Да, мы забыли её включить. Сейчас по Shift+ESCAPE осуществляется выход.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Al_Kuz от 15 Февраля 2016, 09:44:53
По работе с файлами. Часто для работы оборудования требуются некие параметры. Набор таких параметров или рецептов создается пользователем и хранится в файле. Вот мыслю, как это сделать имеющимися в S-S2 возможностями. Если в файл записывать только данные числового типа, то каждая запись группы параметров имеет фиксированную длину в байтах, но пользователю нужен не только номер набора параметров или рецепта, но и название (имя). Строчные данные имеют разную длину, поэтому не одинаковую длину будет иметь и группа параметров. Как организовать поиск и считывание из файла нужных мне параметров?

Поскольку синтаксис скриптов S-S2 похож на синтаксис Дельфи, то подсмотрел в справке как там работают напрямую с файлом. Было бы не плохо научить S-S2 компиль cоздавать типизированные файлы, а так же писать и читать переменные типа record.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 15 Февраля 2016, 10:44:08
Цитировать
Строчные данные имеют разную длину, поэтому не одинаковую длину будет иметь и группа параметров. Как организовать поиск и считывание из файла нужных мне параметров?
Допустим Вы записываете в файл следующим образом:

Код: (delphi)
begin
  if FileOpen('MyFile.sfl') then
  begin
    FileWriteInteger(10);              // первое целое число
    FileWriteString('Привет, мир!');   // строка
    FileWriteInteger(20);              // второе целое число
    // ... и т.д.
  end;
end;
При чтении, чтобы добраться до второго числа в файле, Вы должны выполнить чтение первых двух параметров в той же последовательности.

Код: (delphi)
var
  I: Integer;
  S: UTF8String;
begin
  if FileOpen('MyFile.sfl') then
  begin
    I := FileReadInteger;    // первое целое число
    S := FileReadString;     // строка
    I := FileReadInteger;    // второе целое число
    // ... и т.д.
  end;
end;
Для случая, когда в файле хранятся строки (т.е. динамические данные), только так. Т.е. чтобы переместиться в файле на длину строки - нужно её считать. Как мы поняли Вы хотите хранить в одном файле несколько рецептов, а затем, при необходимости, загружать нужный рецепт из файла. А так как рецепт содержит строки, быстро перейти к нужному рецепту в файле не получается. Нужно будет читать рецепты до него, как в примере выше. Если это так, то здесь можно просто хранить рецепты в разных файлах и всегда читать нужный рецепт, без лишних данных.

Если хранить их нужно строго в одном файле, то можно предложить ещё одно решение. Перед сохранением рецепта в файл, можно сохранять в него и длину рецепта (т.е. суммарную длину всех параметров рецепта), как целочисленное значение. Затем, чтобы пропустить рецепт и перейти к следующему - не придется читать его по параметрам. Можно будет считать его длину и переместить курсор на эту длину используя процедуру FileSeek. Таким образом курсор окажется у второго рецепта, у которого опять же можно считать длину и снова пропустить, если нужно.

Работу с типизированными файлами возможно добавим позже. Но нужно понимать, что типизированные файлы обычно не несут ничего хорошего, кроме удобного перемещения по файлу. Ведь для того, чтобы хранить в таком файле, к примеру строки и числа, придется всё записывать в виде строк, что вынуждает конвертировать числа в строку перед записью в файл, и наоборот, строку в число при чтении из файла.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Al_Kuz от 15 Февраля 2016, 23:33:07
Цитировать
можно просто хранить рецепты в разных файлах и всегда читать нужный рецепт, без лишних данных.

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

Код: (delphi)
type
TRecipe = record //Создаем структуру типа запись
  number:integer;
  name  :string[16];
  weight:integer;
 end;
 
var
 Recipe: TRecipe; //переменная записи
 RecipeF: file of TRecipe; //файловая переменная

begin
    Recipe.number:= Field1.Value;//присвоение значений
    Recipe.name:= Field2.Value;
    Recipe.weight:= Field3.Value;
       
  write(RecipeF,Recipe); //записать данные в файл. Каждая запись имеет строго определенную длину.
end. //Как то так. Вы и без меня знаете.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: SAES-CV от 02 Марта 2016, 13:07:28
Доброго времени суток!
На проекте "Монитор работы вентиляционного оборудования" хочется привязать мото-часы к (фактическую наработку) оборудованию. То-есть при нажатии на кнопку вкл. таймер начнёт отсчёт, при остановке - остановится, при следующем нажатии - продолжит с того-же времени... Контроллеры все виртуальные.
Посоветуйте пожалуйста откуда плясать... буду признателен.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 03 Марта 2016, 22:29:12
Здравствуйте!

Во вложении пример проекта с решением Вашей задачи. Распакуйте его в папку "Simple-Scada 2\Projects" , затем запустите его через Client и посмотрите как он работает. Затем перейдите в редактор и посмотрите скрипты для кнопок и для события OnSecondTimer (также в скриптах используются 2 внутренние переменные). Результат (наработку мото-часов) Вы можете записывать в какой-нибудь тэг OPC-сервера или сохранять в файл(подробнее см. в руководстве по скриптам - раздел "Работа с файлами").
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: SAES-CV от 04 Марта 2016, 13:03:34
Спасибо большое, буду пробовать. потом отпишусь  :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: a_sergeevich от 04 Марта 2016, 15:44:04
У меня есть кнопка на которой висит сброс счетчика, как сделать, чтобы при нажатии на неё выскакивал запрос пароля ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 04 Марта 2016, 23:47:08
a_sergeevich для этого мы должны добавить в скрипты функцию для появления специальной формы с паролем. Возможно добавим её в одном и следующих обновлений.

Есть также и другой вариант. Вы можете создать новое окно и разместить в нём поле для ввода пароля и кнопки "Ок" и "Отмена". На нажатию "Ок" выполнять скрипт, который будет сравнивать текст из поля с паролем и если они совпадают, то сбрасывать счетчик. Минус будет в том, что в момент ввода пароля он будет виден в поле, т.е. символы при вводе не будут заменены звездочками "*" как это обычно бывает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Mishail от 09 Марта 2016, 07:29:42
Здравствуйте!
Немного  опишу ситуацию. Есть регистр(переменная) формата int, который хранит индекс некоего события(в примере причина пуска). Есть объект Text1 (для примера), который должен в зависимости от регистра выводить разный текст. Это реализовано и прекрасно работает в виде:
Код
begin
 case Text1.Value  of
  1:Text1.Text := 'Местн.Пуск';
  2:Text1.Text := 'Вынос.Пульт';
  3:Text1.Text := 'Автозапуск';
  4:Text1.Text := 'Диспетчер';
  0:Text1.Text := 'Работает';
  end;
end.
   

И таких объектов может быть несколько. Захотелось реализовать  "универсальный скрипт", но оказалось что объект Sender не знает никаких Text, Возможно ли это реализовать? Заранее спасибо.
P.S. Клиент и Редактор прекрасно работает под Wine в Linux (Ubuntu 14.04)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 09 Марта 2016, 08:22:58
Конечно возможно! Забыли описать это в руководстве - исправим. Через Sender можно обращаться только к общим свойствам объектов. Для обращения к остальным свойствам необходимо привести объект к нужному типу. Для этого нужно использовать конструкцию "Sender as ...". А чтобы убедиться, что объект действительно имеет нужный нам тип - добавляется проверка "Sender is ...", т.е. в вашем случае код будет выглядеть так:
Код: (delphi)
begin
  if Sender is TM_Text then
    case TM_Text(Sender).ValueAsInt of
      1:(Sender as TM_Text).Text := 'Местн.Пуск';
      2:(Sender as TM_Text).Text := 'Вынос.Пульт';
      3:(Sender as TM_Text).Text := 'Автозапуск';
      4:(Sender as TM_Text).Text := 'Диспетчер';
      0:(Sender as TM_Text).Text := 'Работает';
    end;
end.
Когда таких условий у Вас много правильнее и удобнее для восприятия писать так:
Код: (delphi)
begin
  if Sender is TM_Text then
    with Sender as TM_Text do             
      case ValueAsInt of
        1:Text := 'Местн.Пуск';
        2:Text := 'Вынос.Пульт';
        3:Text := 'Автозапуск';
        4:Text := 'Диспетчер';
        0:Text := 'Работает';
      end;
end.

Цитировать
Клиент и Редактор прекрасно работает под Wine в Linux (Ubuntu 14.04)
Спасибо за информацию! Такого теста мы еще не проводили.
UPD: в обновление 2.6.7.0 добавлена поддержка Linux. Подробные инструкции см. по этой ссылке (https://simple-scada.com/help/manual/linuxwine.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Mishail от 09 Марта 2016, 09:50:26
Благодарю за оперативный ответ  :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 09 Марта 2016, 11:25:32
Здравствуйте.! Уважаемые помогаете пожалуйста с написанием скрипта.
Опишу ситуацию.
Есть кнопка с фиксацией к которой прикреплена переменная типа bool. Естественно эта кнопка меняет цвет в зависимости от состояния выше указанной переменной. Так вот хотелось бы еще чтобы менялся текст на этой кнопке только в зависимости от состояния другой переменной.
Всю голову сломал но что то до меня не доходит как это реализовать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 09 Марта 2016, 12:25:29
1. Создаете поле, у меня это Field2.
2. Прикрепляете к этому полю переменную, от состояния которой у вас будет меняться текст на кнопке. У меня это вирт. переменная со шкалой от 0 до 1 - bVar_2
3. Создаете скрипт к этому полю OnDataChange.
Код: (delphi)
begin
  if Field2.Value = 0 then
    // Кнопка не нажата и зафиксирована, значение bVal_2 = 0
    Button1.States[0].Caption := 'Надпись 1'
  else
    // Кнопка не нажата и зафиксирована, значение bVal_2 = 1
    Button1.States[0].Caption := 'Надпись 2';

  if Field2.Value = 0 then
    // Кнопка нажата и зафиксирована, значение bVal_2 = 0
    Button1.States[1].Caption := 'Надпись 3'
  else
    // Кнопка нажата и зафиксирована, значение bVal_2 = 1
    Button1.States[1].Caption := 'Надпись 4';
end.
где Button1 меняете на вашу кнопку
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 09 Марта 2016, 12:31:40
1. Создаете поле, у меня это Field2.
2. Прикрепляете к этому полю переменную, от состояния которой у вас будет меняться текст на кнопке. У меня это вирт. переменная со шка............

Огромное спасибо за помощь !!!!!!!!!!!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: a_sergeevich от 09 Марта 2016, 15:45:36
Помогите со скриптом.
Есть несколько скриптов для подсчёта наработки:

Код: (delphi)
procedure Narabotka_OnDataChange(Sender:Tm_Control);
begin
   if kot_v_rab.ValueAsInt = 1 then
      Time.Value :=  IncSecond(Now, -Interval.ValueAsInt);
 
   if kot_v_rab.ValueAsInt = 0 then
      Interval.Value := SecondsBetween(Now, Time.Value);
end.
Второй выводит в текст занчение наработки:
Код: (delphi)
procedure OnSecondTimer;
begin
   if kot_v_rab.ValueAsInt = 1 then
     Narabotka.Text := IntToStr(DaysBetween(Now, Time.Value)) + ' дней '+ TimeToStr(Now-Time.Value);
end.
Всё это нормально работает, но до тех пор пока не выйдешь из клиента, после выхода и входа всё начинает считать сначала т.е предыдущие показания не сохраняются.
Поэтому решил при выходе сохранять показания в файл, а при входе из файла их выдёргивать и продолжать счёт. Для этого думаю использовать OnInitialization и OnExit, но никак не соображу как сделать сохранение и считывание правильно. Пытался сохранять в файл значение переменной Interval.ValueAsInt при выходе и считывать значение в неё из файла при входе, но ничего не получается, счет начинается с нуля или с каких-то нереальных цифр типа 7345 дней 20:45:12.
Чувствую, что делаю что-то не так, а что, понять не могу. Поэтому помогите, пожалуйста.
П.С за основу был взят ваш пример счетчика наработки из 31 ответа.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 09 Марта 2016, 17:07:38
Я взял ваш пример работы с таймером и дополнил его.

На выходе
Код: (delphi)
procedure OnExit;
begin
  //Сохраняю интервал
  If FileOpen ('Init.msf') then
      FileWriteInt64 (Interval.ValueAsInt)
end.

На входе
Код: (delphi)
procedure OnInitialization;
{ Скрипт исполняющийся при запуске программы}
begin
  // Загружаю интервал
  If FileOpen ('Init.msf') then
      Interval .Value  := FileReadInt64;
  // Смещаю текущее время на интервал времени наработки в секундах в переменной Time
  Time.Value  := IncSecond (Now, -Interval.ValueAsInt) ;
  // Использую смещенное значение для вычисления времени наработки и отображаю время наработки   
  Text1.Text := IntToStr(DaysBetween(Now, Time.Value ))  + ' дней ' + TimeToStr (Now-Time.Value);
end.
И все работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: a_sergeevich от 10 Марта 2016, 08:05:20
Спасибо за наводку, нашёл свою ошибку, я забыл в скрипте при входе добавить Time.Value  := IncSecond (Now, -Interval.ValueAsInt) ; теперь всё заработало.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 16 Марта 2016, 08:28:04
Здравствуйте ! Подскажите пожалуйста возможно ли с помощью скриптов вызывать внешние программы?  Ну например калькулятор.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Марта 2016, 09:47:22
deldemo, да, будет в ближайшем обновлении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: a_sergeevich от 18 Марта 2016, 15:05:19
Подскажите, правильно ли я использую следующие функции.
Есть три переменных типа word : den, chas, minuta.

den := DayOfTheWeek ( Date ); получаю из даты день недели значение от 1 до 7.
chas := HourOf ( Now ); получаю часы из текущего времени.
minuta := MinuteOf ( Now ); получаю минуты из текущего времени.

Хочу сделать скрипт для работы котла по таймеру, типа с понедельника по пятницу котёл работает с 6:00 до 9:00 и с 16:00 до 18:00. Время включения и выключения можно будет задавать произвольно в полях ввода.
Скрипт этот хочу вставить в скрипт OnSecondTimer.
Как думаете в правильном направлении двигаюсь ? Может у вас есть готовый пример реализации такого таймера ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Марта 2016, 15:15:19
Т.к. у вас работа котла контролируется по часам, то Вы можете сделать проверку в OnHourTimer (брать текущий час и в сравнении проверять наступил ли нужный час), чтобы не выполнять скрипт каждую секунду. Но и в OneSecondTimer всё будет работать. Но, Вы хотите вынести команды управления котлом в скаду, т.е. по сути скада будет управлять котлом. Это неправильно, скада не должна отвечать за управление оборудованием и описанные вами проверки должны выполняться на контроллере, который и должен выполнять пуск и останов котла. Если управление берет на себя скада, то что будет если временно выйдет из строя компьютер, или произойдет сбой в ОС, или самой скада-системе? Процесс нарушится, даже если контроллер будет в это время работать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: a_sergeevich от 18 Марта 2016, 15:51:08
 В плк у меня уже есть блок работы по температурному графику, в скаде будет кнопка переключения работы котла с темп.графика на работу по таймеру и в режиме по таймеру скада будет управлять выходом плк, который используется и при работе по графику. Если слетит скада или комп, котёл просто переключится на работу по графику и всё.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 22 Марта 2016, 13:05:39
Добрый день уважаемые форумчане и хозяева этой великолепной программы "Simple-Scada 2".

Подскажите пожалуйста в правильном направлении я мыслю или есть другой вариант решения этой задачи.
Задача:
   Есть переменные типа DWORD, в них хоронятся состояния 225 кнопок управления двигателями (ну типа АВТО, РУЧНОЙ включен. РУЧНОЙ выключен,) мне нужно забрать эту информацию и отоброзить в SCADA.
Как видно из кода ниже, я использовал виртуальную переменную.
Может быть есть возможность на прямую работать с битом переменной  ? 

Код: (delphi)
begin
bool1.Value := GetBit(dword.Value,0); // Забираем нужный bit из "dword" в виртуальную переменную "bool1".
  case bool1.ValueAsInt of // Дальше работаем с виртуальной переменной "bool1".
    0:Button1.States[0].Color  := RGB(60,70,80);
    1:Button1.States[0].Color  := RGB(0,95,88);
  end;
  case bool1.ValueAsInt of
    0:Button1.States[0].BorderColor := RGB(60,70,80);
    1:Button1.States[0].BorderColor := RGB(0,95,88);
  end;

bool2.Value := GetBit(dword.Value,1);
  case bool2.ValueAsInt of
    0:Button2.States[0].Color  := RGB(60,70,80);
    1:Button2.States[0].Color  := RGB(0,95,88);
  end;
  case bool2.ValueAsInt of
    0:Button2.States[0].BorderColor := RGB(60,70,80);
    1:Button2.States[0].BorderColor := RGB(0,95,88);
  end;

  // и тд. и тп.
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Марта 2016, 13:38:10
Да, есть такая возможность. Можно изменить код вот так, не используя виртуальные переменные:
Код: (delphi)
begin
  // если нулевой бит равен 1
  if GetBit(dword.Value, 0) then
  begin
    Button1.States[0].Color  := RGB(0,95,88);
    Button1.States[0].BorderColor := RGB(0,95,88);
  end else
    // если нулевой бит равен 0
    begin
       Button1.States[0].Color  := RGB(60,70,80);
       Button1.States[0].BorderColor := RGB(60,70,80);
    end;

  // если первый бит равен 1
  if GetBit(dword.Value, 1) then
  begin
    Button1.States[0].Color  := RGB(0,95,88);
    Button1.States[0].BorderColor := RGB(0,95,88);
  end else
    // если первый бит равен 0
    begin
      Button1.States[0].Color  := RGB(60,70,80);
      Button1.States[0].BorderColor := RGB(60,70,80);
    end;
end.
Может быть мы бы могли посоветовать решение ещё лучше, но нужно подробнее понять задачу. Опишите подробно, как должна работать кнопка и как она должна менять свои состояния? Вы точно хотите менять состояние кнопки в зависимости от разных битов? Т.е. сначала в коде вы проверяете нулевой бит, потом проверяете первый бит. Так и должно быть?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 22 Марта 2016, 14:15:07
Извините но я в скрипте выше допустил ошибку. там кнопки разные. сей час исправил.
Цитировать
Может быть мы бы могли посоветовать решение ещё лучше, но нужно подробнее понять задачу. Опишите подробно, как должна работать кнопка и как она должна менять свои состояния? Вы точно хотите менять состояние кнопки в зависимости от разных битов? Т.е. сначала в коде вы проверяете нулевой бит, потом проверяете первый бит. Так и должно быть?
Сама кнопка(без фиксации) в SCADA работает c bool переменной PLC.(т.е. включает АВТО режим узла/агрегата с помощью переменной btnAUTO, ручной режим работы с помощью btnMANUAL) а вот состояние этого узла/агрегата(что он действительно переключился в тот или иной режим работы) приходит из PLC другой переменной типа DWORD. У каждого состояня того или иного узла/агригата свой bit той самой DWORD.
Мне бы хотелось что бы кнопка в SCADA ,которая отвечает за переключение режима ,меняла свой цвет при смене бита отвечающего за ее состояние. 

В принципе скрипт который Вы написали мне очень даже подходит. Спасибо огромное за помощь.
P.S
Так как я не очень силен в паскале (Точнее совсем не силен) объясните дурачку пожалуйста(если не сложно) от куда берется состояние бита , ведь в условии только только бит с которым нужно работать. 
Все понял сдесь как в ST он при вызове априори TRUE а далее ELSE делает свое дело.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Марта 2016, 18:45:28
Да, исходя из всего вышеописанного Вы должны использовать скрипт, который мы предложили. Т.к. кнопки должны работать с одной переменной, а менять свой вид (цвет и цвет рамки) должны в зависимости от значения бита другой переменной - то здесь можно предложить только это решение.

Цитировать
от куда берется состояние бита , ведь в условии только только бит с которым нужно работать
Если подробно, то GetBit - это функция, которая берет нужный бит из целого числа и возвращает его значение как тип Boolean. Т.е. если этот бит равен 1, то она вернёт True, если этот бит равен 0 то она вернёт False. Это позволяет писать так:

Код
if GetBit(dword.Value, 0) then
  ...
else
  ...

, а это одно и то же, что и:
Код
if GetBit(dword.Value, 0) = True then
  ...
else
  ...

Т.к. GetBit возвращает Boolean, а не какой-то другой тип, то мы может использовать сокращенное сравнение, как в первом варианте.

А ещё можно писать так:

Код
if not GetBit(dword.Value, 0) then
  ...
else
  ...

, это одно и то же, что и:
Код
if GetBit(dword.Value, 0) = False then
  ...
else
  ...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 22 Марта 2016, 21:01:39
Спасибо большое за пояснение.!!!!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 22 Марта 2016, 22:31:06
Вечер добрый. Работая со скриптом обнаружил проблему, что поле ввода через которое запускается скрипт OnDataChange (тот самый который вы мне посоветовали) не может принять максимальное значение переменной DWORD (или longWORD) так как максимальную ШКАЛУ можно сделать только от -2147483648 до 2147483647,
 а вот от 0 до 4294967295 (в принципе те же 32 бита) нельзя.

Провел сегодня опыт :
Создал 32 кнопки каждой кнопке присвоил свой бит одной переменной типа longWord.
Создал поле , прикрепил к этому полю  longWord.
При присвоении 31 биту (или кнопке) TRUE значение отображается в поле нормально ,
а вот 32 бит уводит значение поля в -1. что есть не очень хорошо.
Будьте добры добавьте Шкалу от 0 до 4294967295


Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Марта 2016, 23:44:47
deldemo, исправим!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: int2246 от 07 Апреля 2016, 09:35:49
Здравствуйте. Интересует вот такой вопрос. Можно ли с помощью скриптов вписать в фигуру допустим  прямоугольник отображения программы допустим браузера  или программы отображения изображений с камеры?  И чтобы она отобразилась в этом прямоугольники со свойствами как на весь экран? Если это возможно то хотелось бы удивить пример скрипта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Апреля 2016, 09:40:24
Нет, такой возможности нет. Если Вам, к примеру, нужно вывести изображение с камеры и постоянно видеть его, то придется делать это сторонней программой и выводить на второй монитор. Или делать всё с одним монитором, но в этом случае придется постоянно сворачивать скаду, чтобы посмотреть камеру.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: int2246 от 07 Апреля 2016, 09:51:54
Это само самой разумеется, просто хотелось наблюдать из скады  за происходящим.  А на всею страницу сделать нельзя?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Апреля 2016, 13:03:56
Нет, в данном случае Вы по сути хотите вставить в окно скады другое приложение. Это не получится из-за особенностей отрисовки скады. Добавить такую возможность - можно, но это может привести к появлению недостатков связанных со скоростью и стабильностью работы и добавит в скаду несколько уязвимостей.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: int2246 от 08 Апреля 2016, 08:54:07
Нет, в данном случае Вы по сути хотите вставить в окно скады другое приложение. Это не получится из-за особенностей отрисовки скады. Добавить такую возможность - можно, но это может привести к появлению недостатков связанных со скоростью и стабильностью работы и добавит в скаду несколько уязвимостей.
Если вы сможете добавить какую возможность то это будет ВАУ  ::) 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 10 Апреля 2016, 11:53:37
Здравствуйте.
Не получается реализовать скрипт с координатами мыши. Ошибка при компиляции.
(https://storage7.static.itmages.ru/i/16/0410/s_1460278383_8812810_a0cad591ae.png) (https://itmages.ru/image/view/4119977/a0cad591)

(https://storage5.static.itmages.ru/i/16/0410/s_1460278327_5221677_be8db2e911.png) (https://itmages.ru/image/view/4119975/be8db2e9)
Вопрос ? Что я делаю не так
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Апреля 2016, 11:56:28
deldemo, Вы всё делаете верно, но некоторое время назад мы исключили функции Mouse_X, Mouse_Y из скриптов (а из справки удалить забыли), т.к. они вернут координаты курсора мыши сервера, а не клиента, что может привести к разным заблуждениям и бессмысленности этих функций.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 10 Апреля 2016, 12:18:02
Жаль, можно было бы первоАпрельские шутки реализовать для операторов (ну естественно не нарушая ТБ)  ;D

Вообще ,конечно если серьезно, то задумка была прикольная. Можно было бы в связки планшета с шаговым двигателем реализовать какой нибудь станочек по художественному вырезанию.(прямо онлайн)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: int2246 от 25 Апреля 2016, 10:24:35
Здравствуйте, подскажите пожалуйста, можно ли как то сделать воспроизведения собственной аудио записи по событию?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Апреля 2016, 10:55:23
int2246, это будет возможно если мы вынесем в скрипты соответствующие процедуры. Постараемся сделать это в ближайшее время.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: int2246 от 25 Апреля 2016, 10:56:40
спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Evgen4ik от 01 Мая 2016, 11:11:23
Добрый день! Возник вопрос, Можно ли написать скрипт для того чтобы при превышении параметра (температуры) издавался звуковой сигнал. Извиняюсь возможно за глупый вопрос но совсем недавно в этой теме.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Мая 2016, 11:35:38
Для включения звукового сигнала:
У Поля или Уровня, в котором отображается температура переходим в Инспекторе объектов в "События", кликаем два раза ЛКМ на OnDataChange (изменилось значение переменной связанной с объектом) и пишем скрипт:
Код
begin
 // Field1 - поле с которым связанна переменная температуры.
 // Ниже приведены варианты звуковых сообщений - выберите какое требуется Вам.
  case Field1.ValueAsInt of
    20..30: PlayMessageSoundClient(GetClientName);  // проиграть звук сообщения на текущем клиенте, если значение в диапазоне от 20 до 30.
    31..40: PlayWarningSoundClient(GetClientName);  // проиграть звук предупреждения на текущем клиенте, если значение в диапазоне от 31 до 40.
    41..50: PlayAlarmSoundClient(GetClientName);    // проиграть звук аварии на текущем клиенте, если значение в диапазоне от 41 до 50.
  end;
end.

Можно сделать кнопку, которая будет останавливать проигрывание звука:
Ставим кнопку, переходим в события, кликаем по событию OnClick (пользователь кликнул по объекту);
Код
begin
  StopSoundClient(GetClientName); // остановить проигрывание звука на текущем клиенте.
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Хитрый от 12 Мая 2016, 13:17:13
Здравствуйте.
Можно ли написать скрипт так, чтоб при изменении переменной поля, если она меньше определенного значения, то ее значение приравнивалось к нулю и выводилось в поле?
Пробовал писать такой скрипт, но данные в этом же поле не менялись, но при этом по этому условию можно менять данные в другом поле...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег от 12 Мая 2016, 16:53:32
Добрый день!

Подскажите как вывести текущую  время и дату, попробовал из примера руководства но не компилится.
А так же хотелось бы узнать можно как то  реализовать, что бы при нажатии на кнопку не закрывая сеанса(тоесть вся система активна) блокировался экран до введения заданного логина и пароля.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 12 Мая 2016, 18:05:48
Можно ли написать скрипт так, чтоб при изменении переменной поля, если она меньше определенного значения, то ее значение приравнивалось к нулю и выводилось в поле?
   Попробуйте использовать скрипт по окончанию ввода для этого поля.
   Я создал внутренний тег Test типа Integer. Создал поле Field1. Привязал переменную к этому полю и в Событиях для этого поля выбрал скрипт OnDoneInput
Код
begin
  if Field1.Value < -10 then
    Field1.Value := 0;
end.           
Если вы введете значение меньше -10, то оно будет приравнено к нулю и выведено в поле. Это контроль по вводу с клавиатуры.
   А если значение переменной меняется не с клавиатуры, и вы хотите решить ту же задачу, то используйте скрипт OnDataChange. С тем же кодом.

Цитировать
Подскажите как вывести текущую  время и дату, попробовал из примера руководства но не компилится.
Создал объект Text1. В меню Проект-Скрипты использую скрипт OnSecondTimer
Код
begin
  Text1.Text := DateTimeToStr(Now);
end.     
Т.е. просто преобразую текущее время/дату - Now из формата TDateTime в формат String и присваиваю полю Text объекта Text1 и каждую секунду оно будет обновляться.

Цитировать
А так же хотелось бы узнать можно как то  реализовать, что бы при нажатии на кнопку не закрывая сеанса(тоесть вся система активна) блокировался экран до введения заданного логина и пароля.
А вот это надо в предложения внести. Сейчас если вы вошли в учетную запись, вы из нее никак не выйдете. Только сможете перейти в другую учетку или закрыть клиент.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Мая 2016, 19:31:13
Цитировать
Подскажите как вывести текущую  время и дату, попробовал из примера руководства но не компилится.
Как и написал TeNQ.

Цитировать
Можно ли написать скрипт так, чтоб при изменении переменной поля, если она меньше определенного значения, то ее значение приравнивалось к нулю и выводилось в поле?
Подобные проверки безусловно должны быть сделаны на контроллере. Но если такой возможности нет и нужно сделать именно в скаде, то:

Для внешней переменной (с OPC-сервера):
Можно сделать это по событию OnDataChange объекта, который связан с данной переменной, или по событию OnDoneInput, как предложил TeNQ (это подойдет если переменную меняет именно пользователь).

Для виртуальной переменной:
правильнее делать эту проверку в OneSecondTimer или по событию OnDoneInput, как описано выше. Но по событию OnDataChange такого делать нельзя, т.к. скрипт будет зациклен сам на себя и приведет к плохим последствиям. Описать этот процесс можно так:
т.к. любое присваивание в виртуальную переменную сейчас приводит к вызову события OnDataChange. Постараемся уйти от этого в ближайшее время.

А вот это надо в предложения внести. Сейчас если вы вошли в учетную запись, вы из нее никак не выйдете. Только сможете перейти в другую учетку или закрыть клиент.
Добавим в скрипты функции авторизации и закрытия сессии в ближайшем или следующем после него обновлении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 14 Мая 2016, 11:26:47
Здравствуйте!
Есть небольшое неудобство при написании скриптов.
Если печатать длинный текст в скрипте (ну например как на скришоте ) он уходит за область и достать его от туда нельзя. А при переносе половины текста на строку ниже (скрин №2) сбивается форматирование в окне где этот текст отображается, ну и в редакторе скриптов как то не эстетично все это смотрится  без подсветки синтаксиса.
Просто у меня ноут +FHD монитор. Иногда приходится работать с экрана ноутбука а там 1366x768 и тут становится не очень комфортно в редакторе .
Вообщем хотелось бы какие то горизонтальные ползунки ну или любой другой вариант для передвижения по экрану в горизонтальном положении. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Мая 2016, 11:34:40
deldemo, чтобы текст в коде располагался в несколько строк, нужно писать так, как показано на картинке. Также не забывайте, что можно менять размер шрифта, если нужно. Может быть на вашем мониторе удобнее будет работать с более мелким шрифтом.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 14 Мая 2016, 11:38:32
Администратор. Огромное спасибо за моментальную помощь !!!!!!!!!!!!!!!!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 14 Мая 2016, 11:59:03
И еще один вопросик.
Можно ли как то сменить цвет системного сообщения ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Мая 2016, 12:00:14
Пока нет и для этого нужно использовать собственные окна. Но можем добавить такую функцию.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 14 Мая 2016, 12:17:45
Было бы неплохо. Просто системные сообщения очень хорошо акцентируют на себе внимание. Ими очень удобно пользоваться для важных оповещений.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Vladimir от 19 Мая 2016, 15:45:07
Пример скрипта
 
Код
begin
   IF (S21.Value =true) then S21_shape.Color := clgreen
                        else S21_shape.Color := clgray;
end

Если я меняю название объекта с S21_shape к примеру на S21_klapan, то приходится менять и код скрипта, т.к. объекта S21_shape больше не существует. Возможно ли сделать, чтобы название объекта автоматически менялось и в редакторе скриптов?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 19 Мая 2016, 23:48:13
Vladimir, в ближайшее время этой возможности не будет. Лучше всего сначала правильно именовать объекты, а затем писать скрипты, чтобы исключить переименование. Но нужно признать - это не всегда удается. В этом случае нужно использовать универсальные скрипты везде, где это возможно. Если оба варианта не подходят, то придется все-таки переименовывать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 21 Мая 2016, 00:14:17
Подскажите есть скрипт универсальный, в зависимости от состояния переменной меняется кадр, но не получается сделать что бы менялся цвет кадра при 1 - 1 кадр зелёный, а при 0 - кадр оранжевый

Код
  if Sender is TM_Image then   // проверяем, что Sender это картинка:
    with Sender as TM_Image do // приводим объект к типу TM_Image:
      case ValueAsInt of       // если значение переменной равно:
        1 : Frame := 1;        // 1, то показать кадр 1
        0 : Frame := 0;        // 0, то показать кадр 0
   end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Мая 2016, 09:21:18
beloleg86, чтобы менять цвет используйте свойство Color.
Если нужно менять цвет и кадр одновременно, то можно писать так:

Код
  if Sender is TM_Image then   // проверяем, что Sender это картинка:
    with Sender as TM_Image do // приводим объект к типу TM_Image:
      case ValueAsInt of       // если значение переменной равно:
        1 :
        begin
          Color := clGreen;     
          Frame := 1;
        end;

        0 :
        begin
          Color := clOrange;   
          Frame := 0; 
        end;
      end;

Вместо констант цвета Вы также можете использовать функцию RGB, при помощи которой можно задать любой цвет из трёх основных. Например:

Код
  Color := RGB(255, 0, 0);  // Красный
  Color := RGB(0, 255, 0);  // Зеленый
  Color := RGB(0, 0, 255);  // Синий
  и т.д.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 23 Мая 2016, 08:14:20
Еще вопрос по скрипту. Есть переменная с диапазоном от 0 до 100 (положение заслонки). Я выбрал объект заслонка, присвоил ей переменную, написал скрипт, что от -5 до 5 заслонка считается закрытой и меняет цвет заслонки на оранжевый, например, и от 95-105 считается открытой и меняет цвет на зелёный. скрипт выполняется только на одну секунду а потом цвет встает по умолчанию серый, как на открытии так и на закрытии.
Код
begin
  if Sender is TM_Valve then               // проверяем, что Sender это заслонка:
    with Sender as TM_Valve do             // приводим объект к типу TM_Valve:
      case ValueAsInt of                   // если значение переменной равно:
        -5..5 :                            // = -5 до 5 то считаем что заслонка закрыта
        begin
          Color := RGB(255, 0, 0);         // изменить цвет на красный
        end;

        95..105 :                          // = 95 до 105 то считаем что заслонка открыта
        begin
          Color := RGB(0, 255, 0);         // изменяем цвет на зеленый
        end;
    end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Вай-Вай от 23 Мая 2016, 08:50:25
Здравствуйте есть скрипт задача которого в зависимости от значения в поле менять слой кнопки, но что-то у меня не получилось, срабатывает когда ему вздумается и совсем не так как мне нужно (
Код
begin
 if Field2.ValueAsInt > 0 then
 Button3.Layer := 5
  else
 Button3.Layer := 2;
 end.
что у меня тут не так?
и еще, тип переменной в "Field2" у меня LongWord пробовал втулить в первую строку, не получилось, с "ValueAsInt" хоть как-то заработало, хотя и не правильно (
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 23 Мая 2016, 12:00:07
Здравствуйте есть скрипт задача которого в зависимости от значения в поле менять слой кнопки, но что-то у меня не получилось, срабатывает когда ему вздумается и совсем не так как мне нужно (
Попробовал, у меня так же не работает. Я создал три текстовых объекта и выводил туда значение слоя объекта в секундном скрипте.
Код
Text1.Text := 'Слой кнопки ' + IntToStr(Button1.Layer);
Text2.Text := 'Слой изображения ' + IntToStr(Image1.Layer);
Text3.Text := 'Слой поля ' + IntToStr(Field1.Layer);   
Когда слои не меняешь, то все выводится корректно. Хотя номера слоев отличаются от тех, что были заданы объектам в редакторе. А когда начинаешь менять слой объекта, получается полная ерунда. Слои объектов меняются по какому-то странному алгоритму + что-то происходит с текстовыми объектами. Так то, что должно было выводиться  в Text1.Text выводится в Text2.Text, при следующем изменении слоя выводится уже в Text3.Text. Мне кажется, что это все связано с распределение слоев. Как то упоминалось, что один слой может содержать только один объект. И этот алгоритм распределения дает сбой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 23 Мая 2016, 12:43:03
Еще вопрос по скрипту. Есть переменная с диапазоном от 0 до 100 (положение заслонки). Я выбрал объект заслонка, присвоил ей переменную, написал скрипт, что от -5 до 5 заслонка считается закрытой и меняет цвет заслонки на оранжевый, например, и от 95-105 считается открытой и меняет цвет на зелёный. скрипт выполняется только на одну секунду а потом цвет встает по умолчанию серый, как на открытии так и на закрытии.
Объект заслонка работает в трех режимах (SS2 руководство пользователя - стр.62) и они дискретные. Ваш скрипт работал бы с объектом Image, но не будет работать с объектом valve. У вас переменная привязана к объекту заслонка - режим работы Простой. Когда переменная привязанная к заслонке равна 0, то она перекрашивается в серый цвет (закрыто). 1 - зеленый (открыто). 2 и 3 соответственно аварийные состояния - красный цвет.
   Так вот по вашему скрипту 95 окрашивает заслонку в зеленый цвет, а состояние заслонки будет аварийным (ближайшее возможное значение 3). И оно перекрасится в красный практически сразу. Вот вы и видите мелькание.   
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 23 Мая 2016, 12:47:00
Большое спасибо, я так уже и делаю. У меня были насчет этого мысли такие и Вы это подтвердили
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 23 Мая 2016, 13:24:14
Большое спасибо, я так уже и делаю. У меня были насчет этого мысли такие и Вы это подтвердили
Да не за что. Сервер скады подвис и клиент никак не подсоединялся. Видимо игра со слоями не прошла даром)) Пришлось перезагрузить систему, иначе никак не получалось запустить. Я изменил ваш скрипт и проверил - работает.
Полю я присвоил переменную Test типа Integer. Заслонке переменную Valve_State типа Integer. В скрипт по изменению переменной поля OnDataChange
Код
begin
  case Test.ValueAsInt  of                   // если значение переменной равно:
        -5..5 :                            // = -5 до 5 то считаем что заслонка закрыта
        begin
          Valve_State.Value := 2;         // изменить цвет на красный
        end;

        6..94 :                            // = 6 до 94 то считаем что заслонка в промежуточном состоянии
        begin
          Valve_State.Value := 0;         // изменить цвет на серый
        end;

        95..105 :                          // = 95 до 105 то считаем что заслонка открыта
        begin
          Valve_State.Value := 1;         // изменяем цвет на зеленый
        end;
  end;
end.             
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Мая 2016, 15:33:12
Ошибку со слоями обнаружили и сейчас исправим. Причина оказалась в том, что происходит рассинхронизация между клиентом и сервером при попытке смены слоев и проекты начинают отличаться, что может привести и к другим ошибкам.

beloleg86, цвет аналоговой заслонки (это заслонка с включенным свойством "Показать поле") не должен автоматически меняться на серый (цвета автоматически меняются только на дискретных заслонках), поэтому мы думаем, что это недостаток скады, а не Вашего скрипта. Сейчас что-нибудь придумаем, чтобы пользователи могли работать с заслонкой не только как с дискретной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Мая 2016, 11:49:36
Demo-версия обновлена. beloleg86, теперь Ваш скрипт должен корректно работать для аналоговых заслонок (т.е. для заслонок у которых включено свойство "Показать поле").

Вай-Вай, ошибка со слоями устранена.

Вообще, в этом обновлении довольно много изменений, но пока не будем публиковать официальное обновление, т.к. на днях решим ещё несколько вопросов и выложим официально.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 24 Мая 2016, 14:39:23
Спасибо а как обновить версию Стандарт на 1000 точек, при покупке вы дали ссылку на скаду, можно ли с нее обновиться? Лицензия оформлена на ОАО "ЮКЭК-Белоярский" "и еще в редакторе и в клиенте выскакивает ошибка и система закрывается когда заходишь в меню О программе

Код
Сигнатура проблемы:
  Имя события проблемы: APPCRASH
  Имя приложения: Editor.exe
  Версия приложения: 2.0.0.0
  Отметка времени приложения: 573aa805
  Имя модуля с ошибкой: KERNELBASE.dll
  Версия модуля с ошибкой: 6.1.7601.18229
  Отметка времени модуля с ошибкой: 51fb1116
  Код исключения: 0eedfade
  Смещение исключения: 0000c41f
  Версия ОС: 6.1.7601.2.1.0.256.1
  Код языка: 1049
  Дополнительные сведения 1: f26e
  Дополнительные сведения 2: f26e409a6454e93683a6b9f907943f95
  Дополнительные сведения 3: 8c82
  Дополнительные сведения 4: 8c82d1f2107cefd2c06d5af805433944
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Мая 2016, 14:44:42
beloleg86, ближе к ночи мы добавим ещё несколько изменений и исправлений и вышлем Вам ссылку на обновление.

Цитировать
и еще в редакторе и в клиенте выскакивает ошибка и система закрывается когда заходишь в меню О программе
Сейчас проверим.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 24 Мая 2016, 23:11:24
Вопрос по скрипту ToExcel. Пробовал его использовать, но результат - создается пустой Excel`евский файл.
   Переменная Try2 - внутренний тег с частотой записи в тренд 1сек. База подключена и я через WorkBench вижу что значения туда пишутся. Скрипт я использовал из руководства с небольшими изменениями.
Код
var
aBegin, aEnd: TDateTime;
begin
   aEnd := Now; // конец интервала – текущая дата;
   aBegin := IncSecond(aEnd, -10); // начало интервала – текущая дата – 10 секунд;
   Try2.ToExcel ('', aBegin, aEnd, evtAll, False);
end.           
Результатом по идее должно быть 10 значений. В базе записей меньше, явно не с секундным интервалом, а по изменению - видимо это оптимизация. Все равно что-то же должно быть выведено в файл, а  он пустой. Что я делаю не так?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Мая 2016, 23:22:43
Цитировать
В базе записей меньше, явно не с секундным интервалом, а по изменению - видимо это оптимизация.
Да, это из-за оптимизации. Помимо неё, есть ещё одна оптимизация из-за которой Вы можете получать пустой файл экспорта. Дело в том, что вершины трендов не добавляются в БД сразу, т.к. это может привести к плохим последствиям, если таких трендов будет много. Поэтому вершины сначала накапливаются в специальном буфере и только затем загружаются в БД одним большим SQL-запросом. Поэтому при формировании отчета за последние 10 секунд в БД с большой вероятностью этих данных не окажется. Но здесь есть, что улучшить. Например, мы можем сделать так, чтобы в результат выборки из БД добавлялись данные из буферов... и тогда экспорт всегда будет правильным (не касается экспорта по часам/дням/месяцам).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 24 Мая 2016, 23:38:46
Да в принципе это была тестовая задача. Мне лень было ждать, поэтому я и взял короткий интервал. Так что если переделка будет трудозатратна/ухудшит производительность скады  то и не надо.

Цитировать
Поэтому вершины сначала накапливаются в специальном буфере и только затем загружаются в БД одним большим SQL-запросом.
   А вот тогда другой вопрос, возникла мысль использовать БД для хранения массива значений. Выбрал фунцию записи в тренд при каждом изменении значения. Так вот сколько я не менял значение переменной -  в БД, судя по WorkBench ни одно изменение не записалось. А второй тренд пишущийся с интервалом в 1 сек туда заносится по изменению +когда нет изменений значения пишутся каждые 30 сек.
   Прошло уже минут 10 времени, в 1м тренде так обновлений и не было. Это из-за буфера? Похоже да. Поскольку все значения появились в БД при закрытии клиента. Если весь этот буфер висит в оперативке, то так  при аварийном отключении питания можно большой кусок данных(по времени/ не по размеру) потерять. Выигрывает те, кто используют большое кол-во трендов -> большие объемы записываемых данных -> буфер быстро заполняется -> часто сбрасывается. Но задачи то бывают разные. Иногда пишутся показания нескольких счетчиков/регуляторов, там объемы данных небольшие. Может привязать оптимизацию/буфер к кол-ву трендов/частоте записи в проекте?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 25 Мая 2016, 10:06:35
Добрый день все мои вопросы решены, Теперь О программе вылетов нет как в редакторе так и в клиенте, заслонка работает как и надо как я и хотел... спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Мая 2016, 14:38:23
TeNQ, да, выгрузка буфера в БД должна зависеть от времени. Особенно это применимо для варианта "при каждом изменении". На выходных планируем сделать официальное обновление. В нем этот вопрос будет решен.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: toreto от 26 Мая 2016, 14:26:50
Хотел организовать настройки цветовой темы проекта для каждого клиента, пробую записывать в файл, а потом во время инициализации читать, но как то не получается, может кто поделится идеей
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 26 Мая 2016, 17:03:44
Хотел организовать настройки цветовой темы проекта для каждого клиента, пробую записывать в файл, а потом во время инициализации читать, но как то не получается, может кто поделится идеей
   Ну тут наверное надо разделить задачи - сохранение/чтение в файл и задание цветовой темы для конкретного клиента.
   С первой задачей можно разобраться. Создать численные переменные Client_Colour_Scheme_X для каждого клиента соотвественно и сохранять/считывать их. Значения они будут принимать
0 - csGrey //тема серого цвета
1 - csDarkGrey //тема темно серого цвета. и тд.
   Со второй задачей у меня возникли проблемы. Я задал имя клиента через Options.exe. Читаю имя клиента функцией
GetClientName. А она ничего не возвращает. Хотя должна была вернуть строку с именем клиента. А значит и функция выбора цветовой схемы для конкретного клиента procedure SetColorSchemeClient (AClientName: UTF8String; AScheme: TM_ColorScheme); у меня не заработала.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Мая 2016, 19:01:59
toreto, для корректного решения данной задачи не хватает события OnInitializationClient, которое вызывалось бы клиентом при подключении к серверу, т.к. обычное событие OnInitialization не подойдёт, ведь оно вызывается сервером единожды - во время активации проекта. На выходных мы сделаем обновление, в котором эту задачу можно будет легко решить.

Цитировать
Читаю имя клиента функцией GetClientName. А она ничего не возвращает.
Видимо потому что она вызывается в скрипте OnDataChange? Если так, то все верно, ведь GetClientName возвращает имя клиента, который вызвал скрипт. А клиенты не имеют отношения к OnDataChange событиям, т.к. они вызываются сервером. Поэтому имя клиента в этом событии получить не удастся. В этом плане событие OnDataChange уникально и отличается от всех других, которые вызываются клиентами (OnClick, OnDblClick и т.д.). Сейчас опишем это в справке.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 26 Мая 2016, 19:38:48
Цитировать
Видимо потому что она вызывается в скрипте OnDataChange?
В скриптах OnInitialization.
Код
if GetClientName = 'Test' then 
    SetColorSchemeClient ('Test', csBrown);
Просто, чтобы проверить я написал в  OnSecondTimer.
Код
begin
  Text1.Text := 'Имя клиента = ' + GetClientName ;
  SetColorSchemeClient (GetClientName ,csBrown);
end.       
Имя не вывелось и схема не поменялась.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Мая 2016, 20:10:47
Верно, это же касается и всех других событий, которые вызываются сервером (OnInitialization, OnSecondTimer, OnHourTimer, OnExit).

Цитировать
Имя не вывелось и схема не поменялась.
Как Вы успели заметить SetColorSchemeClient не выполнилась, как и не выполнятся многие другие методы, т.к. этот скрипт будет вызван сервером. Как раз вчера мы сделали несколько изменений и теперь в серверных скриптах все методы будут работать, кроме тех, которые работают с данными клиента (на сегодняшний день это только одна функция GetClientName). А мы надеялись, что никто не заметит этого до очередного обновления.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 26 Мая 2016, 20:29:53
Вопрос о свойстве кнопке ActiveState. В редакторе состояний кнопки есть свойство Номер - порядковый номер состояния. Но порядковый номер состояния не соответствует таковому состоянию ButtonX.ActiveState. Например, для кнопки с фиксацией номер состояния в редакторе Отпущено - 1, Нажата - 2. В реальности при исполнении скрипта ActiveState кнопки в состоянии Отпущено - 0, Нажата - 1. Возможно это разные свойства и все работает так как надо, но сейчас в них можно запутаться, тем более что для кнопки с фиксацией доступно множество состояний.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 28 Мая 2016, 21:13:29
Дайте пример по скрипту пожалуйста, например есть три переменных типа Boolean: opened, closed, average есть изображение с тремя кадрами: 0 кадр - открыто, 1 кадр - закрыто,  2 кадр - промежуточное.
задача при изменении состояния переменных показывался кадр изображения соответствующей этой переменной
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 29 Мая 2016, 00:50:32
Например есть три переменных типа Boolean: opened, closed, average есть изображение с тремя кадрами: 0 кадр - открыто, 1 кадр - закрыто,  2 кадр - промежуточное.
задача при изменении состояния переменных показывался кадр изображения соответствующей этой переменной
Я бы так сделал в скрипте OnSecondTimer
Код
 // Открыта                                                                                                                                                                                                                       
 If Open.Value then Image1.Frame := 0;
 // Закрыта
 if Close.Value then Image1.Frame := 1;
 // Среднее положение
 if Average.Value then Image1.Frame := 2;
 // Авария
 if Open.Value and Close.Value then
   Image1.Frame := 4;     

И у меня вопрос возник - почему так скрипт работает (ни открыто ни закрыто = промежуточное состояние)
Код
if (Open.Value = false) and (Close.Value = false) then Image1.Frame := 2;     
А так работает, как по мне неправильно - даже если переменные принимают значение True, условие все равно срабатывает.
Код
if not Open.Value and not Close.Value then Image1.Frame := 2;     
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Мая 2016, 09:58:38
beloleg86, как правильно подсказал TeNQ, все проверки придется писать в OnSecondTimer и они будут выполняться каждую секунду. Это не очень хорошее решение, особенно если таких проверок нужно много. В этом случае скрипт OnSecondTimer получится довольно большой. Но приходится делать именно так, ведь нужно контролировать три переменных одновременно. Обычно эту задачу выполняет контроллер, а скада работает с одной переменной. Т.е. на контроллере выполняются сравнения и результаты помещаются в переменную (значения 0, 1, 2), с которой работает скада.
Сейчас мы обдумываем решение, которое позволит скаде выполнять множественные проверки значений не используя OnSecondTimer, т.к. Вы не первый, кто столкнулся с подобной задачей, к тому же не у всех есть возможность делать проверки на контроллере.

Цитировать
А так работает, как по мне неправильно - даже если переменные принимают значение True, условие все равно срабатывает.
Здесь дело в том, что свойство переменной "Value" имеет тип данных Variant (изменяющийся/непостоянный тип) и его нужно явно приводить к Boolean, вот так:
Код
if not Boolean(Open.Value) and not Boolean(Close.Value) then Image1.Frame := 2;    

А когда Вы сравниваете его со значениями True/False - компилятор сам неявно приводит его к Boolean. Кстати, в сегодняшнем обновлении у переменной появится свойство ValueAsBool, которое возвращает значение переменной, приведенное к Boolean.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 30 Мая 2016, 01:23:11
Вопрос о свойстве кнопке ActiveState. В редакторе состояний кнопки есть свойство Номер - порядковый номер состояния. Но порядковый номер состояния не соответствует таковому состоянию ButtonX.ActiveState...
Исправили в обновлении 2.0.0.19 (http://simple-scada.com/forum/index.php?topic=178.msg1892#msg1892).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: stratixx от 28 Июня 2016, 19:14:40
Нужно перевести переменную со временем наработки  в отображаемую и резервируемую затем для экспорта в excel строку в SimpleScada.
Использую Instat Master OPC.
Для отображения я так понимаю самый простой вариант - передать данные с ПЛК в секундах в Integer, затем написать скрипт который для отображения в текстовой строке будет разбирать эти секунды на часы и минуты.

Код
Тогда след. вопрос: что я делаю не так? ПОстоянно одна за другой ошибки сыпятся, 
var
min: single;
sec: single;
begin
 if Sender is TM_Text then

min:=int(TM_Text.ValueAsFloat /60);
sec:=int((frac(TM_Text.ValueAsFloat/60))*60);
TM_Text.Text:=FloatToStr(min)+'мин '+FloatToStr(sec)+'сек';
end.[/tr]


В данный момент -[i] Property "Value As Float" is inaccessible here.[/i]
При том не важно - в каком виде я переменную вбиваю, всеравно она неприемлима.[/td]
[/tr]
UPD: с этим разобрался, ввёл промежуточную переменную min_1:=ValueAsFloat/60; затем её уже обрезал через INT и FRAC. Но всеравно почему не работает в таком виде как я до этого прислал - непонятно.

Следующее еще актуально:

Может есть более простые, другие способы реализации?

Если переменную в секундах переводить в DateTime при редактировании переменных, или скриптом, она принимает вид "число-месяц-год" с постоянно менгяющейся датой. Если переменную в STRING сохраняю к примеру, а затем скриптом перевожу в StrToTime(var1) - показывает тещущее время, также как последующая конвертация этого значения TimeToStr в текстовое поле, при том что на ОРС сервере значение переменной к примеру 260 секунд.

И еще, опишите пожалуйста работу команд
SetDateFormat
SetTimeFormat
да и вообще, как работать со временными переменными, и как их обрабатывать в клиенте, для последующего экспорта к примеру в Excel, чтобы можно было вывести в отчете за промежуток времени к примеру потребленную электроэнергию + время работы каждого из двигателей. Скрипт который я сейчас пытаюсь написать - поможет только для отображения времени наработки/времени оставшегося до запуска в текстовом поле.
Спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Июня 2016, 17:40:32
stratixx, в коде, который вы представили есть существенное ошибки. Во первых строка с проверкой "if Sender is TM_Text then" действует только на следующую за ней строку, а должна действовать на все последующие строки, а значит их нужно заключить в блок "begin...end;". Также в этом коде вы обращаетесь к классу TM_Text и пытаетесь с ним работать (например "TM_Text.Text := ...). Работать с классом нельзя, т.к. класс это просто описание объекта (экземпляра), а не сам объект. В данном случает объектом с которым нужно работать является Sender и правильный код должен выглядеть так:

Код
var
  Min, Sec: integer;
begin
  if Sender is TM_Text then
    with Sender as TM_Text do
    begin
      Min := ValueAsInt div 60;
      if Min > 0 then
        Sec := ValueAsInt - Min * 60
      else
        Sec := ValueAsInt;

      Text := IntToStr(Min) + ' мин. ' + IntToStr(Sec) + ' сек.';
    end;

Этот скрипт "универсальный" и подойдет для всех объектов типа "Текст". Если Вам не нужен универсальный скрипт, то можно работать с конкретными объектами напрямую, вот так:

Код
var
  Min, Sec: integer;
begin
  Min := MyVar.ValueAsInt div 60;

  if Min > 0 then
    Sec := MyVar.ValueAsInt - Min * 60
  else
    Sec := MyVar.ValueAsInt;

  Text1.Text := IntToStr(Min) + ' мин. ' + IntToStr(Sec) + ' сек.';

Цитировать
да и вообще, как работать со временными переменными, и как их обрабатывать в клиенте, для последующего экспорта к примеру в Excel
Для этого у Вас должна быть переменная типа DateTime на устройстве, на OPC-сервере и соответственно в скаде. Работать с ними нужно используя эти процедуры и функции (http://simple-scada.com/scripts_manual?section=script_time_date). С их помощью Вы можете переводить дату/время в строку и наоборот, а также выполнять множество других задач. При переводе в даты/времени в строку будет использоваться стандартный формат "29.06.2016 17:35:16". Чтобы его изменить можно использовать команды SetDateFormat и SetTimeFormat, например:

Код
SetDateFormat('yyyy.mm.dd');  // соответствует "2016.06.29"
SetTimeFormat('hh:nn:ss');       // соответствует "17:35:16"

Подробнее про сами форматы можно прочесть здесь (http://www.delphisources.ru/pages/faq/faq_delphi_basics/ShortDateFormat.php.html) и здесь (http://www.delphibasics.ru/ShortTimeFormat.php).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: stratixx от 01 Июля 2016, 18:04:04
Спасибо!
Теперь точно разобрался.
Еще один вопрос - как сделать вызов окна трендов сотдельной кнопкой?
хочется скрыть верхнюю панель чтоб место не замимала лишнее, а отдельной кнопкой тренды вызывать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Июля 2016, 19:12:26
Это просто. Напишите в событие кнопки OnClick такую строку:
Код
GoToTrendsClient(GetClientName);

Эта процедура относится к глобальным процедурам. Описание здесь (http://simple-scada.com/scripts_manual).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: stratixx от 02 Июля 2016, 16:38:45
И еще вопрос: есть к примеру постоянно накапливающееся значение потребленной энергии за всё время работы (снимается с PM1200) в REAL переменной.
Нужно какимто образом автоматизировать его перенос например 1 числа каждого месяца в отдельную строку с указанием месяца, а затем вычислить потребленную эл. энергию за этот месяц.

Каким образом это можно сделать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 03 Июля 2016, 22:44:17
Возможно Вам подойдет решение при помощи файлов (http://simple-scada.com/scripts_manual?section=file-work). Можно записывать значение и месяц в файл 1 числа каждого месяца. Затем в любой момент считать их из файла для обработки, или отображения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Павло от 07 Июля 2016, 17:34:45
Хотел сделать универсальный код для анимации насоса Пуск/Стоп почти получилось.
Сейчас в коде есть привъязка к елементу анимации.

Код
begin
 if Sender is TM_Object then
 case TM_Object(Sender).ValueAsInt of
 0 :  Image5.AnimSpeed := 0;
 1 :  Image5.AnimSpeed := 10;
 end;
end.

Хотел что бы через Sender (тогда не нужно к элементу анимации обращаться) но он не подходит для анимации - компилятор не пропускает.

Код
begin
 if Sender is TM_Object then
 case TM_Object(Sender).ValueAsInt of
 0 :  Sender.AnimSpeed := 0;
 1 :  Sender.AnimSpeed := 10;
 end;
end.

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Июля 2016, 19:31:29
Павло, Sender - это какой-то (заранее неизвестный) объект, который вызвал скрипт, т.е. это может быть изображение, или текст, или фигура, или поле и т.д. Именно поэтому Sender имеет тип данных TM_Control. Т.е. тип с общими свойствами объектов (http://simple-scada.com/scripts_manual?section=script_common__property_object). Именно эти свойства будут доступны при обращении через Sender. Но Вам нужно обратиться к свойству AnimSpeed, которое является уникальным и есть только у изображений (http://simple-scada.com/scripts_manual?section=script_instrument_picture) (TM_Image). Поэтому в данном случае нужно явно приводить Sender к классу TM_Image. Исходя из этого универсальный скрипт должен выглядеть так:

Код
if Sender is TM_Image then      // если скрипт вызван каким-то изображением
  with Sender as TM_Image do    // далее будем работать с объектом Sender, как с изображением
    if ValueAsInt = 1 then
      AnimSpeed := 10
    else
      AnimSpeed := 0;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Павло от 08 Июля 2016, 09:56:33
Благодарю, работает. Теперь есть  еще один универсальній скрипт.

Код
begin
 if Sender is TM_Image then
  with Sender as TM_Image do
    if ValueAsInt = 0 then
      AnimSpeed := 0
    else
      AnimSpeed := 10;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Pr_Alex от 12 Июля 2016, 14:33:53
Добрый день!

А как запустить скрипт из другого скрипта?

Наример:
Есть скрипт Change_Color хотелось бы его запускать из скрипта onSecondTimer.

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 12 Июля 2016, 20:05:04
Вопрос по работе с текстовыми файлами.
Хотел создать из клиента папку с именем типа yyyy.мм.дд и в ней текстовый файл с именем типа чч.мм.сс.txt
Хотел использовать функцию TimeToStr(Now) для получения имени файла. Но не тут то было. Время возвращается в виде строки вроде 16:15:10. Использовать двоеточие в имени файла нельзя. Пришлось использовать довольно громоздкий код
Код
TextFileOpen(IntToStr(HourOf(vrTimeBegin.Value)) + ' .' + IntToStr(MinuteOf(vrTimeBegin.Value)) + '.' + IntToStr(SecondOf(vrTimeBegin.Value)) +'.txt',  '' , fomRewrite, fcpUTF8);  
Но тут есть загвоздка. Компилятор ругается на несовпадение типов [SSGlobal] Incompatible types "UTF8string" and "WIDECHAR", в строке: 9, позиция: 58 если написать так как ниже.
Код
TextFileOpen(IntToStr(HourOf(vrTimeBegin.Value)) + '.' + IntToStr(MinuteOf(vrTimeBegin.Value)) + '.' + IntToStr(SecondOf(vrTimeBegin.Value)) +'.txt',  '' , fomRewrite, fcpUTF8);  
   Найдите одно отличие) Я догадываюсь, что добавление любого символа в первые кавычки меняет тип. Но тогда лучше использовать функции приведения типа CHAR к STRING, но я их не нашел.
   С созданием папки вообще ничего не вышло. Если папки с указанным путем не существует, то она не создается и файл соответственно тоже. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 13 Июля 2016, 13:46:08
Цитировать
А как запустить скрипт из другого скрипта?
Сейчас такой возможности нет.

Цитировать
Хотел создать из клиента папку с именем типа yyyy.мм.дд и в ней текстовый файл с именем типа чч.мм.сс.txt
Скрипты для работы с папками добавим. Для того, чтобы изменить формат даты/времени используйте процедуры SetDateFormat и SetTimeFormat.

Например:
Код
SetDateFormat('yyyy.mm.dd');     // соответствует "2016.06.29"
SetTimeFormat('hh:nn:ss');       // соответствует "17:35:16"

Цитировать
Найдите одно отличие) Я догадываюсь, что добавление любого символа в первые кавычки меняет тип.
Если нужно привести строку к UTF8String, то можно писать так: UTF8String('.');. Но в данной задаче проще просто задать формат времени (SetTimeFormat), чтобы не составлять имена вручную.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 13 Июля 2016, 20:34:11
Цитировать
Скрипты для работы с папками добавим. Для того, чтобы изменить формат даты/времени используйте процедуры SetDateFormat и SetTimeFormat.
Я хотел использовать эти процедуры, но в описании не было примеров работы с ними, только назначение. Спасибо за помощь)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: valik84 от 17 Июля 2016, 21:47:19
Вопрос по учетным записям. Я хочу настроить в системе два пользователя. Первый пользователь "operator" с ограниченными правами, для него возможно только чтение, вход без пароля. Второй "naladchik", у этого пользователя полный доступ, чтение и запись, вход в учетную запись через пароль. И для пользователя "naladchik", я хочу настроить время нахождения в системе, допустим 10 минут. То есть пользователь заходит под учетной записью "naladchik", введя пароль, включается таймер который отсчитывает 10 минут, по истечении которых, учетная запись "naladchik", автоматически деактевируется и включается учетная запись "operator". Вопрос, следующий, возможно ли выше сказанное осуществить на Simple-Scada 2? Если возможно, то подскажите как? Какими функциями нужно пользоваться для этого?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Июля 2016, 09:58:01
valik84, в следующем обновлении мы добавим поле "Длительность сеанса" при создании/редактировании пользователей. Это позволит решить задачу без использования скриптов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: valik84 от 18 Июля 2016, 12:29:44
Просьба к Вам, пожалуйста в дополнение к функции "Длительность сеанса" сделайте ещё функцию "Авто авторизация пользователя", при условии что у первого пользователя нет пароля. Заранее спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Июля 2016, 12:32:12
Цитировать
сделайте ещё функцию "Авто авторизация пользователя"
Сейчас есть автоматическая авторизация. Логин и Пароль для автоматической авторизации вводятся в Options.exe, раздел "Simple-Client".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: int2246 от 22 Июля 2016, 14:16:00
Здравствуйте. Имеется RGB лента подключенная к ПЛК, в SS2 выведены 3 переменные типа "byte": переменная R, G, B каждая закреплена в SS2 на объекте "уровень". Написал такой скрипт в OnSecondTimer, чтобы объекту к примеру Image1 присваивался цвет исходя из значения переменных.
 Image1.Color := RGB(r.Value,g.Value,b.Value)

И тут выявился глюк. когда переменная равна "0" то уровень не активен (даже окно рядом с переменной),  а когда переменная равна от 1 до 255 то все работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Июля 2016, 14:20:17
int2246, может быть вы выбрали у уровня свойство "Переменная доступа"? Убедитесь, что она не выбрана.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: int2246 от 22 Июля 2016, 14:37:12
int2246, может быть вы выбрали у уровня свойство "Переменная доступа"? Убедитесь, что она не выбрана.
Да дело было в этом. Спасибо большое.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Kritan от 04 Августа 2016, 10:47:05
Есть скрипт OnSecondTimer - выполняется 1 раз в секунду, а мне нужно чтоб параметр Alpha(прозрачность) изменялась хотябы 5 раз в секунду, как можно реализовать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 04 Августа 2016, 15:06:25
Kritan, мы специально не добавляли возможность создания скриптов с частотой выполнения быстрее секунды, т.к. это может плохо сказаться на производительности и обычно используется для создания каких-нибудь эффектов (например плавного исчезновения объекта и т.п.).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Kritan от 05 Августа 2016, 04:25:13
То есть плавное повеление и исчезновение объекта не получится сделать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Августа 2016, 09:14:39
Kritan, нет, к сожалению. Именно такое использование скриптов мы и хотели исключить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: padraig от 05 Августа 2016, 16:36:41
Добрый день. Приведите, пожалуйста, пример  скрипта по запросу к бд и возврату числа записанного в ячейке по адресу - столбец Х строка Y. Если сформулировал как-то не так, извините, с БД только начинаю работать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Августа 2016, 17:57:54
padraig, этот вопрос больше относится к SQL, чем к скаде. Запрос будет выглядеть по-разному для разных таблиц БД. Вы должны составлять запрос для вашей БД. Здесь важно понять суть и можно будет работать с любыми данными. Посмотрите этот пример (http://simple-scada.com/forum/index.php?topic=205.msg2134#msg2134). Также более сложный пример для работы с БД есть в Demo-проекте, страница "Скрипты -> Работа с БД".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: padraig от 08 Августа 2016, 09:26:23
Спасибо огромное, все понял, пример как раз то, что нужно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Rymaks от 09 Августа 2016, 08:29:34
Подскажите, как реализовать задержку по времени. Например я хочу чтобы одна переменная на 2 секунды принимала одно значение, а по про шествию 2 секунд - другое.

Вот такой вариант почему то не работает - зависает:

Код
 
var
   A: TDateTime;
begin
   A := Now;
   repeat
     Field1.Color := clGreen;
   until SecondsBetween(Now, A) > 2 ;
   
  Field1.Color := clRed;
end.   
   
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 09 Августа 2016, 22:10:37
Rymaks, дело в том, что Вы сначала записываете в A текущее время, а затем в цикле сравниваете его с текущим временем, т.е. по сути получается сравнение одинакового времени и цикл крутится бесконечно. Для правильной реализации таймеров через скрипты придется использовать глобальные переменные и делать это нужно так:

Код
begin
  { прерываем процедуру, если прошло меньше 2 секунд }
  if SecondsBetween(Now, vrTime.AsDateTime) < 2 then
    Exit;

  vrTime.Value := Now;

  { Весь код далее будет выполнен с частотой 2 секунды  }
  // ...
  // ...
end.

Учитывайте, что все скрипты выполняются на сервере, а на клиенты информация передается каждые пол секунды, а значит в некоторые моменты, при просмотре значения на клиенте будет казаться что прошло больше 2 секунд, но частота выполнения таймера на сервере при этом будет правильной. Также ни в коем случае не используйте подобные таймеры для управления важными или опасными процессами, т.к. это поставит процессы в зависимость от скады. В этом случае реализуйте таймер на уровне контроллера.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: EnterDownload от 15 Августа 2016, 09:41:19
Есть ли возможность управлять свойствами страниц? Допустим, нужно сделать некоторые страницы неактивными, чтоб они вообще изчезли из списка или при нажатии на них ничего не происходило бы? Свойства Enabled и Visible есть, но первое вроде ничего не меняет совсем, а второе read-only.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 15 Августа 2016, 22:30:32
EnterDownload, сейчас практически все свойства страниц не влияют на их поведение. Постараемся разрешить работу со свойствами Enabled и Visible в следующем обновлении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: mikl182 от 16 Августа 2016, 07:38:43
Добрый день.
На могу разложить байт с OPC сервера на биты, использую getbit и присваиваю значение внутренней переменной, при компиляции пишет Incompatible types "TM_Variable" and "BOOLEAN", хотя переменная булевая.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Августа 2016, 09:01:34
mikl182, вероятно Вы выполняете присваивание так: MyVariable := GetBit(...); Это неправильно, ведь переменная имеет тип TM_Variable (описание типа здесь (http://simple-scada.com/scripts_manual?section=script_variable)) и включает в себя множество свойств, одно из которых Value (значение переменной). Его и нужно использовать.

Например:
Код
  MyVariable.Value := GetBit(...);
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: mikl182 от 16 Августа 2016, 10:19:36
Да действительно, теперь скрипт компилируется, но значение бита не возвращает. Написал так
Код
begin
  svet1.Value := GetBit(tag1.Value, 0);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Августа 2016, 10:43:58
mikl182, Ваш скрипт должен работать, только что проверили его в разных вариациях, работает. Может быть нулевой бит переменной tag1 в вашем случае просто равен 0 (False) и не меняется, поэтому скрипт пишет в svet1 значение 0 (False)? Или же переменная svet1 перезаписывается ещё где-то?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dimon от 13 Сентября 2016, 23:50:37
Здравствуйте. Заметил такую вещь, что на время работы скрипта не работают другие скрипты и сервер. У вас это что реализовано в одном потоке?  :o Не получается запустить 2-ва скрипта одновременно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Сентября 2016, 23:50:23
Здравствуйте, Dimon.

Во время выполнения скрипта сервер должен работать. Покажите код скрипта который приводит к зависанию сервера, чтобы мы могли выявить проблему.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dimon от 19 Сентября 2016, 09:11:39
Достаточно в скрипте "Запуск проекта" вставить бесконечный цикл типа While (1) {} запустить прект и наблюдать как все повисло. А сервер в диспетчере задач начинает уничтожать свободную память.
Вариант номер два. В пустом проекте  ставим кнопку. К этой кнопке прикручиваем универсальный скрипт с бесконечным циклом While (1) {}. Запускаем проект жмем кнопку и весь проект замирает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 19 Сентября 2016, 09:33:02
Dimon, не нужно так никогда делать. Любую задачу можно решить без использования бесконечных циклов, для этого в Simple-Scada есть система событий. Какую задачу Вы пытаетесь решить? Опишите её, мы предложим Вам решение без использования бесконечного цикла. Зависание сервера при использовании бесконечных циклов исправим в след. обновлении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dimon от 20 Сентября 2016, 22:18:56
вопрос:
Какую задачу Вы пытаетесь решить?

ответ:
Требуется запустить два скрипта одновременно (виртуально)!!! 

Цитировать
не нужно так никогда делать
Что это значит >:( (? Вы предусмотрели возможность бесконечных (или не бесконечных while (A < B)) циклов, так будьте добры реализовать эту функцию (только в  разных потоках, или один скрипт один поток ПК) и все будет ОК.

Короче надо функцию:

main
  {
    while (1)
     {
         ....
         тут управляем другими скриптами
         ....
     }
   }
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Сентября 2016, 00:29:09
Цитировать
Что это значит >:( (?
Как мы и написали в предыдущем сообщении, работа скриптов в Simple-Scada 2 основана на системе событий которые возникают в процессе работы сервера скады (Server.exe). Сервер сам по себе является бесконечным циклом во время работы которого возникают события и выполняются соответствующие им скрипты. Если Вам нужно обрабатывать какие-то данные постоянно (или на протяжении какого-то времени), то нужно делать это на основе таймеров (+ это хорошо скажется на производительности), а не бесконечных циклов, т.к. это противоречит системе которая используется в Simple-Scada 2.

Цитировать
Короче надо функцию:
main
  {
    ...
Исходя из того, что описано выше - ничего подобного мы не планируем и если для Вас критически важно организовать обработку в бесконечном цикле, то стоит присмотреться к другим SCADA-системам.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Yuriy от 10 Октября 2016, 23:03:07
Добрый день! Вопрос следующий. Мне нужно  реализовать таймер времени (обьект Текст - txtTime) в формате минуты:секунды, привязанный к переменной с OPC-сервера (выводится в Скаде в обьекте Поле = field1). При установке переменной в 1 - запуск счета и останов таймера при значении переменной 0. Следуя аналогии DemoProject, в событии OnDataChange обьекта field1 пишем скрипт:
Код
if field.value :=0 then 
  vrTimerState.Value := 0;
else
  vrTimerState.Value := 1;

Далее пишем скрипт OnSecondTimer:
Код
begin
  if vrTimerState.ValueAsInt = 1 then
    txtTimer.Text := TimeToStr(Now - vrTime.Value);
end.

Т.е индикация идет каждую секунду (только добавляются еще часы, которые мне не нужны)
А вот где сам счет идет переменной vrTime - я так и не понял:
Код
vrTime.Value := IncSecond(Now, -vrIntervalInSec.ValueAsInt);

И можно ли убрать из индикации Часы? Спасибо                               
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 11 Октября 2016, 10:44:06
Здравствуйте.

Итак, у нас есть объект текст с именем "txtTime" в который мы будем выводить время в формате "ММ:СС". Есть поле "Filed1", которое связано с переменной таймера. Переменная таймера имеет имя "vrTimerState".

В результате у нас должны быть следующие переменные:
В событие OnDataChange для поля "Field1" пишем следующий код:
Код
begin
  { запуск таймера }
  if vrTimerState.AsInt = 1 then
    vrTime.Value := Now
  else
    { остановка таймера }
    txtTime.Text := '00:00';
end.

Далее создаём новый скрипт с типом события "Прошла секунда". Такой скрипт будет выполняться каждую секунду. Пишем в него следующий код:
Код
var
  aTime: TDateTime;
begin
  { Если таймер запущен, то обновляем время каждую секунду }
  if vrTimerState.AsInt = 1 then
  begin
    aTime := Now - vrTime.Value;
    SetTimeFormat('nn:ss');  // формат минуты:секунды
    txtTime.Text := TimeToStr(aTime);
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Yuriy от 12 Октября 2016, 00:02:18
Спасибо ОГРОМНОЕ! Завтра попробую на работе. Еще хотел описать задачу, которую я пытаюсь реализовать в Скаде. Есть переменная в OPC-сервере, которая может принимать значения 0 или 1. Таймер должен считать время в Сек (максимум до 200 Сек) в течении которого переменная принимает значение 1. При значении переменной 0 - счет останавливается и оператор снимает показание таймера. Попробую переменную vrTimerState заменить на переменную с OPC-сервера. И можно ли реализовать формат ('sss') - Секунды как 3 цифры?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Октября 2016, 10:28:53
Цитировать
Таймер должен считать время в Сек в течении которого переменная принимает значение 1. При значении переменной 0 - счет останавливается и оператор снимает показание таймера.
Здесь все то же самое, как в примере выше, как Вы правильно поняли нужно только заменить переменную vrTimerState.

Цитировать
И можно ли реализовать формат ('sss') - Секунды как 3 цифры?
Если нужно представление только в секундах, то можно изменить секундный таймер вот так:

Код
var
  aTime: TDateTime;
begin
  { Если таймер запущен, то обновляем время каждую секунду }
  if vrTimerState.AsInt = 1 then
    txtTime.Text := IntToStr(SecondsBetween(Now, vrTime.Value));  // выводим количество секунд
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 13 Октября 2016, 22:58:10
Добрый день, у нас почему то после добавления нового скрипта перестал запускаться проект. Не открывается ни в клиенте, ни в редакторе, тот же проект без нового скрипта открывается всем. Сейчас в наличии демо-версия, проект во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Октября 2016, 00:40:59
Здравствуйте.

Почему-то в проекте отсутствуют следующие два файла:
Возможно они как-то потерялись при копировании проекта или подобных действиях? Либо были блокированы/удалены антивирусом, или подобным ПО? Есть ли у Вас резервные копии проекта?
Мы можем восстановить проект завтра, но для этого нам нужно знать какой OPC-сервер Вы использовали для внешних тегов. Лучше всего для нас получить полные параметры OPC-сервера. Для этого создайте новый пустой проект в Редакторе. Войдите в меню "Проект - OPC-серверы" и добавьте OPC-сервер, который Вы использовали в проекте "БЦ Октябрьский". Далее сохраните проект и отправьте его нам.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 14 Октября 2016, 12:13:33
Спасибо, скопировал файлы из резервной копии и все заработало. Причина скорее всего в том что у нас все проекты лежат на яндекс-диске, и он не успел синхронизироваться до того как я  выключил компьютер.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 16 Октября 2016, 18:24:21
Здравствуйте, есть необходимость читать состояние нескольких битов из внешней переменной общей для двух установок ("Alarm_PV1"). И записывать значение аварии во внутреннюю переменную привязанную к одной из них ("Alarm_P1"). Написал скрипт, но значение переменной "Alarm_P1" присваивается только когда выполняется первая строка, при выполнении условий других строк значение не "Alarm_P1" остается прежним. Объясните пожалуйста где я ошибся. 

Код
begin
if GetBit(Alarm_PV1.Value,1) = true or
   GetBit(Alarm_PV1.Value,2) = true or                                   
   GetBit(Alarm_PV1.Value,4) = true or
   GetBit(Alarm_PV1.Value,5) = true or
   GetBit(Alarm_PV1.Value,6) = true or
   GetBit(Alarm_PV1.Value,10) = true or
   GetBit(Alarm_PV1.Value,11) = true or
   GetBit(Alarm_PV1.Value,12) = true or
   GetBit(Alarm_PV1.Value,13) = true or
   GetBit(Alarm_PV1.Value,14) = true then
   Alarm_P1.Value := 1 else
   Alarm_P1.Value := 0
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Октября 2016, 19:00:05
Здравствуйте.

Правильный вариант скрипта должен быть таким:
Код
var
  aValue: Integer;
begin
  { записываем в aValue значение переменной Alarm_PV1 в виде целого числа }
  aValue := Alarm_PV1.AsInt;   
 
  { проверяем нужные биты }
  if GetBit(aValue, 1) or
     GetBit(aValue, 2) or
     GetBit(aValue, 4) or
     GetBit(aValue, 5) or
     GetBit(aValue, 6) or
     GetBit(aValue, 10) or
     GetBit(aValue, 11) or
     GetBit(aValue, 12) or
     GetBit(aValue, 13) or
     GetBit(aValue, 14) then
    Alarm_P1.Value := 1
  else
    Alarm_P1.Value := 0;
end.

Также обращаем внимание, что в функции GetBit биты нумеруются с нуля.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 16 Октября 2016, 20:56:45
Спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Yuriy от 17 Октября 2016, 17:26:47
Добрый день!
По ходу изучения Скады появилось еще несколько вопросов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Октября 2016, 19:34:31
Здравствуйте.

Цитировать
В OPC-сервере имеется переменная U, кот. представляет собой напряжение, снятое с АЦП и имеющее диапазон значений 0 (0.00В) до 600 (6.00В).
Конструкция case..of применяется только для целых чисел. Для вещественных придется писать обычные сравнения по типу "if aVar.AsFloat > 4.56 then". Но в Вашем случае, как мы поняли. переменная adc0 это целочисленная переменная со сдвигом запятой на 2 знака влево. Если это так, то вместо "adc0.AsInt" лучше использовать "adc0.OriginalAsInt". OriginalAsInt возвращает оригинальное значение переменой, без смещения запятой. И тогда можно использовать конструкцию case..of, вот так:
Код
begin
  Text1.Text := adc0.AsStr;
  case adc0.OriginalAsInt of
    0..429:   Text1.FontColor := clRed;   // Красный
    430..519: Text1.FontColor := clBlack; // Черный
    520..600: Text1.FontColor := clRed;   // Красный
  end;
end.

А т.к. таких переменных предполагается около 100, то чтобы не писать 100 по сути одинаковых скриптов, лучше всего сделать один универсальный скрипт. Для этого нужно в Редакторе у объекта "Text1" выбрать свойство "Переменная" - "adc0". Затем создать универсальный скрипт:
Код
var
  aText: TM_Text;
begin
  { прерываем процедуру, если скрипт вызван не объектом Текст }
  if not (Sender is TM_Text) then Exit;
  aText := Sender as TM_Text;

  aText.Text := aText.AsStr;
  case aText.Variable.OriginalAsInt of
    0..429:   aText.FontColor := clRed;   // Красный
    430..519: aText.FontColor := clBlack; // Черный
    520..600: aText.FontColor := clRed;   // Красный
  end;
end.

Такой скрипт можно поставить любому объекту типа Текст на событие OnDataChange и он будет работать. При этом у каждого объекта Текст можно выбрать свою переменную и скрипт будет работать именно с этой переменной. Не придется писать 100 подобных скриптов. Подробнее про универсальные скрипты можно прочесть здесь (http://simple-scada.com/forum/index.php?topic=205.msg2044#msg2044).

Цитировать
Фон страницы нужен Белый. Как лучше это реализовать?
Здесь можно посоветовать только поставить в качестве фона объект Фигура (Shape), растянуть его на нужную зону и выбрать цвет.

Цитировать
Можно ли все эти значения экспортировать в таблицу EXCEL или в БД MySQL? Или экспорт работает только с Трендами?
Сейчас Simple-Scada 2 может выполнять любые запросы к БД и Вы можете сделать что угодно используя все возможность языка SQL. Для выполнения пользовательских SQL команд используйте процедуру RunSQL (http://simple-scada.com/scripts_manual?section=work-db). Можно создать отдельную таблицу и добавлять в неё любые данные. Здесь главное знать как правильно написать SQL запросы. Хороший пример есть в Демо-проекте (страница Скрипты - Работа с БД). там есть и создание таблицы, запись и чтение из этой таблицы. Можно также вместо БД выводить данные в текстовые, или двоичные файлы (http://simple-scada.com/scripts_manual?section=file-work). Экспортировать в Excel сейчас можно только данные переменных, которые пишутся в тренды.

Цитировать
Нигде не мог найти, какие арифметические и логические функции можно использовать в скриптах.
В скриптах Simple-Scada 2 используется Object Pascal компилятор. Обо всех командах и операторах присущих языкам Pascal/Delphi можно прочесть в интернете на сайтах связанных с языками Pascal/Delphi. Например, описание типов данных (http://www.delphibasics.ru/1Types.php) и ключевые слова (http://www.delphibasics.ru/1Keywords.php) (к которым и относятся такие слова как or или and и др.).

Цитировать
Почему имя переменной при обьявлении в скриптах начинается с буквы "a" - aValue?
Это распространенный в программировании способ именования локальных переменных, или параметров методов. Буква "a" добавляется для того, чтобы имя стало уникальным, это позволяет убрать возможную путаницу в именах переменных/объектов и совпадение имён.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Yuriy от 17 Октября 2016, 21:18:54
Спасибо большое! По поводу универсального скрипта - скорее мне не подойдет, т.к. допустимые значения у всех переменных - разные. По поводу БД - обязательно попробую как установлю MySQL. По ссылке к языку Delphi - не вижу оператора умножения (или его просто нет)?  И по имени локальной переменной при обьявлении в скриптах - можно ли обозвать ее не aValue, а например bValue?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: int2246 от 18 Октября 2016, 14:28:45
Задача такая сделать универсальный скрипт при выполнении которого переменная привязана к объекту меняла значение.
Создал переменную лампочка с именем Imag1 и виртуальную переменную test типа Boolian, при старте проекта переменной test присваиваемым "лож"
написал вот такой скрипт который выполняется по двойному щелчку мышки

begin
  case TM_Object(Sender).AsInt of           
    0 : test.Value := 1;       
    1 : test.Value := 0;
  end;
  end.

все работает. но как бы сделать универсальный скрипт чтобы не писать имя переменной если она присвоена к объекту?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 18 Октября 2016, 16:28:37
Цитировать
По ссылке к языку Delphi - не вижу оператора умножения (или его просто нет)? 
Yuriy оператор умнажения есть  *
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Октября 2016, 21:21:36
По ссылке к языку Delphi - не вижу оператора умножения (или его просто нет)?
Обычные операторы: "+" (сложение), "-" (вычитание), "/" (деление с остатком), "*" (умножение).

И по имени локальной переменной при обьявлении в скриптах - можно ли обозвать ее не aValue, а например bValue?
Да, можно использовать любое имя.

int2246, здесь все просто, любой объект (TM_Object) имеет свойство Value (значение переменной с которой он связан)

Код
begin
  with TM_Object(Sender) do  // далее будем работать с объектом Sender приведенным к типу TM_Object
    case AsInt of           
      0: Value := 1;       
      1: Value := 0;
    end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bars от 08 Ноября 2016, 11:15:48
Подскажите, пользовательский звуковой фаил как вставить в проек в качестве звука аварийной сигнализации? Только скриптами? В меню выбираются только 6 стандартных звуков.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 08 Ноября 2016, 12:34:49
Здравствуйте!

Вы можете сохранить свой файл, например с именем Sound_1.ogg и заменить аналогичный файл в папке \Simple-Scada 2\Libraries. Затем, в настройках проекта ->Сообщения -> "Звук аварии" выбрать Sound_1 - теперь при появлении аварийного сообщения будет проигрываться Ваш файл. Важно! Ваш файл обязательно должен быть в формате .ogg
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bars от 09 Ноября 2016, 07:49:15
И я так понимаю звуков не будет больше шести...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Ноября 2016, 19:41:17
bars, да, при этом также не получится поставить разные звуки на аварийные сообщения. Для всех аварийных сообщений будет использоваться один звук. Для всех предупреждающий другой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Mishail от 11 Ноября 2016, 09:12:51
Здравствуйте!
Подскажите пожалуйста есть ли возможность работы с переменной String в плане: отрезать, добавить или заменить символ или часть строки. Знаю в Object Pascal есть такие функции(процедуры) как Delete, Insert, Copy и т. д., но тут не получается их использовать.
Заранее, спасибо за ответ.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 11 Ноября 2016, 10:02:07
Здравствуйте.

В данный момент есть только следующие функции для работы со строками:

Пример копирования части текста:
Код
var
  aStr: string;
begin
  aStr := 'Привет мир!';
  Text1.Text := UTF8Copy(UTF8Encode(aStr), 1, 6);  // в Text1 запишется "Привет"
end.

В ближайшее обновление добавим также другие функции для работы со строками.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: starmos от 18 Ноября 2016, 12:10:10
Непонятно.
Скрипт:
Код
begin
    Obem1 := V_1.AsFloat  + V1_1.AsFloat * 0.0001;
end.
Ошибка:
[uGlobal] Incompatible types "TM_Variable" and "DOUBLE", в строке: 2, позиция: 49

Типы переменных: V_1:LongWord, V1_1:Word, Obem1:Double   Первые две берутся с OPC, третья - виртуальная.
Как я понимаю все типы в выражении должны совпадать?  В чем тогда причина ошибки? И где в редакторе посмотреть позицию 49?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Ноября 2016, 12:14:00
starmos, дело в том, что Obem1 это глобальная переменная и она имеет тип TM_Variable, который включает в себя множество свойств (подробно описан здесь (http://simple-scada.com/scripts_manual?section=script_variable)), одно из которых Значение (Value). Правильно менять не саму переменную, а значение переменной, вот так:

Код
begin
    Obem1.Value := V_1.AsFloat  + V1_1.AsFloat * 0.0001;
end.

Цитировать
И где в редакторе посмотреть позицию 49?
Это позиция курсора по горизонтали и она указывает на конец строки "    Obem1 := V_1.AsFloat  + V1_1.AsFloat * 0.0001;", ровно 49 символов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 01 Декабря 2016, 19:18:00
РЕШЕНО!
Ребята здравствуйте. Направьте пожалуйста на путь истинный.
Не могу реализовать нормально работающий код для дискретной задвижки.
Хотелки => Что бы при состоянии задвижки ОТКРЫТА в поле писалось 'Открыта'
, а при состоянии ЗАКРЫТА ,естественно, 'Закрыта'.

Я делал так.
Создал внутреннею переменную, ее присвоил задвижке. И уже в эту virt_переменную в зависимости от сработавшего концевика писал текст. Но для этой процедуры приходится создавать кучу доп. объектов. 
Так то в принципе все ничего, но при старте СКАДЫ в этих поля прочерки " ---- " пока не поменяется состояние концевика.
А хотелось бы сразу лицизреть нужную надпись о положении задвижки.

Код
Скрипт 1

begin
  if PLC2_FIRST_PRG_zkh1_open_ok.AsInt = 1 then
    virtZKH1_txt.Value := 'Открыта'
  else
    virtZKH1_txt.Value := '----'
end.           

Скрипт 2

begin
  if PLC2_FIRST_PRG_zkh1_close_ok.AsInt = 1 then
    virtZKH1_txt.Value := 'Закрыта'
  else
    virtZKH1_txt.Value := '----'
end.       
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Декабря 2016, 10:30:25
Цитировать
РЕШЕНО!
Не успели, но здесь видимо нужно было что-то вроде этого кода:

Скрипт 1:
Код
begin
  if (PLC2_FIRST_PRG_zkh1_open_ok.AsInt = 1) and (PLC2_FIRST_PRG_zkh1_close_ok.AsInt <> 1) then
    virtZKH1_txt.Value := 'Открыта';
end.   

Скрипт 2:
Код
begin
  if (PLC2_FIRST_PRG_zkh1_close_ok.AsInt = 1) and (PLC2_FIRST_PRG_zkh1_open_ok.AsInt <> 1) then
    virtZKH1_txt.Value := 'Закрыта';
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 02 Декабря 2016, 11:04:11
Администратор. Мне просто еще хотелось что бы в процесе работы или аварии был текст  "----"

Решил так:

Скрипт 1
Код
begin
  if PLC2_FIRST_PRG_zkh1_close_ok.AsInt = 1 then
    virtZKH1_txt.Value := 'Закрыта';

  if (PLC2_FIRST_PRG_zkh1_close_ok.AsInt = 0) and (PLC2_FIRST_PRG_zkh1_open_ok.AsInt = 0) then
    virtZKH1_txt.Value := '----'
end.                     

Скрипт 2

Код
begin
  if PLC2_FIRST_PRG_zkh1_open_ok.AsInt = 1 then
    virtZKH1_txt.Value := 'Открыта';

  if (PLC2_FIRST_PRG_zkh1_close_ok.AsInt = 0) and (PLC2_FIRST_PRG_zkh1_open_ok.AsInt = 0) then
    virtZKH1_txt.Value := '----'
end.                   


Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 06 Декабря 2016, 09:41:24
Добрый день, подскажите можно ли сделать кнопку, что бы при нажатии я попадал в определенную группу трендов, например есть у меня группы давления, уровня, температуры, разряжения, положения приводов ну и т.д. я хочу попасть на тренд разряжение, т.е. нажал и мне открылись графики тренда разряжения (не временные). В справке так понял что можно открыть группу трендов скриптом по кнопке  а потом выбрать из этой группы нужную группу и тогда я попадаю на страниц трендов
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Декабря 2016, 16:18:10
Здравствуйте.

В версии 2.1.2.0 Добавили процедуры GoToTrendsGroupAll, GoToTrendsGroupClient, GoToMessagesGroupAll, GoToMessagesGroupClient (http://simple-scada.com/scripts_manual?section=global_procedure). С их помощью можно перейти в заданную группу трендов или сообщений.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 12 Декабря 2016, 19:09:28
Здравствуйте, можно ли как-нибудь "спросить" скриптом у группы трендов какой у нее ID?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Декабря 2016, 20:16:24
Цитировать
Здравствуйте, можно ли как-нибудь "спросить" скриптом у группы трендов какой у нее ID?
596039, здравствуйте, а для какой цели это нужно? Можно посмотреть ID нужной группы в Редакторе и указать этот ID.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 12 Декабря 2016, 21:17:18
Для перехода в группу трендов из универсального окна.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Декабря 2016, 21:48:48
Здесь возникнет одна проблема. Группы трендов это не объекты и поэтому нельзя написать в скрипте например так: TrendGroup1.ID. Но даже если бы это было возможно, то для универсального скрипта пришлось бы сначала формировать имя группы, например подставляя тег объекта, вот так:
Код
Name := 'TrendGroup' + intToStr(Object.Tag); 

затем искать группу по этому имени группу и извлекать её ID. Т.е. в любом случае для универсального перехода в группу из окна нам придется где-то взять номер группы (в примере выше этот номер берется из Тега объекта). Но ведь и сейчас нам ничего не мешает хранить в теге ID нужной группы. Т.е. при открытии окна в его свойство Тег (или свойство Тег какого-то объекта окна) подставлять ID группы в которую нужно выполнить переход из данного окна. По нажатию на кнопку перехода в группу брать тег и переходить в указанную группу.

Рассмотрим пример. В проекте есть:
На кнопки Button1 и Button2 ставим универсальный скрипт который показывает окно и передает в тег окна свой тег (кнопки). А по нажатию на Button3 пишем переход в группу с ID равным тегу окна. Готово.

Но здесь нам может просто не хватить тегов. Насколько нам известно у вас на кнопках открытия универсального окна уже выставлены теги и выставить им ещё и ID нужных групп просто некуда. Это так? Тогда нужно подумать куда вписать идентификаторы групп.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 13 Декабря 2016, 00:16:43
Да все правильно, сегодня попробовал реализовать все следующим образом:

Код
begin
  if not (Sender is TM_Image) then Exit;
  Field_Speed_P.Variable  := GetVariableByName('Speed_P_' + IntToStr(Sender.Tag));
  Field_Speed_V.Variable := GetVariableByName('Speed_V_' + IntToStr(Sender.Tag));
  Field_Three_Way_Heat.Variable := GetVariableByName('Three_Way_Heat_' + IntToStr(Sender.Tag));
  Field_Set.Variable := GetVariableByName('Set_' + IntToStr(Sender.Tag));
  Field_Temp_Room.Variable := GetVariableByName('Temp_Room_' + IntToStr(Sender.Tag));
  Field_Temp_Air.Variable := GetVariableByName('Temp_Air_' + IntToStr(Sender.Tag));
  Field_Temp_Water.Variable := GetVariableByName('Temp_Water_' + IntToStr(Sender.Tag));
  Image_Mode_Cool.Variable := GetVariableByName('Mode_' + IntToStr(Sender.Tag));
  Image_Mode_Heat.Variable := GetVariableByName('Mode_' + IntToStr(Sender.Tag));
  Button_Mode.Variable := GetVariableByName('Mode_' + IntToStr(Sender.Tag));
  Image_Filtr1.Variable := GetVariableByName('Status_P_' + IntToStr(Sender.Tag));
  Image_Filtr2.Variable := GetVariableByName('Status_P_' + IntToStr(Sender.Tag));
  Image_Vent_P.Variable := GetVariableByName('Status_P_' + IntToStr(Sender.Tag));
  Image_Vent_V.Variable := GetVariableByName('Status_V_' + IntToStr(Sender.Tag));
  Image_Trend.Variable := GetVariableByName(IntToStr(Sender.Tag));                             //Присваиваем значение переменной
  Text_PV.Text := 'ПВ_' + IntToStr(Sender.Tag);

  case Image_Vent_P.AsInt  of
     0, 2, 4..7: Image_Vent_P.AnimSpeed := 0;
     1, 3: Image_Vent_P.AnimSpeed := GetVariableByName('Speed_P_' + IntToStr(Sender.Tag)).AsInt;
  end;

  case Image_Vent_V.AsInt  of
     0, 2, 4..7: Image_Vent_V.AnimSpeed := 0;
     1, 3: Image_Vent_V.AnimSpeed := GetVariableByName('Speed_V_' + IntToStr(Sender.Tag)).AsInt;
  end;

   if GetVariableByName('Status_P_' + IntToStr(Sender.Tag)).AsInt = 3 then
   begin
    Image_Filtr2.Visible := True;
    Image_Filtr1.Visible := False;
    Text1_Filtr.FlashColor := clRed;
    Text2_Filtr.Text := 'Требует замены';
    Text2_Filtr.FlashColor := clRed;
   end else
   begin
    Image_Filtr2.Visible := False;
    Image_Filtr1.Visible := True;
    Text1_Filtr.FlashColor :=clNone;
    Text2_Filtr.Text := 'В работе';
    Text2_Filtr.FlashColor :=clNone;
   end;
end.


А в скрипт привязанный к кнопке трендов подставляем значение переменной:
Код
var
  Name : String;
  Trend : TM_Variable;
begin
  Name := GetClientName;
  Trend := GetVariableByName('Image_Trend');
  GoToTrendsGroupClient (Name, Trend.Value + 3);      //Подставляем нужный номер в идентификатор
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 13 Декабря 2016, 00:22:23
Не совсем понимаю почему не работает. Но эта схема не совсем универсальна.Например при масштабировании проекта придется добавлять новые универсальные окна, так как нет возможности присваивать идентификаторы вручную, соответственно строка: "GoToTrendsGroupClient (Name, Trend.Value + 3);" будет работать только в том случае если идентификаторы идут по порядку.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Декабря 2016, 00:07:54
В этой ситуации предлагаем такой способ: у кнопки которая вызывает универсальное окно в Редакторе задействуем свойство Тег для подстановки в универсальное окно соответствующих переменных, как у вас это уже сделано. Но! Помимо этого задействуем ещё свойство Подсказка. Оно имеет строковый тип, но подойдет нам. И в Редакторе вписываем в Подсказку ID группы трендов в которую будет осуществлен переход из универсального окна, вызванного этой кнопкой. В этом случае в ваш скрипт с подстановкой значений добавится ещё одна строка, вот так:

Код
begin
  if not (Sender is TM_Image) then Exit;

  { записываем в Тег кнопки ID-группы в которую нужно будет перейти }
  ButtonToTrend.Tag := StrToInt(Sender.Hint);       // эта строка
 
  { далее код Вашего скрипта без изменений }
  Field_Speed_P.Variable  := GetVariableByName('Speed_P_' + IntToStr(Sender.Tag));
  Field_Speed_V.Variable := GetVariableByName('Speed_V_' + IntToStr(Sender.Tag));
  ...

в данном случае "ButtonToTrend" это имя кнопки трендов, которая находится в универсальном окне и по нажатию на которую нужно перейти в группу трендов. Тогда скрипт OnClick для этой кнопки будет таким:

Код
begin
  GoToTrendsGroupClient (GetClientName, Sender.Tag);
end.

Что скажете на счет такого решения?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: toreto от 14 Декабря 2016, 13:55:47
Здравствуйте!!
Помогите с таким вопросом, имеется некий счетчик который постоянно и неравномерно увеличивается, нужно посчитать количество за час и сделать записи каждого часа в БД.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Декабря 2016, 19:34:45
Здравствуйте.

Нужно получить число на которое увеличился счетчик за час? Например счетчик за час выдает последовательно такие значения: 100, 101, 102, 130, 131. Тогда результат должен быть: 31?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: toreto от 14 Декабря 2016, 20:41:11
Примерно что то такое. Точнее- опрашиваются показания электроэнергии из счетчика, и нужно сделать почасовку потребления.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Декабря 2016, 16:43:09
Если так, то можно просто запоминать в начале каждого часа текущее значение и записывать измеренное за прошедший час. Для корректной работы нужно три виртуальных переменных:
Далее создаем скрипт с типом события "Прошел час" и пишем такой код:

Код
begin
  if vrInit.AsBool then
  begin
    { получаем значение, накопленное за прошедший час }
    vrByHour.Value := Int1.AsInt - vrStartCount.AsInt;
    // ... здесь можно разместить код сохранения значения за прошедший час в БД, или файл
    vrStartCount.Value := Int1.AsInt;
  end else
    begin
      vrInit.Value := True;
      vrStartCount.Value := Int1.AsInt;
    end;
end.

При этом расчеты появятся в переменной vrByHour только после того, как пройдет один полный час после старта сервера скады. И соответственно после перезапуска сервера также придется ждать один полный час, чтобы скада показала накопленное значение за этот час.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Morozbl4 от 19 Декабря 2016, 12:01:57
Здравствуйте!
Есть булевая переменная i, которая отвечает за реле, время работы задается ручками условно от 1 до 5 секунд.
Необходимо перед выключением считать значение переменной P с контроллера и присвоить это значение виртуальной переменной Pmax.
При использовании while  do все уходит в бесконечный цикл и зависает...
If тоже не работает....
Помогите советом, пожалуйста.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 19 Декабря 2016, 12:18:15
Здравствуйте, Morozbl4.

Есть переменные:
Создаем в проекте новый объект, неважно какой, например простой Текст (TM_Text). В свойствах выбираем ему "Переменная - vrI". Теперь он связан с переменной vrI. Переходим в событие OnDataChange и пишем такой скрипт:

Код
procedure Text1_OnDataChange(Sender: TM_Control);
begin
  // если реле выключается, то записываем vrP в vrPmax
  if vrI.AsBool = False then
    vrPmax.Value := vrP.Value;
end.

Если у Вас в проекте уже есть объект, который связан с vrI, то используете его вместо Текста из примера выше.

В ближайшем будущем появится возможность создавать OnDataChange-скрипты без связи с каким-либо объектом и тогда можно будет сразу писать OnDataChange-скрипт, без объекта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Morozbl4 от 19 Декабря 2016, 12:19:07
Спасибо! Попробую!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dim от 22 Декабря 2016, 16:27:27
Здравствуйте. Есть тренд для булевых переменных. Как можно сделать чтоб тренд записывался только когда переменная  =1 а когда будет равняться 0 записи не будет?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Декабря 2016, 19:46:46
Здравствуйте.

По событию OnDataChange для данной boolean-переменной написать такой скрипт:

Код
begin
    vrBool.Archived := not vrBool.AsBool;
end.

Здесь vrBool это имя переменной по которой ведётся тренд. Правда непонятно для чего так делать, ведь в этом случае в тренд попадут только значения равные 1.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dim от 22 Декабря 2016, 20:59:25
Когда сделаю выложу скриншот. А как толщину линии добавить
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Декабря 2016, 09:41:54
Цитировать
А как толщину линии добавить
Сейчас это невозможно, из-за некоторых особенностей отрисовки. После внедрения системы слоёв в тренды рассмотрим также возможность изменения толщины линии тренда.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: mepexa от 24 Декабря 2016, 11:59:14
Если так, то можно просто запоминать в начале каждого часа текущее значение и записывать измеренное за прошедший час. Для корректной работы нужно три виртуальных переменных:
  • vrInit (тип данных Boolean, можно без шкалы);
  • vrByHour (тип данных тот же, что и у переменной счетчика, шкала должна быть достаточно большой). Для хранения результата за прошедший час;
  • vrStartCount (тип данных тот же, что и у переменной счетчика, шкала должна быть достаточно большой). Хранит значение счетчика на начало часа;
Далее создаем скрипт с типом события "Прошел час" и пишем такой код:

Код
begin
  if vrInit.AsBool then
  begin
    { получаем значение, накопленное за прошедший час }
    vrByHour.Value := Int1.AsInt - vrStartCount.AsInt;
    // ... здесь можно разместить код сохранения значения за прошедший час в БД, или файл
    vrStartCount.Value := Int1.AsInt;
  end else
    begin
      vrInit.Value := True;
      vrStartCount.Value := Int1.AsInt;
    end;
end.

При этом расчеты появятся в переменной vrByHour только после того, как пройдет один полный час после старта сервера скады. И соответственно после перезапуска сервера также придется ждать один полный час, чтобы скада показала накопленное значение за этот час.

А как сделать привязку по времени не к старту скады, а к 00 час 00 мин каждого дня ?
Есть счетчики электроэнергии. показания - с постоянным накоплением.
Требуется ежесуточный отчет потребленной энергии в excel-файл (или в БД с выводом в таблицу).
Я думаю, такой пример будет востребован многими пользователями.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Декабря 2016, 10:10:19
Как раз для таких задач мы сейчас разрабатываем взаимодействие Simple-Scada 2 с системой отчетов Stimulsoft Reports и в начале 2017 года планируем закончить. При этом вывод будет доступен не только в excel-файл, но и в html, word, pdf и т.д. Также появятся расчетные переменные, чтобы подобные расчеты велись автоматически.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: garry от 07 Января 2017, 12:42:59
Использую Simple-Scada для дома, в программировании не силен и чего-то затупил: приходят 2 тега с сервера - температура подачи и температура обратки, нужно в отдельном поле вывести разницу этих температур(дельту). Не могу понять с чего начать. Использую первую бету.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 07 Января 2017, 13:21:08
Имеем две температуры Temp1 и Temp2. Для решения задачи нужно создать еще одну виртуальную переменную Temp3 (не забудьте создать для нее шкалу с отрицательной нижней границей - иначе при отрицательной разнице температур будет показывать 0), и связать ее с полем для вывода "Дельты". Затем выделить поле Temp1, перейти в события -> OnDataChange и написать скрипт:
Код
begin
  Temp3.Value := Temp1.Value - Temp2.Value;
end.

Далее выделяем поле Temp2 и в событии OnDataChange также выбираем наш скрипт. В итоге при изменений Temp1 или Temp2 будет выполняться наш скрипт и в поле Temp3 всегда будет отображаться актуальная разница температур.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: garry от 07 Января 2017, 14:04:01
Спасибо , все получилось! Сначала по вашему примеру не компилировалось потому-что имена переменных стояли по именам тегов по умолчанию русские Тег1, Тег2. Поменял имена переменных и все завелось. Бегаю кругами и радуюсь.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 09 Января 2017, 00:52:17
Здравствуйте, раскладываю переменную(Alarm_1) на биты и записываю в отдельные виртуальные переменные(Alarm_Bit_N). Объясните пожалуйста в чем разница между двумя скриптами. Первый нормально отрабатывает, второй компилируется, но не работает. Как влияет перемена строк местами на работу?

Первый:
Код
var
 Alarm_Bit : TM_Variable;
 b : byte;
Begin
 for b := 0 to 15 do
  begin
   Alarm_bit := GetVariableByName('Alarm_Bit_' + IntToStr(b));
   Alarm_bit.Value := GetBit(Alarm_1.Value , b);
  end;
End.

И второй:
Код
var
 Alarm_Bit : TM_Variable;
 b : byte;
Begin
 for b := 0 to 15 do
  begin
   Alarm_bit.Value := GetBit(Alarm_1.Value , b);
   Alarm_bit := GetVariableByName('Alarm_Bit_' + IntToStr(b));
  end;
End.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 09 Января 2017, 09:34:28
Здравствуйте.

Здесь дело в том, что Alarm_Bit это указатель на переменную, а не сама переменная (это почти как ссылка в интернете). В первой ситуации Вы сначала помещаете в Alarm_Bit переменную с заданным именем, а затем работаете с этой переменной. Здесь ошибок нет. Разве что нужно учитывать, что GetVariableByName может вернуть nil, если не найдет переменную и лучше этот момент предусмотреть, вот так:

Код
var
  Alarm_Bit : TM_Variable;
  b : byte;
Begin
  for b := 0 to 15 do
  begin
    Alarm_bit := GetVariableByName('Alarm_Bit_' + IntToStr(b));
    if Alarm_bit <> nil then   // если переменная найдена, то работаем с ней
      Alarm_bit.Value := GetBit(Alarm_1.Value , b);
  end;
End.

А второй вариант содержит ошибку. Вы сразу начинаете работать с Alarm_Bit (присваивая значение), хотя она ещё не указывает на какую-то переменную. Нужно было сначала инициализировать указатель, а только потом работать, как в примере выше, или так:

Код
var
  Alarm_Bit : TM_Variable;
  b : byte;
Begin
  Alarm_bit := Alarm_1;  // теперь Alarm_bit инициализирован и указывает на переменную Alarm_1
  for b := 0 to 15 do
  begin
    Alarm_bit.Value := GetBit(Alarm_1.Value , b);
    Alarm_bit := GetVariableByName('Alarm_Bit_' + IntToStr(b));
  end;
End.

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 596039 от 09 Января 2017, 11:40:21
Спасибо за доступное объяснение
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 03 Февраля 2017, 17:49:47
Не силен я в SQL поэтому откладывал как мог, но сегодня пришлось заняться. И у меня появились вопросы.
Почему не работает вот такой скрипт.
Код
aQuery := 'UPDATE `program_table` ' +
            'SET `TRM1_ProgramDuration` = `2017.02.03 16:48:36`, ' +
            '`TRM2_ProgramDuration` = NOW() WHERE `ID` = 1;';
В MySQL WorkBench работает такая последовательность.
Код
update TENQ.program_table SET TRM1_ProgramDuration = '2017.02.03 17:48:36', TRM2_ProgramDuration = Now() where ID = 1;
Дело тут в формате даты/времени, потому что если я меняю `2017.02.03 16:48:36` на NOW(), то и из SS2 скрипт записывает в таблицу. Но сколько я не танцевал с бубном с различными форматами и преобразованиями, так у меня ничего и не получилось.
И еще вопрос. Это шаманство с апострофами/одинарными кавычками для названий таблиц, столбцов можно убрать?  И так новичку непонятно ничего, так еще и разберись где их ставить, а где нет. В идеале я хотел бы через ctl+c/v скопировать из WorkBench рабочую последовательность и вставить ее в скрипт SS2 и чтобы заработало).
Все, разобрался.Вот так работает.
Код
aTRM1_ProgramDuration := QuotedStr('2017.02.03 16:48:36');
  aQuery := 'UPDATE `program_table` ' +
            'SET `TRM1_ProgramDuration` = ' + aTRM1_ProgramDuration + ', ' +
            '`TRM2_ProgramDuration` = NOW() WHERE `ID` = 1;'; 
Т.е. таки оказалось, что вся проблема в этих кавычках/апострофах. Причем только обходным путем, используя дополнительную функцию ее удалось решить. Но это же и не очевидно и не удобно.
Я сейчас столкнулся с вещью, которая мне убила мне час времени. Я никак не мог понять, почему у меня не работает последовательность
Код
aTRM1_ProgramDuration := QuotedStr(DateTimeToStr(vrTRM1_ProgramDuration.AsDateTime));
aTRM2_ProgramDuration := QuotedStr(DateTimeToStr(vrTRM2_ProgramDuration.AsDateTime));   
aQuery := 'UPDATE `program_table` ' +
            'SET `TRM1_ProgramDuration` = ' + aTRM1_ProgramDuration + ', ' +
            '`TRM2_ProgramDuration` = ' + aTRM2_ProgramDuration + ' WHERE `ID` = 1;';
Ведь все же работает, если я дату беру из текста. Но из переменной ни в какую. А дело было вот в чем. Я инициализировал переменные vrTRM1_ProgramDuration через функцию StrToTime. При этом переменной присваивается год 1899. А MySQL считает  что в дате ошибка, если год ниже 1970 (проверено экспериментально).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Февраля 2017, 10:18:39
Цитировать
В MySQL WorkBench работает такая последовательность.
Дело в том, что в редакторе скриптов текст заключается в одинарные кавычки (апострофы), например: 'текст'. В SQL текст также заключается в одинарные кавычки. И если мы выполним запрос: RunSQL('my_text');, то в СУБД придет текст без кавычек, т.е. my_text. И если мы хотим передать текст с кавычками, то мы можем использовать функцию QuotedStr, которая заключает строку в одинарные кавычки, например: RunSQL(QuotedStr('my_text'));. Можно также обойтись без QuotedStr и чтобы добавить в строку одинарную кавычку её в строке нужно удвоить. Т.е. без QuotedStr наш скрипт будет таким: RunSQL('''my_text'''); и в СУБД придет 'my_text'. Или ещё пример:  RunSQL('''hello'' my ''friend''');, в этом случае в СУБД будет передана строка 'hello' my 'friend'.

Цитировать
И еще вопрос. Это шаманство с апострофами/одинарными кавычками для названий таблиц, столбцов можно убрать?
Имена таблиц и столбцов в MySQL часто заключают в другие одинарные кавычки, которые находятся на клавише "ё" и выглядят так: ``. Их основное предназначение в том, чтобы избежать  путаницы между зарезервированными ключевыми словами и названиями переменных, столбцов или таблиц. Например в SQL есть ключевое слово SELECT и мы хотим назвать столбец также. Для этого мы пишем так: SELECT * FROM `select` WHERE ...;

Поэтому, если Вы не используете ключевые слова при именовании таблиц и т.д., то эти кавычки можно убрать и записывать так: RunSQL('SELECT * FROM my_table.my_column WHERE id = 10');

Цитировать
Я инициализировал переменные vrTRM1_ProgramDuration через функцию StrToTime.
StrToTime запишет в переменную только время, без даты и дата останется 30 декабря 1899. Поэтому нужно инициализировать используя StrToDateTime (дата + время), например:

Код
var
  D: TDateTime;
begin
  D := StrToDateTime('03.02.2017 16:48:36');
end.

В результате вышеописанного можем заменить такую запись:
Код
aQuery := 'UPDATE `program_table` ' +
          'SET `TRM1_ProgramDuration` = `2017.02.03 16:48:36`, ' +
          '`TRM2_ProgramDuration` = NOW() WHERE `ID` = 1;';

на такую:
Код
aQuery := 'UPDATE program_table ' + 
          'SET TRM1_ProgramDuration = ''2017.02.03 16:48:36'', ' +
          'TRM2_ProgramDuration = NOW() WHERE id = 1;';

т.е. убираем лишние кавычки и используем кавычки только для передачи строк и разделения кода скрипта на строки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 05 Февраля 2017, 11:52:52
Спасибо за разъяснения. Думаю дальше легче пойдет)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: toreto от 17 Февраля 2017, 17:29:14
Здравствуйте!!! Такой вопрос: есть несколько полей со значениями и нужно вывести наибольшее из них в отдельное поле. И еще использую процедуру "Button_OnClick" со скриптом  MinimizeApplicationClient(GetClientName) на сворачивание клиента, и если запущено несколько клиентов то сворачивание происходит на всех клиентах, то же самое и с закрытием. Использую версию Simple-Scada 2.1.2.0.   
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Февраля 2017, 17:40:17
Цитировать
Такой вопрос: есть несколько полей со значениями и нужно вывести наибольшее из них в отдельное поле.
Пусть это поля fldA, fldB, fldC, а поле с максимумом fldMax. Каждое поле должно быть связано со своей переменной, а поле fldMax связано с виртуальной переменной. Тогда переходим к скрипту OnDataChange для поля fldA и пишем такой код:

Код
var
  aMax: Double;
begin
  aMax := fldA.AsFloat;
  if fldB.AsFloat > aMax then aMax := fldB.AsFloat;
  if fldC.AsFloat > aMax then aMax := fldC.AsFloat;

  fldMax.Value := aMax;
end.

Готово. Теперь у полей fldB и fldC выставляем этот скрипт на событие OnDataChange.

Цитировать
И еще использую процедуру "Button_OnClick" со скриптом  MinimizeApplicationClient(GetClientName) на сворачивание клиента, и если запущено несколько клиентов то сворачивание происходит на всех клиентах, то же самое и с закрытием. Использую версию Simple-Scada 2.1.2.0.
Значит на всех клиентских компьютерах используется одинаковое имя (или оно не задано). Изменить имя клиента Вы можете через Options.exe (раздел Simple-Client, поле "Имя этого клиента").
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: toreto от 17 Февраля 2017, 17:46:43
Спасибо за быстрый ответ!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Guchi от 07 Марта 2017, 12:58:58
Добрый день!

есть скрипт на изменение цвета  объекта (ежесекундный)

begin
  if Teg1. IsGoodQuality = False then TM_Field6.Color :=clRed
     else TM_Field.Color :=clLime
end.

необходимо сделать универсальный скрипт (по изменению переменной) или ежесекундный скрипт, для того чтобы при потере связи или плохом признаке качества Тега поле меняло цвет с зеленого на красный.
Необходимо контролировать параметры связи...+ вывод в лог сообщений (+звук) при потере связи с датчиком.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Марта 2017, 13:16:44
Здравствуйте.

Лучше избегать секундных скриптов, т.к. такие скрипты выполняются строго по таймеру и если переменная не меняется скрипт все равно будет выполняться проделывая лишние вычисления. Для создания универсального скрипта можно делать так:

Допустим у нас есть множество полей, каждое из которых связано со своей переменной. Создаем новый скрипт с типом события "Универсальный". и пишем такой код:

Код
var
  aVar: TM_Variable;
begin
  // сначала проверяем что скрипт вызван объектом
  if Sender is TM_Object then
  begin
    // получаем переменную с которой связан объект
    aVar := TM_Object(Sender).Variable;

    // если не удалось получить переменную объекта, то прерываем выполнение скрипта
    if not Assigned(aVar) then Exit;

    if aVar.IsGoodQuality then
      TM_Object(Sender).Color := clLime
    else
      TM_Object(Sender).Color := clRed;
  end;
end.

Готово. Теперь выделяем наше поле и на событие OnDataChange ставим этот универсальный скрипт. Этот же скрипт можно поставить на любые другие поля или объекты и они будет менять цвет при изменении качества тега.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Guchi от 07 Марта 2017, 13:56:13
огромное спасибо...возможно ли к данному скрипту прибавить сообщение..которое будет появляться в логе (+звук), при плохом признаке качества переменной...
естественно сообщение должно соответствовать  тому полю которое окрасилось в красный цвет..
Название: Вопросы по скриптам в Simple-Scada 2
Отправлено: vio от 07 Марта 2017, 23:26:59
Здравствуйте. В Simple Scada 2 имеется двадцать полей, в которые выводятся значения температур. Как можно периодически (по таймеру) подсвечивать поле с максимальным значением?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Марта 2017, 00:07:16
огромное спасибо...возможно ли к данному скрипту прибавить сообщение..которое будет появляться в логе (+звук), при плохом признаке качества переменной... естественно сообщение должно соответствовать  тому полю которое окрасилось в красный цвет..
Да, можно. Вот так:

Код
var
  aVar: TM_Variable;
begin
  // сначала проверяем что скрипт вызван объектом
  if Sender is TM_Object then
  begin
    // получаем переменную с которой связан объект
    aVar := TM_Object(Sender).Variable;

    // если не удалось получить переменную объекта, то прерываем выполнение скрипта
    if not Assigned(aVar) then Exit;

    if aVar.IsGoodQuality then
      TM_Object(Sender).Color := clLime
    else
      begin
        TM_Object(Sender).Color := clRed;
        AddMessage(Now, mkWarning, Sender.Name + '. Плохое качество тега!', TRUE, TRUE);
      end;
  end;
end.

Обратите внимание, что процедура AddMessage появилась только в Simple-Scada 2.2.0.0 (http://simple-scada.com/forum/index.php?topic=178.msg2930#msg2930). Обновите, если у Вас более старая версия.


Здравствуйте. В Simple Scada 2 имеется двадцать полей, в которые выводятся значения температур. Как можно периодически (по таймеру) подсвечивать поле с максимальным значением?
Здравствуйте. Правильнее будет не по таймеру, а по изменению (OnDataChange). Все поля придется перебирать в скрипте (в будущем сможем предложить лучшее решение, но пока только так). Далее подробное описание реализации.

Допустим наши поля называются Field1, Field2 ... Field20. Переходим в меню скриптов и нажимаем кнопку "Создать скрипт". В раскрывшемся окне вводим название скрипта, а тип события оставляем "Универсальный". И пишем такой код:

Код
var
  aMaxField: TM_Field;

  procedure GetMax(AField: TM_Field);
  begin
    AField.Color := clSilver;  // сбрасываем цвет поля на стандартный
    if AField.AsInt > aMaxField.AsInt then
      aMaxField := AField;
  end;

begin
  aMaxField := Field1;

  GetMax(Field1);
  GetMax(Field2);
  //... и так далее
  GetMax(Field20);

  aMaxField.Color := clIndianRed; 
end.

Готово. Теперь выделяем все 20 полей и на событие OnDataChange ставим этот скрипт.

Далее опишем код скрипта: есть локальная переменная aMaxField, которая сначала устанавливается равной первому полю Field1. Затем для каждого из полей вызывается подпроцедура GetMax в которую передается очередное поле. И если значение в переданном поле больше чем значение в aMaxField, то aMaxField приравнивается переданному полю. В итоге после всех процедур GetMax в переменной aMaxField будет поле с самым большим значением. Его мы и подсвечиваем красным цветом. В примере работа идет с целочисленными переменными. Если у вас в полях вещественные числа, то измените в коде AsInt на AsFloat.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vio от 08 Марта 2017, 12:32:30
Спасибо, завтра попробую.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan-nn от 08 Марта 2017, 16:44:24
Есть несколько объектов CheckBox.   Каждый отвечает за свой режим работы оборудования.  Одновременно может быть активирован только один ChekBox. Вопрос такой - не получается при нажатии на определенный чекбох деактивировать остальные, связанные с данной переменной. Т.е. нужно получить аналог радиокнопки в Делфи.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Марта 2017, 17:02:48
Цитировать
Вопрос такой - не получается при нажатии на определенный чекбох деактивировать остальные, связанные с данной переменной.
Флажок всегда отображает состояние переменной, с которой он связан. И если все флажки связаны с одной и той же переменной, то они всегда будут отображать одно и то же состояние, т.е. будут либо все включены, било все выключены. А чтобы отделить их друг от друга сейчас придется использовать разные переменные.

Как мы поняли Вам нужно сделать так, чтобы один флажок был активен только когда значение переменной равно, например 1. Второй активен только когда значение переменой равно 2 и т.д. Тогда несколько флажков действительно смогут работать с одной и той же переменной и в зависимости от её значения будут включаться/выключаться, при этом активен будет только один. Но для этого нужно чтобы у них было дополнительное свойство "значение", с которым они связаны. Сейчас так сделан компонент "Список". Может быть он подойдет Вам? Ставим список, связываем его с переменной и добавляем в него строки. Для каждой строки выбираем своё значение переменной. Но, конечно, список не будет выглядеть как несколько флажков и может не подойти.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan-nn от 08 Марта 2017, 17:25:47
Приложил картинку. Есть пять чекбоксов. Одновременно может быть нажат только один. Да, они связаны с одной переменной, но с разными ее битами (чтобы съэкономить на переменных). Допустим нажат первых чекбокс. Переменная равна 1  (бит 0). Если нажать чекбокс 2 переменная будет равна 3 (бит 1 + бит 0), а мне нужно чтобы отжался чекбокс 1 и переменная была равна 2.  Надеюсь объяснил понятно
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan-nn от 08 Марта 2017, 22:24:27
Еще вопрос. Как в скрипте задать иконку  кнопке?
Не понятен сиктаксис кода  Button54.Icon := ????
 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 09 Марта 2017, 00:02:53
Цитировать
Да, они связаны с одной переменной, но с разными ее битами (чтобы съэкономить на переменных).
Теперь понятно, но к сожалению с битами ситуация такая же, ведь нужно при установке одного бита сбрасывать остальные. Сейчас этого нормально не реализовать даже скриптом, т.к. нажатие на флажок будет "перебивать" действие скрипта. Поэтому мы добавим объекту "Флажок" новое свойство "Значение", тогда можно будет реализовать радиокнопки на основе значения одной переменной, а также и на основе битов одной переменной. Т.е. получится максимальная гибкость и без использования скриптов. А пока нормально реализовать это можно только объектом "Список".

Цитировать
Еще вопрос. Как в скрипте задать иконку  кнопке?
Кнопка представляет собой набор состояний и работать нужно не с самой кнопкой, а с её состояниями (http://simple-scada.com/scripts_manual?section=script_instrument_button). Свойство Button54.Icon доступно только для чтения, оно возвращает номер иконки для активного состояния кнопки. Вот так можно изменить иконку для первых двух состояний кнопки:

Код
begin
   Button1.States[0].Icon := 5;
   Button1.States[1].Icon := 5;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Guchi от 09 Марта 2017, 10:40:19
в скаду выведены 2 переменные Connect (устройство_1) и Connect_1(устройство_2) из arOPC...
необходимо контролировать связь с 2-мя устройствами и ОРС сервером
1) при потере  признака качества переменных (Connect и Connect_1) - отпал OPC сервер;
2) значение 0 - нет связи с устройством, 1- есть связь с устройством (по каждому устройству соответственно)
  Необходимо при выявлении события (нет связи с ОРС сервером, нет связи с устройством 1, нет связи с устройством 2) сделать задержку (например на 1 минуту) и если связь не восстановится выдать в лог сообщение с звуком о соответствующем сообытии...с возможностью автоквитирования сообщения при возобновлении связи, до того как сообщение будет в ручную подтверждено.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 09 Марта 2017, 11:25:14
Приложил картинку. Есть пять чекбоксов. Одновременно может быть нажат только один. Да, они связаны с одной переменной, но с разными ее битами (чтобы съэкономить на переменных). Допустим нажат первых чекбокс. Переменная равна 1  (бит 0). Если нажать чекбокс 2 переменная будет равна 3 (бит 1 + бит 0), а мне нужно чтобы отжался чекбокс 1 и переменная была равна 2.  Надеюсь объяснил понятно
Экономить можно и нужно внешние переменные :) Внутренние то зачем?

Если есть 1 ворд(внешний), то создаем 5 локальных булей и привязываем их к чекбоксам. Прописываем чекбоксам тег от 0 до 4.
Пишем 2 скрипта. 1 универсальный на изменение переменной чекбокса. Второй на изменение глобальной переменной.

1 скрипт - по тегу сендера при изменении его в true присваивает внешней переменной значение 2 в степени тег(1.2.4.8.16)
2 скрипт присваивает локальным переменным значение битов глобальной переменной.
Все...

если есть 2 чек, а мы ставим на 3-й (тег=2) Переменной присвоится 4, при ее смене скинется фажок с 2 переменной, 1 скрипт при этом не исполнится. Одна проблема, что при снятии птичек вообще, в глобальной переменной останется последнее значение, т.к. скрипт 1 не выполнится. Если это не критично, то можно попользовать последний бит внешней переменной и независимо от того что вызвало первый скрипт менять его на обратный. Тогда и второй исполнится, хоть бит и не участвует в процессе.
Использование 2-х скриптов критично, если есть другие источники изменений (контроллер, панельки). Если менять настройку только в скаде, то можно все вписать в 1 скрипт.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 09 Марта 2017, 21:12:51
1) при потере  признака качества переменных (Connect и Connect_1) - отпал OPC сервер;
Guchi , эта проверка никогда не будет достоверной, т.к. скада получает качество тегов и их значения с OPC-сервера и при потере связи скады с OPC-сервером она не получит BAD-статус на переменные Connect и Connect_1. Скада в этом случае просто начнет попытки переподключения к OPC-серверу. Вы работаете с удаленным OPC-сервером, или локальным? Если OPC-сервер на том же компьютере, что и скада, то связь между ними может потеряться только если OPC-сервер принудительно закроет пользователь.

Цитировать
2) значение 0 - нет связи с устройством, 1- есть связь с устройством (по каждому устройству соответственно)...  сделать задержку (например на 1 минуту)
Для этого удобнее всего сделать подсчет секунд в секундном таймере. Создать две внутренние переменные (одна на каждое устройство), допустим vrTimer_1 и vrTimer_2 с типом данных Integer и шкалой от 0 до 2147483647. И в секундном скрипте написать такой код:

Код
begin
  {  обрабатываем первый таймер }
  if Connect.AsInt = 0 then
  begin
    vrTimer_1.Value := vrTimer_1.Value + 1;
    if vrTimer_1.AsInt = 60 then
      AddMessage(Now, mkAlarm, 'Нет связи с первым устройством!', TRUE, TRUE);
  end else
    vrTimer_1.Value := 0;

  {  обрабатываем второй таймер }
  if Connect_1.AsInt = 0 then
  begin
    vrTimer_2.Value := vrTimer_2.Value + 1;
    if vrTimer_2.AsInt = 60 then
      AddMessage(Now, mkAlarm, 'Нет связи со вторым устройством!', TRUE, TRUE);
  end else
    vrTimer_2.Value := 0;
end;

Цитировать
.с возможностью автоквитирования сообщения при возобновлении связи
Автоквитирование сделать не получится, т.к. данные неквитированных сообщений недоступны из скриптов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Guchi от 13 Марта 2017, 08:13:39
Исходные данные:
имеем 2 устройства по 8 точек измерения (Тег1...Тег8 и Тег9-Тег16) и 8 точкам измерения Статус (Тег17..Тег24 и Тег25..Тег32)
сбор с устройств (МВ110-8А Овен) идет посредством терминала GPRS Teleofis - Master OPC Universal Modbus Server   - Simple Scada...
Требуется определять
1. связь с утройствами.... применить универсальный скрип по изменению параментра...если признак качества по Тег1...Тег8 плохой, то устройство №1 "нет связи", если Тег9...Тег16 признак качества плохой, то "устройство №2 нет связи".
2. нештатки по каналам измерения....универсальный скрипт: если Тег1....Тег8 имеет хороший признак качество то читаем Тег17...Тег24 и если переменные: 1) = 61447, то выводим сообщение "датчик отключен", 2) = 61493, то выводим сообщение "обрыв датчика" и т.д.
если признак качества Тег1...Тег8 плохой, то конец скрипта....аналогично с Тег9...Тег16 (статусы Тег25...Тег32)....
технически у меня ничего не получилось...прошу помочь...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 13 Марта 2017, 21:53:02
Можно оба пункта решить одним секундным скриптом. Допустим переменные тегов называются соответственно Tag1, Tag2 ... Tag32.
Тогда скрипт будет таким:
Код: (delphi)
var
  aGoodCount, aBadCount: Byte;
  a61447, a61493: Byte;

  procedure Check(AQuality: Boolean; var ATag: TM_Variable);
  begin
    { если нужно проверять качество }
    if AQuality = TRUE then
      if ATag.IsGoodQuality then
        Inc(aGoodCount)
      else
        Inc(aBadCount);

    { если нужно проверять значение }
    if AQuality = FALSE then
      if ATag.AsInt = 61447 then
        Inc(a61447)
      else
        if ATag.AsInt = 61493 then
          Inc(a61493);
  end;

  { проверяет восемь тегов на качество (при AQuality = TRUE)
    или на значение (при AQuality = FALSE) }
  procedure GoodOrBad(AQuality: Boolean; var T1, T2, T3, T4, T5, T6, T7, T8: TM_Variable);
  begin
    aGoodCount := 0;
    aBadCount := 0;
    a61447 := 0;
    a61493 := 0;
   
    Check(AQuality, T1);
    Check(AQuality, T2);
    Check(AQuality, T3);
    Check(AQuality, T4);
    Check(AQuality, T5);
    Check(AQuality, T6);
    Check(AQuality, T7);
    Check(AQuality, T8);
  end;

begin
  { проверяем качество 8 тегов первого устройства }
  GoodOrBad(TRUE, Tag1, Tag2, Tag3, Tag4, Tag5, Tag6, Tag7, Tag8);

  { если все 8 тегов с плохим качеством }
  if aBadCount = 8 then
    AddMessage(Now, mkAlarm, 'Устройство 1. Нет связи!', TRUE, TRUE);

  { если все 8 тегов с хорошим качеством }
  if aGoodCount = 8 then
  begin
    { проверяем значение тегов 17..24 }
    GoodOrBad(FALSE, Tag17, Tag18, Tag19, Tag20, Tag21, Tag22, Tag23, Tag24);

    if a61447 = 8 then  // все равны 61447
      AddMessage(Now, mkAlarm, 'Устройство 1. Датчик отключен!', TRUE, TRUE);

    if a61493 = 8 then  // все равны 61493
      AddMessage(Now, mkAlarm, 'Устройство 1. Обрыв датчика!', TRUE, TRUE);
  end;


  //////   далее тот же код, но для тегов второго устройства   //////


  { проверяем качество 8 тегов второго устройства }
  GoodOrBad(TRUE, Tag9, Tag10, Tag11, Tag12, Tag13, Tag14, Tag15, Tag16);

  { если все 8 тегов с плохим качеством }
  if aBadCount = 8 then
    AddMessage(Now, mkAlarm, 'Устройство 2. Нет связи!', TRUE, TRUE);

  { если все 8 тегов с хорошим качеством }
  if aGoodCount = 8 then
  begin
    { проверяем значение тегов 25..32 }
    GoodOrBad(FALSE, Tag25, Tag26, Tag27, Tag28, Tag29, Tag30, Tag31, Tag32);

    if a61447 = 8 then  // все равны 61447
      AddMessage(Now, mkAlarm, 'Устройство 2. Датчик отключен!', TRUE, TRUE);

    if a61493 = 8 then  // все равны 61493
      AddMessage(Now, mkAlarm, 'Устройство 2. Обрыв датчика!', TRUE, TRUE);
  end;
end.

Для сокращения кода используется две подпроцедуры:
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 14 Марта 2017, 14:25:27
    Здравствуйте! Помогите разобраться.

1. Задача: если переменная var1 (byte) принимает значение больше нуля, то переменная var2 (byte) (вентилятор) принимает значение 16.
var1 - Field1, var2 - Image1.

Код
Код:
begin
if Field1.AsInt > 0 then
    Image1.AnimSpeed := 16
  else
    Image1.AnimSpeed := 0;
end. 
       
При изменении значения Field1 - ничего не происходит.

Анимация начинает срабатывать только в таком случае, при var1 - Field1, Image1:

Код
begin
if Image1.AsInt > 0 then
    Image1.AnimSpeed := 16
  else
    Image1.AnimSpeed := 0;
end.

2.   Задача: написать скрипт таймера наработки оборудования с функциями ПУСК, СТОП и ПАУЗА, работающего от системного времени.   
Как будет выглядеть код?

Спасибо.
     
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Марта 2017, 15:16:42
Здравствуйте!

Вы этот код:

Код
begin
if Field1.AsInt > 0 then
    Image1.AnimSpeed := 16
  else
    Image1.AnimSpeed := 0;
end.

написали для события OnDataChange Изображения? Если да, то скрипт не будет работать, так как для изображения он будет выполняться только при изменении переменной связанной с изображением - "var2".

Цитировать
Анимация начинает срабатывать только в таком случае, при var1 - Field1, Image1

Все верно. Если Вам нужно, чтобы запускалась/останавливалась анимация изображения при изменении переменной "var1", то ее нужно связать и с полем и с изображением и не нужно использовать две переменных.

Цитировать
Задача: написать скрипт таймера наработки оборудования с функциями ПУСК, СТОП и ПАУЗА, работающего от системного времени.   
Как будет выглядеть код?

Пример таймера наработки с функциями ПУСК, СТОП и ПАУЗА Вы можете найти в демо-проекте: Страница "Скрипты" -> подстраница "Простые скрипты(1)" -> пример №8 "Пример секундомера".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Guchi от 15 Марта 2017, 08:44:44
Код
begin
  {  обрабатываем первый таймер }
 
  if Tag11.IsGoodQuality = False then
  if Tag12.IsGoodQuality = False then
  if Tag13.IsGoodQuality = False then
  if Tag14.IsGoodQuality = False then
  if Tag15.IsGoodQuality = False then
  if Tag16.IsGoodQuality = False then
  if Tag17.IsGoodQuality = False then
  if Tag18.IsGoodQuality = False then

  begin
    vrTimer_1.Value := vrTimer_1.Value + 1;
    begin
    if vrTimer_1.AsInt = 1 then
      AddMessage(Now, mkMessage, 'Отсутсвует связь. Устройство 1!', TRUE, FALSE);
    if vrTimer_1.AsInt = 60 then
      AddMessage(Now, mkWarning, 'Отсутсвует связь. Устройство 1!', TRUE, FALSE);
    if vrTimer_1.AsInt = 180 then
      AddMessage(Now, mkAlarm, 'Нет связи. Устройство 1 !', TRUE, TRUE);
      end;
   end else
    vrTimer_1.Value := 0;




  {  обрабатываем второй таймер }
 
  if Tag21.IsGoodQuality = False then
  if Tag22.IsGoodQuality = False then
  if Tag23.IsGoodQuality = False then
  if Tag24.IsGoodQuality = False then
  if Tag25.IsGoodQuality = False then
  if Tag26.IsGoodQuality = False then
  if Tag27.IsGoodQuality = False then
  if Tag28.IsGoodQuality = False then
  begin
    vrTimer_2.Value := vrTimer_2.Value + 1;
    begin
    if vrTimer_2.AsInt = 1 then
      AddMessage(Now, mkMessage, 'Отсутсвует связь. Устройство 2!', TRUE, FALSE);
    if vrTimer_2.AsInt = 60 then
      AddMessage(Now, mkWarning, 'Отсутсвует связь. Устройство 2!', TRUE, FALSE);
    if vrTimer_2.AsInt = 180 then
      AddMessage(Now, mkAlarm, 'Нет связи. Устройство 2 !', TRUE, TRUE);
    end;
  end else
    vrTimer_2.Value := 0
end.

секундный скрипт проверяет 8 переменных на качество и если все 8 плохого качества то по таймеру выдает сообщение...скрипт мой (выстраданный с Вашей помощью...за что я Вам очень благодарен) вроде бы  работает...как его можно упростить ? потому как переменных может быть и не 8 8))) возможно применить процедуру Check...
Идет просто проверка на связь с Устройством...по всем переменным...возможно и по одному (любому)

Код
var
  aGoodCount, aBadCount: Byte;
  a61447, a61493: Byte;

  procedure Check(AQuality: Boolean; var ATag: TM_Variable);
  begin
    { если нужно проверять качество }
    if AQuality = TRUE then
      if ATag.IsGoodQuality then
        Inc(aGoodCount)
      else
        Inc(aBadCount);

    { если нужно проверять значение }
    if AQuality = FALSE then
      if ATag.AsInt = 61447 then
        Inc(a61447)
      else
        if ATag.AsInt = 61493 then
          Inc(a61493);
  end;

  { проверяет восемь тегов на качество (при AQuality = TRUE)
    или на значение (при AQuality = FALSE) }
  procedure GoodOrBad(AQuality: Boolean; var T1, T2, T3, T4, T5, T6, T7, T8: TM_Variable);
  begin
    aGoodCount := 0;
    aBadCount := 0;
    a61447 := 0;
    a61493 := 0;
   
    Check(AQuality, T1);
    Check(AQuality, T2);
    Check(AQuality, T3);
    Check(AQuality, T4);
    Check(AQuality, T5);
    Check(AQuality, T6);
    Check(AQuality, T7);
    Check(AQuality, T8);
  end;

begin
  { проверяем качество 8 тегов первого устройства }
  GoodOrBad(TRUE, Tag1, Tag2, Tag3, Tag4, Tag5, Tag6, Tag7, Tag8);

  { если все 8 тегов с плохим качеством }
  if aBadCount = 8 then
    AddMessage(Now, mkAlarm, 'Устройство 1. Нет связи!', TRUE, TRUE);

  { если все 8 тегов с хорошим качеством }
  if aGoodCount = 8 then
  begin
    { проверяем значение тегов 17..24 }
    GoodOrBad(FALSE, Tag17, Tag18, Tag19, Tag20, Tag21, Tag22, Tag23, Tag24);

    if a61447 = 8 then  // все равны 61447
      AddMessage(Now, mkAlarm, 'Устройство 1. Датчик отключен!', TRUE, TRUE);

    if a61493 = 8 then  // все равны 61493
      AddMessage(Now, mkAlarm, 'Устройство 1. Обрыв датчика!', TRUE, TRUE);
  end;


  //////   далее тот же код, но для тегов второго устройства   //////


  { проверяем качество 8 тегов второго устройства }
  GoodOrBad(TRUE, Tag9, Tag10, Tag11, Tag12, Tag13, Tag14, Tag15, Tag16);

  { если все 8 тегов с плохим качеством }
  if aBadCount = 8 then
    AddMessage(Now, mkAlarm, 'Устройство 2. Нет связи!', TRUE, TRUE);

  { если все 8 тегов с хорошим качеством }
  if aGoodCount = 8 then
  begin
    { проверяем значение тегов 25..32 }
    GoodOrBad(FALSE, Tag25, Tag26, Tag27, Tag28, Tag29, Tag30, Tag31, Tag32);

    if a61447 = 8 then  // все равны 61447
      AddMessage(Now, mkAlarm, 'Устройство 2. Датчик отключен!', TRUE, TRUE);

    if a61493 = 8 then  // все равны 61493
      AddMessage(Now, mkAlarm, 'Устройство 2. Обрыв датчика!', TRUE, TRUE);
  end;
end.
вышеописанный скрипт с Check процедурой выдавал каждую секунду что "Нет связи с Устройством 1", "Нет связи с Устройством 2".
Насчет проверки по значению- эту часть скрипта можно убрать...только по качеству
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 15 Марта 2017, 11:55:55
Цитировать
Пример таймера наработки с функциями ПУСК, СТОП и ПАУЗА Вы можете найти в демо-проекте: Страница "Скрипты" -> подстраница "Простые скрипты(1)" -> пример №8 "Пример секундомера".

Попробовал повторить таймер представленный в demo в своем проекте - пока ничего не получается.
Последовательность действий следующая:
1. Создал виртуальные переменные:
vrTimerState (состояние таймера), тип Byte;
vrIntervalInSec (интервал в сек), тип Int64, шкала - время;
vrTime (хранение отмеренного времени), тип DataTime, шкала - время.
2. Создал кнопку ПУСК. Присвоил переменную - vrTimerState. В событиях OnClick установил скрипт:
Код
begin
      if vrTimerState.AsInt = 0 then
         vrTime.Value := IncSecond(Now, -vrIntervalInSec.AsInt)
      else
         vrIntervalInSec.Value := SecondsBetween(Now, vrTime.Value);
end.

3. Создал кнопку СТОП. В событиях OnClick установил скрипт:
Код
begin
  vrTimerState.Value := 0;
  vrIntervalInSec.Value := 0;
  txtTimer.Text := '0 дней 00:00:00';
end.
4. Создал тект. В свойствах текста указал - 0 дней 00:00:00
5. Написал скрипт
Код
begin
  { Код для таймера. Если таймер запущен выводим накопленное время }
     if vrTimerState.AsInt = 1 then
        txtTimer.Text := IntToStr(DaysBetween(Now, vrTime.Value))  + ' дней ' + TimeToStr(Now -       vrTime.Value);
end.   
   
Подскажите, пожалуйста, где я что не учел?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 15 Марта 2017, 12:11:53
5. Написал срипт
А когда этот скрипт и чем вызывается?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 15 Марта 2017, 13:06:53
5. Написал скрипт
А когда этот скрипт и чем вызывается?
Да я ввел этот скрипт, в надежде, что он как-то выведет информацию о текущем времени, но к чему его "прикрутить" не знаю  ???
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 15 Марта 2017, 13:16:47
Да я ввел этот скрипт, в надежде, что он как-то выведет информацию о текущем времени, но к чему его "прикрутить" незнаю  ???
Например сделать его секундным, или часовым, или по событию (по кнопке). Я ж не знаю как вам надо :)
Но если скрипт не вызывать, он точно не исполнится.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 15 Марта 2017, 13:59:14
Цитировать
Например сделать его секундным, или часовым, или по событию (по кнопке). Я ж не знаю как вам надо :) Но если скрипт не вызывать, он точно не исполнится.

При условии, когда две переменных становятся больше нуля, включается таймер, если в процессе условие не соблюдается - таймер переходит в режим ПАУЗЫ.

В общем, поставил скрипт пятого пункта на кнопку ПУСК. Теперь таймер отображает значения, но пока обновляет данные только при условии нажатия кнопки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 15 Марта 2017, 14:27:18
Цитировать
Например сделать его секундным, или часовым, или по событию (по кнопке). Я ж не знаю как вам надо :) Но если скрипт не вызывать, он точно не исполнится.

Получилось. При создании скрипта выбрал событие: прошла секунда.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 15 Марта 2017, 16:27:13

Цитировать
При условии, когда две переменных становятся больше нуля, включается таймер, если в процессе условие не соблюдается - таймер переходит в режим ПАУЗЫ.

На строке  else программа не хочет компилироваться.

Код
begin
      if vr_4.Value >  0 and vr_5.Value > 0  then
      begin
         { если выполнено условие, то включается таймер }
         vrIntervalInSec_2.Value := SecondsBetween(Now, vrTime_2.Value);
         { При включении таймера выводим накопленное время }
         txtTimer_2.Text := IntToStr(DaysBetween(Now, vrTime_2.Value))  + ' дней ' + TimeToStr(Now - vrTime_2.Value);
      end;
      else
         { если таймер ещё не включен }
         vrTime_2.Value := IncSecond(Now, -vrIntervalInSec_2.AsInt);
  end.
           
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 15 Марта 2017, 16:28:51
AutoCY, лишняя точка с запятой после end, должно быть:

Код
...
      txtTimer_2.Text := IntToStr(DaysBetween(Now, vrTime_2.Value))  + ' дней ' + TimeToStr(Now - vrTime_2.Value);
    end else
      { если таймер ещё не включен }
...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 15 Марта 2017, 17:10:42
Цитировать
вышеописанный скрипт с Check процедурой выдавал каждую секунду что "Нет связи с Устройством 1", "Нет связи с Устройством 2".
Насчет проверки по значению- эту часть скрипта можно убрать...только по качеству
Да, забыли учесть таймеры. Если добавить таймер и убрать проверку на значение, то скрипт будет таким:

Код
var
  aGoodCount, aBadCount: Byte;

  procedure Check(var ATag: TM_Variable);
  begin
    if ATag.IsGoodQuality then
      Inc(aGoodCount)
    else
      Inc(aBadCount);
  end;

  procedure GoodOrBad(var T1, T2, T3, T4, T5, T6, T7, T8: TM_Variable);
  begin
    aGoodCount := 0;
    aBadCount := 0;
   
    Check(T1);  Check(T2);
    Check(T3);  Check(T4);
    Check(T5);  Check(T6);
    Check(T7);  Check(T8);
  end;

begin
  { проверяем качество 8 тегов первого устройства }
  GoodOrBad(Tag1, Tag2, Tag3, Tag4, Tag5, Tag6, Tag7, Tag8);

  { если все 8 тегов с плохим качеством }
  if aBadCount = 8 then
  begin
    vrTimer_1.Value := vrTimer_1.Value + 1;
    case vrTimer_1.AsInt of
        1: AddMessage(Now, mkMessage, 'Отсутствует связь. Устройство 1!', TRUE, FALSE);
       60: AddMessage(Now, mkWarning, 'Отсутствует связь. Устройство 1!', TRUE, FALSE);
      180: AddMessage(Now, mkAlarm, 'Нет связи. Устройство 1!', TRUE, TRUE);
    end;
  end else
    vrTimer_1.Value := 0;


  //////   далее тот же код, но для тегов второго устройства   //////

  { проверяем качество 8 тегов второго устройства }
  GoodOrBad(Tag9, Tag10, Tag11, Tag12, Tag13, Tag14, Tag15, Tag16);

  { если все 8 тегов с плохим качеством }
  if aBadCount = 8 then
  begin
    vrTimer_2.Value := vrTimer_2.Value + 1;
    case vrTimer_2.AsInt of
        1: AddMessage(Now, mkMessage, 'Отсутствует связь. Устройство 2!', TRUE, FALSE);
       60: AddMessage(Now, mkWarning, 'Отсутствует связь. Устройство 2!', TRUE, FALSE);
      180: AddMessage(Now, mkAlarm, 'Нет связи. Устройство 2!', TRUE, TRUE);
    end;
  end else
    vrTimer_2.Value := 0;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan-nn от 15 Марта 2017, 19:03:14
Новый затык со скриптами.
Как из переменной TDateTime вытащить только время?   Нужно сравнивать две переменных только  с учетом времени.
В Делфи есть AsTime и TimeToStr, а как тут сделать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 15 Марта 2017, 20:13:08
Цитировать
В Делфи есть AsTime и TimeToStr, а как тут сделать?
Можно так же как в Delphi перевести в строку только время используя TimeToStr и затем сделать сравнение строк. TimeToStr вытащит из TDateTime только время, без даты. Например:

Код
var
  dt1, dt2: TDateTime;
  Time1, Time2: string;
begin
  dt1 := Now;
  dt2 := Now;

  Time1 := TimeToStr(dt1);
  Time2 := TimeToStr(dt2);

  if Time1 = Time2 then
  begin
    // время в dt1 равно времени dt2!
  end;
end.

Этот способ работает. Но так так TimeToStr зависит от формата времени, то правильнее сравнивать время извлекая часы, минуты и секунды. Вот так:

Код
var
  dt1, dt2: TDateTime;
begin
  dt1 := Now;
  dt2 := Now;

  { если часы, минуты и секунды у dt1 и dt2 равны }
  if (HourOf(dt1) = HourOf(dt2)) and
     (MinuteOf(dt1) = MinuteOf(dt2)) and
     (SecondOf(dt1) = SecondOf(dt2)) then
  begin
    // время в dt1 равно времени dt2!
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 16 Марта 2017, 12:10:07
Как правильно присвоить переменной Time_1 значение времени 08.00.00, которая будет являться константой?

Код
const
    Time_1 =(08, 00, 00);

или

Код
 var Time_1: TDataTime;
begin
 Time_1 := (08, 00, 00);

При попытке сделать так - выдает ошибку при компиляции EncodeTime:

Код
var
 Time_1 : TDateTime;
begin
 Time_1.Value :=  EncodeTime(8, 0, 0, 0);
end.     
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Марта 2017, 20:37:47
AutoCY, тип TDateTime этот тот же самый тип Double (вещественное число) и при создании константы время придется задавать именно как вещественное число и это неудобно. При попытке сделать так - выдает ошибку при компиляции EncodeTime. Сейчас EncodeDate, EncodeTime не вынесены в скрипты. Добавим их в очередном обновлении. Но возможно Вашу задачу можно решить проще. Можете описать то, что нужно сделать в скрипте? Мы предложим решение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 17 Марта 2017, 13:13:30
Цитировать
Но возможно Вашу задачу можно решить проще. Можете описать то, что нужно сделать в скрипте? Мы предложим решение.

Задача заключается в следующем: необходимо сделать таймер наработки оборудования с тремя интервалами во времени. Например, таймер формирует отдельные отрезки времени с 8.00 до 12.00, далее с 12.00 до 16.00 и т.д. При этом компонент таблица регистрирует эти данные в соответствующие ячейки. В результате, чтобы можно было проследить сколько работало оборудование в трех сменах в течении суток, скажем, за месяц.

Таймер будет включаться не только от времени, но еще и от дополнительных переменных. Как управлять таймером от переменных на данный момент времени я разобрался.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Марта 2017, 16:39:03
Простите, но это работа контроллера, а не скады...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 17 Марта 2017, 16:51:23
Простите, но это работа контроллера, а не скады...
Да мне бы пока понять как включить и выключить таймер по определенному времени. А с контроллером...увы, в этом проекте я занимаюсь только скадой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Марта 2017, 18:04:21
Таймер будет включаться не только от времени, но еще и от дополнительных переменных. Как управлять таймером от переменных на данный момент времени я разобрался.
Ну так, а время это что, не переменная? Задайте в секундном скрипте проверку времени, и зависимо от смены переменной смена присваивайте значение 1,2,3.

Таймера тогда собсно тоже 3.
1 стартует если железо включено и смена=1, иначе стоп.
2...
3...

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Марта 2017, 09:44:50
необходимо сделать таймер наработки оборудования с тремя интервалами во времени. Например, таймер формирует отдельные отрезки времени с 8.00 до 12.00, далее с 12.00 до 16.00 и т.д. При этом компонент таблица регистрирует эти данные в соответствующие ячейки. В результате, чтобы можно было проследить сколько работало оборудование в трех сменах в течении суток, скажем, за месяц.
Но ведь в этом случае все накопленные в таблице записи будут потеряны при первом перезапуске сервера скады или проекта. К тому же, чтобы они добавлялись в таблицу придется на каждый интервал времени выделить переменные и связать ячейки таблицы с этими переменными. Причем если планируется выводить наработку за месяц добавляя по 3 новых строки в день, то получается что нужно создать 90 строк в таблице и заполнить все строки переменными. Плюс остается проблема с потерей данных при перезапусках. Такая система совсем не подходит для нормальной работы.

Правильнее было бы выводить наработки получая их из архива. Т.е. включить у нужных тегов архивацию а затем выполнять выборку из БД за нужный интервал времени и подсчитывать время наработки. Тогда даже после перезапуска сервера все наработки сохранятся. Только сейчас все это нужно делать в запросе и готовых функций для вычисления наработок средствами скады нет. Постараемся их добавить в ближайших обновлениях.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 20 Марта 2017, 12:41:09
Цитировать
Но ведь в этом случае все накопленные в таблице записи будут потеряны при первом перезапуске сервера скады или проекта. К тому же, чтобы они добавлялись в таблицу придется на каждый интервал времени выделить переменные и связать ячейки таблицы с этими переменными. Причем если планируется выводить наработку за месяц добавляя по 3 новых строки в день, то получается что нужно создать 90 строк в таблице и заполнить все строки переменными. Плюс остается проблема с потерей данных при перезапусках. Такая система совсем не подходит для нормальной работы.

Правильнее было бы выводить наработки получая их из архива. Т.е. включить у нужных тегов архивацию а затем выполнять выборку из БД за нужный интервал времени и подсчитывать время наработки. Тогда даже после перезапуска сервера все наработки сохранятся. Только сейчас все это нужно делать в запросе и готовых функций для вычисления наработок средствами скады нет. Постараемся их добавить в ближайших обновлениях.
C БД я займусь немного позже. А пока не пойму как сделать правильным сравнение по отрезку времени в четвертой строке:

Код
begin
      Timer_1.Value := Now;
       txtTimer_4.Text := TimeToStr(Now);
       if(Timer_1.Value > 07:00:00) and (Timer_1.Value < 15:00:00)  then
            begin
               { если выполнено условие, то включается таймер }
               vrIntervalInSec_3.Value := SecondsBetween(Now, vrTime_3.Value);
               { При включении таймера выводим накопленное время }
               txtTimer_3.Text := TimeToStr(Now - vrTime_3.Value);
               Image8.Color := clRed

            end
      else
         begin
         { если таймер ещё не включен }
         Timer_1.Value := IncSecond(Now, -vrIntervalInSec_3.AsInt);
         Image8.Color := clNone
         end;
  end.             
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Марта 2017, 23:26:33
Цитировать
А пока не пойму как сделать правильным сравнение по отрезку времени в четвертой строке:
Т.е. нужно проверить, что час из значения Timer_1 больше 7 и меньше 15? Тогда нужно делать так:

Код
var
  aHour: Byte;
begin
  aHour := HourOf(Timer_1.AsDateTime);   // достаём час из переменной Timer_1 в переменную aHour
  if (aHour > 7) and (aHour < 15) then
    // ...
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 21 Марта 2017, 09:15:36
Цитировать
Тогда нужно делать так:
Спасибо за ответ.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 21 Марта 2017, 17:00:09
При попытке повторить видео-пример по работе с файлами, компиляция не получается: в первой строке выбивает ошибку Not enough actual parametrs:
 
Код
begin
  if FileOpen ('Hello.sbm') then
  begin
      FileWriteString (Field9.ValueAsStr);
      FileWriteInteger (Field7.ValueAsInt);
      FileWriteSingle (Field8.ValueAsFloat);
      FileWriteString (Text13.Text);
      FileWriteDateTime (Now);
  end;
end.
     
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 21 Марта 2017, 17:45:06
Здравствуйте!

С момента записи видеоурока функции FileOpen, FileRecreate, FileExists получили еще один параметр APath - задает полный путь к файлу. Если этот параметр оставить пустым (= ''), то будет взят стандартный путь: «..\Simple-Scada 2\Projects\Папка_проекта\User files\». Важно! При указании пути к файлу в конце обязательно должен быть символ «\».

Поэтому скрипт нужно изменить так:
Код
begin
  if FileOpen ('Hello.sbm', '') then  // если файл по стандартному пути успешно открыт, то …
  begin
      FileWriteString (Field9.ValueAsStr);
      FileWriteInteger (Field7.ValueAsInt);
      FileWriteSingle (Field8.ValueAsFloat);
      FileWriteString (Text13.Text);
      FileWriteDateTime (Now);
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 22 Марта 2017, 10:28:11
Цитировать
С момента записи видеоурока функции FileOpen, FileRecreate, FileExists получили еще один параметр APath - задает полный путь к файлу. Если этот параметр оставить пустым (= ''), то будет взят стандартный путь: «..\Simple-Scada 2\Projects\Папка_проекта\User files\». Важно! При указании пути к файлу в конце обязательно должен быть символ «\».

Рабочий код получился таким (без Value):
Код
begin
  if FileOpen ('Hello.sbm', '') then
  begin
      FileWriteString (Field9.AsStr);
      FileWriteInteger (Field7.AsInt);
      FileWriteSingle (Field8.AsFloat);
      FileWriteString (Text13.Text);
      FileWriteDateTime (Now)
  end;
end.             
По умолчанию файл сохранился там, где Вы и сказали. Но я не совсем понял, как указать пользовательский путь сохранения файла. Не могли бы пример привести для наглядности. Например, путь такой:
D:\Simple-Scada 2\Папка_файла\.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 22 Марта 2017, 10:38:14
Здравствуйте!

Пример:
Код
begin
  if FileOpen('Hello.sbm', 'D:\Simple-Scada 2\Папка_файла\') then
  begin
      FileWriteString (Field9.AsStr);
      FileWriteInteger (Field7.AsInt);
      FileWriteSingle (Field8.AsFloat);
      FileWriteString (Text13.Text);
      FileWriteDateTime (Now);
  end;
end.   
   
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 30 Марта 2017, 06:33:16
Здравствуйте.
Недавно начал изучать Simple-SCADA. Система интересная. Видимо, остановлюсь на ней (раньше не использовал SCADA, пробовал многие, но по разным причинам отказывался и продолжал создавать своё ПО для АСУ на Делфи). Появилось несколько вопросов по скриптам:

1) Можно ли как-то вызвать скрипт из другого скрипта
2) Можно ли как-то объявить глобальную процедуру/функцию
3) Можно ли выполнять скрипты, которые находятся во внешних файлах
4) Можно ли объявить глобальный класс/объект и связать с ним глобальную переменную, или, например, глобальный массив
5) Можно ли использовать API-Windows и DLL
6) Можно ли выводить в поля значения в двоичном или шестнадцатеричном виде
7) Немного напрягает отсутствие отмены изменений в редакторе скриптов (хотя кого я обманываю - сильно напрягает)))

Всем заранее спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 30 Марта 2017, 09:24:23
Здравствуйте.

Все семь пунктов недоступны. Все-таки компилятор скриптов это не полноценная среда разработки. Программа управления обычно реализуется на контроллерах, что позволяет убрать зависимость работы тех. процессов от работы скады, а в скриптах скады используются либо готовые методы, либо пишутся свои для простой визуализации. При этом мы хорошо понимаем, что описанные Вами функции будут очень полезны даже при решении небольших задач, поэтому пункты 1, 2, 4 (касаемо глобальных классов) и 7 будут реализованы в будущих обновлениях. Пункты 3, 5 и 6 пока не планируются.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 30 Марта 2017, 11:44:44
Понял. Спасибо. Можно, конечно, без этого обойтись. Но новых версий будем ждать ))) И про редактор не забудьте. Всё-таки не очень удобно случайно удалив кусок кода не иметь возможности отменить это действие.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 30 Марта 2017, 14:09:44
Ещё вопрос. Правда не по скриптам.
Не могу ввести в поле (вручную) значение больше 100. В свойствах поля стоит параметр "Максимум" 100. В документации сказано, что этот параметр изменяется в редакторе переменных. Но там я такого параметра не нашёл. Там есть границы, но это, как я понимаю, не "Максимум". В чём может быть причина?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 30 Марта 2017, 14:13:31
Здравствуйте!

Этот вопрос рассмотрен в разделе FAQ - пятое сообщение (http://simple-scada.com/forum/index.php?topic=288.msg2577#msg2577).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 30 Марта 2017, 15:21:13
Понял. Спасибо. Можно, конечно, без этого обойтись. Но новых версий будем ждать ))) И про редактор не забудьте. Всё-таки не очень удобно случайно удалив кусок кода не иметь возможности отменить это действие.
Перед редактированием скриптов сохраняйтесь... ф9 кроме компиляции сохраняет скрипт... В случае аврала снимаете процесс и запускаете по новой... Сохранится последняя компиляция :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 31 Марта 2017, 12:01:42
Здравствуйте снова.
Видимо, какое-то время ещё буду надоедать вам, пока не освоюсь  :)
Вопрос такой: есть процедура (см. код), которая должна возвращать значение в глобальную переменную. Но этот код выдаёт ошибку. Хотя при использовании локальной переменной всё компилируется нормально. Как решить эту проблему?

Код
var z : byte;

procedure Test(var x : byte);
begin
  x := 1;
end;

//------------------------------------------------------------------------------------------------------
// ОСНОВНОЙ СЦЕНАРИЙ
//------------------------------------------------------------------------------------------------------
begin
 
  Test(z);  //Компилируется
  Test(BIT_0.Value );  //Не компилируется (BIT_0 - глобальная переменная типа byte)
  //Сообщение об ошибке: [uGlobal] Types of actual and formal var parameters must be identical

end.     
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 31 Марта 2017, 12:09:30
Test(BIT_0.Value )

Test(BIT_0.AsInt) пробовали?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 31 Марта 2017, 13:26:45
Пробовал с AsInt и с OriginalAsInt. Тоже не компилируется. Причём с объектами, связанными с графикой (например, с TM_Image вместо Byte) подобная процедура работает нормально. А вот с глобальными переменными не получается. Может это связано с ограничениями бесплатной версии? Хотя вроде как ограничения касаются только баз данных и файлов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 31 Марта 2017, 14:40:16
Тогда еще вопрос, вам критичен именно байт, как параметр? Если вопрос не в ограничении размеров, то можно и даже нужно передать ВСЮ "переменную":

Код
procedure Test(var x :TM_Variable);
begin
  x.Value   := 1;

end;

//------------------------------------------------------------------------------------------------------
// ОСНОВНОЙ СЦЕНАРИЙ
//------------------------------------------------------------------------------------------------------
begin

  Test(Тest3 ); 

end.

если надо именно байт, то так:

Код
var
  i:byte;

procedure Test(var x : byte);
begin
  x := 1;
end;

//------------------------------------------------------------------------------------------------------
// ОСНОВНОЙ СЦЕНАРИЙ
//------------------------------------------------------------------------------------------------------
begin

  i:=Тest3.Value;
  Test(i);

 end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 31 Марта 2017, 14:44:26
Код
var z : byte;

procedure Test(var x : byte);
begin
  x := 1;
end;

//------------------------------------------------------------------------------------------------------
// ОСНОВНОЙ СЦЕНАРИЙ
//------------------------------------------------------------------------------------------------------
begin

  z := BIT_0.AsInt
  Test(z);
  BIT_0.Value := z;

end.                         
Я бы попробовал так. Дело тут не в демо версии. А в несоответствии типов. Процедура принимает тип Byte. AsInt возвращает переменную типа Integer, что шире типа Byte. Вот и ругается компилятор. Поэтому надо явно довести тип Integer до типа Byte. Поэтому воспользоваться вашей процедурой можно только через локальную переменную-буфер, потому что метода AsByte для глобальной переменной нет)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 31 Марта 2017, 14:54:54
Процедура принимает тип Byte. AsInt возвращает переменную типа Integer, что шире типа Byte. Вот и ругается компилятор. Поэтому надо явно довести тип Integer до типа Byte. А это пока видимо можно сделать только через присвоение локальной переменной вашей глобальной переменной, потому что метода AsByte нет)
А ну задайте-ка инты и там и там? :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 31 Марта 2017, 15:00:51
Как правильно заметил TeNQ есть несоответствие типов byte и integer. Всё дело в том, что в подпроцедуре Test параметр задан с меткой var. Это передача параметра по-ссылке и она требует строгого соответствия типов данных. Поэтому нужно делать как написал TeNQ. Либо менять тип параметра в подпроцедуре на Integer.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 31 Марта 2017, 15:04:34
Как правильно заметил TeNQ есть несоответствие типов byte и integer. Всё дело в том, что в подпроцедуре Test параметр задан с меткой var. Это передача параметра по-ссылке и она требует строгого соответствия типов данных. Поэтому нужно делать как написал TeNQ.
Окей. А если в процедуре указать Single, и воспользоваться методом .AsSingle переменной, то получится ли строгое совпадение типов? НЕТ...

Можно лечить? Да!
Код
procedure Test(x : byte);
begin
  x := 1;
end;

begin
  Test (Test3.AsInt64);
end.
Спокойно компилится  ;D

Что не так? А то что мы НЕ создавали переменную х, а просто связали ее со значением BIT_0.Value, которое очень даже может не совпадать... Или, если попроще, то var убрали из объявления...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 31 Марта 2017, 15:44:31
Цитировать
А если в процедуре указать Single, и воспользоваться методом .AsSingle переменной, то получится ли строгое совпадение типов? НЕТ...
Оно получится, но нужно будет писать также как писали в примере выше, через отдельную переменную, т.к. нужно передавать ссылку:

Код
var
  X: Single;
begin
  X := vrMy.AsSingle;
  Test(X);
end;

Цитировать
Можно лечить? Да! Спокойно компилится
Конечно компилится, т.к. параметр больше не передается по ссылке, но подпроцедура теряет смысл и код свою задачу выполнять не будет, т.к. в подпроцедуре будет создана новая локальная переменная и значение равное 1 будет задано именно для неё, а не для той переменной, которая была передана в подпроцедуру.

Код
procedure Test(x : byte);
begin
  x := 1;
end;

begin
  Test(Test3.AsInt64);
  // здесь переменная Test3 будет равна тому же, чему была равна до выполнения Test,
  // т.к. в подпроцедуре работа велась с локальной копией.
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 31 Марта 2017, 17:21:46
А я ее и не собирался возвращать  ;D

но тогда уже так:
Код
var
  X: Single;
begin
  X := vrMy.AsSingle;
  Test(X);
  vrMy.Value:= X; // иначе, ничем от того что написал я, оно не отличается
end;

А так как я с саааамого начала написал нельзя? В плане передачи сразу ТМ_Variable и не плясать с бубном ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 31 Марта 2017, 19:26:31
Цитировать
А так как я с саааамого начала написал нельзя? В плане передачи сразу ТМ_Variable и не плясать с бубном ?
Как в сообщении #262? Тоже нельзя, т.к. в var параметр нельзя передавать свойство переменной, как Test(BIT_0.Value) или Test(BIT_0.AsInt), нужно обязательно передать переменную соответствующего типа.

Мы бы, в данной задаче, когда нужно в подпроцедуре менять значение переменной - не использовали бы подобных конструкций которые предложены в сообщениях выше, потому что проще передавать ссылку на переменную, вот так например:

Код
procedure Test(AVariable: TM_Variable);
begin
  AVariable.Value := 1;
end;

begin
  Test(vrMy);
end.

Тогда нет необходимости создавать отдельную переменную для извлечения значения и передачи как var параметр. Кроме того становится неважно - передавать переменную как var параметр или нет, в обоих случаях будет работать, т.к. AVariable это ссылка на область памяти.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 01 Апреля 2017, 11:36:46
Цитировать
А так как я с саааамого начала написал нельзя? В плане передачи сразу ТМ_Variable и не плясать с бубном ?
Как в сообщении #262? Тоже нельзя, т.к. в var параметр нельзя передавать свойство переменной, как Test(BIT_0.Value) или Test(BIT_0.AsInt), нужно обязательно передать переменную соответствующего типа.

Мы бы, в данной задаче, когда нужно в подпроцедуре менять значение переменной - не использовали бы подобных конструкций которые предложены в сообщениях выше, потому что проще передавать ссылку на переменную, вот так например:

Код
procedure Test(AVariable: TM_Variable);
begin
  AVariable.Value := 1;
end;

begin
  Test(vrMy);
end.
сообщение 262, первый пример :) Да, вар там лишний(с разгону не вытер, у меня в коде его нету). Но в общем смысл тот-же. :-[
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 03 Апреля 2017, 06:33:04
Ребята, всем, конечно, спасибо. Но суть в том, что мне надо работать именно с глобальными переменными, потому что в процедуре должна изменяться глобальная переменная, переданная по ссылке. Переменную целиком тоже пробовал передавать, тоже не компилируется. Так что ваши советы не помогли. Я, конечно, нашёл решение - использовал функцию, которая возвращает значение. Но, теперь вместо одной процедуры мне приходится использовать две функции, т.к. моя подпрограмма должна изменять значения двух глобальных переменных, переданных по ссылке. А это значит, что в конструкции case мне придётся использовать begin...end, то есть

Код
case x of
1: begin
    y := func1;
    z := func2;
    end;
end;

вместо

Код
case x of
1: proc(y, z);
end;

Согласитесь, что это увеличивает размер кода и время на его написание.

Так что просьба к разработчикам решить эту проблему в будущих версиях.

P.S. Вариант из сообщения 271 попробовал, но что-то тоже не получилось. Поковыряю ещё попозже, может разберусь.
P.P.S. Вариант из сообщения 271 работает. Спасибо за подсказку.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 06 Апреля 2017, 07:15:40
Доброе утро.
Уважаемые, подскажите.

Все скрипты выполняются от одной переменной. Используя биты этой переменной. 
Вариант
1) пишу скрипты привязывая их к полю OnDataChangeEx и указываю ту самую одну переменную в качестве доп.переменной для выполнения скрипта.
2) пишу все скрипты в одном месте и привязываю этот скрипт к OnDataChange другого объекта.

Как эффективней, быстрее и надежней будут выполнятся скрипты?
пример скрипта (их будет сотни)
Код
begin
{AUTO}
  if GetBit(PLC2_FIRST_PRG_status.Value, 13) then
    begin // если бит равен 1
      bt_ZKH1_auto.States[0].Color  := RGB(0,95,88);
      bt_ZKH1_auto.States[0].BorderColor := RGB(0,95,88);
      bt_ZKH1_auto.States[0].FontStep := 0;
      bt_ZKH1_auto.States[0].Caption := 'Авто вкл.';
      img_ZKH1_manual.Visible := FALSE ;
    end
  else
    begin // если бит равен 0
      bt_ZKH1_auto.States[0].Color  := RGB(60,70,80);
      bt_ZKH1_auto.States[0].BorderColor := RGB(60,70,80);
      bt_ZKH1_auto.States[0].FontStep := 3;
      bt_ZKH1_auto.States[0].Caption := 'Авто';
      img_ZKH1_manual.Visible := TRUE ;
    end;
end.             
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Апреля 2017, 09:23:00
Здравствуйте.

Цитировать
Все скрипты выполняются от одной переменной. Используя биты этой переменной.
Т.е. есть одна переменная и множество объектов. Все объекты должны реагировать на изменение битов в переменной, причем каждый объект реагирует только на изменение какого-то определённого бита. Мы правильно поняли?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 06 Апреля 2017, 10:11:16
Да Вы все правильно поняли.
В данный момент мой скрипт выглядит так:
Код
begin
{Скрипт меняет состояние кнопок и индикаторов PLC2}

// Marsh *************************************************************************

{SILOS 1}
  if GetBit(PLC2_FIRST_PRG_status.Value, 0) then
    begin //если бит равен 1
      bt_silos1.States[0].Color  := RGB(0,95,88);
      bt_silos1.States[0].BorderColor := RGB(0,95,88);
    end
  else
    begin //если бит равен 0
      bt_silos1.States[0].Color  := RGB(60,60,60);
      bt_silos1.States[0].BorderColor := RGB(60,60,60);
    end;

{SILOS 2}
  if GetBit(PLC2_FIRST_PRG_status.Value, 1) then
    begin //если бит равен 1
      bt_silos2.States[0].Color  := RGB(0,95,88);
      bt_silos2.States[0].BorderColor := RGB(0,95,88);
    end
  else
    begin //если бит равен 0
      bt_silos2.States[0].Color  := RGB(60,60,60);
      bt_silos2.States[0].BorderColor := RGB(60,60,60);
    end;

{on TSB}
  if GetBit(PLC2_FIRST_PRG_status.Value, 2) then
    begin //если бит равен 1
      bt_onTSB.States[0].Color  := RGB(0,95,88);
      bt_onTSB.States[0].BorderColor := RGB(0,95,88);
    end
  else
    begin //если бит равен 0
      bt_onTSB.States[0].Color  := RGB(60,60,60);
      bt_onTSB.States[0].BorderColor := RGB(60,60,60);
    end;

// TSH ***************************************************************************

{AUTO}
  if GetBit(PLC2_FIRST_PRG_status.Value, 5) then
    begin //если бит равен 1
      bt_tsh_auto.States[0].Color  := RGB(0,95,88);
      bt_tsh_auto.States[0].BorderColor := RGB(0,95,88);
      bt_tsh_auto.States[0].FontStep := 0;
      bt_tsh_auto.States[0].Caption := 'Авто вкл.';
      manual_tsh.Visible := FALSE;
    end
  else
    begin //если бит равен 0
      bt_tsh_auto.States[0].Color  := RGB(60,70,80);
      bt_tsh_auto.States[0].BorderColor := RGB(60,70,80);
      bt_tsh_auto.States[0].FontStep := 3;
      bt_tsh_auto.States[0].Caption := 'Авто';
      manual_tsh.Visible := TRUE;
    end;

{MANUAL ON}
  if GetBit(PLC2_FIRST_PRG_status.Value, 6) then
    begin //если бит равен 1
      bt_tsh_on.States[0].Color  := RGB(0,95,88);
      bt_tsh_on.States[0].BorderColor := RGB(0,95,88);
      bt_tsh_on.States[0].Caption := 'Включено';
    end
  else
    begin //если бит равен 0
      bt_tsh_on.States[0].Color  := RGB(60,70,80);
      bt_tsh_on.States[0].BorderColor := RGB(60,70,80);
      bt_tsh_on.States[0].Caption := 'Включить';
    end;

{MANUAL OFF}
  if GetBit(PLC2_FIRST_PRG_status.Value, 7) then
    begin //если бит равен 1
      bt_tsh_off.States[0].Color  := RGB(0,95,88);
      bt_tsh_off.States[0].BorderColor := RGB(0,95,88);
      bt_tsh_off.States[0].Caption := 'Выключено';
    end
  else
    begin //если бит равен 0
      bt_tsh_off.States[0].Color  := RGB(60,70,80);
      bt_tsh_off.States[0].BorderColor := RGB(60,70,80);
      bt_tsh_off.States[0].Caption := 'Выключить';
    end;

{REVERS ON/OFF}
  if GetBit(PLC2_FIRST_PRG_status.Value, 4) then
    img_tsh_revers.Visible := true
  else
    img_tsh_revers.Visible := false;

// NORIAH ************************************************************************

{AUTO}
  if GetBit(PLC2_FIRST_PRG_status.Value, 10) then
    begin //если бит равен 1
      bt_noriah_auto.States[0].Color  := RGB(0,95,88);
      bt_noriah_auto.States[0].BorderColor := RGB(0,95,88);
      bt_noriah_auto.States[0].FontStep := 0;
      bt_noriah_auto.States[0].Caption := 'Авто вкл.';
      manual_noriah.Visible := FALSE;
    end
  else
    begin //если бит равен 0
      bt_noriah_auto.States[0].Color  := RGB(60,70,80);
      bt_noriah_auto.States[0].BorderColor := RGB(60,70,80);
      bt_noriah_auto.States[0].FontStep := 3;
      bt_noriah_auto.States[0].Caption := 'Авто';
      manual_noriah.Visible := TRUE;
    end;

{MANUAL ON}
  if GetBit(PLC2_FIRST_PRG_status.Value, 11) then
    begin //если бит равен 1
      bt_noriah_on.States[0].Color  := RGB(0,95,88);
      bt_noriah_on.States[0].BorderColor := RGB(0,95,88);
      bt_noriah_on.States[0].Caption := 'Включено';
    end
  else
    begin //если бит равен 0
      bt_noriah_on.States[0].Color  := RGB(60,70,80);
      bt_noriah_on.States[0].BorderColor := RGB(60,70,80);
      bt_noriah_on.States[0].Caption := 'Включить';
    end;

{MANUAL OFF}
  if GetBit(PLC2_FIRST_PRG_status.Value, 12) then
    begin //если бит равен 1
      bt_noriah_off.States[0].Color  := RGB(0,95,88);
      bt_noriah_off.States[0].BorderColor := RGB(0,95,88);
      bt_noriah_off.States[0].Caption := 'Выключено';
    end
  else
    begin //если бит равен 0
      bt_noriah_off.States[0].Color  := RGB(60,70,80);
      bt_noriah_off.States[0].BorderColor := RGB(60,70,80);
      bt_noriah_off.States[0].Caption := 'Выключить';
    end;


// ZKH1 ***********************************************************************

{AUTO}
  if GetBit(PLC2_FIRST_PRG_status.Value, 13) then
    begin // если бит равен 1
      bt_ZKH1_auto.States[0].Color  := RGB(0,95,88);
      bt_ZKH1_auto.States[0].BorderColor := RGB(0,95,88);
      bt_ZKH1_auto.States[0].FontStep := 0;
      bt_ZKH1_auto.States[0].Caption := 'Авто вкл.';
      img_ZKH1_manual.Visible := FALSE ;
    end
  else   
    begin // если бит равен 0
      bt_ZKH1_auto.States[0].Color  := RGB(60,70,80);
      bt_ZKH1_auto.States[0].BorderColor := RGB(60,70,80);
      bt_ZKH1_auto.States[0].FontStep := 3;
      bt_ZKH1_auto.States[0].Caption := 'Авто';
      img_ZKH1_manual.Visible := TRUE ;
    end;

{MANUAL OPEN}
  if GetBit(PLC2_FIRST_PRG_status.Value, 15) then
    begin // если бит равен 1
      bt_ZKH1_open.States[0].Color  := RGB(0,95,88);
      bt_ZKH1_open.States[0].BorderColor := RGB(0,95,88);
      bt_ZKH1_open.States[0].Caption := 'Открыта';
    end
  else   
    begin // если бит равен 0
      bt_ZKH1_open.States[0].Color  := RGB(60,70,80);
      bt_ZKH1_open.States[0].BorderColor := RGB(60,70,80);
      bt_ZKH1_open.States[0].Caption := 'Открыть';
    end;

{MANUAL CLOSE}
  if GetBit(PLC2_FIRST_PRG_status.Value, 14) then
    begin // если бит равен 1
      bt_ZKH1_close.States[0].Color  := RGB(0,95,88);
      bt_ZKH1_close.States[0].BorderColor := RGB(0,95,88);
      bt_ZKH1_close.States[0].Caption := 'Закрыта';
    end
  else   
    begin // если бит равен 0
      bt_ZKH1_close.States[0].Color  := RGB(60,70,80);
      bt_ZKH1_close.States[0].BorderColor := RGB(60,70,80);
      bt_ZKH1_close.States[0].Caption := 'Закрыть'
    end;

// ZKH2 ***********************************************************************

{AUTO}
  if GetBit(PLC2_FIRST_PRG_status.Value, 16) then
    begin // если бит равен 1
      bt_ZKH2_auto.States[0].Color  := RGB(0,95,88);
      bt_ZKH2_auto.States[0].BorderColor := RGB(0,95,88);
      bt_ZKH2_auto.States[0].FontStep := 0;
      bt_ZKH2_auto.States[0].Caption := 'Авто вкл.';
      img_ZKH2_manual.Visible := FALSE ;
    end
  else   
    begin // если бит равен 0
      bt_ZKH2_auto.States[0].Color  := RGB(60,70,80);
      bt_ZKH2_auto.States[0].BorderColor := RGB(60,70,80);
      bt_ZKH2_auto.States[0].FontStep := 3;
      bt_ZKH2_auto.States[0].Caption := 'Авто';
      img_ZKH2_manual.Visible := TRUE ;
    end;

{MANUAL OPEN}
  if GetBit(PLC2_FIRST_PRG_status.Value, 18) then
    begin // если бит равен 1
      bt_ZKH2_open.States[0].Color  := RGB(0,95,88);
      bt_ZKH2_open.States[0].BorderColor := RGB(0,95,88);
      bt_ZKH2_open.States[0].Caption := 'Открыта';
    end
  else   
    begin // если бит равен 0
      bt_ZKH2_open.States[0].Color  := RGB(60,70,80);
      bt_ZKH2_open.States[0].BorderColor := RGB(60,70,80);
      bt_ZKH2_open.States[0].Caption := 'Открыть';
    end;

{MANUAL CLOSE}
  if GetBit(PLC2_FIRST_PRG_status.Value, 17) then
    begin // если бит равен 1
      bt_ZKH2_close.States[0].Color  := RGB(0,95,88);
      bt_ZKH2_close.States[0].BorderColor := RGB(0,95,88);
      bt_ZKH2_close.States[0].Caption := 'Закрыта';
    end
  else
    begin // если бит равен 0
      bt_ZKH2_close.States[0].Color  := RGB(60,70,80);
      bt_ZKH2_close.States[0].BorderColor := RGB(60,70,80);
      bt_ZKH2_close.States[0].Caption := 'Закрыть'
    end;
end.                                                       

этот скрипт привязан к  инструменту "поле" и событию он  OnDataChange
Как видно из текста скрипта ,он меняет визуальное отображение совершенно разных кнопок.

В связи с внедрением новой возможности в S-S .OnDataChangeEx хотел раскидать скрипты непосредственно на кнопки.
Из этого следует вопрос. Не будит ли новый вариант медленней?
Ведь каждая кнопка будет одновременно вызывать свой скрипт.(так как переменная по которой срабатывает OnDataChangeEx одна)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Апреля 2017, 10:42:07
Жаль что для разных кнопок выполняются уникальные изменения (для одних смена цвета, для других цвет + надпись и т.д.), а не типовые., тогда можно было бы все сделать одним универсальным скриптом.
Вы писали что таких скриптов будут сотни. Т.е. нужно будет выполнять тот же длинный скрипт но извлекая биты из другой переменной и применимо к другим кнопкам? Если так, то можно рассмотреть вариант создания нескольких универсальных скриптов из данного длинного скрипта.

Например взять следующую часть кода:
Код
begin
  {SILOS 1}
  if GetBit(PLC2_FIRST_PRG_status.Value, 0) then
    begin //если бит равен 1
      bt_silos1.States[0].Color  := RGB(0,95,88);
      bt_silos1.States[0].BorderColor := RGB(0,95,88);
    end else
      begin //если бит равен 0
        bt_silos1.States[0].Color  := RGB(60,60,60);
        bt_silos1.States[0].BorderColor := RGB(60,60,60);
      end;

  {SILOS 2}
  if GetBit(PLC2_FIRST_PRG_status.Value, 1) then
    begin //если бит равен 1
      bt_silos2.States[0].Color  := RGB(0,95,88);
      bt_silos2.States[0].BorderColor := RGB(0,95,88);
    end else
      begin //если бит равен 0
        bt_silos2.States[0].Color  := RGB(60,60,60);
        bt_silos2.States[0].BorderColor := RGB(60,60,60);
      end;
end.

Его можно заменить универсальным. Назовем его "uniButtonState" и напишем такой код:
Код
begin
  if not (Sender is TM_Button) then Exit;
 
  with Sender as TM_Button do
    if GetBit(AsInt, Tag) then
    begin
      States[0].Color  := RGB(0,95,88);
      States[0].BorderColor := RGB(0,95,88);
    end else
      begin
        States[0].Color  := RGB(60,60,60);
        States[0].BorderColor := RGB(60,60,60);
      end;
end.

В этом коде номер бита с которым нужно работать мы берём из свойства "Тег" кнопки. Теперь у кнопки bt_silos1 можно изменить свойство тег на 0, а кнопке bt_silos2 тег изменить на 1. В качестве доп. переменной выбрать PLC2_FIRST_PRG_status и на событие OnDataChangeEx выбрать наш универсальный скрипт "uniButtonState". Причем если в будущем нужно будет добавить в проект ещё несколько подобных кнопок, то можно будет использовать этот же универсальный скрипт, а не писать новый.

Этот вариант подойдет Вам? Если да, то мы можем написать как переделать на универсальные скрипты оставшуюся часть кода.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 06 Апреля 2017, 12:45:00
Цитировать
Жаль что для разных кнопок выполняются уникальные изменения.....
Да действительно жаль. Но как не крути в этом то и загвоздка :'(. Причем я предполагаю что со временем они("уникальные изменения") будут изменятся в зависимости от смены конфигурации маршрутов.
Цитировать
Этот вариант подойдет Вам? Если да, то мы можем написать как переделать на универсальные скрипты оставшуюся часть кода.
Спасибо большое за помощь !!!!!!
Я примерно понял как писать универсальные скрипты. Думаю что справлюсь сам. У Вас и без меня огромное кол-во работы.
Еще раз большое спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 06 Апреля 2017, 21:01:53
Цитировать
Его можно заменить универсальным. Назовем его "uniButtonState" и напишем
Я не знаю по какой причине, но данный способ вообще отказывается работать с кнопкой(по крайней мере у меня).
С изображением все работает, а с кнопкой нет.

Скрипт вроде как выполняется но не полностью
Первая часть до ELSE не реагирует на изменение бита.

Вообщем провел несколько тестов.
Оказалось что именно OnDataChangeEx не работает нормально.
Так как если закинуть скрипт в OnDataChange то все выполняется полностью.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Апреля 2017, 23:57:27
deldemo, всё работает, мы случайно в примере указали основную переменную, а работать ведь надо с дополнительной. Т.е. вот так:

Код
begin
  if not (Sender is TM_Button) then Exit;
 
  with Sender as TM_Button do       // далее работаем с Sender'ом как с кнопкой
    if Assigned(VariableEx) then    // если кнопка связана с до. переменной
      if GetBit(VariableEx.AsInt, Tag) then   // достаем из доп. переменной бит равный номеру тега кнопки
      begin
        States[0].Color  := RGB(0,95,88);
        States[0].BorderColor := RGB(0,95,88);
      end else
        begin
          States[0].Color  := RGB(60,60,60);
          States[0].BorderColor := RGB(60,60,60);
        end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 07 Апреля 2017, 06:49:11
Спасибо!!!!!. Теперь все понятно. Нужно всегда указывать доп.переменную.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 13 Апреля 2017, 08:27:19
необходимо сделать таймер наработки оборудования с тремя интервалами во времени. Например, таймер формирует отдельные отрезки времени с 8.00 до 12.00, далее с 12.00 до 16.00 и т.д. При этом компонент таблица регистрирует эти данные в соответствующие ячейки. В результате, чтобы можно было проследить сколько работало оборудование в трех сменах в течении суток, скажем, за месяц.
Но ведь в этом случае все накопленные в таблице записи будут потеряны при первом перезапуске сервера скады или проекта. К тому же, чтобы они добавлялись в таблицу придется на каждый интервал времени выделить переменные и связать ячейки таблицы с этими переменными. Причем если планируется выводить наработку за месяц добавляя по 3 новых строки в день, то получается что нужно создать 90 строк в таблице и заполнить все строки переменными. Плюс остается проблема с потерей данных при перезапусках. Такая система совсем не подходит для нормальной работы.

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

Вернемся к данной теме еще раз. Чтобы не терялись данные я их записываю в файл. На данный момент времени сделал таблицу, которая задействует много однотипных скриптов, переменных и т.д. В свете появившейся программы ОТЧЕТЫ можно ли решить задачу проще?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Апреля 2017, 11:33:29
Здравствуйте!

Система отчетов сейчас находится на стадии бета-тестирования. После доработки и добавления в нее некоторого функционала, добавления необходимых примеров по работе с системой отчетов, можно будет вернуться к Вашему вопросу.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 19 Апреля 2017, 12:46:32
Здравствуйте.
Поле ввода (TM_Field) не обрабатывает события мыши (двойной щелчок - остальные пока не проверял).
Пытаюсь вызвать скрипт по этому событию - ничего не происходит. Сам скрипт рабочий. Например, при двойному щелчку по TM_Text этот же скрипт работает.
Это баг или всё-таки я что-то делаю не так?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 19 Апреля 2017, 21:18:09
Цитировать
Это баг или всё-таки я что-то делаю не так?
Здравствуйте. Вы всё делаете правильно. Событие двойного клика перекрывается обработкой ввода. Исправим в будущих обновлениях.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 20 Апреля 2017, 12:17:15
Здравствуйте. Вы всё делаете правильно. Событие двойного клика перекрывается обработкой ввода. Исправим в будущих обновлениях.

Спасибо. Будем ждать ))) Кстати, остальные события для TM_Field проверил - тоже не обрабатываются.

И ещё нашёл небольшую неприятность )))

В документации ничего не сказано про функцию Inc. То есть её как бы нет.
Но если эту функцию использовать в скрипте, то при компиляции не выдаётся никаких ошибок. То есть она как бы есть, хотя и не работает.
Желательно тоже либо реализовать её, либо сделать так, чтобы компилятор сообщал об ошибке.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Апреля 2017, 13:19:32
Цитировать
В документации ничего не сказано про функцию Inc. То есть её как бы нет.
Но если эту функцию использовать в скрипте, то при компиляции не выдаётся никаких ошибок
Inc и Dec стандартные функции инкремента и декремента, которые можно заменить на: Value := Value + 1; и Value := Value - 1;

Цитировать
То есть она как бы есть, хотя и не работает.Желательно тоже либо реализовать её, либо сделать так, чтобы компилятор сообщал об ошибке.
Она есть и работает без ошибок, а если компилятор сообщает об ошибке, значит не просто так. Приведите пример кода, который у Вас не получается скомпилировать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 21 Апреля 2017, 09:16:07
Цитировать
Она есть и работает без ошибок, а если компилятор сообщает об ошибке, значит не просто так. Приведите пример кода, который у Вас не получается скомпилировать.
Я как раз и говорил, что ошибок компилятор не выдаёт, а функция не работает. Вот код
Код: (delphi)
CurrCmdTime.Value := CurrCmdTime.Value + 1;
который работает. А вот так:
Код: (delphi)
Inc(CurrCmdTime.Value);
не работает. При этом никаких ошибок не выдаётся. Просто значение переменной не увеличивается.
CurrCmdTime.Value - это глобальная переменная. Возможно, с локальными переменными функция работает - не проверял.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Апреля 2017, 09:19:19
Цитировать
А вот так: не работает.
Правильно, и не должна. В функцию нужно передавать конкретную переменную, а не свойство (как CurrCmdTime.Value). Например так:
Код: (delphi)
var 
  I: Integer;
begin
  I := CurrCmdTime.Value;
  Inc(I);
  CurrCmdTime.Value := I;
end.

И просто CurrCmdTime передать в функцию также нельзя, т.к. это не обычная переменная, а объект с типом TM_Variable (http://simple-scada.com/scripts_manual?section=script_variable) и множеством своих свойств и методов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 21 Апреля 2017, 11:27:49
Понял. Спасибо.

И всё-таки хотелось бы иметь возможность объявлять глобальные переменные и константы именно как обычные переменные/константы, а не как объекты. Потому что использование объектов в некоторых случаях (таких, например, как описанный ранее) вызывает неудобство, и периодически наступаешь на одни и те же грабли, забывая, что глобальная переменная на самом деле является объектом. Наверно, со временем привыкну, но всё же...

P.S. А вообще в Паскале в функцию можно передавать в том числе и свойство объекта. Поэтому и не могу никак привыкнуть ))))
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Апреля 2017, 11:59:34
Цитировать
И всё-таки хотелось бы иметь возможность объявлять глобальные переменные и константы именно как обычные переменные/константы, а не как объекты.
Такая возможность планируется, но не в ближайшее время.

Цитировать
А вообще в Паскале в функцию можно передавать в том числе и свойство объекта.
В паскале, как и в делфи нельзя передавать свойства объекта в функции Inc, Dec. У нас в компиляторе то же самое, ведь наш компилятор по сути является компилятором Паскаль, с незначительными отличиями.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 23 Апреля 2017, 02:48:01
Добрый день, у меня уже был вопрос по объекту "Заслонка". Есть сигнал положения привода от 0 до 100 (%), по нему я определяю универсальным скриптом цвет заслонок, раньше при запуске сервера и проекта заслонкам присваивались цвета в зависимости от их положения на момент запуска. Сейчас заметил, что после обновлений перестали присваиваться цвета заслонок, все стандартные серые, до того момента пока не пройдет граничное положение смены цвета, например, при запуске проекта заслонка закрыта 0 - цвет серый (должен быть оранжевый), при открывании проходя границу с 5 до 6 цвет переключается на желтый как и должно быть, ну а дальше все по скрипту работает. Ну и также если открыта или в промежуточном положении. До этого скрипт работал отлично, но после какого то обновления заслонки стали вести себя так. 
Код: (delphi)
begin
  if Sender is TM_Valve then                   // проверяем, что Sender это заслонка:
    with Sender as TM_Valve do                 // приводим объект к типу TM_Valve:
      case TM_Valve(Sender).AsInt of           // если значение переменной равно:
        -5..5 :                                // = -5 до 5 то считаем что заслонка закрыта
        begin
          Sender.Color := RGB(255, 128, 0);    // меняем цвет на оранжевый
        end;

        6..95 :                                // = 6 до 94 то считаем что заслонка в промежуточном
        begin
          Sender.Color := RGB(255, 255, 0);    // меняем цвет на желтый
        end;

        95..105 :                              // = 95 до 105 то считаем что заслонка открыта
        begin
          Sender.Color := RGB(0, 255, 0);      // меняем цвет на зеленый
        end;
    end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Апреля 2017, 13:22:10
beloleg86, здравствуйте. Исправим в обновлении в ближайшее время.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 24 Апреля 2017, 06:32:05
Цитировать
В паскале, как и в делфи нельзя передавать свойства объекта в функции Inc, Dec. У нас в компиляторе то же самое, ведь наш компилятор по сути является компилятором Паскаль, с незначительными отличиями.
Ну вот зацепили вы меня прям этим вопросом. Специально проверил:
Код: (delphi)
type MyObj = object
  Svoistvo : integer;
end;

var MyVar : MyObj;

begin
  MyVar.Svoistvo := 0;
  Inc(MyVar.Svoistvo);
end.

В Делфи всё прекрасно компилируется и работает. Кстати, в вашей системе вот такая конструкция:
Код: (delphi)
type MyObj = object
  Svoistvo : integer;
end;

вообще не компилируется - выдаётся ошибка. В то время как вот это:
Код: (delphi)
type MyRec = record
  Svoistvo : integer;
end;
компилируется нормально.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Апреля 2017, 09:30:53
Уважаемый ksapp, мы занимаемся разработкой программ на языке Delphi уже долгое время, Simple-Scada также полностью написана на Delphi и, конечно, мы не стали бы писать о передаче свойств, если бы не были уверены в правильности написанного. Как и было описано в пред. сообщении, в делфи и паскале нельзя передавать свойства объекта в функции Inc и Dec, т.к. эти функции используют передачу параметра по ссылке (http://mif.vspu.ru/books/pascal/procedure2.html). Также нельзя передавать свойства объектов в любые другие процедуры и функции, если в них требуется передача параметра по ссылке, а не по значению.

В своём примере Вы передаёте в функцию Inc переменную объекта MyObj, а не свойство. Подробнее про свойства объектов можно прочесть здесь (https://rsdn.org/article/Delphi/Delphi_7_03.xml#EHKAC). И объект со свойством будет выглядеть так:
Код: (delphi)
type 
  MyObj = class
  private
    function GetSvoistvo: Integer;
    procedure SetSvoistvo(AValue: Integer);
  public
    property Svoistvo: integer read GetSvoistvo write SetSvoistvo;
  end;

var
  MyVar : MyObj;

// здесь нужно описать функцию GetSvoistvo и SetSvoistvo, мы пропустим описание

begin
  MyVar.Svoistvo := 0;
  Inc(MyVar.Svoistvo);  // здесь будет ошибка компиляции
end.

В упрощенном виде примерно так и выглядит класс Переменной (TM_Variable) в Simple-Scada 2. И в редакторе скриптов Вы работаете именно со свойствами объектов, а не переменными и на это есть много причин (http://www.delphiplus.org/delphi6-object-pascal/inkapsulyaciya-i-svoistva-obekta.html), одна из них - скрытие от пользователя (и ограничение доступа к переменным) о которых ему лучше не знать.

Кстати, в вашей системе вот такая конструкция:
Код: (delphi)
type MyObj = object
  Svoistvo : integer;
end;
вообще не компилируется - выдаётся ошибка. В то время как вот это:
Не компилируется, т.к. ключевое слово object использовалось для объявления классов в объектной модели Turbo Pascal. В современных компиляторах используется объектная модель Object Pascal и ключевое слово class (http://www.delphibasics.ru/Class.php). Подробнее про объектные модели здесь (https://ru.wikipedia.org/wiki/Object_Pascal). Поэтому объявление класса должно быть таким:

Код: (delphi)
type 
  MyObj = class
    Svoistvo: integer;
  end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ksapp от 24 Апреля 2017, 11:27:24
Понятно. Спасибо за разъяснения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AllReal от 03 Мая 2017, 08:53:10
Доброе утро, подскажите пожалуйста, как сделать обращение к пользователю программное, что бы в окне отображался активный пользователь?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 03 Мая 2017, 12:30:40
Здравствуйте.

Т.е. нужно просто отобразить имя пользователя в окне? Для этого можно разместить в окне объект Текст и создать новый скрипт с типом события "Авторизация пользователя" и в этом скрипте написать такой код:

Код
begin
  Text1.Text := GetUserName;
end.

Функция GetUserName возвращает имя активного пользователя.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AllReal от 03 Мая 2017, 12:41:50
Спасибо за помощь!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AllReal от 11 Мая 2017, 09:53:53
Добрый день, подскажите пожалуйста, при задачи переменной любое значение больше 100 становится 100, при этом шкала от -70000 до 70000  не могу найти проблему((( если задаю меньше 100 вписывает правильно, и так же не правильно вписывает отрицательные значения
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 11 Мая 2017, 10:02:42
Добрый день AllReal.
А Вы заданные шкалы прикрепили к переменным?
Сначала нужно создать шкалу с тем диапазоном который Вам нужен.
(https://storage2.static.itmages.ru/i/17/0511/s_1494486397_3025977_37e7a5f81f.png) (https://itmages.ru/image/view/5724033/37e7a5f8)
(https://storage6.static.itmages.ru/i/17/0511/s_1494486442_3686065_97377c710d.png) (https://itmages.ru/image/view/5724039/97377c71)
(https://storage8.static.itmages.ru/i/17/0511/s_1494486569_3657884_404c598b38.png) (https://itmages.ru/image/view/5724049/404c598b)
Затем прикрепить вновь созданную шкалу к нужнаму тегу.
(https://storage2.static.itmages.ru/i/17/0511/s_1494486121_8146263_748ed9687a.png) (https://itmages.ru/image/view/5724016/748ed968)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 11 Мая 2017, 10:06:28
Здравствуйте, AllReal!

Проблема может быть в:
Если не разберетесь пришлите проект на support@simple-scada.com с указанием проблемной переменной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AllReal от 11 Мая 2017, 10:31:29
может быть проблема, в шкале? у меня не выбрана единица измерения, если да, то что выбрать? диапазон от -70000 до 70000
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 11 Мая 2017, 10:32:47
Нет, дело не в единице измерения. Пришлите проект на support@simple-scada.com с указанием проблемной переменной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AllReal от 11 Мая 2017, 10:45:09
Спасибо, отправил.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: igorigor07 от 14 Мая 2017, 16:01:38
Добрый день!

Подскажите, как можно менять положение окна (x и y) из скрипта? Если это свойство "read only", то вопрос почему? Можно дать возможность его все-таки задавать для создания универсальных окон, появляющихся в нужном месте при нажатии мышкой на объекте?

Использую пока свойство положения "по координатам объекта", но вопрос актуален...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Мая 2017, 22:26:03
Здравствуйте.

Цитировать
Подскажите, как можно менять положение окна (x и y) из скрипта? Если это свойство "read only", то вопрос почему?
В будущих обновлениях откроем данные свойства для записи.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: LIM_IA от 17 Мая 2017, 07:22:53
Здравствуйте!

Ситуация следующая - есть некое командное слово, в нем, по нажатию кнопки, должны менять два бита. Пишу следующий код:
Код
1 begin
2  if BUT_bit2_3.Value
3   then
4    begin
5     CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,true) ;
6     CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,true) ;
7    end
8  else
9    begin
10   CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,False) ;
11   CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,False) ;
12  end
13 end.

При запуске клиента принципиально игнорируются строки 5 и 10.
Переменная BUT_bit2_3 - локальная и связана с кнопкой
Переменная CMD_RUN - подтягивается с OPC сервера и является командным словом.

Подскажите почему не отрабатывает составной оператор "begin...end"?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: godygadu от 17 Мая 2017, 08:18:56
Здравствуйте!

Ситуация следующая - есть некое командное слово, в нем, по нажатию кнопки, должны менять два бита. Пишу следующий код:
Код
1 begin
2  if BUT_bit2_3.Value
3   then
4    begin
5     CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,true) ;
6     CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,true) ;
7    end
8  else
9    begin
10   CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,False) ;
11   CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,False) ;
12  end
13 end.

При запуске клиента принципиально игнорируются строки 5 и 10.
Переменная BUT_bit2_3 - локальная и связана с кнопкой
Переменная CMD_RUN - подтягивается с OPC сервера и является командным словом.

Подскажите почему не отрабатывает составной оператор "begin...end"?

Проверьте синтаксис.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: LIM_IA от 17 Мая 2017, 08:34:39
godygadu, добрый день!

Синтаксис верный, потому что компилятор ошибок не выдаёт. Если вы копируете код то копируйте без нумерации строк(я их написал для наглядности описания), то есть код выглядит так:
Код
 begin
  if BUT_bit2_3.Value
   then
    begin
     CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,true) ;
     CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,true) ;
    end
  else
   begin
   CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,False) ;
   CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,False) ;
  end
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Мая 2017, 09:09:37
Здравствуйте.

Переменная CMD_RUN приходит с OPC-сервера. Соответственно и смена значения происходит через OPC-сервер. Поэтому, когда Вы пишите "CMD_RUN.Value := SetBit(CMD_RUN.Value,2,true);" на OPC-сервер отправляется "запрос" на присвоение переменной нового значения и реальное изменение значения произойдет с мелкой задержкой. Поэтому можно в начале скрипта получить значение CMD_RUN в локальную переменную скрипта и в скрипте работать с ней. А в конце скрипта выполнить запрос на присвоение. Такой способ также сократит количество запросов к OPC-серверу.

Правильный код будет таким:
Код
var
  aValue: Integer;
begin
  aValue := CMD_RUN.AsInt;

  if BUT_bit2_3.Value then
  begin
    aValue := SetBit(aValue, 2, true);
    aValue := SetBit(aValue, 3, true);
  end else
    begin
      aValue := SetBit(aValue, 2, False);
      aValue := SetBit(aValue, 3, False);
    end;

  CMD_RUN.Value := aValue;
end.

В будущем постараемся сделать так, чтобы все операции с внешними переменными в ходе скрипта делались в оперативной памяти и выполнялось одно присвоение после выполнения скрипта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: LIM_IA от 17 Мая 2017, 12:40:15
Спасибо, идею понял, заработало!

теперь усложнил код:
Код
var
  aValue: Integer;
begin
  aValue := CMD_RUN.AsInt;

  if
   BUT_bit1_2.Value
   then
    begin
      aValue := SetBit(aValue, 1, true);
      aValue := SetBit(aValue, 2, true);
      Button11.Enabled:=true;
      image2.Color:=RGB(255,0,0);
      Button11.Color:=RGB(255,0,0);
    end
  else
   begin
     aValue := SetBit(aValue, 1, False);
     aValue := SetBit(aValue, 2, False);
     Button11.Enabled:=false;
     image2.Color:=RGB(0,100,0) ;
     Button11.Color:=RGB(0,100,0) ;
  end ;

       CMD_RUN.Value :=   aValue;
end.

Почему не меняется цвет кнопки  Button11.Color ? причем цвет картинки image2.Color меняется нормально
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Мая 2017, 12:52:36
А вы попробуйте поменять цвет кнопки в нужном состоянии (нажата/отпущена).

Button11.States[0].Color:=RGB(0,100,0) ;
Button11.States[1].Color:=RGB(0,100,100) ;
 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: LIM_IA от 17 Мая 2017, 13:00:12
Teodor, здравствуйте!

Идея немного в другом, есть две кнопки Button10 и Button11. Когда НЕнажата Button10 блокируется  Button11, и я хочу что б это сопровождалось цветом. То есть когда Button11 заблокирована что б она была красной, а когда разблокирована зеленой(цвет образно, можно любой другой)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 17 Мая 2017, 13:31:59
Здравствуйте. Как ранее уже сказал Teodor необходимо указать в каком состоянии кнопки будет изменятся ее цвет.
Код: (delphi)
var
  aValue: Integer;
begin
  aValue := CMD_RUN.AsInt;

  if BUT_bit1_2.Value then
    begin
      aValue := SetBit(aValue, 1, true);
      aValue := SetBit(aValue, 2, true);
      Button11.Enabled:=true;
      image2.Color:=RGB(255,0,0);
      Button11.States[0].Color:=RGB(255,0,0);
    end
  else
   begin
     aValue := SetBit(aValue, 1, False);
     aValue := SetBit(aValue, 2, False);
     Button11.Enabled:=false;
     image2.Color:=RGB(0,100,0) ;
     Button11.States[0].Color:=RGB(0,100,0) ;
  end ;

   CMD_RUN.Value :=   aValue;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Мая 2017, 15:12:50
Повторюсь... У кнопки есть 2 цвета... Когда она нажата-1, и когда отпущена-0. Если кнопка не фиксируемая, то цвет нажатой будет только пока вы ее удерживаете.

Вы можете менять цвет не нажатой (состояние 0) кнопки 11 по событию нажатия кнопки 10. Если допускается возможность блокирования кнопки в нажатом состоянии, то вам надо менять цвет кнопки в обоих состояниях (0 и 1).

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: LIM_IA от 17 Мая 2017, 15:13:32
Ребят, спасибо! понял, заработало!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Мая 2017, 15:25:39
Кстати, я привязал к нефиксируемой кнопке скриптик, который при нажатии инкрементирует переменную на 1, и задает цвет (значок) зависимо от ее нового значения. При достижении граничного значения переменная скидывается в 0. Получилась кнопка с несколькими положениями :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: LIM_IA от 17 Мая 2017, 15:27:44
Teodor, тогда бы уж скрипт приложили бы) а то заинтриговали)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Мая 2017, 15:56:42
Teodor, тогда бы уж скрипт приложили бы) а то заинтриговали)
Искать надо :) Если есть реальная необходимость, то найду и подчищу от лишнего.

ПС. Не марайтесь с РГБ... Есть готовые цветовые константы, которых более чем хватает для жизни
Например: clWhite, clRed, clGreen, clYellow, clBlack, clSilver и т.д. http://diversenok.ho.ua/articles/TColor

Оно и понятнее по тексту, что ты хотел сделать год тому. :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Мая 2017, 16:40:35
Накидал по новой :)

OnMouseUp:
Код
begin
  if Sender is TM_Button then
    with Sender as TM_Button do
      if VariableEx.Value < 3 then
        VariableEx.Value:= VariableEx.Value + 1
      else
        VariableEx.Value:= 0;
 end.

OnChangeEx:
Код
begin
  if Sender is TM_Button then
    with Sender as TM_Button do
      case VariableEx.Value of
        0: States[0].Color:=clGray;
        1: States[0].Color:=clGreen;
        2: States[0].Color:=clYellow;
        3: States[0].Color:=clRed;
     end;
 end.

К кнопке цепляете эти скрипты и переменные основная (булеан) и дополнительная (инт).

Теперь, при нажатии(точнее отпускании) на кнопку, значение доп переменной изменится, что запустит второй скрипт, меняющий цвет. Если переменную сменить снаружи(например от ОРС), то цвет  все равно изменится.

Так-же, во втором скрипте можно менять и текст/иконки, но вместо
Код
        0: States[0].Color:=clGray;
надо писать:
Код
        0: begin
              States[0].Color:=clGray;
              .....
            end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Мая 2017, 17:25:50
еще вариант с фиксируемой кнопкой:
Код
begin
  if Sender is TM_Button then
    with Sender as TM_Button do
      if VariableEx.Value = true then
         States[1].Color:=clGreen
      else
         States[1].Color:=clRed;
end.

Отжатая кнопка имеет свой цвет(напр. серый), в нажатом виде зависит от доп переменной.

Полезно если основная переменная например, включает движок(с серого), а дополнительная меняет цвет c зеленого на красный, если нет сигнала с датчика оборотов. Отжав мы получим назад свой серый.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Мая 2017, 17:29:47
Кстати, я привязал к нефиксируемой кнопке скриптик, который при нажатии инкрементирует переменную на 1, и задает цвет (значок) зависимо от ее нового значения. При достижении граничного значения переменная скидывается в 0. Получилась кнопка с несколькими положениями :)
Но ведь для этого можно сделать просто кнопку с фиксацией и множеством состояний, без скриптов, как на скрине во вложении. Такая кнопка есть в Демо-проекте на странице "Инструменты", блок 7.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 17 Мая 2017, 18:04:53
Гы... Век живи, век читай маны...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 23 Мая 2017, 15:36:10
Здравствуйте уважаемые.
Сделайте пожалуйста  пример, новой функции S-S, автозаполнение таблицы.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Мая 2017, 09:13:55
Здравствуйте.

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

1. Из БД будет сделана выборка всей таблицы с именем `my_table` и эта выборка отобразится в таблице myTable. В первой строке таблицы будут выведены названия столбцов.
Код: (delphi)
var
  aQuery: string;
begin
  aQuery := 'SELECT * FROM `my_table`;';
  myTable.RunSQL(aQuery, tsAll);
end.

2. То же самое, но у таблицы заполнятся все строки кроме первой. Это позволяет сохранить заголовок таблицы неизменным.
Код: (delphi)
var
  aQuery: string;
begin
  aQuery := 'SELECT * FROM `my_table`;';
  myTable.RunSQL(aQuery, tsSaveFixRow);
end.

3. Бывает нужно сделать выборку так, чтобы названия колонок были на русском языке, а в БД они обычно названы на английском. Тогда можно выполнить замену имён прямо в запросе:
Код: (delphi)
var
  aQuery: string;
begin
  aQuery := 'SELECT `col1` as `Столбец 1`, `col2` as `Столбец 2` FROM `my_table`;';
  myTable.RunSQL(aQuery, tsAll);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 24 Мая 2017, 10:25:36
Здравствуйте. Спасибо за помощь.
Но тут же возникает другой вопрос. Делая вот такой запрос.
Код: (delphi)
var
  aQuery:string;
begin
  aQuery := 'SELECT AR_NAM, AR_ARTICLECODE, DP_TOTALWEIGHT, DP_BATCHESSET'+
            'FROM CFG_ARTICLE INNER JOIN CFG_DAYPROGRAM'+
            'ON CFG_ARTICLE.AR_ARTICLE_ID = CFG_DAYPROGRAM.DP_PRODUCT_ID'+
            'WHERE DP_STATUS_ID IN (1,2) AND DP_PRODUCT_ID <> 42'+
            'ORDER BY DP_PRODUCTIONNUMBER;';
                                               
  tblPlan.RunSQL(aQuery, tsSaveFixRow);
end.

Выдает вот такое сообщение.
(https://storage8.static.itmages.ru/i/17/0524/s_1495610561_9171858_1efea5a51f.png) (https://itmages.ru/image/view/5769573/1efea5a5)

Хотя в СУБД запрос проходит на ура
(https://storage7.static.itmages.ru/i/17/0524/s_1495611019_6197749_ebdd8adc29.jpg) (https://itmages.ru/image/view/5769610/ebdd8adc)
В чем может быть ошибка?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Мая 2017, 10:40:20
Здравствуйте.
У вас пробел пропущен между DP_BATCHESSET и FROM. Затем между CFG_DAYPROGRAM и ON и т.д. в каждой строке.
Код: (delphi)
var
  aQuery:string;
begin
  aQuery := 'SELECT AR_NAM, AR_ARTICLECODE, DP_TOTALWEIGHT, DP_BATCHESSET '+
            'FROM CFG_ARTICLE INNER JOIN CFG_DAYPROGRAM '+
            'ON CFG_ARTICLE.AR_ARTICLE_ID = CFG_DAYPROGRAM.DP_PRODUCT_ID '+
            'WHERE DP_STATUS_ID IN (1,2) AND DP_PRODUCT_ID <> 42 '+
            'ORDER BY DP_PRODUCTIONNUMBER;';
                                               
  tblPlan.RunSQL(aQuery, tsSaveFixRow);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 24 Мая 2017, 11:01:17
Огромное Спасибо !!!!!!!!!
Вечно я с этими переносами путаюсь.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 29 Мая 2017, 13:02:52
Подскажите почему может не отрабатывать ежесекундный скрипт, хотя компиляция проходит:
Это теги проекта:
T111_1, T111_2, ... T111_29
...
T255_1, T255_2, ... T255_29

Код: (delphi)
Const
  Cname : array[1..52] of string = ('T111', 'T112', 'T113', 'T114', 'T115', 'T116', 'T121', 'T122', 'T123', 'T124', 'T125', 'T126',
  'T133', 'T134', 'T135', 'T136', 'T141', 'T142', 'T143', 'T144', 'T145', 'T151', 'T152', 'T153', 'T154', 'T155',
  'T211', 'T212', 'T213', 'T214', 'T215', 'T216', 'T221', 'T222', 'T223', 'T224', 'T225', 'T226', 'T231', 'T232', 'T233', 'T234',
  'T241', 'T242', 'T243', 'T244', 'T245', 'T251', 'T252', 'T253', 'T254', 'T255');
Var
  Tmin, Tmax, Tavg, pp : Double;
  i, j, n : Word;
  Tname : string;
  p: ^string;
begin

  for i:=1 to 52 do
    begin
      n := 29;
      Tname := Cname[i] + '_01';
      p := @Tname;
      pp := Double(p);
      Tmin := pp;
      Tmax := pp;
      Tavg := pp;

      for j := 2 to n do
        begin
          Tname := Silosname[i] + '_' + IntToStr(j);
          p := @Tname;
          pp := Double(p);
          if pp < Tmin then Tmin := pp;
          if pp > Tmax then Tmax := pp;
          Tavg := Tavg + pp;
        end;
      Tavg := Tavg/n;
 
  //как теперь присвоить Тегам T111_avg, T112_avg, ..., T255_avg значение переменной Tavg?
    end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Мая 2017, 13:23:34
Миханик, код очень странный. Формируется строка Tname, затем зачем-то берётся указатель на эту строку и приводится к типу Double (вещественное число) и с ним идёт работа. Хотя это просто указатель на ячейку в оперативной памяти ПК.

Опишите задачу которую нужно решить, а мы предложим решение. Нужно пройти по 52 переменным и среди них найти среднее, мин., макс.? Мы правильно поняли?

И ещё: откуда берётся переменная "Silosname"?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 29 Мая 2017, 15:09:06
Извините, торопился, не успел подробнее описать.
Имеется 52 термоподвески, каждая из которых состоит из 29 датчиков.
Термоподвески называются T111, T112, ..., T255 (Представлены массивом Cname)
В скаде датчики термоподвески описаны как T111_01, T111_02, ..., T111_29.
Необходимо для каждой термоподвески вычислять минимальное, максимальное и среднее значение.
Silosname это Cname (проглядел при редактировании сообщения).
У меня главный вопрос как обратится к тегу по индексу в цикле скрипта?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Мая 2017, 17:22:11
К тегам по индексу обратиться нельзя, т.к. у них нет индекса. Вместо этого нужно обращаться к переменной по имени. Для поиска переменной по имени можно воспользоваться глобальной функцией GetVariablebyName.

В Вашем случае можно избавиться от массива Cname, т.к. имена растут последовательно с 111 до 255, а значит можно генерировать их прямо в цикле.

В результате: у нас в проекте должны быть подвески от 111 до 255, каждая имеет по 29 датчиков с именами, например T111_01, T111_02... и т.д.. Также для каждой подвески есть отдельные переменные T111_min, T111_max, T111_avg в которые будем записывать минимум/максимум/среднее по датчикам. Тогда рабочий код должен быть таким:
Код: (delphi)
var
  I, J: Integer;
  aName, aNumber: string;
  aVar: TM_Variable;
  aVarMin, aVarMax, aVarAvg: TM_Variable;

  aVal: Double;
  aCount: Integer;
  aMin, aMax, aSum: Double;
begin
  { проход по подвескам от 111 до 255 }
  for I := 111 to 255 do
  begin
    { формируем приставку к имени текущей подвески, например "T111_" }
    aName := CharToStr('T') + IntToStr(I) + CharToStr('_');

    { сброс счетчика переменных }
    aCount := 0;

    { проход по 29 датчикам текущей подвески }
    for J := 1 to 29 do
    begin
      { получаем переменную датчика, по имени, например "T111_01" }
      if J < 10 then
        aVar := GetVariableByName(aName + '0' + IntToStr(J))
      else
        aVar := GetVariableByName(aName + IntToStr(J));

      { если переменная с таким именем найдена }
      if aVar <> nil then
      begin
        aVal := aVar.AsFloat;     // получаем значение переменной приведённое к типу Double
        Inc(aCount);              // увеличиваем счетчик переменных

        { далее операции для вычисления мин./макс./среднего }
        if aCount = 1 then       
        begin
          aMin := aVal;
          aMax := aVal;
          aSum := aVal;
        end else
          begin
            if aMin > aVal then aMin := aVal;
            if aMax < aVal then aMax := aVal;
            aSum := aSum + aVal;
          end;
      end;
    end;

    if aCount > 0 then
    begin
      { ищем по имени переменные мин., макс. и среднего для текущей подвески }
      aVarMin := GetVariableByName(aName + 'min');
      aVarMax := GetVariableByName(aName + 'max');
      aVarAvg := GetVariableByName(aName + 'avg');

      { записываем результаты вычислений в переменные мин., макс. и среднего }
      if aVarMin <> nil then aVarMin.Value := aMin;
      if aVarMax <> nil then aVarMax.Value := aMax;
      if aVarAvg <> nil then aVarAvg.Value := aSum / aCount;
    end;
  end;
end.
Обратите внимание, в коде выше имена будут генерироваться "T111_01", "T111_02", а не "T111_1", "T111_2" и т.д. Поэтому убедитесь, что у Вас переменные названы именно "T111_01", "T111_02".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 30 Мая 2017, 07:52:53
Большое спасибо, это то, что нужно!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: makimu от 05 Июня 2017, 15:15:27
Доброго времени суток, уважаемые разработчики. Интересует меня тип TM_DataSet. Если я получаю в результирующей выборке более чем одну строку, то как мне работать с этим? Как считывать построчно?

К примеру:
//Выделить все из таблицы А
Код
select * from tableA;

//Получить данные построчно C#
Код
SqlCommand command = new SqlCommand(queryString, connection);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
  // Что-то делаем, например, заполняем записями ComboBox
}

И по поводу того же ComboBox. Динамически, как я прочел, но не пробовал еще, можно добавлять строки. У ComboBox есть свойство "строка", а там свойство "Значение". Так вот, могу ли я динамически строку создать и присвоить свойству "Значение", собственно, значение динамически=) ?

Спасибо заранее.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Июня 2017, 15:38:57
Здравствуйте.

Для перемещения курсора в наборе данных на следующую позицию используйте Next. А на предыдущую позицию - Prior. Если нужно перебрать весь набор данных, то цикл будет таким:
Код: (delphi)
begin
  { выполнять цикл пока не достигнем конца набора данных }
  while not DataSet.EOF do
  begin
    // здесь работаем с текущей строкой
    DataSet.Next;  // переходим на следующую строку
  end;
end.

А это тот же код, но добавлен проход по ячейкам строки:
Код: (delphi)
var
  I: Integer;
  aStr: string;
begin
  { выполнять цикл пока не достигнем конца набора данных }
  while not DataSet.EOF do
  begin
    { проходим по каждой ячейке текущей строки }
    for I := 0 to DataSet.FieldCount - 1 do
      aStr := DataSet[I].AsStr;  // получаем значение текущей ячейки переведённое в строку и записываем его в переменную aStr.

    DataSet.Next;  // переходим на следующую строку
  end;
end.

Обратите внимание: если нужно вывести данные в компонент Таблица, то можно использовать автоматическое заполнение таблицы при помощи метода RunSQL. Например, если в проекте есть таблица с именем Table1, то можно написать такой скрипт:
Код: (delphi)
var
  aQuery: string;
begin
  aQuery := 'SELECT * FROM `my_table`';  // формируем запрос к БД на выборку всех данных из таблицы `my_table`
  Table1.RunSQL(aQuery, tsAll);          // выполнить запрос и заполнить таблицу результатом выполнения
end.

Не забывайте также, что работать с наборами данных можно только в скриптах с типом "Выполнен SQL-запрос". Информацию о других свойствах набора данных смотрите здесь (http://simple-scada.com/scripts_manual?section=tm_dataset).

Цитировать
Динамически, как я прочел, но не пробовал еще, можно добавлять строки.
Да, можно, например так:
Код: (delphi)
begin
  ComboBox1.AddItem('Моя строка');
end.

Цитировать
могу ли я динамически строку создать и присвоить свойству "Значение", собственно, значение динамически
А вот динамически сменить значение не получится и строка будет принимать значение по-умолчанию равное номеру строки. В будущем постараемся разрешить смену значения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: makimu от 05 Июня 2017, 15:59:23
Огромное спасибо за оперативный ответ!!!

Ваш код:
Код: (delphi)
begin
  { выполнять цикл пока не достигнем конца набора данных }
  while not DataSet.EOF do
  begin
    // здесь работаем с текущей строкой
    DataSet.Next;  // переходим на следующую строку
  end;
end.
Делал почти также, но у меня вис сервер, почему также, потому что без DataSet.Next;. Спасибо еще раз за разъяснение данного нюанса =)
З.Ы. Когда выходишь за пределы окна редактирования кода (набрал длинную строку кода), то не появляется полоса горизонтальной прокрутки. Или ее нет?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Июня 2017, 10:03:39
Цитировать
Когда выходишь за пределы окна редактирования кода (набрал длинную строку кода), то не появляется полоса горизонтальной прокрутки. Или ее нет?
Пока нет, но скоро будет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 06 Июня 2017, 18:19:22
Здравствуйте Уважаемые.
Последнее время пришлось плотно поработать(не без Вашей помощи) с SQL запросами. В связи с этим есть несколько пожеланий
1. Возможно ли добавить подсветку синтаксиса и сам синтаксис SQL ?
      Если честно, то не очень удобно писать запрос в нынешней реализации S-S. При работе с SQL часто приходится
      переключатся  с ManagementStudio на Simple-Scada и наоборот что неизбежно ведет к ошибкам в синтаксисе.
2. Очень нахватает TAB для выделенных строк
3. При вставке кода из другого редактора , типа Notepad++ , пропадаю TAB-ы
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Июня 2017, 09:04:58
Цитировать
Возможно ли добавить подсветку синтаксиса и сам синтаксис SQL?
Здравствуйте. Для Simple-Scada SQL-запросы это просто текст, который никак не проверяется и не компилируется, а просто передается к БД. Поэтому подсветка SQL-кода не будет добавлена. Но вместо этого возможно добавим выполнение SQL-запросов из файла.

Цитировать
2. Очень нахватает TAB для выделенных строк
Для смещения выделенного текста влево/вправо можно использовать комбинации клавиш Ctrl+Sift+U / Ctrl+Sift+I. Либо выполнять смещение через меню "Действия - Увеличить отступ", "Действия - Уменьшить отступ".

Цитировать
При вставке кода из другого редактора , типа Notepad++ , пропадаю TAB-ы
Исправим.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bezzub2007 от 07 Июня 2017, 15:31:43
Доброе время суток.
Вопрос. Имеем таблицу с заполненными данными при помощи процедуры RunSQL. Как в скрипте отследить нажатие мышкой на конкретной строке таблицы? Есть ли инструмент отслеживания курсора в таблице?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Июня 2017, 21:50:35
Цитировать
Как в скрипте отследить нажатие мышкой на конкретной строке таблицы? Есть ли инструмент отслеживания курсора в таблице?
Здравствуйте. Отследить курсор сейчас не получится. Это связано с тем, что на каждом клиенте может быть выбрана разная строка таблицы, а все скрипты выполняются на сервере и он не знает о выделении на клиентах. Но в ближайшем будущем данный вопрос планируется решить и у таблиц появится возможность выделения строк и получения номера выделенной строки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 08 Июня 2017, 07:58:54
Есть функция GetVariableByName() для обращения к переменной по имени, а есть ли такая же функция для обращения к объектам программы по имени?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Июня 2017, 09:02:35
а есть ли такая же функция для обращения к объектам программы по имени?
Такой функции нет, с объектами можно работать только обращаясь по имени напрямую.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 08 Июня 2017, 15:04:54
Есть функция GetVariableByName() для обращения к переменной по имени, а есть ли такая же функция для обращения к объектам программы по имени?
Предложу движняк "через анал" для тех кому оооочень надо. Если вам нужно сменить свойство объекта EditXX:
Делаете пачку переменных VarXX и привязываете к объекту как вторичные. Делаете 2 скрипта. Один меняет по GetVariableByName() значение VarXX, второй привяываете к объекту на изменение вторичной переменной и меняете что хотите сендеру, тоесть объекту EditXX. Значение переменной = состояние объекта, посему в кейсе значения VariableEx задаете все возможные варианты 8)

ИМХО!!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 08 Июня 2017, 15:07:26
Добрый день уважаемые форумчане. У меня такой вопрос: связал Simple Scada с модулем МК110-8ДН.4Р через Овен ОРС сервер для приборов модбас. В проекте создал 4 кнопки для управления выходами модуля. Вопрос в следующем. При нажатии кнопок с некоторой задержкой все отрабатывает нормально, но стоит нажать 2 кнопки без паузы, отрабатывает только тот выход, кнопка которого была нажата последней. Кнопки привязаны к одному тегу, но через разные биты. В чем может быть проблема? И вопрос номер два, помогите с написанием скрипта для одновременного активирования всех 4 выходов от одной кнопки. За ранее спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 08 Июня 2017, 15:23:28
Есть такая штука с блокированием переменной до получения ответа от сервера. Я ее поборол, но объяснить будет сложно и наверно есть пути попроще. :)
Суть мысли. При нажатии кнопки устанавливается бит ВНУТРЕННЕЙ переменной и ставитя в TRUE еще одна ВН. переменная(флаг обновления данных). Дальше секундный скрипт проверяет состояние второй переменной. Если она TRUE, и значение ВН. переменной отличается от внешней, то значение внутренней присваивается внешней, если они равны, то флаг скидывается.

Если вы ткнете быстро 1 кнопку, то вн. переменная примет значение 1(0х0001), и отдаст это значение внешней. Потом вы жмете 2 и 3... Вн. переменная уже равна 7 (0х0111), а внешней присвоить пока не удается и она еще равна 1, значит флаг еще висит и через секунду опять пытаемся записать, и так пока не удасться и флаг не скинется.

Как-то так.  :-\
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 08 Июня 2017, 15:34:38
Спасибо большое, для меня пока сложновато это все переварить... Буду копать дальше..
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 08 Июня 2017, 15:37:46
Ув. Teodor, а можно Вас попросить кусочек скрипта который вы описали?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 08 Июня 2017, 15:45:20
Спасибо большое, для меня пока сложновато это все переварить... Буду копать дальше..
Например, пишем по 2 температуры в 1 регистр(DW). Но с учетом того, что они могут изменится и снаружи, потому есть еще одна "лишняя" переменная. Процедурой т.к. там этих строк еще много есть, а процедура одна на всех.
Надеюсь поможет.
Код: (delphi)
procedure WriteTemp(VarOPC, VarIn, VarOut, Temp1, Temp2, Change :TM_Variable);
  begin
  if VarOPC.IsGoodQuality = true then begin
    VarIn.Value := VarOPC.Value;
  end;
  if (VarIn.AsInt <> VarOut.AsInt ) and (Change.AsBool = false) then
  begin
    Temp1.Value:= (VarIn.Value and 8191);
    Temp2.Value:= ((VarIn.Value shr 16) and 8191);
  end;

  if (VarIn.AsInt  <> VarOut.AsInt ) and (Change.AsBool  = True) then
  VarOPC.Value := VarOut.Value;

  if (VarIn.AsInt = VarOut.AsInt) and (Change.AsBool = True) then
  Change.Value  := false;
end;

begin
WriteTemp(TempSet2_1 ,SetTempBathIn1 ,SetTempBathOut1 ,SetBathTemp_1 ,SetTambourTemp_1,Change2_1 );     
...........
а тут скрипт для кнопки. Тег у каждой свой, чтобі не писать 100500 скриптов просто перебирам в кейсе кто именно обратился.
Код: (delphi)
begin
case Sender.Tag of
1:  begin
       SetTempBathOut1.Value := SetBathTemp_1.Value*10 + (SetTambourTemp_1.Value SHL 16)*10;
       Change2_1.Value  := True;
      end;
.....
end;
end.   
вам, наверно от него можно просто оставить:
Код: (delphi)
begin
  ChangeХХ.Value  := True;
end.
т.к. значение переменной изменяется самой кнопкой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 08 Июня 2017, 16:00:08
Спасибо Вам огромное, буду пробовать...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 08 Июня 2017, 16:03:38
Спасибо Вам огромное, буду пробовать...
Не надо!!!
Все намного проще :) Например Секундный скрипт:
Код
if IntVar1.Value <> ExtVar.Value then
  ExtVar1.Value := IntVar.Value;
Тогда скада раз в секунду будет проверять есть ли расхождения, и если есть, то пробовать писать.

По кнопке с несколькими выходами просто подцепляете скрипт на клик и делаете ее НЕ фиксируемой:
Код
  IntVar.Value := 15; (* 0х00001111 или какие там у вас биты*)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 08 Июня 2017, 16:35:56
Спасибо, ув. Teodor, все работает как часы... ;D
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Июня 2017, 17:44:09
st-legal, Teodor, извините, но вы сделали какой-то переполох на ровном месте и просто усложнили. Можно обойтись без секундного скрипта и лишних проверок.

Цитировать
Вопрос в следующем. При нажатии кнопок с некоторой задержкой все отрабатывает нормально, но стоит нажать 2 кнопки без паузы, отрабатывает только тот выход, кнопка которого была нажата последней. Кнопки привязаны к одному тегу, но через разные биты. В чем может быть проблема?
В данной ситуации нет никакого блокирования переменных и дело только в работе с битами одной и той же переменной. Всё очень просто. Присвоение внешних переменных происходит не моментально, а с какой-то задержкой. Вот последовательность шагов:
Начиная с шага 2, до шага 5 сервер скады будет думать, что переменная равна нулю. И только на 5 шаге сервер получит значение, равное 1. Вот и всё.

Теперь конкретнее про биты. Есть две кнопки. Обе связаны с переменной vrBit. Первая кнопка работает с нулевым битом. Вторая кнопка - с первым. Тогда, если быстро кликнуть первую и вторую кнопку, может произойти следующая ситуация:

Для решения этого вопроса можно сделать синхронизацию через внутреннюю переменную. Т.е., дано: наша внешняя переменная в которой нужно менять биты. Она называется vrMy. Мы создаем ещё одну внутреннюю переменную с именем vrSync. Связываем обе кнопки с переменной vrSync. Также у этих кнопок в качестве доп. переменной выбираем vrMy. Пишем следующий универсальный скрипт:

Код
begin
  if not (Sender is TM_Object) then Exit;
  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      VariableEx.Value := Value;
end.

Теперь ставим данный скрипт на событие OnDataChange у наших кнопок (причем этот скрипт подойдет для всех подобных кнопок в проекте). Готово. Теперь кнопки работают с внутренней переменной и присвоения выполняются моментально, поэтому проблемы с битами нет. При этом все изменения отправляются во внешнюю переменную.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 09 Июня 2017, 08:44:18
Спасибо уважаемые разработчики за столь развернутый ответ и помощь!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 09 Июня 2017, 09:38:35
Не, ну я ж предупреждал что, возножно, я не прав и есть способы попроще. Под блокировкой имел в виду именно то что переменная приобретет заданное значение только после подтверждения от ОРС.

А можете теперь все то-же расписать, но с условием, что ExtVar может измениться "с той стороны"? Например есть еще один сервер работающий с тем-же регистром и нам надо переключить кнопки в актуальное положение? При том что щелкать по ним могут фактически одновременно. :-\
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: xrusteg от 09 Июня 2017, 14:02:30
Добрый день, только начала разбираться со скадой, возник такой вопрос. Необходимо проверять связь с контроллером. Делаю это таким способом:
Код
begin
  if sysUpTime_0.IsGoodQuality = False then
    AddMessage(Now, mkAlarm, 'Потеря связи с контроллером!', True, True);
end.
Но проблема в том, что не знаю к какому событию привязать данный скрипт, если привязать к посекундному, то каждую секунду будут появляться сообщения, что неправильно. К чему еще можно привязать данный скрипт?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 09 Июня 2017, 14:09:55
А если сделать булевую переменную, привязанную к кнопке(без флага "Доступно") "OnLine"

Oдин скрипт секундный для проверки качества и установки переменной, второй привязан к ОнЧенж кнопки уже показывает сообщение если флаг в Тrue?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: xrusteg от 09 Июня 2017, 15:03:12
Спасибо за ответ. Работает, но костыльно и, получается, каждый раз после срабатывания нужно нажимать кнопку. Кстати, а как сделать, чтобы при появлении связи сообщение автоматически убиралось?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 09 Июня 2017, 15:10:58
Добрый день, ув. форумчане. Помогите разобраться с таблицами. Есть переменная (счетчик), которая записывается в базу данных mysql. Стоит задача: вывести значение счетчика накопленное за час и общее количество за сутки. Т.е. в таблице 24 строки (для каждого часа) и столбец со значением счетчика. значение счетчика передается из контроллера в формате word. И еще как организовать перезапись данных в таблице, значения, полученного в этом же часу но днем раньше??? За ранее спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 09 Июня 2017, 16:38:36
а если так? :)

Код
if sysUpTime_0.IsGoodQuality = TRUE then
  Online.Value := TRUE
else
  Online.Value := FALSE;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Июня 2017, 12:03:49
А можете теперь все то-же расписать, но с условием, что ExtVar может измениться "с той стороны"? Например есть еще один сервер работающий с тем-же регистром и нам надо переключить кнопки в актуальное положение? При том что щелкать по ним могут фактически одновременно. :-\
Для этого достаточно написать обратный универсальный скрипт на событие OnDataChangeEx для кнопок:

Код
begin
  if not (Sender is TM_Object) then Exit;

  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      Value := VariableEx.Value;
end.
Тогда виртуальная переменная будет всегда иметь актуальное значение и работа будет корректной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Июня 2017, 12:18:47
Но проблема в том, что не знаю к какому событию привязать данный скрипт, если привязать к посекундному, то каждую секунду будут появляться сообщения, что неправильно. К чему еще можно привязать данный скрипт?
Для данной задачи действительно лучше всего делать проверку в секундном скрипте. А чтобы сообщение не выдавалось каждую секунду, можно создать отдельную внутреннюю переменную с типом данных Boolean и именем, например, vrShown. Тогда секундный скрипт будет таким:
Код: (delphi)
begin
  if sysUpTime_0.IsGoodQuality = False then
  begin
    if vrShown.Value = False then   // если сообщение не было показано
    begin
      AddMessage(Now, mkAlarm, 'Потеря связи с контроллером!', True, True);
      vrShown.Value := True;        // отмечаем, что сообщение было показано
    end;
  end else                          // если качество хорошее, то
    vrShown.Value := False;         // разрешаем выдачу сообщения
end.
Добрый день, ув. форумчане. Помогите разобраться с таблицами. Есть переменная (счетчик), которая записывается в базу данных mysql. Стоит задача: вывести значение счетчика накопленное за час и общее количество за сутки. Т.е. в таблице 24 строки (для каждого часа) и столбец со значением счетчика. значение счетчика передается из контроллера в формате word.
Т.е. Вам нужно взять данные счетчика из БД и на основе этих данных подсчитать накопленное за час и общее за сутки, а затем вывести полученный результат в таблицу?

И еще как организовать перезапись данных в таблице, значения, полученного в этом же часу но днем раньше???
Можно просто связать ячейку таблицы с переменной. По изменению переменной, значение в ячейке будет обновляться.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 11 Июня 2017, 11:25:36
Код
begin
  Button5.Value := 1;
  delay := 1000;
  Button6.Value := 1;
  delay := 2000;
  Button2.Value := 1;
  delay := 3000;
  Button1.Value := 1;
end.   
   

 Где ошибка в сценарии?
  Как выкроить время  между кнопками?
Мне нужно, чтобы иметь возможность установить время между : Button5,Button6,Button2,Button1
Помощь много мне нужно это изменение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 12 Июня 2017, 10:05:34
Создайте секундный скрипт и переменные для времени начала (отсчета) и флажка начала отсчета.
По нажатию на кнопку установите флажок в TRUE.
Дальше после установки флажка увеличивайте на 1 переменную отсчета. Выполняйте действия по значению этой переменной.

Код
if Started.Value = TRUE then
  Counter.Value := Counter.Value+1
else
  Counter.Value := -1;

case Counter.Value of
  0:Button1.Value := 1;
  1:Button2.Value := 1;
  2:Button3.Value := 1;
...
  x:ButtonХ.Value := 1;
  y:Started.Value :=FALSE;
end;

тогда значения кнопок будут изменяться каждую секунду (точнее через Counter.Value секунд от момента установки флажка)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 12 Июня 2017, 15:32:15
..
Для этого достаточно написать обратный универсальный скрипт на событие OnDataChangeEx для кнопок:
...
Прям сейчас так и попробую... А то мои методы явный "оверкил".  ;D ;)

И сразу грабли... Еще нужен Тег... Для определения места начала поиска данных в переменной и записи ее в нужную часть регистра.
Код
var
  Mask:byte;
begin
  if not (Sender is TM_Object) then Exit;
  Mask:=7; //3bit
  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      VariableEx.Value := VariableEx.Value and (Mask shl Tag xor 65535) or (Value shl tag);
end.
Код
var
  Mask:byte;
begin
  if not (Sender is TM_Object) then Exit;
  Mask:=7; //3bit
  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      Value := (VariableEx.Value shr Tag) and Mask;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Июня 2017, 16:30:49
Teodor, мы планируем в ближайшем будущем сделать сохранение присвоенного значения в оперативной памяти на определенное время. Тогда при быстром клике двух кнопок с разными битами одной переменной все присвоения будут корректными и данный вопрос не придется решить скриптами. Но разве у Вас именно такая проблема? Кажется Вы писали, что иногда присвоение у Вас просто не проходит с первого раза. Или тогда речь как раз шла о присвоении разных битов одной переменной?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 12 Июня 2017, 17:21:10
Teodor, мы планируем в ближайшем будущем сделать сохранение присвоенного значения в оперативной памяти на определенное время. Тогда при быстром клике двух кнопок с разными битами одной переменной все присвоения будут корректными и данный вопрос не придется решить скриптами. Но разве у Вас именно такая проблема? Кажется Вы писали, что иногда присвоение у Вас просто не проходит с первого раза. Или тогда речь как раз шла о присвоении разных битов одной переменной?
Мы ж не просто так у вас 4 лицензии купили :) Это уже третий проект в работе, на котором такой проблемы не стоит, а все летает четенько и шустренько. Зато тут свои "заморочки" в виде подготовки под ханивел с ДИКОЙ ценой точки, потому каждый бит на счету, а тема просто удачно подвернулась :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 12 Июня 2017, 17:45:16
Teodor, я не могу сделать кнопки для включения последовательно в течение 30 секунд.
Загрузить проект, пожалуйста, сделайте это.
Администратор и попросить вас, чтобы помочь закончить проект.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 12 Июня 2017, 17:45:32
Напомните почему так:
 VariableEx.Value := VariableEx.Value and ((Mask shl Tag) xor 65535) + (Value shl tag);
работает, а так:
 VariableEx.Value := VariableEx.Value and ((Mask shl Tag) xor 65535) or (Value shl tag);
нет?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 12 Июня 2017, 17:47:13
Этот скрипт для кнопки AUTO это ?

Мне нужно, когда я нажимаю на кнопку AUTO.
Включите первую кнопку - 30 секунд второй-30 секунд третий -30 секунд четвертый и так до последнего.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 13 Июня 2017, 07:57:05
Добрый день, ув. форумчане. Помогите разобраться с таблицами. Есть переменная (счетчик), которая записывается в базу данных mysql. Стоит задача: вывести значение счетчика накопленное за час и общее количество за сутки. Т.е. в таблице 24 строки (для каждого часа) и столбец со значением счетчика. значение счетчика передается из контроллера в формате word.
Т.е. Вам нужно взять данные счетчика из БД и на основе этих данных подсчитать накопленное за час и общее за сутки, а затем вывести полученный результат в таблицу?

И еще как организовать перезапись данных в таблице, значения, полученного в этом же часу но днем раньше???
Можно просто связать ячейку таблицы с переменной. По изменению переменной, значение в ячейке будет обновляться.
Доброе утро, примерно так, только не получится связать ячейку с переменной, т.к. одна и та же переменная должна появляться в своей строке: пример
01:00     300
02:00     350
и т.д.
Но на следующий день ячейка со значением переменной для 01:00 должна перезаписаться новым значением
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 13 Июня 2017, 09:21:58
Загрузить проект, пожалуйста, сделайте это.
посмотрите. Я сделал отдельно кнопки, чтобы не поломать ваши и вывел счетчики, чтобы понятно было что происходит в скрипте. Цифры в Case, это секунды задержки включения кнопок после нажатия на АВТО.
вам надо будет поставить для вашей задержки:
0:
30:
60:
90:
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 13 Июня 2017, 09:24:48
Но на следующий день ячейка со значением переменной для 01:00 должна перезаписаться новым значением
То есть у вас фиксированный размер таблицы? Тогда вам надо просто 24 переменных и забудьте о базах и таблицах. Выведите их в 24 поля. :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 13 Июня 2017, 09:51:22
Но на следующий день ячейка со значением переменной для 01:00 должна перезаписаться новым значением
То есть у вас фиксированный размер таблицы? Тогда вам надо просто 24 переменных и забудьте о базах и таблицах. Выведите их в 24 поля. :)
тогда я не очень понимаю как это сделать без базы
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 13 Июня 2017, 10:40:06
Вам база нужна для чего-то еще, или только для вывода в таблицу? Если только для таблицы, то 24 ячейки проще нарисовать отдельными текстовыми полями и привязать к ним 24 переменных. Тем более все равно вы можете вести тренды по этим полям и/или вывести их архивы в отчетах.

А вам, тогда, надо считать счетчик в начале каждого часа и в конце. А разницу записать в соответствующую переменную.
Скрипт один на всех, но зависимо от часа по GetVariableByName собираем название переменной куда писать разницу.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 13 Июня 2017, 11:03:39
А можете теперь все то-же расписать, но с условием, что ExtVar может измениться "с той стороны"? Например есть еще один сервер работающий с тем-же регистром и нам надо переключить кнопки в актуальное положение? При том что щелкать по ним могут фактически одновременно. :-\
Для этого достаточно написать обратный универсальный скрипт на событие OnDataChangeEx для кнопок:

Код
begin
  if not (Sender is TM_Object) then Exit;

  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      Value := VariableEx.Value;
end.
Тогда виртуальная переменная будет всегда иметь актуальное значение и работа будет корректной.

В общем выходит лажа. Если вцепить Ех к внутренней переменной все бегает отлично в обе стороны, а вот с ОРС происходит нечто странное. Что именно я пока сказать не готов, т.к. еще не ковырялся в программе контроллера (ее не я собирал), но задавая параметр в лоб, без этих скриптов, он устанавливается. Таким образом, нет, при том, что задаваемое значение вычисляется корректно.

В связи с чем контрольный вопрос. Мы меняем Val, срабатывает скрипт на ее изменение и меняет Ех, которая ОРС и меняется не сразу, а только после подтверждения от сервера, посему скрипт на изменение Ех тоже выполнится не сразу, да? Или все-же он выполниться моментально после присвоения измененного значения ОРС?

Отбой тревоги. Переменной было задано ограничение 0..100

А можно все-же попросить... При создании переменной привязывать ее значение не к 0..100, а все-же к ее реальным рамкам? Ну или хоть дать возможность выбора шкалы по умолчанию в настройках?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 13 Июня 2017, 17:34:10
Загрузить проект, пожалуйста, сделайте это.
посмотрите. Я сделал отдельно кнопки, чтобы не поломать ваши и вывел счетчики, чтобы понятно было что происходит в скрипте. Цифры в Case, это секунды задержки включения кнопок после нажатия на АВТО.
вам надо будет поставить для вашей задержки:
0:
30:
60:
90:


Большое спасибо за вашу помощь.
В этой ситуации, когда у них есть выходы Arduino?
Где можно установить паузу между  кнопок ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Июня 2017, 08:59:11
Напомните почему так работает: VariableEx.Value := VariableEx.Value and ((Mask shl Tag) xor 65535) + (Value shl tag);
А так нет: VariableEx.Value := VariableEx.Value and ((Mask shl Tag) xor 65535) or (Value shl tag);
Потому что сложение (http://www.reshinfo.com/primer_bin_slozenije1.php) (1 + 1 = 10 (единица переносится в следующий разряд)) и операция ИЛИ (1 + 1 = 1) это разные операции.

Цитировать
А можно все-же попросить... При создании переменной привязывать ее значение не к 0..100, а все-же к ее реальным рамкам? Ну или хоть дать возможность выбора шкалы по умолчанию в настройках?
Здесь вся проблема в том, что реальные рамки у разных переменных - разные, поэтому и используется система шкал. Иначе можно было бы обойтись без неё. А вот выбор шкалы по-умолчанию вполне можем добавить. Кстати. вчера мы закончили работу над новой системой присвоений. Теперь ситуация с битами описанная в этом сообщении (http://simple-scada.com/forum/index.php?topic=145.msg3689#msg3689) не будет возникать и писать доп. скрипты не придется.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 14 Июня 2017, 09:10:25
В этой ситуации, когда у них есть выходы Arduino?
Где можно установить паузу между  кнопок ?
Все так-же. Только вместо внутренних переменных подставьте те что вам надо.

Задержки - это "2:", "4:", "6:"... вместо этого ставьте сколько вам надо. Последняя на 1 больше чтобы выйти из режима.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 14 Июня 2017, 09:17:50
Напомните почему так работает: VariableEx.Value := VariableEx.Value and ((Mask shl Tag) xor 65535) + (Value shl tag);
А так нет: VariableEx.Value := VariableEx.Value and ((Mask shl Tag) xor 65535) or (Value shl tag);
Потому что сложение (http://www.reshinfo.com/primer_bin_slozenije1.php) (1 + 1 = 10 (единица переносится в следующий разряд)) и операция ИЛИ (1 + 1 = 1) это разные операции.
Именно здесь 1 в первой части исключена т.к. она перед тем вычищена на с AND 0. Посему у нас тут 0+0=0or0 или 0+1=0or1 :) А вообще, проблема была со шкалой в которую вписывалось окончательное значение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 14 Июня 2017, 13:29:53

Для решения этого вопроса можно сделать синхронизацию через внутреннюю переменную. Т.е., дано: наша внешняя переменная в которой нужно менять биты. Она называется vrMy. Мы создаем ещё одну внутреннюю переменную с именем vrSync. Связываем обе кнопки с переменной vrSync. Также у этих кнопок в качестве доп. переменной выбираем vrMy. Пишем следующий универсальный скрипт:

Код
begin
  if not (Sender is TM_Object) then Exit;
  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      VariableEx.Value := Value;
end.

Теперь ставим данный скрипт на событие OnDataChange у наших кнопок (причем этот скрипт подойдет для всех подобных кнопок в проекте). Готово. Теперь кнопки работают с внутренней переменной и присвоения выполняются моментально, поэтому проблемы с битами нет. При этом все изменения отправляются во внешнюю переменную.
Добрый всем день. В продолжении темы. Столкнулся с очередной задачей. Вопрос практически такой же только с одной поправкой . Имеется не один модуль а например 10. и нужно нажатием кнопки активировать 1 выход каждого модуля (выхода вытаскиваю из ОРС сервера в виде word, где каждый бит отвечает за свой выход). Как решить такую задачу? Да выхода каждого модуля имеют свой тег соответственно : bout, bout_1, bout_2 и т.д.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 14 Июня 2017, 14:26:47
Посмотри здесь: http://simple-scada.com/forum/index.php?topic=404.msg3739#new
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 14 Июня 2017, 14:47:57
Посмотри здесь: http://simple-scada.com/forum/index.php?topic=404.msg3739#new
Если я все правильно понял, то в данном примере каждый элемент управления меняет бит своего тега. А мне нужно 1 кнопкой поменять 1 бит у каждой идентичной переменной
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Июня 2017, 14:50:32
st-legal, а простое присвоение по событию OnClick в Вашем случае не подходит? Например:

Код
begin
  myVar1.Value := SetBit(MyVar1.Value, 0, TRUE);  // меняем нулевой бит в переменной myVar1
  myVar2.Value := SetBit(MyVar2.Value, 0, TRUE);  // меняем нулевой бит в переменной myVar2
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 14 Июня 2017, 15:07:47
st-legal, а простое присвоение по событию OnClick в Вашем случае не подходит? Например:

Код
begin
  myVar1.Value := SetBit(MyVar1.Value, 0, TRUE);  // меняем нулевой бит в переменной myVar1
  myVar2.Value := SetBit(MyVar2.Value, 0, TRUE);  // меняем нулевой бит в переменной myVar2
end.
Ув. разработчики, в очередной раз огромное человеческое спасибо. Ответы всегда на поверхности
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andrey1883 от 14 Июня 2017, 15:11:29
Уважаемые специалисты! со скриптами туго  совсем, только начал разбираться, натолкните на мысль, как организовать архив, где имеется :
 Фактически мультиплексор из клапанов ( производится отбор проб газа из 9 точек на один газоанализатор ), управляет которым контроллер в ручном и автоматическом режиме,Соответственно имеются все переменные с этим связанные...нужно сохранять данные с каждого канала в БД, а затем, выбрав определенный промежуток времени, читать их.. Логично предположить, что сработал клапан 1 - записали значение на выходе в базу данных с меткой времени, сработал клапан 2 - записали значение и тд, а вот как выборку сделать не понятно...отсюда и тренды не подходят, т.к.,к примеру, клапан 3 в ручном режиме открыт может быть дольше, чем в автомате и на графике разрывы будут, что не наглядно и не очень удобно при просмотре..лучше как-то таблицей
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 14 Июня 2017, 15:41:27
Все проще... На всех нужных переменных ставите галку "Архивировать/по изменению" и читаете как работать с системой отчетов :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 14 Июня 2017, 18:56:31
Teodor все работает спасибо.
Как изменить скрипт, чтобы остановить кнопки ?
Я добавил кнопку, чтобы остановить, но не работает ?
Пожалуйста, помогите мне.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andrey1883 от 15 Июня 2017, 09:22:23
Все проще... На всех нужных переменных ставите галку "Архивировать/по изменению" и читаете как работать с системой отчетов :)
спасибо) а я тут что-то выдумываю
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 15 Июня 2017, 09:37:21
Как изменить скрипт, чтобы остановить кнопки ?
Я добавил кнопку, чтобы остановить, но не работает ?
Тут надо не менять, а еще один создавать (не на изменение, а тоже секундный). Со своим счетчиком и своим флагом. Я бы еще предложил блокировать вторую кнопку, если нажата первая. Поскольку эти 2 скрипта будут работать одновременно... и можно запутаться в том что мы включаем, а что выключаем.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andrey1883 от 15 Июня 2017, 14:40:07
Все проще... На всех нужных переменных ставите галку "Архивировать/по изменению" и читаете как работать с системой отчетов :)
Дело в том, что изменением у меня является срабатывание клапана (входа мультиплексора грубо говроря)..да такой подход позволит зафиксировать красивый график, но вот определить, с какого входа мультиплексора я получил значение и в какой момент времени,- не получится или я пока не догоняю как...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 15 Июня 2017, 14:52:04
Мы видимо о разном... Я не про тренды, а про систему отчетов. Там можно выбрать период и данные, которые вам нужны за этот период. Хоть таблицей, хоть графиком, хоть одновременно.

А, простите, вы же можете заархивировать так-же "входящиие" изменения состояния клапанов и добавить их как столбцы в отчете? Все 9. Тогда при каждом изменении любого из "входов" у вас появится новая строка, пусть и не изменилось состояние "выхода".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andrey1883 от 15 Июня 2017, 15:23:44
Мы видимо о разном... Я не про тренды, а про систему отчетов. Там можно выбрать период и данные, которые вам нужны за этот период. Хоть таблицей, хоть графиком, хоть одновременно.
в принципе можно создать отчет и открывать его потом из скады...но хочется видеть в скаде сразу в виде таблицы, к примеру, или просто набора нескольких полей...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 15 Июня 2017, 16:44:39
Мы видимо о разном... Я не про тренды, а про систему отчетов. Там можно выбрать период и данные, которые вам нужны за этот период. Хоть таблицей, хоть графиком, хоть одновременно.
в принципе можно создать отчет и открывать его потом из скады...но хочется видеть в скаде сразу в виде таблицы, к примеру, или просто набора нескольких полей...
Точно о разном. ;)
Цитировать
затем, выбрав определенный промежуток времени, читать их..
и видеть уже - вещи разные... Тогда вам таки в БД надо писать и выводить в таблицу(заполняется выборкой). А в поля, если и выводить, то только актуальное значение, и последнее изменение, иначе заманаетесь.

Если надо именно онлайн+история, то я бы для себя комбинировал. Актуальные значения в поля, а на изменение данных любого из полей в скрипте добавлял SQL-ом строку со значениями всех полей и меткой по времени. В таблицу бы выводил запросом с ограничением по времени, например в сутки, тем-же скриптом.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 15 Июня 2017, 17:40:54
Как изменить скрипт, чтобы остановить кнопки ?
Я добавил кнопку, чтобы остановить, но не работает ?
Тут надо не менять, а еще один создавать (не на изменение, а тоже секундный). Со своим счетчиком и своим флагом. Я бы еще предложил блокировать вторую кнопку, если нажата первая. Поскольку эти 2 скрипта будут работать одновременно... и можно запутаться в том что мы включаем, а что выключаем.

Большое спасибо за вашу помощь.
Будет ли проблема, если добавить другие кнопки для запуска и стоп с различными выходами для Ардуино ?
Что необходимо изменить скрипт для более таких автоматизированных кнопок?
Я пытался добавить новый набор кнопок со временем, но не знаю, как вывести их от других?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Июня 2017, 09:27:18
Уважаемые специалисты! со скриптами туго  совсем, только начал разбираться, натолкните на мысль, как организовать архив, где имеется :
 Фактически мультиплексор из клапанов ( производится отбор проб газа из 9 точек на один газоанализатор ), управляет которым контроллер в ручном и автоматическом режиме,Соответственно имеются все переменные с этим связанные...нужно сохранять данные с каждого канала в БД, а затем, выбрав определенный промежуток времени, читать их.. Логично предположить, что сработал клапан 1 - записали значение на выходе в базу данных с меткой времени, сработал клапан 2 - записали значение и тд, а вот как выборку сделать не понятно...отсюда и тренды не подходят, т.к.,к примеру, клапан 3 в ручном режиме открыт может быть дольше, чем в автомате и на графике разрывы будут, что не наглядно и не очень удобно при просмотре..лучше как-то таблицей
Обычно для подобных задач используются именно тренды. Не совсем понятно о каких разрывах на графике Вы говорите. Разрывов быть не должно, если клапан открыт, то график просто будет выше, если закрыт, то ниже. Может быть мы что-то недопоняли? Если нужно отобразить данные в таблице, то можно сделать запрос на выборку данных из БД в соответствующую таблицу, например:

Код
var
  aQuery: string;
begin
  aQuery := 'SELECT * FROM `my_table`';  // формируем запрос к БД на выборку всех данных из таблицы `my_table`
  Table1.RunSQL(aQuery, tsAll);          // выполнить запрос и заполнить таблицу результатом выполнения
end.

Но недостаток в том, что данную выборку нужно будет периодически повторять, чтобы обновить таблицу, а это, как мы поняли, неудобно для Вашей задачи. Другой вариант - это просто вывести на мнемосхему набор полей и в них выводить данные (то же самое можно сделать и таблицей, связав ячейки таблицы с разными переменными).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 16 Июня 2017, 18:38:43
Администратор поможет.
Как реализовать проекты с помощью этих кнопок во время запуска ?
Существует ли универсальный скрипт для последовательного включения объектов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 18 Июня 2017, 11:58:20
Teodor много спасибо за помощь.
Я не бы справиться без тебя.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 19 Июня 2017, 08:18:10
1) А почему из скриптов нельзя менять свойство объекта Таблица "Title"? Выводится ошибка, что это свойство только для чтения.

2) Как из скрипта удалить привязку переменной к объекту?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 19 Июня 2017, 10:36:41
Как реализовать проекты с помощью этих кнопок во время запуска?
Если Вам нужно, чтобы скрипт выполнялся во время запуска проекта, то используйте скрипт с типом события "Полностью запущен".

Существует ли универсальный скрипт для последовательного включения объектов.
Универсальный скрипт для последовательного включения не подойдёт.

А почему из скриптов нельзя менять свойство объекта Таблица "Title"? Выводится ошибка, что это свойство только для чтения.
Откроем это свойство для записи в ближайшее время.

Как из скрипта удалить привязку переменной к объекту?
Сейчас это невозможно. Можно только изменить ссылку на другую, например так:

Код
begin
  Text1.Variable := vrMy;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 21 Июня 2017, 09:19:12
Как из скрипта обраться к трендам объекта TrendViewer ("Временной тренд")?
Мне нужно настроить видимость определенных трендов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 21 Июня 2017, 09:30:54
Как из скрипта обраться к трендам объекта TrendViewer ("Временной тренд")?
Мне нужно настроить видимость определенных трендов.
Тренды по окнам, показывать-скрывать окна?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 21 Июня 2017, 12:05:39
Тренды по окнам, показывать-скрывать окна?
У объекта типа TM_TimeTrendViewer есть свойство "Тренды", в котором имеется список трендов со своими свойствами, включая "Видимость". Мне нужно его менять в скрипте.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Июня 2017, 12:07:13
Миханик, временные тренды пока недоступны для работы из скриптов. Они станут доступны в будущих обновлениях.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 21 Июня 2017, 12:11:55
Simple-Scada, а ориентировочную дату внедрения данного функционала можете назвать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 21 Июня 2017, 16:11:33
Ex - OPC
Value - внутренняя
Есть такие 2 скрипта (упрощенно):

OnChangeEx
Код
begin
  if not (Sender is TM_Object) then Exit;
    with Sender as TM_Object do
      if (Variable <> nil) and (VariableEx <> nil) then
        Value := VariableEx.Value;
end.
и
OnChange
Код
begin
  if not (Sender is TM_Object) then Exit;
  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      VariableEx.Value := Value;                                                                                         
end.

В общем все работает вроде не плохо, но есть вопрос.

Что происходит при старте в случае если ЕХ в ОРС не 0? Какова вероятность того, что она может быть перезаписана 0 из свежеинициализированной внутренней переменной?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Июня 2017, 09:34:47
Simple-Scada, а ориентировочную дату внедрения данного функционала можете назвать?
Точную дату трудно назвать. Скорее всего в ближайшие две недели.

Что происходит при старте в случае если ЕХ в ОРС не 0? Какова вероятность того, что она может быть перезаписана 0 из свежеинициализированной внутренней переменной?
Точно! Есть вероятность перезаписи на ноль, причем довольно большая, т.к. виртуальная переменная скорее всего сделает OnChange первой. Поэтому здесь нужно игнорировать первый DataChange по внутренней переменной. Вот только как это сделать не используя доп. переменных.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 22 Июня 2017, 10:06:34
Simple-Scada, а ориентировочную дату внедрения данного функционала можете назвать?
Точную дату трудно назвать. Скорее всего в ближайшие две недели.

Что происходит при старте в случае если ЕХ в ОРС не 0? Какова вероятность того, что она может быть перезаписана 0 из свежеинициализированной внутренней переменной?
Точно! Есть вероятность перезаписи на ноль, причем довольно большая, т.к. виртуальная переменная скорее всего сделает OnChange первой. Поэтому здесь нужно игнорировать первый DataChange по внутренней переменной. Вот только как это сделать не используя доп. переменных.
Тогда еще вопрос. Качество OPC переменной. Когда оно установится в TRUE? Точнее, когда на ней пропадет nil? Это одновременные явления? Теоретически, хоть вирт. переменная и установится в 0 первой, а ОРС еще считать надо, то этот скрипт не выполнится, ибо ОРС все еще nil (или уже не nil, но еще не считана?)   В общем если в условие поставить качество, а не иннициализацию, что либо изменится?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Июня 2017, 09:02:13
Использовать качество, это хорошая идея. Тогда скрипт по изменению внутренней переменной (в Вашем случае OnDataChange), нужно изменить так:

Код
begin
  if not (Sender is TM_Object) then Exit;
  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      if VariableEx.IsGoodQuality then
        VariableEx.Value := Value;                                                                                         
end.

В теории это должно сработать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 23 Июня 2017, 10:07:56
Кстати, да... А что будет если присвоить нечто некачественной ОРС переменной? Зачем проверять и качество и нил, она может быть качественной и нил одновременно?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Июня 2017, 10:14:13
А что будет если присвоить нечто некачественной ОРС переменной?
Просто будет попытка выполнить присвоение в эту переменную, а пройдёт она, или нет, зависит от OPC-сервера.

Зачем проверять и качество и нил, она может быть качественной и нил одновременно?
Проверка ""if Variable <> nil then" не имеет отношения к качеству переменной, или к её значению. Эта проверка позволяет убедиться в том, что разработчик проекта не забыл выбрать переменную у данного объекта.  Допустим есть два поля Field1 и Field2. Поле Field1 связано с переменной A, а поле Field2 не связано с переменными. На событие OnDataChange у этих полей ставим такой универсальный скрипт:

Код
begin
  if not (Sender is TM_Object) then Exit;
  TM_Object(Sender).Variable.Value := 10;
end.

Для поля Field1 скрипт будет работать. А для поля Field2 будет давать ошибку, т.к. оно не связано с переменной (Variable = nil), а в скрипте мы пытаемся изменить Variable.Value, т.е. обращается в несуществующей переменной.

Поэтому в скрипте из предыдущего сообщения мы сначала убедились, что у объекта выбрана доп. переменная и только потом начинаем работать с ней, проверяя качество, или изменяя её значение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 26 Июня 2017, 09:42:27
Доброе утро, ув. форумчане. В продолжении темы Есть 2 модуля, каждый со своим адресом. Имеется кнопка которая активирует выход модуля.
vrSync-Value
bout-Ex
OnDataChange
Код
begin
if not (Sender is TM_Object) then Exit;
  with Sender as TM_object do
    if(Variable <> nil) and (VariableEx <> nil) then
    VariableEx.Value:= Value;
end.
Все тут работает нормально. При перезапуске проекта внутренние переменные обнуляются и соответственно обнуляют за собой OPC переменные. Для решения этой проблемы было создано скрытое Поле:
vrSync-Value
bout-Ex
OnDataChange
Код
begin
if not (Sender is TM_object) then Exit;
with Sender as TM_object do
if (Variable <> nil) and (VariableEx <> nil) then
if Variable.IsGoodQuality then
Value:=VariableEx.Value;
end.

OnDataChangeEx:
Код
begin
  if not (Sender is TM_Object) then Exit;
    with Sender as TM_Object do
      if (Variable <> nil) and (VariableEx <> nil) then
        Value := VariableEx.Value;
end.
Проблема состоит в следующем: Все вроде не плохо, но первый перезапуск проекта все норм. Последующие перезапуски творят чудеса. Выхода могут сброситься в ноль, могут начать сбрасываться и возвращаться в активное состояние. И еще если модуль не один, то на модуле с низшим Modbus адресом при перезагрузке проекта значения сохраняются, а на последующих модулях либо сбрасываются либо начинают моргать.
Вопрос, в чем тут загвоздка. Всем за ранее спасибо!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Июня 2017, 10:11:55
Здравствуйте. Данные скрипты Вы добавляли для того чтобы обойти проблему присвоения разных битов в одну и ту же переменную. В версии 2.2.2.0 мы улучшили систему присвоений во внешние теги и теперь Вы можете удалить эти скрипты. Присвоения должны выполняться правильно без использования доп. скриптов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 26 Июня 2017, 10:41:04
К сожалению, после того как я убрал внутреннюю переменную проблема присвоения разных битов одной и той же переменной осталась. У меня версия 2.2.2.0
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Июня 2017, 10:43:04
Можете выслать текущую версию проекта (после того, как убрали внутреннюю переменную) на support@simple-scada.com?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 26 Июня 2017, 10:47:30
Конечно, и ещё кое-что. Имеется кнопка, которая активирует сразу все 4 выхода модуля. Так вот она сначала устанавливает все биты в 1 (слово =15), а затем сразу сбрасывает все выходы в ноль, кроме первого (слово =1).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Июня 2017, 11:11:11
и ещё кое-что. Имеется кнопка, которая активирует сразу все 4 выхода модуля. Так вот она сначала устанавливает все биты в 1 (слово =15), а затем сразу сбрасывает все выходы в ноль, кроме первого (слово =1).
Конечно сбрасывает. Это же кнопка и в этом принцип её работы. Если вы создаёте кнопку и связываете её с переменной, то по нажатию на кнопку в переменную будет производиться запись единицы. У вас так и получается. Вы нажимаете кнопку, выполняется скрипт Value := 15 и сразу после этого кнопка выполняет своё предназначение и записывает в эту же переменную единицу. Если Вы хотите выполнять присвоения только скриптом, то нужно разорвать связь кнопки с любыми переменными.

Т.е. для Вашего проекта нужно разорвать связь кнопок "Включить все" и "Выключит все" с переменной bout, а скрипты изменить так:

"Включить все":
Код
begin
  bout.Value := 15;
end.

"Выключить все":
Код
begin
  bout.Value := 0;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 26 Июня 2017, 11:16:30
согласен, не доглядел. А с первым вопросом как быть?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Июня 2017, 11:22:01
Вы уверены, что проблема с быстрым присвоением битов в одну переменную существует после того как Вы убрали внутреннюю переменную? Мы сейчас делаем очень быстрые клики в Вашем проекте по кнопкам "Выход 1" .. "Выход 4" и присвоения всегда выполняются правильно. Может быть Вы во время кликов по кнопкам производите нажатие в зоне кнопки, а отпускаете мышь уже за её пределами? В таком случае присвоение не выполнится и может создастся впечатление, будто нажатие было, а присвоение не выполнилось.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 26 Июня 2017, 11:49:21
Вы уверены, что проблема с быстрым присвоением битов в одну переменную существует после того как Вы убрали внутреннюю переменную? Мы сейчас делаем очень быстрые клики в Вашем проекте по кнопкам "Выход 1" .. "Выход 4" и присвоения всегда выполняются правильно. Может быть Вы во время кликов по кнопкам производите нажатие в зоне кнопки, а отпускаете мышь уже за её пределами? В таком случае присвоение не выполнится и может создастся впечатление, будто нажатие было, а присвоение не выполнилось.
Итоговая картинка, сделал скрины. Нажимал все 4 кнопки последовательно, на последнем скрине итоговый результат. Не работает быстрое присвоение тегу..(((
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 26 Июня 2017, 14:50:52
А попробуй десяток полей сделать, и скриптик срабатывающий на изменение переменной:
Увеличивающий на 1 переменную счетчик и присваивающий  в кейсе значения полям по очереди.
Тогда можно будет отследить все изменения переменной.
Еще лучше, если рядом будет еще колоночка полей для внутренней переменной прицепленной как Екс для кнопок. Тогда можно будет точно отследить сам факт нажатия.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: st-legal от 26 Июня 2017, 15:20:55
А попробуй десяток полей сделать, и скриптик срабатывающий на изменение переменной:
Увеличивающий на 1 переменную счетчик и присваивающий  в кейсе значения полям по очереди.
Тогда можно будет отследить все изменения переменной.
Еще лучше, если рядом будет еще колоночка полей для внутренней переменной прицепленной как Екс для кнопок. Тогда можно будет точно отследить сам факт нажатия.
Приветствую Teodor, в том то и прикол, что с внутренней переменной одновременное присвоение проходит, а вот как заявлено что "улучшенная работа с внешними переменными (значение на присвоение временно хранится в оперативной памяти);" не работает. Это не особо критично, можно операторам объяснить, что необходимо дождаться пока загорится лампочка и затем нажимать другую кнопку. Но просто хотелось добиться результата при одновременном нажатии
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 26 Июня 2017, 15:30:15
А мне критично... Объект рабочий и за каждый отвал параметров я запасаюсь вазелином. Один движок уже спалил(он был перемотанный, а 0 означал отсытствие ограничений для частотника). Потому и попросил глянуть что получается, т.к. сам не могу :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 27 Июня 2017, 10:52:01
st-legal, вчера делали разные тесты с Вашим проектом (OPC-сервер изменили сначала на Kassl dOPC, затем на KepServer), нажимая кнопки "Выход 1" .. "Выход 4", присвоения всегда выполняются правильно, независимо от частоты кликов по кнопкам. Для того, чтобы получить более полную информацию предлагаем проделать следующее:

1. На событие OnClick кнопок "Выход 1" .. "Выход 4" поставить такой универсальный скрипт:
Код
begin
  Log_Add(Sender.Name + '.Click: ' + bout.AsUTF8String);
end.

2. Сохранить и запустить проект. Последовательно нажать кнопки "Выход 1", "Выход 2", "Выход 3" "Выход 4";
3. Завершить работу клиента и сервера скады;
4. Отправить на support@simple-scada.com лог-файл сервера из папки "Simple-Scada 2\Logs\Server-log.txt".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 28 Июня 2017, 12:07:32
Решил попробовать новые процедуры TimerStart и т.д. Но сразу же возник вопрос, а как ими пользоваться? Дело в том, что процедура требует параметр AVariable типа TM_Variable. Я как-то сразу на это и не обратил внимание. Я ожидал тип TDateTime. Да и в описании к процедуре написано - "Переменная должна быть объявлена в редакторе переменных." Переменную типа TM_Variable не объявишь в редакторе. И второй вопрос, а что за параметр Afrom - "Запускает таймер по переменной AVariable начиная с времени AFrom". Это смещение для AVariable или время запуска(задержка запуска) процедуры?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Июня 2017, 12:18:11
TeNQ, посмотрите пример в Demo-проекте, страница "Скрипты" - "Простые скрипты (1)", блок номер 8. Секундомер сделан полностью на основе таймерных процедур.

Цитировать
"Переменная должна быть объявлена в редакторе переменных." Переменную типа TM_Variable не объявишь в редакторе.
Здесь говорится не о типе данных, а о самой переменной. Любая переменная, которая создается в редакторе переменных представляет собой объект типа TM_Variable. Тип данных у переменной должен быть как раз DateTime, чтобы на её основе можно было создать секундомер.

Допустим у нас есть переменная vrTimer с типом данных DateTime, тогда на её основе можно запустить секундомер так:
Код
begin
  TimerStart(vrTime, 0);  // запускаем таймер с нуля
end.

Цитировать
И второй вопрос, а что за параметр Afrom
Это время с которого секундомер начнёт отсчет. Т.е. можно стартовать не с нуля.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 28 Июня 2017, 12:29:39
Я создал две переменных vrTime, vrFrom типа DateTime в редакторе. В скрипте использовал процедуру TimerStart(vrTime, vrFrom); И компилятор ругается на несовместимость типов TDateTime и TM_Variable. У вас в демо-проекте не ругается. Буду разбираться.
П.С. Все разобрался.
TimerStart(vrTime,  vrFrom.AsDateTime) ;  Вот так надо было сразу) Это я сам запутался.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 28 Июня 2017, 15:01:44
  Здравствуйте помогите пожалуйста с запросом.

Есть код:
Код
var {Заполняем таблицу tblOtchet "Отчет производства"}
  aQuery:string;
  aHome:string;
  aEnd:string;
begin
  aHome := QuotedStr(vOtchet_home.AsStr);
  aEnd := QuotedStr(vOtchet_end.AsStr);

  aQuery :=  'SELECT'+
                 ' AR_NAME'+
                 ', AR_ARTICLECODE'+
                 ', BD_STARTTIME'+
                 ', BD_ENDTIME'+
             ' FROM CFG_ARTICLE, CFG_BATCHES'+
             ' WHERE (AR_ARTICLE_ID = BD_PRODUCT_ID'+
             ' AND BD_STARTTIME >= '+aHome+''+
             ' AND BD_STARTTIME <= '+aEnd+')'+
             ' ORDER BY BD_STARTTIME;';

  tblOtchet.RunSQL(aQuery, tsSaveFixRow);
end.       

Где:
  vOtchet_home:= DateTime
  vOtchet_end:= DateTime                         
Есле в запросе присутствует дата которой нет в таблице, то выдает это:
(https://storage1.static.itmages.ru/i/17/0628/s_1498650895_1546331_fea6fa9ba7.png) (https://itmages.ru/image/view/5870335/fea6fa9b)
Хотя в СУБД запрос проходит на ура и таблица формируется.

Решил так:
Код
var {Заполняем таблицу tblOtchet "Отчет производства"}
  aQuery:string;
begin
  aQuery :=  'SELECT'+
                 ' AR_NAME'+
                 ', AR_ARTICLECODE'+
                 ', BD_STARTTIME'+
                 ', BD_ENDTIME'+
             ' FROM CFG_ARTICLE, CFG_BATCHES'+
             ' WHERE (AR_ARTICLE_ID = BD_PRODUCT_ID'+
             ' AND BD_STARTTIME >= '+vOtchet_home.AsSQLDateTime+''+
             ' AND BD_STARTTIME <= '+vOtchet_end.AsSQLDateTime+')'+
             ' ORDER BY BD_STARTTIME;';

  tblOtchet.RunSQL(aQuery, tsSaveFixRow);
end.     
                                               
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 29 Июня 2017, 08:20:55
Здравствуйте.
Подскажите пожалуйста как пользоваться этой функцией

Код
function GetCell(ACol, ARow: Integer): TM_TableCell; 
Описание: Возвращает ячейку на пересечении столбца с номером ACol и строки с номером
ARow. Возвращает nil, если такой ячейки не существует.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Июня 2017, 10:47:35
Цитировать
Есле в запросе присутствует дата которой нет в таблице, то выдает это:
Хотя в СУБД запрос проходит на ура и таблица формируется.
Здесь всё дело в формате даты/времени и код QuotedStr(vOtchet_home.AsStr); возвращает дату время в формате, который не подходит для запроса. Поэтому, как Вы и сделали, нужно использовать метод AsSQLDateTime.

Цитировать
Подскажите пожалуйста как пользоваться этой функцией
Посмотрите пример использования данной функции в руководстве по скриптам (https://simple-scada.com/help/script/tgetcell.html). Эта функция возвращает указанную ячейку. Ячейка имеет тип TM_TableCell, все свойства ячейки можно посмотреть здесь (https://simple-scada.com/help/script/tmtablecell.html) (доступны только для чтения). Если Вы не уверены, что ячейка существует в заданных "координатах", то для большей надежности кода можно сначала делать проверку на nil и только потом работать с ячейкой, например:

Код
var
  aCell: TM_TableCell;
begin
  aCell := Table1.GetCell(1, 1);  // получаем ячейку на пересечении столбца 1 и строки 1
  if aCell <> nil then            // если ячейка в столбце 1 и строке 1 существует, то
    Text1.Text := aCell.Text;     // извлекаем из ячейки текст
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 29 Июня 2017, 15:22:55
Цитировать
Посмотрите пример использования данной функции
Спасибо огромное. К большому сожалению не знал что есть новая версия мана по скриптам.
                                                                                   
В PDF версии нет примера работы с данной функцией.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 29 Июня 2017, 15:29:37
Вопросик опять нарисовался.
Как извлечь из ячейки не текст а INTEGR или преобразовать TEXT в INTEGR/
Просто  я хотел бы использовать конечный результат как ID для других запросов
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 29 Июня 2017, 15:36:42
Для этого нужно использовать функцию StrToInt (https://simple-scada.com/help/script/strtoint.html). Пример:

Код
var
  aCell: TM_TableCell;
  I: Integer;
begin
  aCell := Table1.GetCell(1, 1);  // получаем ячейку на пересечении столбца 1 и строки 1
  if aCell <> nil then            // если ячейка в столбце 1 и строке 1 существует, то
    I := StrToInt(aCell.Text);     // извлекаем из ячейки число
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 30 Июня 2017, 12:57:36
Как правильно загрузить значение даты из БД в переменную?
например, aDate - переменная типа TM_Variable

aDate.Value := DataSet.FieldByName('val_date').AsDateTime - так не работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Июля 2017, 09:17:58
Миханик, допустим у нас в БД есть таблица с именем `my_table` и в этой таблице есть столбец `val_date`, который хранит дату. Также в Редакторе переменных была создана переменная vrDate с типом данных DateTime, в неё мы будем читать дату из БД. Поставим в проект кнопку и на событие OnClick напишем код для выборки из БД:

Код
var
  aQuery: string;
begin
  aQuery := 'SELECT * FROM `my_table`;';    // формируем запрос на выборку всех строк из таблицы `my_table`
  RunSQL(aQuery, nil, 77);                  // запускаем запрос на выполнение с тегом 77
end.

Для обработки результата запросов используются скрипты с типом события "Выполнен SQL-запрос" (https://simple-scada.com/help/script/event-types.html). Поэтому переходим в меню "Скрипты" и создаем новый скрипт с типом события "Выполнен SQL-запрос" и пишем следующий код:

Код
var
  aField: TM_DBField;
begin
  if DataSet.IsEmpty then Exit;   // прерываем выполнение если набор данных пуст
 
  { если это набор данных с тегом 77 }
  if DataSet.Tag = 77 then
  begin
    { ищем в наборе данных столбец с именем "val_date" }
    aField := DataSet.FieldByName('val_date');
    { если столбец найден }
    if aField <> nil then
      vrDate.Value := aField.AsDateTime;    // читаем дату из набора данных в vrDate
  end;
end.

Готово. Теперь после выполнения запроса будет произведён поиск столбца "val_date" и из него будет извлечена дата в переменную "vrDate".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 21 Июля 2017, 14:19:12
Я столкнулся с интересной работой скрипта и стал разбираться. Дело касается локальных переменных объявляемых в скриптах. Я написал простой проект-тест. Кнопка и текстовое поле. По нажатию на кнопку (OnClick) выполняется скрипт
Код
var
  aCount : integer;
begin
  aCount := aCount + 1;
  Text1.Text := IntToStr(aCount);
end.   
Если я правильно понимаю, как работают локальные переменные (каждый раз при запуске скрипта для локальной переменной ищется свободное место в памяти, выделяется и инициализируется по умолчанию нулем), то при нажатии на кнопку в текстовом поле всегда должна выводиться 1. Но не тут то было. В SS2 локальная переменная работает не так. При повторном выполнении скрипта переменная сохраняет значение,  поскольку при каждом нажатии на кнопку значение в текстовом поле увеличивается на 1, т.е. aCount работает как счетчик. По-моему это неправильно. Так должна работать виртуальная переменная объявленная в списке переменных проекта. А это же локальная переменная созданная только на время работы скрипта, и при новом вызове скрипта ее значение утрачивается или я неправильно что-то понимаю?
И второй вопрос. У меня вызывается процедура AddMessageToGroup(), далее по программе присваивается значение переменной связанной со списком сообщений. Но в журнал первой попадает сообщение из списка, а уже потом сообщение созданное процедурой, иногда и с задержкой в секунду. Почему так получается?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Июля 2017, 15:02:58
Цитировать
Если я правильно понимаю, как работают локальные переменные (каждый раз при запуске скрипта для локальной переменной ищется свободное место в памяти, выделяется и инициализируется по умолчанию нулем)
Локальные переменные в Pascal, Delphi, C, C++, C# и т.п. языках не инициализируются компилятором и это забота программиста. При каждом очередном вызове скрипта переменной выделяется область памяти и её структура может быть любой (зависит от того, что в ней хранилось ранее), соответственно и значение переменных после выделения памяти может быть каким угодно. Компилятор в Simple-Scada работает аналогично, но при первой инициализации все-таки обнуляет переменную, а при последующих выделяет ту же самую область памяти, что и в первый раз. Поэтому в переменной значение сохраняется (не касается динамических типов данных, например строк). При этом мы рекомендовали бы работать с локальными переменными как и в других языках, т.е. сначала инициализировать, а затем использовать, чтобы значение переменной всегда было очевидным.

Цитировать
И второй вопрос. У меня вызывается процедура AddMessageToGroup(), далее по программе присваивается значение переменной связанной со списком сообщений. Но в журнал первой попадает сообщение из списка, а уже потом сообщение созданное процедурой, иногда и с задержкой в секунду. Почему так получается?
Т.е. первое сообщение Вы создаёте процедурой AddMessageToGroup, а второе это обычное сообщение из меню "Проект -> Сообщения" которое генерирует скада при изменении переменной, мы правильно поняли? Причина, возможно, в последовательности записи в БД, хотя у нас такого не наблюдается и последовательность правильная. Вы уверены что событие OnDataChange переменной не наступает раньше чем Вы вызываете AddMessageToGroup?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 21 Июля 2017, 15:18:20
Цитировать
При этом мы рекомендовали бы работать с локальными переменными как и в других языках, т.е. сначала инициализировать, а затем использовать, чтобы значение переменной всегда было очевидным.
Ясно. Значит буду явно ициализировать.

Цитировать
Вы уверены что событие OnDataChange переменной не наступает раньше чем Вы вызываете AddMessageToGroup?
Да. Это один длинный скрипт. Вначале идет условный вызов AddMessageToGroup, далее в операторе case идут варианты сообщений из списка. Скрипт выполняется один раз по-изменению.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Июля 2017, 15:20:02
Цитировать
далее в операторе case идут варианты сообщений из списка
А как именно выглядит этот case? Можете показать код скрипта?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 21 Июля 2017, 15:25:41
Я вам проект на почту вышлю. А то я не знаю, как сворачивать текст на форуме.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Июля 2017, 15:26:54
Цитировать
А то я не знаю, как сворачивать текст на форуме.
Кнопка с иконкой решетки в форме ответа.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 21 Июля 2017, 15:52:08
У меня с редактором какая-то ерунда творится. Перехожу на этот скрипт и редактор подвисает.  Пробую выделить фрагмент и снова подвисание.  Я думал проблема с компьютером, перезагрузился. И снова то же самое. А на других скриптах подвисаний нет. Это на новой версии 2.2.3.0. А раньше такого не было.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Июля 2017, 15:53:34
Пришлите проект и укажите скрипт, мы проверим.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 21 Июля 2017, 16:24:24
С порядком сообщений разобрался. Я был не прав. Порядок верный, как вызываются, так и попадают в журнал. Сам уже забыл как сделал)
Подвисание при выделении - выслал проект.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Июля 2017, 12:50:39
Цитировать
Подвисание при выделении - выслал проект.
Спасибо. Исправили. Скачать обновлённую версию можно по последней ссылке (2.2.3.0). Проект нужно пересохранить обновленной версией.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 25 Июля 2017, 09:46:31
Здравствуйте.
Почему сообщения в списках Неподтвержденные и Все сообщения/Сообщения в группах имеют разный порядок? В неподтвержденных я считаю порядок правильный. (Выбор программы и шага/Номер программы изменен/Останов) Как вызываются, так и показываются. А в группах и во всех сообщениях применена какая-то сортировка (у сообщений одинаковое время)?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Июля 2017, 09:29:19
TeNQ, здравствуйте. Да, это из-за одинакового времени. Для ускорения выборки данных из БД все таблицы индексируются по нескольким полям. Если время у сообщений одинаковое, то индекс будет проходить по ID, соответственно порядок может измениться. Если Вы создаёте эти сообщения при помощи процедуры AddMessage, то можно регулировать порядок вычитая миллисекунды, например так:

Код
begin
  AddMessage(IncMilliSecond(Now, -2), mkAlarm, 'Первое сообщение', True, True);
  AddMessage(IncMilliSecond(Now, -1), mkAlarm, 'Второе сообщение', True, True);
  AddMessage(Now, mkAlarm, 'Третье сообщение', True, True);
end.

Т.е. время каждого сообщения теперь уникально и оно определяет порядок сообщений.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 02 Августа 2017, 07:59:31
Добрый день.
Существует необходимость читать биты в слове состояния типа LongWord. Функцией GetBit удаётся считать только первые 16. 17 и далее биты воспринимаются как 0-15. Есть ли возможность корректно считать весь LongWord по битам или придётся его "резать" на части?
Заранее спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 02 Августа 2017, 08:28:13
Здравствуйте.
Функция GetBit достаточно корректно работает с LongWord(по крайней мере у меня). Данный тип взаимодействия с переменной использую очень интенсивно.
Практически все аварии, сообщения, кнопки.
Возможно что то с OPC сервером?.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 02 Августа 2017, 11:32:40
Примерно следующая ситуация:
Контроллер генерирует DWORD. При импорте с Codesys OPC определяется как LongWord
Забираю LondWord с OPC в скаду нормально:
Создаю поле ввода-вывода и завязываю на него на эту переменную. Показывает как положено 4294967295 при всех "1" в DWORD'e.
Завожу 32 текстовых поля. На них в свойстве Тэг прописываю 0-31.
Функция читает тэг и у подвязанной переменной смотрит GetBit[text.variable.value,Тэг] и вываливает в текст aBOOL = GetBit.
Если кладу в переменную максимальное значение 4294967295 скрипт умирает при чтении true из старшего бита..
Если кладу в переменную в контроллере любое другое число где старший бит = false, например 2147483647 - скрипт нормально отрабатывает и читает false из старшего бита. Всё остальные биты также правильно считываются.
Видимо что-то с приведением типов данных (знаковое беззнаковое).
Комментирование строки case aTag (aTag integer) of 31: не помогает. То есть вообще обращаться функцией GetBit нельзя если старший бит = true. А в поле ввода вывода при этом всё нормально.
При работе с обычным Word'ом чтение 16-бита (саse aTag of 15:) тем же самым кодом проходит совершенно нормально.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Августа 2017, 11:52:00
GEW, да, дело в преобразовании типов. Просто указывайте тип явно, например так:

Вариант 1:
GetBit(text.variable.AsInt64, Тэг);

Вариант 2:
GetBit(text.AsInt64, Тэг);

Так все работает?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 02 Августа 2017, 11:59:42
Да, работает. Спасибо)👍🏻
Сразу вопрос: что делать если захочется использовать 64 бита переменную?)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Августа 2017, 15:52:57
Цитировать
Сразу вопрос: что делать если захочется использовать 64 бита переменную?)
Сейчас GetBit работает с 32-битными переменными, поэтому нужно сначала получить последние 32 бита из 64-битной переменной и уже из них извлекать конкретные биты. Сделать это можно следующим образом:

Код
var
  aOriginal: Int64;   // здесь будем хранить оригинальное значение 64-битной переменной
  aLast32: Integer;   // переменная для последних 32 битов из 64-битной переменной
begin
  aOriginal := myVariable.AsInt64;  // получаем оригинальное значение 64-битной переменной
  aLast32 := aOriginal shr 32;      // смещаем биты вправо на 32 бита, оставляя только старшие 32 бита
 
  { теперь 0 бит переменной aLast32 соответствует 33 биту оригинальной переменной,
     а 31 бит переменной aLast32 соответствует 64 биту оригинальной переменной }
  if GetBit(aLast32, 0) = TRUE then
    Text1.Text := 'бит номер 33 равен 1';
end.

В ближайших обновлениях добавим поддержку 64-битных переменных в функциях GetBit и SetBit.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 14 Августа 2017, 11:29:30
Добрый день.
Нужна универсальная функция для формирования отчёта по событию или по клику кнопки на автоэкспорт в пдф отчёта. Существуют две проблемы:
1) Есть ограничение на GetClientName, который нельзя вызывать из OnDataChange. Функция "ReportExportClient(GetClientName..." работать не будет.
2) Вызывая "ReportExportClient(GetClientName..." из OnClick тоже не удаётся сформировать файл, хотя другие функции ReportExportAll и ReportView с теми же самыми параметрами работают корректно. "ReportExportClient(GetClientName..." Не крашится, проверял через AddMessage.
Подскажите решение проблемы)
Права доступа на папки (полный всем), общий доступ к папке, другие диски и папки, запуск от админа сервера и клиента попробовал. Не помогло.
Настройка в Options "Папка для принятых файлов" не помогло - ReportAll кладёт к себе по-умолчанию.
P.S.: Прописал путь в скрипте в папку: Projects\"имя проекта"\Reports\ (туда ReportAll писал по-умолчанию) - файл успешно создался.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 14 Августа 2017, 17:42:52
GetClientName а вам точно надо отдавать кажому клиенту, а не "себе"? Тогда можно имя прописать статической строкой и отдаст оно только определенному клиенту. По той-же причине может быть и кака с папками. Они должны быть настроенны синхронно на сервере и на том клиенте, с которого запускаете. ИМХО!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 14 Августа 2017, 19:31:05
Пока в проекте не можем определиться с топологией сети, количеством серверов и клиентов и кто к кому и как будет подключен. Поэтому пока приходится делать единый проект для всех и всё на универсальных скриптах (набиваю библиотеку реализаций). Поэтому имя клиента - вообще не задаётся в настройках - да и так тиражировать проект на компьютеры проще, и выполнять требование по снятию контрольных сумм с одного единого проекта - тоже.
А что касается места хранения архивов и отчётов - то оно будет регламентировано стандартом организации (диск, пусть) и едино для всех систем.
Была мысль в диалоге авторизации пользователя прописать запрос на имя клиента и сохранять его во внутреннюю переменную. Но мне кажется это больше костылём.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Августа 2017, 21:39:27
GEW, сегодня нашли возможную причину данной проблемы с отчетами. Завтра вечером опубликуем обновление с исправлением.

Цитировать
Они должны быть настроенны синхронно на сервере и на том клиенте, с которого запускаете. ИМХО!
По расположению папок ограничений нет, синхронность не нужна, можно на каждом ПК выбирать своё расположение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Teodor от 15 Августа 2017, 17:00:13
GEW, сегодня нашли возможную причину данной проблемы с отчетами. Завтра вечером опубликуем обновление с исправлением.

Цитировать
Они должны быть настроенны синхронно на сервере и на том клиенте, с которого запускаете. ИМХО!
По расположению папок ограничений нет, синхронность не нужна, можно на каждом ПК выбирать своё расположение.
я имею в виду, внутри проекта. А сам проект хай лежит себе где хочет... Или я могу создать проект, указать папку проекта, скопировать, создать в одном подпапку 1 и сохранять туда файл. Потом с другого клиента, указав куда сохранить у меня эта подпапка сама появится?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Августа 2017, 23:46:27
Разговор был про "Папку для принятых файлов", которую можно задать в Options.exe на вкладке Simple-Client (https://simple-scada.com/help/manual/settings-simple-client.html). Если она не задана, то принятые файлы на клиенте будут сохраняться по-умолчанию в папку "\Simple-Scada\Received\Имя_Проекта". На каждом клиенте можно задать свою "Папку для принятых файлов" для процедуры ReportExportAll.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 21 Августа 2017, 14:08:09
Здравствуйте!
Столкнулся с проблемой при редактировании настроек аварийных и предупредительных пределов внешней переменной: по скрипту считываю настройки в контроллере и включаю скриптом LimitType у переменной скады. Все сообщения (алармы) нормально и корректно работают со значениями из контроллера. Параллельно 4 поля ввода-вывода, смотрящие в настройки алармов переменной - в них значение  не обновляется вообще. При перезаписи значения с поля алармы также корректно работают с новым значением. В общем проблема только с отображением значения аларма в поле.
P.S.: по-умолчанию в настройках переменной - сообщения о нарушении границ - для любых, а вот сами границы - не выбрано (для того чтобы не грузить оператора некорректной информацией пока правильные настройки алармов из контроллера не будут считаны скриптом). Скрипт после настройки границ меняет limittype на ltAlarmsAndWarnings. Возможно причина в этом.
P.P.S.: возможно ли в будущем добавление возможности работы с пределами алармов переменной в ячейке таблицы?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 22 Августа 2017, 08:59:10
Небольшое предложение: вижу что довольно часто пользователи сталкиваются с проблемами при работе с кнопкой. Ввиду того что в моём случае кнопки используются только для подачи управляющих команд "true" в контроллер, а сброс в "false" организует сам контроллер, постоянно пустует слот под главную переменную (действия прописываются в универсальный скрипт с VariableEx по OnClick). При этом довольно часто нужно знать (например для цветовой индикации кнопки) или писать состояние двух переменных. А в слот Variable вставить переменную уже нельзя. Всвязи с этим предложение: для управляющих кнопок и флажков ввести свойство "не управлять переменной". Это избавило бы от множества проблем.
Отмечу что реализация управлениея контроллером посредством только команд "true" или только команд "false" - не такая уж и редкость. Только в моём случае - такая реализация (частично или полностью) на 9 крупных и средних проектах ПТК.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 22 Августа 2017, 10:44:27
Здравствуйте!

Цитировать
Столкнулся с проблемой при редактировании настроек аварийных и предупредительных пределов внешней переменной...
Пришлите папку с проектом (\Simple-Scada\Projects\Имя проекта) на support@simple-scada.com и укажите в каких полях не обновляются границы переменной - проверим.

Цитировать
Ввиду того что в моём случае кнопки используются только для подачи управляющих команд "true" в контроллер, а сброс в "false" организует сам контроллер, постоянно пустует слот под главную переменную (действия прописываются в универсальный скрипт с VariableEx по OnClick). При этом довольно часто нужно знать (например для цветовой индикации кнопки) или писать состояние двух переменных. А в слот Variable вставить переменную уже нельзя.
Если нужно, чтобы кнопка записывала в переменную только "true"(1), то у кнопки в свойстве "Переменная" необходимо указать переменную, в которую необходимо записывать "true", затем выбрать тип кнопки (https://simple-scada.com/help/manual/button.html) "С фиксацией" и оставить одно состояние(остальные удалить) со свойством "Значение" = 1. В таком случае, при нажатии на кнопку она всегда будет записывать в основную переменную "true".  Для цветовой индикации кнопки по второй переменной используйте доп. переменную кнопки - пример можно найти здесь (https://simple-scada.com/help/script/buttondbl.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 22 Августа 2017, 11:37:02
По поводу кнопки - да, понимаю что так можно. Но не всегда нужно писать в саму переменную. Переменная в данном случае аналоговая,  нужна для считывания качества, связи, а также для работы с её настройками (границы сообщений и т.д.) по имени.
Суть такая:
Подвязываю на VariableEX кнопки переменную AI_001.
Загружается проект клиента, после полной загрузки производится считывание структуры в контролере всех связанных с AI сигналом значений - настроек аварийных и предупредительных границ. Связанные переменные - AI_001_HH, AI_001_H .. L LL. - Их имена склеиваются в универсальном скрипте и по GetWariableByName, читаются значения, контролируя качество.
Затем производится передача этих значений в допсвойства переменной AI_001 (LimitType и т.д.).
Если всё хорошо - тушу цвет кнопки на серый, если значения в контроллере и в настройках переменной отличаются - подсвечиваю зелёным, если ошибка (например качество) - подсвечиваю красным.
В переменную AI_001 писать самой кнопкой ничего нельзя. Поэтому и подвязываю на VariableEX AI_001. Однако события по переменной VariableEX срабатывают только по изменении значения в AI_001, а это в реальной системе происходит не всегда. Я решал эту проблему внутренней переменной GlobalEvent_1s, которая инвертировала себя раз в секунду и вызывала срабатывание события. Мне бы хотелось подвязать GlobalEvent_1s и завести скрипт на цвет в событие - но Слот второй переменной занят. На основную - тоже нельзя. Ввести AI_001 в виде текста в тэг - не могу (разве что собирать из цифр имя переменной в скрипте, но это уже перебор). Думал ввести в свойство кнопки - подсказка - но для чтения оно из скрипта не доступно.
В общем тут больше дело в том что не хватает слота под переменную, или тэга текстового. Можно взять вместо кнопки текст конечно - но жаль анимации нажатия тогда не будет.
 P.S.: проект пришлю в конце рабочего дня.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Августа 2017, 11:48:14
Думал ввести в свойство кнопки - подсказка - но для чтения оно из скрипта не доступно.
Почему недоступно? Подсказку можно использовать для Вашей задачи. Например так:

Код
var
  s: string;
begin
  s := Button1.Hint;  // получаем текст подсказки кнопки Button1 в переменную s
end.

Аналогично для поиска переменной:
Код
var
  aVariable: TM_Variable;
begin
  aVariable := GetVariableByName(Button1.Hint); 
  if aVariable <> nil then
    aVariable.Value := 10;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 23 Августа 2017, 11:49:49
Спасибо, видимо недоглядел. Искал по руководству скриптов в свойствах кнопки подсказку, наверно забыли добавить в руководство.
Было бы кстати неплохо добавить функцию GetVariableByID. Тогда бы можно было было писать в тэг ID переменной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Августа 2017, 15:47:21
Искал по руководству скриптов в свойствах кнопки подсказку, наверно забыли добавить в руководство.
Все компоненты в Simple-Scada 2 имеют свои уникальные свойства, а остальные свойства наследуют из базовых классов TM_Control (https://simple-scada.com/help/script/tm_control.html) и TM_Object (https://simple-scada.com/help/script/tm_object.html). Свойство Hint как раз является базовым и описано здесь (https://simple-scada.com/help/script/hint.html). Прочтите эту короткую статью (https://simple-scada.com/help/script/object-properties.html) в руководстве по скриптам, чтобы лучше понять организацию объектов в Simple-Scada 2.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 11 Сентября 2017, 10:24:15
С версии 2.2.3.0 свойства Временных трендов доступны для изменения из скриптов, но например, свойство Variable не доступно для редактирования, можно только получить ID переменной через свойство VariableID.
Можно ли добавить для редактирования свойство Variable?
То есть мне нужно из скриптов менять переменные временного тренда (скриншот), чтобы не плодить целый огород разных временных трендов. Может я не там ищу?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 11 Сентября 2017, 16:45:50
Миханик, да, можем добавить это свойство и сделать его доступным для изменения. В ближайшем обновлении сделаем.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 12 Сентября 2017, 03:11:50
Спасибо, было бы очень здорово!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 22 Сентября 2017, 14:37:41
День добрый!

Подскажите, возможно ли с помощью ОТЧЕТА получить выборку времени наработки оборудования? Когда-то я уже писал вам по этому поводу, еще до появления ОТЧЕТА. Тогда пришлось создавать массу переменных.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 22 Сентября 2017, 18:23:09
Здравствуйте!

В последнем обновлении (2.2.5.0) появились процедуры для работы с архивом (https://simple-scada.com/help/script/work-with-archive.html). Среди них есть процедура ArchiveTimeOn (https://simple-scada.com/help/script/archivetimeon.html), с помощью которой можно легко получить время наработки оборудования за указанный промежуток времени. Такой вариант Вам подойдет?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 25 Сентября 2017, 10:37:38
Да, похоже это как раз то, что нужно. Скачал на свой ПК полную версию 2.2.5.0 и time - версию, т.к. USB - ключ стоит у нас на сервере. Однако, ни в той ни в другой папке нет файла Client. exe. Как быть в этой ситуации?  И еще вопрос, раньше устанавливал MySQL на свой ПК, все работало, после вируса ПЕТЯ мой Server - скада пишет об отсутствии активных БД, хотя я переустанавливал MySQL. Не подскажите, в чем может быть проблема?

Спасибо за вашу работу!  ;)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Сентября 2017, 10:56:25
Здравствуйте!

Цитировать
Однако, ни в той ни в другой папке нет файла Client. exe.
В архиве с любой версией имеются все необходимые для работы файлы, в том числе и клиент. Проверьте внимательно - может архив не до конца скачался или при распаковке Вы выделяете все содержимое кроме клиента. Либо файл клиента удаляется сторонним По (например антивирусом) после распаковки.

Цитировать
скада пишет об отсутствии активных БД, хотя я переустанавливал MySQL.
В настройках Вашего проекта на вкладке "База данных" укажите имя БД, а также имя пользователя и пароль, которые были заданы при установке MySQL. Нажмите кнопку "Проверить" - если
связь с БД установится, то выведется окошко об успешном соединении с БД.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 25 Сентября 2017, 13:37:00
Все сделал по Вашей инструкции - получилось.
Теперь о самом формировании выборки. Написал следующий скрипт:

Код
var
  DateStart, DateEnd: TDateTime;
begin

  if bn_1.AsBool = true then //bn_1 - кнопка формирования выборки
     begin
      DateEnd:= End_.AsDateTime;
      DateStart:= Start.AsDateTime;
     end;

  ArchiveTimeOn(MyVariable, MyVariableRes, DateStart, DateEnd);

end.

Выборка формируется по календарю, однако дата выводится странная:
30.12.1899 и далее время в нормальном виде. В чем может быть моя ошибка по дате?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Сентября 2017, 14:31:31
Вероятно Вы создали внутренние переменные "End_" и "Start" с типом DateTime для указания периода. Внутренние переменные при запуске проекта инициализируются нулем, поэтому и выводится дата 30.12.1899 - она соответствует нулю. Вам нужно инициализировать переменные - для этого создайте скрипт с типом события (https://simple-scada.com/help/script/event-types.html) "Запуск проекта" и напишите скрипт:

Код
begin
  End_.Value := Now;
  Start.Value := Now;
end.

Скрипт выполнится при запуске проекта и переменные инициализируются текущей датой и временем. Либо можете указать произвольные дату/время воспользовавшись процедурами и функциями для работы с датой и временем (https://simple-scada.com/help/script/datetime.html).

Также, в Вашем скрипте можно не использовать локальные переменные - можно сразу указывать переменные начала/конца:

Код
begin
  if bn_1.AsBool = true then //bn_1 - кнопка формирования выборки
  ArchiveTimeOn(MyVariable, MyVariableRes, Start.AsDateTime, End_.AsDateTime);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 25 Сентября 2017, 15:49:54
Вероятно Вы создали внутренние переменные "End_" и "Start" с типом DateTime для указания периода. Внутренние переменные при запуске проекта инициализируются нулем, поэтому и выводится дата 30.12.1899 - она соответствует нулю. Вам нужно инициализировать переменные - для этого создайте скрипт "Запуск проекта" и напишите скрипт:

Написал два скрипта. Первый для установления начальной даты Now переменным при ЗАПУСКЕ ПРОЕКТА, второй - для отображения данных при нажатии кнопки. Локальные переменные удалил, по Вашему совету. Изначально пишется текущая дата без времени, далее при выборе времени по календарю опять дата превращается в 30.12.1899. Я уже менял и даты выборки помимо часов и минут, и изначально задавал их разными - это отображается в календаре, но при создании выборки дата опять возвращается на 30.12.1899.

Скрипт при запуске проекта:
Код
begin
  Time_start.Value := (Now -1);
  Time_end.Value := Now;
end.   

Скрипт универсальный при нажатии кнопки:
Код
begin
  if btn_resultat.AsBool = true then
    ArchiveTimeOn(Start_time, Time_resultat, Time_start.AsDateTime, Time_end.AsDateTime) ;
end. 
Наименования переменных изменены.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Сентября 2017, 16:19:38
Теперь понятно о чем Вы говорите. Вы имеете ввиду, что в календаре, в который выводится переменная наработки "Time_resultat" отображается дата 30.12.1899? Но у наработки нет даты - в нее выводится время наработки. У календаря наработки скройте дату и будет отображаться только время. Если нужно выводить наработку в другом формате, то напишите как Вы хотите выводить наработку, например, в формате "дни, часы, минуты" или как то по другому? Мы приведем пример как это сделать.

Уточнение - мы совсем забыли, что в последних обновлениях внутренние переменные DateTime уже сами инициализируются текущей датой. Поэтому нет необходимости инициализировать их при запуске проекта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 26 Сентября 2017, 08:26:58
Теперь понятно о чем Вы говорите. Вы имеете ввиду, что в календаре, в который выводится переменная наработки "Time_resultat" отображается дата 30.12.1899?

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

Не совсем так. Я извиняюсь за не точность изложения.
В проекте я ввел два календаря: начало и конец даты и времени выборки Time_start и Time_end. Отображение времени и даты в них корректны. Далее я ввел цифровое поле с переменной Time_resultat и именно в нем отображается дата 30.12.1899 совместно с нормальным временем.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 26 Сентября 2017, 13:09:01
Работа с архивом - процедура ArchiveTimeOn. У нее есть параметр ALayer, который определяет слой архива. Основной слой - какой выводит формат?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Сентября 2017, 13:19:48
Дата, которую Вы видите - верна, т.к. ArchiveTimeOn возвращает результат в переменную типа DateTime (http://www.delphibasics.ru/TDateTime.php). Нулевой значение в этом формате соответствует дате-времени "30.12.1899 00:00:00" (т.е. отсчет у него ведётся от 30.12.1899) и его можно привести к совершенно любому формату простейшими операциями. Просто напишите в каком формате Вы хотите видеть время наработки и мы напишем Вам как его вывести.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 26 Сентября 2017, 13:27:17
Дата, которую Вы видите - верна, т.к. ArchiveTimeOn возвращает результат в переменную типа DateTime (http://www.delphibasics.ru/TDateTime.php). Нулевой значение в этом формате соответствует дате-времени "30.12.1899 00:00:00" (т.е. отсчет у него ведётся от 30.12.1899) и его можно привести к совершенно любому формату простейшими операциями. Просто напишите в каком формате Вы хотите видеть время наработки и мы напишем Вам как его вывести.

дд.мм.гггг чч.мм
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Сентября 2017, 13:50:01
Добавьте в проект объект Текст (https://simple-scada.com/help/manual/text.html). Свяжите его в переменной "Time_resultat" и на событие OnDataChange поставьте такой скрипт:

Код
var
  aText: TM_Text;
  aDay, aMonth, aYear: string;

  function myFormat(AVal: Integer; aSymbols: Byte): string;
  begin
    Result := IntToStr(AVal);
    while Length(Result) < aSymbols do
      Result := '0' + Result;
  end;
begin
  if not (Sender is TM_Text) then Exit;
  aText := TM_Text(Sender);

  SetTimeFormat('hh:mm');
  if YearOf(aText.AsDateTime) < 2016 then
  begin
    aDay := myFormat(DaysBetween(aText.AsDateTime, 0), 2) + '.';
    aMonth := myFormat(MonthsBetween(aText.AsDateTime, 0), 2) + '.';
    aYear := myFormat(YearsBetween(aText.AsDateTime, 0), 4) + ' ';
    aText.Text := aDay + aMonth + aYear + TimeToStr(aText.AsDateTime);
  end else
    aText.Text := '00.00.0000 00:00';
end.

Это универсальный скрипт, который учитывает все преобразования в заданном формате и подходит для любых объектов Текст.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 26 Сентября 2017, 14:17:25
Спасибо, завтра попробую.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Egor_Egor от 10 Октября 2017, 14:32:33
Добрый день!
Подскажите, пожалуйста, как реализовать (если это возможно) следующую задачку:
есть 2 переменные word_1 и word_2 типа word, и изображение.
как сделать чтобы при переходе 5го бита переменной word_2 в TRUE картинка окрашивалась в зеленый, при FALSE в серый; при переходе 6го бита переменной word_2 в TRUE картинка окрашивалась в красный, при FALSE в серый.
а при пеходе 5го бита переменной word_1 в TRUE картинка мигала зеленым цветом, при FALSE не мигала; при переходе 6го бита переменной word_1 в TRUE картинка мигала красным цветом, при FALSE не мигала.
и надо ли присваивать переменным какую-либо шкалу?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Октября 2017, 14:51:10
Здравствуйте.

Создайте изображение и в качестве основной переменной изображения выберите переменную word_1, а в качестве дополнительной word_2. Затем нужно перейти в меню скриптов и создать новый скрипт с типом события "Универсальный" и следующим кодом:

Код
begin
  if not (Sender is TM_Object) then Exit;

  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
    begin
      { проверяем 5 и 6 биты доп. переменной }
      if GetBit(VariableEx.AsInt, 6) then
        Color := clCrimson   // красный цвет
      else
        if GetBit(VariableEx.AsInt, 5) then
          Color := clLightGreen  // зелёный цвет
        else
          Color := clNone;  // обычный цвет

      { проверяем 5 и 6 биты основной переменной }
      if GetBit(Variable.AsInt, 6) then
        FlashColor := clCrimson  // мигание красным
      else
        if GetBit(Variable.AsInt, 5) then
          FlashColor := clLightGreen  // мигание зелёным
        else
          FlashColor := clNone;  // без мигания
    end;
end.

Теперь остается этот скрипт назначить изображению на события OnDataChange и OnDataChangeEx. Данный скрипт универсальный и подойдет любым другим изображениям, которые должны работать по тому же принципу.

Смотрите другие примеры скриптов в руководстве по скриптам (https://simple-scada.com/help/script/sample-scripts.html).

Цитировать
и надо ли присваивать переменным какую-либо шкалу?
не обязательно, т.к. шкала используется только для записи значений в переменную и для отображения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Egor_Egor от 10 Октября 2017, 15:01:31
Спасибо за развернутый оперативный ответ, всё работает)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 23 Октября 2017, 15:48:26
Интересно, что условие представленное в таком виде не работает

Код
if (in1.Value and in2.Value) > 1 then
       out.Value := 10
 else  out.Value := 0;   

А работает следующее

Код
if (in1.Value > 1) and (in2.Value > 1) then
       out.Value := 10
 else  out.Value := 0;   
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Октября 2017, 16:06:23
AutoCY, все правильно, а что именно Вы хотите сравнить? Это два разных условия. В первом случае для двух чисел выполняется логическое умножение (https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%86%D0%B8%D1%8F) и полученный результат сравнивается с единицей. Во втором случае два значения сравниваются с единицей и условие выполняется если оба больше 1. Вам скорее всего нужен второй способ.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 24 Октября 2017, 07:52:51
AutoCY, все правильно, а что именно Вы хотите сравнить? Это два разных условия. В первом случае для двух чисел выполняется логическое умножение (https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%86%D0%B8%D1%8F) и полученный результат сравнивается с единицей. Во втором случае два значения сравниваются с единицей и условие выполняется если оба больше 1. Вам скорее всего нужен второй способ.

Ага, теперь понятно. В первом случае, хотя я подавал на in1 и на in2 значения больше, чем единица, но конструкция работала, как булевое сравнение, которое возвращает или 0 или 1. Я правильно понял Вас?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Октября 2017, 14:30:43
AutoCY, для полного понимания можно рассмотреть пример когда in1 = 3, а in2 = 6. Тогда операция "in1.Value and in2.Value" выполнится как логическое умножение:

Код
0011  // число 3 в двоичном виде
0110  // число 6 в двоичном виде
=
0010  // результат. Равен 2.

И число 2 будет участвовать в сравнении: "if 2 > 1 then". Так работает первый вариант.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 26 Октября 2017, 13:35:04
День добрый!

Еще вопрос по выборке наработки оборудования. Процедура ArchiveTimeOn делает выборку по заданному времени, суммируя время. Это я сделал в проекте. Но пользователи теперь хотят с помощью интервала времени увидеть во сколько оборудование начало работать, когда закончило и еще при этом некоторые технологические параметры (среднее арифметическое). Я думал воспользоваться ArchiveCountOff и ArchiveCountOff для определения начала и конца отрезков включения оборудования. Если бы это касалось нескольких дней, то и ладно, а так придется плодить много переменных. Может есть какое-то готовое решение?

Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Октября 2017, 14:12:13
Здравствуйте.

Цитировать
Это я сделал в проекте. Но пользователи теперь хотят с помощью интервала времени увидеть во сколько оборудование начало работать, когда закончило и еще при этом некоторые технологические параметры (среднее арифметическое).
Обычно именно эти задачи решают тренды. Оператор переходит в меню просмотра трендов (https://simple-scada.com/help/manual/client-trends-view.html), задаёт интересующий его интервал времени и видит когда оборудование начало/закончило работать, а при наведении мыши на легенду тренда видит мин., макс., и среднее по тренду за просматриваемый интервал времени. Архивные процедуры (https://simple-scada.com/help/script/work-with-archive.html) не подходят для решения такой задачи, т.к. они работают с данными на всём интервале, а в Вашем случае требуется взять весь интервал заданный пользователем, найти на нём другие "подинтервалы" (например когда оборудование было включено) и для каждого "подинтервала" выполнить действие (например получить время начала/конца работы). Т.е. результат может быть не один, а несколько (для каждого "подинтервала").

Можно включить архивацию у переменной "Пуск/Стоп" оборудования, тогда можно скадой по запросу пользователя делать выборку из БД за любые интервалы времени и выводить результат в таблицу на мнемосхеме. Т.е. получится таблица с перечислением моментов пуска/остановки оборудования за заданный оператором интервал. Но такой способ не позволяет вывести доп. данные (например средн. арифметическое).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: oleger от 26 Октября 2017, 14:37:50
Приветствую.
Начинающий, прошу не пинать :-)
Хочу получить СМС и отобразить его текст в сообщении.
USB-модем E173, сообщения из скады отправляются.
Нужно по таймеру вызывать процедуру GetSMS или скада сама опрашивает модем ?
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Октября 2017, 17:10:17
Хочу получить СМС и отобразить его текст в сообщении.
Нужно по таймеру вызывать процедуру GetSMS или скада сама опрашивает модем ?
Здравствуйте. Да, Вы всё поняли правильно. Достаточно создать внутреннюю переменную с типом Integer и именем например vrTimerSMS. Далее создается новый скрипт с типом события "Прошла секунда" и следующим кодом:
Код: (delphi)
const 
  INTERVAL = 60;  // интервал таймера 60 сек.
begin
  vrTimerSMS.Value := vrTimerSMS.Value + 1;
  if vrTimerSMS.AsInt >= 60 then
  begin
    GetSMS(TRUE, FALSE);   // запрос на чтение и удаление SMS сообщений из памяти SIM-карты
    vrTimerSMS.Value := 0;
  end;
end.

Не рекомендуем читать SMS чаще чем каждые 5 секунд, т.к. модем отвечает не моментально. Теперь создаём новый скрипт с типом события "Получено SMS-сообщение" для обработки полученных SMS-сообщений. Допустим в проекте есть объект Text1 в который мы хотим выводить сообщения (каждое сообщение с новой строки). Тогда код будет таким:
Код: (delphi)
begin
  Text1.Text := Text1.Text + smsTime + ' | ' + smsPhone + ' | ' + smsMsg + Chr(10);
end.
, где Chr(10) - символ переноса строки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: oleger от 27 Октября 2017, 06:14:31
Так работает, спасибо.
А вот если в СМС присылать какой-либо код, вида "ABS.123.1" , что означает "Цех ABC, механизм 123 занял положение 1" - как проще разложить такое по переменным ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 27 Октября 2017, 09:14:03
Можно включить архивацию у переменной "Пуск/Стоп" оборудования, тогда можно скадой по запросу пользователя делать выборку из БД за любые интервалы времени и выводить результат в таблицу на мнемосхеме. Т.е. получится таблица с перечислением моментов пуска/остановки оборудования за заданный оператором интервал. Но такой способ не позволяет вывести доп. данные (например средн. арифметическое).

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

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

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 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.         

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

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

Цитировать
Вопрос такой: возможно ли сделать нечто подобное, как на рисунке?
Да, можно получить очень близкий результат. И проще всего это сделать используя систему отчетов. Достаточно правильно настроить архивацию в БД времени старта и остановки оборудования. Кроме того система отчетов позволяет строить Master-Detail отчеты, которые близки к тому, о чем Вы писали изначально. В таком отчете можно вывести данные каждого подинтервала и доп. расчеты для него (среднее, мин., макс., кол-во, сумму). Для примера мы взяли процесс который периодически запускается и останавливается и построили для него Master-Detail отчет. В отчет выводится отдельно период каждого цикла работы и расчетные данные для каждого цикла (см. скрин во вложении). Если вариант с отчетами подходит, то можем в ближайшее время написать отдельную статью с примером создания такого отчета.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 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 вызывается для каждого слова.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 30 Октября 2017, 09:34:21
Если вариант с отчетами подходит, то можем в ближайшее время написать отдельную статью с примером создания такого отчета.

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

Да, пример очень нужен.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 30 Октября 2017, 15:32:00
Цитировать
Master-Detail - это новый параметр ОТЧЕТА? Есть ли он в описании руководства?
Это отчет, в котором одному выводимому значению из Master источника данных, соответствует какое-то количество значений из Detail источника данных. В руководстве его нет, нам нужно будет написать статью с примером создания такого отчета. Кроме того нужно будет внести мелкие изменения в редактор отчетов, поэтому потребуется время. Внесём изменения и опубликуем статью к концу недели.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 30 Октября 2017, 16:57:33
Внесём изменения и опубликуем статью к концу недели.

Большое спасибо, буду ждать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: georgy от 30 Октября 2017, 17:33:41
Как можно обрабатывать нажатие клавиш с клавиатуры, что-бы переходить с одной страницы на другую ( панель страниц скрыта для увеличения полезной площади экрана) и прыгать из одного поля ввода в другое? К примеру клавиша PgUp для перехода с одной страницы на другую по возрастающей, а PgDn по понижающей, и Tab между полями ввода-вывода.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 30 Октября 2017, 19:22:52
Здравствуйте!

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

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

Ознакомиться с другими горячими клавишами можно здесь (https://simple-scada.com/help/manual/hot-keys.html).

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

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

Для кнопки "На предыдущую страницу"
Код
begin
  GoToPrevPageClient(GetClientName); // переход на предыдущую страницу на клиенте, который вызвал скрипт
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: georgy от 31 Октября 2017, 13:26:15
1) Tab перемещает между полями ввода,но не очень явно видно какое поле выбрано, а тем более через несколько секунд выделение пропадает. Как сделать постоянную подсветку выделенного поля ввода?
2)Сочетание клавиш CTRL + и CTRL - не перемещает между страницами, а включает и выключает режим "Контроль качества"
В чем может быть проблема "не перехода на следующую страницу"?

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

Используется урезанная промышленная клавиатура с PS/2 разъемом где есть кнопки:
1234567890-=Enter,точка,стрелки вверхвнизвправовлево,PgUpPgDn,Backspace
, при выходе которой из строя заменяется на обычную.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 31 Октября 2017, 14:22:52
Здравствуйте!

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

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

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

Цитировать
Хотелось иметь возможность обработки нажатых клавиш.
Такой возможности нет и пока не планируется.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 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
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 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.

Если у Вас много однотипного кода и нужно его сократить, то можно воспользоваться подпроцедурами, как описано здесь (https://simple-scada.com/help/script/code-reduction.html) (т.е. вынести проверку на nil и работу с переменной в подпроцедуру).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: JonyBest от 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
Где ошибка?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Ноября 2017, 10:40:28
Здравствуйте.

Когда Вы связываете компонент "Поле" с какой-то переменной, то при каждом изменении переменной скада будет автоматически выводить в это поле обновленное значение переменной, т.е. будет перебивать Ваш скрипт, что и происходит в Вашем случае. Если нужно вывести на мнемосхему преобразованное значение какой-то переменной, то нужно использовать компонент "Текст", связать его с переменной и на OnDataChange написать скрипт:

Код
var
  q: Single;
  i: Int64;
begin
  i := Text1.AsInt64 mod 222;
  q := i / 10;
  Text1.Text := FloatToStr(q, 1);
end.

Если таких объектов должно быть много, то можно не писать для каждого объекта отдельный OnDataChange-скрипт и воспользоваться универсальным скриптом:
Код
var
  q: Single;
  i: Int64;
  aText: TM_Text;
begin
  if not (Sender is TM_Text) then Exit;
  aText := Sender as TM_Text;
  i := aText.AsInt64 mod 222;
  q := i / 10;
  aText.Text := FloatToStr(q, 1);
end.

Этот скрипт можно расставить на событие OnDataChange множеству объектов "Текст" и он будет работать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: JonyBest от 08 Ноября 2017, 12:25:02
СПС! Так работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bars от 08 Ноября 2017, 12:31:46
Здравствуйте! Подскажите пожалуйста как при помощи переменной можно изменять угол положения изображения. Это необходимо для визуализации положения заслонок.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 08 Ноября 2017, 22:16:15
Здравствуйте!

Для изменения угла наклона изображения используется свойство Angle (https://simple-scada.com/help/script/angle.html). У изображения в свойстве "Переменная" укажите переменную, по которой необходимо изменять угол наклона. Создайте скрипт по событию OnDataChange изображения:
Код
begin
  if Sender is TM_Image then    // проверяем, что Sender это Изображение
    with Sender as TM_Image do  // приводим Sender к типу "TM_Image"
      if AsInt = 1 then         // если значение переменной объекта равно 1, то
        Angle := 90             // изменить угол на 90
      else                      // иначе
        Angle := 45;            // изменить угол на 45
end.

Это универсальный скрипт, который подойдет для любого изображения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 10 Ноября 2017, 09:57:23
Это отчет, в котором одному выводимому значению из Master источника данных, соответствует какое-то количество значений из Detail источника данных. В руководстве его нет, нам нужно будет написать статью с примером создания такого отчета. Кроме того нужно будет внести мелкие изменения в редактор отчетов, поэтому потребуется время. Внесём изменения и опубликуем статью к концу недели.

Здравствуйте, получается ли у вас с дополнением в редакторе отчета?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Ноября 2017, 20:51:14
Цитировать
Здравствуйте, получается ли у вас с дополнением в редакторе отчета?
Здравствуйте. Да, получается, версию скады уже обновили. На выходных опубликуем статью.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alex29 от 11 Ноября 2017, 12:09:05
Здравствуйте. у меня такой вопрос: к примеру имеем несколько страниц визуализации ( т.к на одной всё не уместится), можно ли скриптами (или может еще как) сделать так, чтобы при аварии помимо сообщения еще вверху  мигала бы страница на которой это произошло. если да, поделитесь примером.
 под страницей я имел ввиду мигание вкладки
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Ноября 2017, 11:01:20
Здравствуйте!

Цитировать
можно ли скриптами (или может еще как) сделать так, чтобы при аварии помимо сообщения еще вверху  мигала бы страница на которой это произошло. если да, поделитесь примером.
Это можно сделать только создав прямоугольник с помощью компонента "Фигура (https://simple-scada.com/help/manual/figure.html)" и разместив его поверх вкладки страницы. Затем, создать скрипт с типом события (https://simple-scada.com/help/script/event-types.html) "Изменились переменные"(пример создания такого скрипта можно найти здесь (https://simple-scada.com/help/script/changemulvar.html)). И в этом скрипте описать условия, по которым должен мигать наш прямоугольник, например:

Код
begin
  if (aVar1.AsInt = 1) or (aVar2.AsInt = 2) or (aVar3.AsInt = 3) then
    Shape1.FlashColor := clRed   // включить мигание красным цветом
  else                           // иначе
    Shape1.FlashColor := clNone; // отключить мигание
end.

В будущем планируется добавить возможность перехода к объекту, который вызвал аварию, кликнув на сообщение связанное с этим объектом.

AutoCY, сегодня опубликовали статью (https://simple-scada.com/help/report/cycles-rep.html) с примером создания Master-Detail отчета. Не забудьте скачать последнюю версию скады, иначе отчет будет строиться с ошибкой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alex29 от 13 Ноября 2017, 11:13:26
понял. спасибо. а не планируется ли добавить такую "плюшку" штатно. то есть мигание вкладки на которой сформировался любой аварийный сигнал
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alex29 от 13 Ноября 2017, 13:37:07
попробовал сделать как вы посоветовали. но для прямоугольника не имеет значения находится он на странице или выше на вкладке, его видно только если открыта эта страница, соответственно смысл теряется. мигание нужно видеть не зависимо от какая страница открыта..  может еще что то посоветуете?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AutoCY от 13 Ноября 2017, 16:30:32
Да, получается, версию скады уже обновили. На выходных опубликуем статью.

Просьба, когда опубликуете, укажите ссылку. Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 13 Ноября 2017, 16:50:38
AutoCY, смотрите наш ответ в этой теме выше (ответ #518), ссылка указана. Вот она ещё раз (https://simple-scada.com/help/report/cycles-rep.html).

Цитировать
понял. спасибо. а не планируется ли добавить такую "плюшку" штатно
Мы планируем добавить возможность привязки сообщений к объектам в будущем, но это будет не в ближайшее время. Сейчас основной задачей является разработка web-клиента для скады.

Цитировать
попробовал сделать как вы посоветовали. но для прямоугольника не имеет значения находится он на странице или выше на вкладке, его видно только если открыта эта страница, соответственно смысл теряется. мигание нужно видеть не зависимо от какая страница открыта..  может еще что то посоветуете?
Да верно, т.к. объекты принадлежат страницам/подстраницам на которых созданы, поэтому нужно создавать прямоугольники на каждой странице/подстранице и в скрипте включать/выключать мигание сразу нескольких прямоугольников. Сейчас возможно только такое решение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Golowa70 от 21 Ноября 2017, 15:30:07
Здравствуйте. В редакторе скриптов есть функция " RunApplication" которая может запускать приложение. Вопрос в следующем -
 есть ли возможность закрыть это приложение посредством скриптов?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Ноября 2017, 15:48:07
Здравствуйте.
Отдельной процедуры для закрытия приложения нет. Можно создать .bat-файл который выполняет закрытие приложения и запускать его из скады через RunApplication.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: levchenkoa от 21 Ноября 2017, 17:03:29
Здравствуйте.
Отдельной процедуры для закрытия приложения нет. Можно создать .bat-файл который выполняет закрытие приложения и запускать его из скады через RunApplication.
Использую для этого nircmd.
http://www.nirsoft.net/utils/nircmd2.html
Необходимо добавить путь к nircmd.exe  в переменную Path Системных переменных или просто скопировать в каталог, который уже там обозначен (Например: C:\Windows)
Вызов из скрипта:
Код
begin
  RunApplication(GetClientName, 'nircmd.exe'  , 'killprocess notepad.exe');
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 23 Ноября 2017, 08:25:28
Добрый день! В проекте необходимо работать с базой данных и выводить значения в таблицу в формате столбца. При этом каждый раз количество строк от запроса к запросу в столбце разное. Возникает проблема когда скролл улетает вниз (вручную пролистывается), а на следующем запросе выдаётся, например 3 строки и их из-за скрола внизу не видно. Существует ли возможность скриптом вернуть скролл на первую строку (MiveFirst)?
2. При работе с таблицей приходится использовать переменные. Существует  ли возможность работы с ячейками из скриптов без подвязки переменой?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Ноября 2017, 21:24:54
Здравствуйте.

Цитировать
Возникает проблема когда скролл улетает вниз (вручную пролистывается), а на следующем запросе выдаётся, например 3 строки и их из-за скрола внизу не видно. Существует ли возможность скриптом вернуть скролл на первую строку (MiveFirst)?
Т.е. обновляются данные в таблице через метод Table.RunSQL(...), верно? Скролл должен автоматически перемещаться в самую верхнюю позицию после выполнения метода Table.RunSQL. У Вас этого не происходит?

Цитировать
При работе с таблицей приходится использовать переменные. Существует  ли возможность работы с ячейками из скриптов без подвязки переменой?
Сейчас менять значение в ячейках можно только через переменные. Считывать текст из ячейки можно следующим образом:

Код: (delphi)
var
  aText: UTF8String;
begin
  aText := Table1.GetCell(0, 0).Text;  // получить текст из первой ячейки первого столбца
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Golowa70 от 25 Ноября 2017, 23:21:00
Подскажите пожалуйста. Как свернуть окно клиента в полноэкранном режиме. Кнопка Esc закрывает программу, а вот как свернуть не найду.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Ноября 2017, 09:46:01
Здравствуйте.

Используйте комбинацию клавиш "Ctrl + M". Или создайте в проекте кнопку с таким скриптом:
Код: (delphi)
begin
  MinimizeApplicationClient(GetClientName);
end.
Имя клиента и комбинацию для завершения работы клиента можно изменить через приложение Options (https://simple-scada.com/help/manual/settings-simple-client.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: PonomarevPI от 27 Ноября 2017, 22:10:12
Добрый день!
 Прошу Вас помочь в написании простого скрипта. Имеется связка ПЛК(сервер)-GPRS модем- на объекте ,GPRS модем-Lectus-SimpleScada2 в диспетчерской. Задача - отследить разрыв связи на стороне ПЛК. То есть, необходимо чтобы СКАДА записывала в ПЛК периодически меняющуюся переменную типа boolean. На стороне ПЛК организовать проверку не составляет проблем, а вот со скриптами пока не разберусь... Спасибо!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: levchenkoa от 27 Ноября 2017, 23:27:37
Добрый день!
 Прошу Вас помочь в написании простого скрипта. Имеется связка ПЛК(сервер)-GPRS модем- на объекте ,GPRS модем-Lectus-SimpleScada2 в диспетчерской. Задача - отследить разрыв связи на стороне ПЛК. То есть, необходимо чтобы СКАДА записывала в ПЛК периодически меняющуюся переменную типа boolean. На стороне ПЛК организовать проверку не составляет проблем, а вот со скриптами пока не разберусь... Спасибо!!
Cкрипт с условием "Прошла секунда":
Код: (delphi)
begin
  Tag.Value := InverseBit(Tag.Value, 0);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 28 Ноября 2017, 08:25:44
Здравствуйте!
Прошу помощи. Ребята подскажите как указать в универсальном скрипте координаты  открытия окна. Хочется что бы окно появлялось рядом с кликобельным объектом.
Я так понял что координаты окна только для чтения?.
(https://storage2.static.itmages.ru/i/17/1128/s_1511846469_8900182_9abfcc681f.png) (https://itmages.ru/image/view/6289050/9abfcc68)
Возможно ли открыть этот параметр для записи
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Ноября 2017, 09:55:22
Здравствуйте. В будущих версиях добавим возможность изменения координат окна.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: JonyBest от 01 Декабря 2017, 12:08:46
 Доброго дня! Тема для меня новая, но очень интересно...
Пытаюсь получить значения с термостата. В справочнике написано
Код
Room measure temperature(high byte), data range :0-199 / Room set temperature (low byte), data range :0-199
. В ОРС сервере значение получаю как int16
 Как с помощью скриптов получить значения температур?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Декабря 2017, 12:18:26
Здравствуйте.

Импортируйте переменную с OPC-сервера (https://simple-scada.com/help/manual/variable-import-opc.html) в проект и затем используйте. Например разместите в проекте Поле и свяжите его с переменной. После запуска проекта Вы увидите в поле значение переменной. Также Вы сможете обращаться к переменной через скрипты, например:
Код
begin
  MyVariable.Value := 10; // записываем значение 10 в переменную MyVariable
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: JonyBest от 01 Декабря 2017, 13:01:20
Здравствуйте.

Импортируйте переменную с OPC-сервера (https://simple-scada.com/help/manual/variable-import-opc.html) в проект и затем используйте. Например разместите в проекте Поле и свяжите его с переменной. После запуска проекта Вы увидите в поле значение переменной. Также Вы сможете обращаться к переменной через скрипты, например:
Код
begin
  MyVariable.Value := 10; // записываем значение 10 в переменную MyVariable
end.
Это Вы мне написали? Если да то спасибо, но моя проблема лежит в другой плоскости. Основы я знаю, есть рабочие проекты. Я не пойму как с помощью скриптов получить high byte и low byte из переменной с OPC-сервера...
Мне бы один примерчик, дальше я сам...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 01 Декабря 2017, 13:48:11
Код
Room_measure_temperature.Value := Temperature.AsInt shr 8;
  Room_set_temperature.Value     := Temperature.AsInt and $FF;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Декабря 2017, 13:52:50
JonyBest, неправильно поняли Вас. TeNQ описал верное решение. Также подобный вопрос подробно обсуждался на форуме в этой теме (https://simple-scada.com/forum/index.php?topic=261.msg2415#msg2415).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: JonyBest от 01 Декабря 2017, 15:40:43
Спасибо!
температура на термометре = 22,5
строкой
Код
aText.Text := FloatToStr((aText.AsInt shr 8), 1); 
получаю значение =45.0
где ошибка?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Декабря 2017, 18:43:11
А какое значение имеет переменная в скаде без преобразований?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: JonyBest от 01 Декабря 2017, 20:12:20
значение переменной в скаде 11550
должны получится т1=22,5 т2=15,0
получаются т1=45,0 т2=30
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Декабря 2017, 21:06:54
Значит все считается верно.
Код
11550 = 0010 1101 0001 1110
старший байт = 0010 1101 = 45
младший байт  = 0001 1110 = 30

Может быть Вы что-то напутали с адресацией? Значения у Вас в два раза выше требуемых. Конечно можно разделить их на два: 45 / 2 = 22.5, 30 / 2 = 15, но это не нормально.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: JonyBest от 01 Декабря 2017, 23:09:11
СПС за помощь! Вот инструкция что дал китайский друг
Цитировать
Standard Modbus RTU protocol, serial RS485 with two lines, communicate technical parameter:
Baud rate 9600, 8 data bits, no parity data check , 2 stop bits Please keep Register command 03,
 write single register command 06.

1 .Key-lock, power on off, register address 00:
Key-lock (high byte), 0: unlock, 1:lock;
Power switch: (low byte), 0: power off, 1: power on.

2.Room   measure temperature , room set temperature, register address 01:
Room measure temperature(high byte), data range :0-199, relative temperature : 0-99.5, at this byte “write” No valid;
Room set temperature (low byte), data range :0-199, relative temperature: 0-99.5,
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: JonyBest от 02 Декабря 2017, 10:50:34
Спасибо огромное! Не правильно понял эту фразу.
Последний вопрос, отправить свое значение в контроллер
Код: (delphi)
var
  aHiWord, aLowWord: Word;
begin
  aHiWord := 30*2;  // т1
  aLowWord := 20*2;  // т2
  varDWord.Value := LongWord(aHiWord shl 8) or aLowWord;
правильно?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Декабря 2017, 11:11:24
Правильно, только Вы хотите произвести запись в значение которое приходит с датчика (а запись доступна только в младший байт, для задания температуры).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 08 Декабря 2017, 22:08:40
Здравствуйте.
Ребята прошу помощи. После последнего обновления напрочь отказывается работать наипростейший скрипт.
пример:
Код: (delphi)
begin
  if btnTEST.AsInt = 1 then
    test1.Value:=true
  else
    test1.Value:=false
end.               
где:
btnTEST - кнопка к которой привязана переменная на ПЛК1 не участвующая в этом скрипте
test1 - булевая переменная ПЛК2
Проблема в том что test1 не меняет свое значение при btnTEST = 1
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Декабря 2017, 22:11:53
Это скрипт на событие OnDataChange? Можете выслать проект на почту поддержки для проверки?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 08 Декабря 2017, 22:17:03
Да именно он, проект вышлю
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Декабря 2017, 23:32:41
Скачайте снова лицензионную версию (ссылка и пароль те же). Проблема не должна возникать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maxicooler от 12 Декабря 2017, 20:48:42
Как начинающий спрашиваю. В демо проекте есть 1s процедура SimulationTimer. Как создать такой-же скрипт? у меня выходит только что-то(Sender: TM_Control)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Декабря 2017, 21:03:14
Здравствуйте.

Нужно перейти в меню "Проект - Скрипты", нажать кнопку "Создать новый скрипт" и в открывшемся окне выбрать тип события "Прошла секунда". Типы скриптов описаны здесь (https://simple-scada.com/help/script/event-types.html). Скрипт с таким типом события будет выполняться каждую секунду.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 14 Декабря 2017, 13:20:00
Здравствуйте. Ребята а подскажите как сделать из инструмента "уровень"  что то типа полосы загрузки?

Допустим у меня к "уровню" прикручена переменная типа dword. На эту переменную приходит каждый раз новое значение(значение времени в сек.) для отсчета в обратном порядке. Так как верхняя граница уровня зависит от шкалы переменной у меня полоса загрузки из уровня уберется не равномерно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Декабря 2017, 20:48:17
Здравствуйте. Можно создать копию переменной с другой шкалой, которая подойдёт для полосы загрузки и связать её с уровнем.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: stratixx от 15 Декабря 2017, 01:23:30
Подскажите, как можно реализовать анимацию координатами?
Делал односекундный скрипт по типу
Код: (delphi)
begin
  if line3.Y<900 then
    line3.Y:=line3.Y+80
  else
    line3.Y:=0;
end.
но не то, в идеале бы шаг около 50мс  для плавной анимации  :D Такое возможно? Проект лёгкий, ресурсов не жалко   :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Декабря 2017, 09:34:02
Здравствуйте. Чаще чем раз в секунду сделать нельзя. Плавную анимацию можно реализовать только анимированным изображением (https://simple-scada.com/help/manual/pictures.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 19 Декабря 2017, 12:25:27
Здравствуйте.
Ребята, сегодня добавил вот такой запрос в проект.
Код: (delphi)
var
{Заполняем таблицу tblSpisok_TH03 "Перечень компонентов ручного ввода"}
  aQuery:string;
begin
  aQuery :=    'SELECT    AR.AR_ARTICLE_ID              AS AR_ARTICLE_ID '+
                         ',AR.AR_NAME                   AS AR_NAME'+
                         ',SUM(TMP.TDB_DOSINGWEIGHT)    AS TDB_DOSINGWEIGHT'+
                         ',CASE TMP.TDB_ACTIVE WHEN 1 THEN ''Добавлен'' ELSE '''' end  AS ACTIVE '+
               'FROM TMP_DOSINGBATCHES TMP '+
               'INNER JOIN CFG_BATCHES BD ON BD.BD_PLC_BATCHNUMBER = TMP.TDB_PLC_BATCHNUMBER '+
               'INNER JOIN CFG_RAWMATERIAL RM ON RM.RM_RAWMAT_ID = TMP.TDB_RAWMAT_ID '+
               'INNER JOIN CFG_ARTICLE AR ON AR.AR_ARTICLE_ID = RM.RM_RAWMAT_ID '+
               'WHERE   BD_BATCHNUMBER = (SELECT MAX(BD_BATCHNUMBER) '+
               'FROM CFG_BATCHES '+
               'INNER JOIN TMP_DOSINGBATCHES ON TDB_PLC_BATCHNUMBER = BD_PLC_BATCHNUMBER '+
               'INNER JOIN CFG_WEIGHER ON WG_WEIGHER_ID = TDB_WEIGHER_ID '+
               'INNER JOIN CFG_UNITS ON UN_BATCHNUMBER = BD_BATCHNUMBER '+
               'INNER JOIN CFG_UNIT_DEVICES ON UN_UNIT_ID = UDS_UNIT_ID AND WG_DEVICE_ID = UDS_DEVICE_ID '+
               'AND UN_BATCHNUMBER > 1 '+
               'AND TDB_WEIGHER_ID = 6) '+
               'AND TMP.TDB_WEIGHER_ID = 6 '+
               'AND TMP.TDB_MODIFYTYPE <> ''D'' '+
               'GROUP BY TMP.TDB_PLC_BATCHNUMBER'+
               ',RTRIM(AR.AR_ARTICLECODE)'+
               ',AR.AR_NAME '+
               ',AR.AR_ARTICLE_ID '+
               ',TMP.TDB_WEIGHER_ID '+
               ',TMP.TDB_ACTIVE '+
               'ORDER BY TMP.TDB_PLC_BATCHNUMBER, MIN(TDB_SEQUENCENUMBER) ';

  tblSpisok_TH03.RunSQL(aQuery, tsSaveFixRow);
end.
   

Получается таблица похожая на эту:
+-------------------+---------------------+--------------------------+------------------+                   
|  AR_ARTICLE_ID |       AR_NAME       |  TDB_DOSINGWEIGHT |       ACTIVE       |
+-------------------+---------------------+--------------------------+------------------+
|           32           |  Магния оксид      |                 24.2232      |   Добавлен       |
+-------------------+---------------------+--------------------------+------------------+

Но есть одно Но. Когда запрос выполняется в SQL, все проходит гладко и происходит подстановка
в колонку ACTIVE значения вместо 1 - 'Добавлен', а вместо 0 - пустую строку с помощью  CASE.
Но если тот же запрос выполнять через клиент с автозаполнением таблицы, то в колонке ACTIVE всегда записывается 'Добавлен'
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 19 Декабря 2017, 14:10:24
Все вопрос снят.
Вообщем ситуация следующая. Если в таблицу с автозаполнением вписать статичный текст а при запросе к SQL будет возвращаться пустая строка, то выше указанный статичный текст будет множится на все пустые строки.
(статичный текст вписывал для проб и настройки шрифтов)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Romz_ru от 20 Декабря 2017, 00:28:28
Подскажите пожалуйста, как в редакторе скриптов отменить изменения в коде (обычный Ctrl+Z не работает).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 20 Декабря 2017, 09:01:30
Расскажите пожалуйста более подробно, как (последовательно/параллельно) исполняются скрипты. Какие есть приоритеты исполнения, последовательность и т.п.
Вот, например, у меня есть скрипт, который при изменении переменной делает в цикле несколько однотипных SQL-запросов (инсертов) с разными данными.
Пока работает все норм., но хотелось бы понять саму "механику" работы. Как идут эти запросы в базу? Просто перемещаются в какую-то очередь и исполняются один за другим с ожиданим подтверждения/ошибки исполнения от предидущего или посылаются в базу без ожидания ответа (который просто обрабатывается в другом скрипте по событию).
Может ли быть ситуация, когда один из этих запросов не обработается по причине занятости СУБД обработкой предидущего запроса?
Когда возникает событие "выполнен SQL-запрос" в этой ситуации? Если после выполнения каждого, тода получается, что это событие может прерывать выполнение цикла в текущем скрипте, что врядли. Или же это событие будет наступать только после отправки последнего запроса из цикла и завершения выполнения текущего скрипта.
Вот такого плана информация интересует.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Декабря 2017, 22:00:31
Подскажите пожалуйста, как в редакторе скриптов отменить изменения в коде (обычный Ctrl+Z не работает).
Комбинация Ctrl+Z отвечает за отмену действия. Может быть Вы используете старую версию скады? (отмена действий доступна с версии 2.2.2.0 и выше).
В ином случае убедитесь, что во время нажатия комбинации Ctrl+Z курсор установлен в редактор кода. Используйте комбинацию несколько раз, т.к. перемещения курсора тоже могут считаться за действие.

Расскажите пожалуйста более подробно, как (последовательно/параллельно) исполняются скрипты.
Скрипты выполняются последовательно в том порядке, в котором были вызваны. Запросы к БД ставятся в очередь, а затем выполняются в отдельных потоках параллельно. После выполнения любого из запросов вызываются скрипты с типом "Выполнен SQL-запрос". При возникновении ошибки во время выполнения SQL-запроса вызываются скрипты с типом "Ошибка SQL-запроса".

Цитировать
Может ли быть ситуация, когда один из этих запросов не обработается по причине занятости СУБД обработкой предидущего запроса?
Нет, иначе работа с СУБД была бы крайне ненадежной.

Цитировать
Когда возникает событие "выполнен SQL-запрос" в этой ситуации? Если после выполнения каждого, тода получается, что это событие может прерывать выполнение цикла в текущем скрипте, что врядли. Или же это событие будет наступать только после отправки последнего запроса из цикла и завершения выполнения текущего скрипта.
В этом случае сначала пройдет весь цикл, запросы добавятся в очередь и скрипт завершится (это займёт миллисекунды). Далее скада будет брать сразу несколько запросов и выполнять их в отдельных потоках параллельно. Тот, который выполнится первым вызовет событие "выполнен SQL-запрос" первым. Выполнится вторым, вызовет "выполнен SQL-запрос" вторым и т.д.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreiKov от 20 Декабря 2017, 22:47:43
Добрый день.
Возможно ли в скрипте получить текущее количество неподтвержденных или активных сообщений?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 21 Декабря 2017, 08:58:22
А есть какая-нибудь команда для открытия(показа) окна?
Например, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreiKov от 21 Декабря 2017, 11:16:41
А есть какая-нибудь команда для открытия(показа) окна?
Например, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.
https://simple-scada.com/help/script/tmwindow.html
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 21 Декабря 2017, 11:26:16
Здравствуйте!

Цитировать
Возможно ли в скрипте получить текущее количество неподтвержденных или активных сообщений?
Нет. Пожалуйста опишите для чего это может потребоваться?

Цитировать
Например, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.
Victor_P., для этой цели лучше подойдут процедуры ShowMessageClient (https://simple-scada.com/help/script/showmessageclient.html)и ShowMessageAll (https://simple-scada.com/help/script/showmessageall.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreiKov от 21 Декабря 2017, 12:13:17
Нет. Пожалуйста опишите для чего это может потребоваться?
После подтверждения сообщения оператор может забыть(или не передать по смене), что событие ещё активно.
Нужно отображать предупреждение, если есть активные сообщения(неустранённые аварии).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 21 Декабря 2017, 12:22:19
Для этого можно использовать компонент "Список сообщений (https://simple-scada.com/help/manual/message-viewer.html)", выбрав в свойстве "Группа" пункт "Активные сообщения", тогда в списке будут отображаться только активные сообщения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreiKov от 21 Декабря 2017, 12:52:13
Для этого можно использовать компонент "Список сообщений (https://simple-scada.com/help/manual/message-viewer.html)", выбрав в свойстве "Группа" пункт "Активные сообщения", тогда в списке будут отображаться только активные сообщения.
Это понятно. Но хочется сделать как на картинке, компактную кнопку, появляющуюся, если есть активные сообщения.
Список сообщений занимает много лишнего места и отображает пустоту, когда активных сообщений нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Декабря 2017, 13:09:10
AndreiKov в ближайшем обновлении добавим функцию которая позволит реализовать описанное.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 19 Января 2018, 16:28:47
Подскажите, как сделать переключатель.
Например, у меня есть 5 кнопок (bt0 .. bt4) и переменная Val типа byte. Кнопки привязаны к переменной, каждая к своему биту (0 .. 4) и в их свойствах прописаны тиги (0 .. 4).
На обработчик события OnClick каждой кнопки повешен скрипт:
Код
if not GetBit(Val.AsInt, Sender.Tag) then Val.Value := 0;
Все работает,- при нажатии на каждую кнопку, лбая другая нажатая отжимается, но...! Если я нажимаю на нажатую кнопку, то она тоже отжимается.
Как сделать, чтобы нажимались только отжатые кнопки, а при нажатии на нажатую она не реагировала? Т.е. как сделать переключатель, в котором одна кнопка обязательно должна быть нажата?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 19 Января 2018, 17:55:30
Victor_P., эги  кнопок по значениям битов: 1, 2, 4, 8, 16. Обработчик событий OnClick и OnMouseUp:
Код: (delphi)
Val.Value := Sender.Tag;
Первый изменяет вид кнопки при нажатии, а второй - фиксирует нажатую кнопку.
Пример во вложении. Обратите внимание на возможность любой исходной комбинации включенных кнопок (!).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Января 2018, 18:47:34
Victor_P., можно не использовать свойство "Бит" которое есть у кнопок, а вместо этого записывать в переменную Val число в котором включен только один бит. Возьмем двоичные числа в которых включен только один бит и посмотрим чему они равны:
00000001 = 1
00000010 = 2
00000100 = 4
00001000 = 8
00010000 = 16
...и так далее. Т.е. чтобы включить второй бит и выключить все остальные достаточно записать в переменную Val число 2. Чтобы включить четвертый бит и выключить остальные нужно записать число 8. Поэтому можно не использовать свойство кнопок "Бит", а вместо этого просто оставить у кнопок одно состояние с нужным значением. Кнопка bt0 должна присваивать значение равное 1. Кнопка bt1, значение 2. Кнопка bt2, значение 4. Кнопка bt3, значение 8. Кнопка bt4, значение 16. Т.е. нажатие на любую кнопку оставит включенным только один бит. Правда в этом случае нужно поставить на событие OnDataChange кнопок один универсальный скрипт для "подсветки" включенного бита. Ещё вместо пяти кнопок можно использовать один компонент "Список", который отлично подойдёт в роли переключателя (он им и является по сути). Посмотрите пример во вложении, в нём реализован переключатель битов на основе кнопок и на основе списка. Напишите, если что-то непонятно.

* перед запуском демо-проекта откройте его в редакторе и пересохраните.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 22 Января 2018, 09:33:51
pan2000, спасибо, работает.
Simple-Scada, я сначала так и делал, только записывал кнопками значение в переменную 1, 2, 3, ... (мне не принципиально что записывать биты или значения),
но в этом случае при нажатии одной кнопки остальные становились не активными (прикрепил скриншоты).
Я так понял, вы предлагаете вообще не привязывать переменную к кнопкам, а значение присваивать скриптом.
Пример ваш не открылся, пишет сделан в версии 2.2.7.1, а у меня 2.2.7.0
Кстати, а почему кнопки становятся не активными, если привязання к ним переменная принимает значение не равному одному из состояний кнопки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Января 2018, 09:46:25
Цитировать
но в этом случае при нажатии одной кнопки остальные становились не активными (прикрепил скриншоты).
Правильно, потому что у этих кнопок нет состояния для текущего значения переменной. Т.е. кнопка находится в одном из недопустимых состояний, поэтому она блокируется.

Цитировать
Пример ваш не открылся, пишет сделан в версии 2.2.7.1, а у меня 2.2.7.0
Скачать последнюю версию можно с сайта. Если у Вас лицензионная версия, то напишите на support@simple-scada.com.

Цитировать
Я так понял, вы предлагаете вообще не привязывать переменную к кнопкам, а значение присваивать скриптом.
Нет, все делается как обычно, только у кнопок оставляется только одно состояние. Проще понять если посмотреть пример, он очень простой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 22 Января 2018, 11:14:17
Спасибо, с примером стало понятно.
Сделал аналогичным образом у себя в проекте, все работает.
А вот сам пример ведет себя не адекватно (возможно только у меня на машине),- при выборе в комбобоксе все норм,
а вот при клике по кнопке вываливается с ошибкой, при этом при попытке нажать PrintScreen уводит винду в BSOD.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Января 2018, 11:23:53
Цитировать
А вот сам пример ведет себя не адекватно (возможно только у меня на машине),- при выборе в комбобоксе все норм,
а вот при клике по кнопке вываливается с ошибкой, при этом при попытке нажать PrintScreen уводит винду в BSOD.
Это из-за того что мы сохранили его своей отладочной версией редактора. Откройте проект и пересохраните его в Редакторе на Вашем ПК. Тогда он должен работать корректно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 22 Января 2018, 11:41:43
Пересохранение не помогло.
Заметил, что в свойствах кнопок состояние указано как "Отпущена", хотя включен английский интерфейс и остальные свойства как кнопок так и других обьектов указываются на английском. Переключил систему на русский (думал, что причина в этом), но это тоже не помогло.
Собственно работоспособность данного примера мне и не нужна, что мне было в нем нужно я увидел, но если есть желание разобраться в причине такого поведения, то можем попробовать что-нибудь еще :) Если есть варианты.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Января 2018, 13:57:25
Victor_P., исправили ошибку с отображением кнопок с одним состоянием. Архив со скадой обновили.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 22 Января 2018, 14:30:31
Здравствуйте.
Уважаемые разработчики, возможно ли добавить выделение цветом строки в таблице с автозаполнением.

Мое видение:
Есть таблица с автозаполнением. В этой таблице есть управляющий столбец который отвечает за выдиление цветом строки .
Если в этом столбце имеется ячейка со значением TRUE значит строка выделяется цветом
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Января 2018, 10:10:59
Здравствуйте.
Мы планируем расширение возможностей таблицы, но только после внедрения веб и OPC-UA. Ваше предложение рассмотрим.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 08 Февраля 2018, 11:19:59
Подскажите ! А можно ли на один объект с одной булевой переменной написать 2 или более скрипта ? Например - при переменной = 1 начинает моргать и воспроизводит звуковой файл . Или лучше от доп. переменной ?

И ещё . Есть где скачать  изображения и анимации ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 09 Февраля 2018, 10:48:37
Здравствуйте!

Цитировать
А можно ли на один объект с одной булевой переменной написать 2 или более скрипта ? Например - при переменной = 1 начинает моргать и воспроизводит звуковой файл . Или лучше от доп. переменной ?
Можно, но для описанной Вами задачи это не имеет смысла. Если нужно, чтобы объект при изменении значения связанной с ним переменной начинал мигать цветом, то Вам необходимо написать скрипт на событие (https://simple-scada.com/help/script/event-types.html) OnDataChange объекта - пример скрипта мигания цветом можно найти здесь (https://simple-scada.com/help/script/flashing.html). Воспроизвести/остановить воспроизведение звукового файла можно при помощи процедур для работы со звуком (https://simple-scada.com/help/script/sound.html).

Цитировать
И ещё . Есть где скачать  изображения и анимации ?
В этой (https://simple-scada.com/forum/index.php?topic=153.0) и этой (https://simple-scada.com/forum/index.php?topic=12.0) темах можно найти изображения и анимацию, которыми поделились пользователи форума.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 09 Февраля 2018, 18:20:21
Спасибо . А можно ли сделать звуковую сигнализацию при потере связи с контроллером ( ПЛК100 Ethernet ) ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 10 Февраля 2018, 21:08:01
Цитировать
А можно ли сделать звуковую сигнализацию
Код: (delphi)
begin
  if MyVar.IsGoodQuality = False then // Где MyVar Ваша переменная на ПЛК
  AddMessage(Now, mkAlarm, 'Нет связи с ПЛК!', True, True);
end.
https://simple-scada.com/help/script/varisgoodquality.html
https://simple-scada.com/help/script/addmessage.html
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 16 Февраля 2018, 14:28:23
Код на событие OnDataChange:
Код: (delphi)
var
  aImg: TM_Image;

begin
  if not (Sender is TM_Image) then Exit;
  aImg := Sender as TM_Image;

  if aImg.AsBool then aImg.AnimSpeed := 12
  else
    begin
      aImg.AnimSpeed := 0;
      aImg.Frame := 4;
    end;
end.
не выставляет рисунок в 4 кадр при остановке анимации.
Почему?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Февраля 2018, 22:04:44
Victor_P., спасибо, исправили. Обновление опубликуем на след. неделе.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 18 Февраля 2018, 22:00:56
Здравствуйте! Помогите разобраться с работой процедуры PlayUserSound. Хотел сделать скрипт "Изменились переменные", в котором в цикле пробегаются все биты слова хранящего состояние датчиков уровня, и если бит true, загорается лампочка и проигрывается моё сообщение "Бункер заполнен". Сделал тестовый проект с одной лампочкой и скриптом + на лампочку для пробы звука сделал скрипт по OnClick c кодом
Код
PlayUserSound('KHP','du1_0.ogg',false);
. При нажатии на лампочку звук проигрывается, всё хорошо. Когда ставлю бит в 1, лампочка загорается зелёным, но звук не проигрывается почему-то. Но самое интересное, что если закрыть клиент и запустить его снова когда бит в 1 - лампочка становиться зелёной и звук проигрывается. Если после этого снова сбросить бит в 0 и поставить в 1, опять только загорается лампочка. Не могу понять почему всё работает только однократно при запуске проекта. Код скрипта прилагаю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 19 Февраля 2018, 10:01:53
Здравствуйте.

Взяли Ваш код без изменений. Проигрывание работает как на клик, так и на OnDataChange. Может быть в первом случае в качестве имени клиента используются русские буквы "КНР" (ка, эн, эр), а во втором английские (кей, эйч, пи)? Тогда будет работать только один скрипт. Если же все имена заданы в одной и той же раскладке, то вышлите нам проект на support@simple-scada.com для проверки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 19 Февраля 2018, 17:37:50
Добрый день. Разобрался, всё оказалось ещё проще. Я не знал что в фоне звук не воспроизводится  :-[ Открывал клиента, вызывал окно симулятора ПЛК, устанавливал бит в 1 и просто наблюдал как загорается лампочка, звук не слышал т.к. активным было окно симулятора а не клиент. Теперь всё понятно, спасибо за помощь! Теперь операторы не смогут сериалы смотреть во время работы - аварию не услышат  ;D
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 20 Февраля 2018, 10:40:35
Я не знал что в фоне звук не воспроизводится
А вот это кстати плохо, что в фоне не воспроизводится
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 20 Февраля 2018, 10:53:33
Миханик, ИМХО, сворачивание скады в фон равнозначно уходу оператора с рабочего места. Этого нельзя делать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreiKov от 20 Февраля 2018, 13:23:07
Victor_P., а может оператор отчёт в Экселе просматривает, звук в фоне однозначно должен быть.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 21 Февраля 2018, 05:48:49
Victor_P., а может оператор отчёт в Экселе просматривает, звук в фоне однозначно должен быть.
поддерживаю. Либо разработчику должен быть предоставлен выбор: воспроизводить звук в фоне или нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 22 Февраля 2018, 16:48:28
При открытой скаде звук работает , согласно скрипту , согласно значению переменной . Если окно свернуть , звук пропадает .
Как сделать , чтобы воспроизведение звука было слышно и при свёрнутой программе ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Февраля 2018, 09:44:24
serg, звуки не воспроизводятся когда окно скады не в фокусе.

UPD: Начиная с версии 2.3.6.11 звук на клиентах воспроизводится всегда (независимо от состояния окна).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 26 Февраля 2018, 18:52:25
Подскажите . На скаде хочу сделать 3 кнопки без фикации и одно поле . При нажатии кнопок в поле должно показывать номер кнопки 1 - 3 и отправлять в контроллер .  Не могу разобраться с тем как это сделать . Я так понял нужно три виртуальных переменных для каждой кнопки и привязать их к переменной поля . А как написать скрипт не разберусь .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreiKov от 26 Февраля 2018, 22:58:52
serg, для описанной задачи не требуются ни три виртуальных переменных, ни скрипт. Нужна только одна переменная, связанная с соответствующим OPC-тегом.
Поле и три кнопки с фиксацией! (читайте Руководство (https://simple-scada.com/help/manual/button.html)) привязываете к этой переменной. У кнопок оставляете по одному состоянию со значениями 1,2,3 соответственно. Всё.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 27 Февраля 2018, 10:39:26
AndreiKov. Спасибо за помощь ! Всё получилось .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Ragnarok от 01 Марта 2018, 12:10:48
Помогите с кодом. Есть 6 переменных типа Smallint. Задача: если значение хотя бы одной переменной равно -1, то должно выполниться действие, изменить цвет или вывести сообщение. Неважно какое действие, важен сам скрипт.
Название: Re: Советы по использованию скриптов в Simple-Scada 2
Отправлено: Пишу диплом от 01 Марта 2018, 12:41:17
Пишу дипломный проект, в котором присутствует автоматизированное управление котлоагрегатом и параметрическая диагностика.
Возник вопрос: как написать скрипт для управления над заслонкой?
еcolor=red]Есть заслонка, к нему прикрепил Поля(Field)- значения параметров и  три кнопки ( Откр, Стоп, Закр) - нужно чтобы заслонка меняла цвет в зависимости от нажатия кнопок и значение в Поле(Field) увеличивалась/уменьшалась при открытии/закрытии заслонки, а при нажатии СТОП сохраняла последнее значение. СКРИНШОТ 1
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 01 Марта 2018, 16:34:32
Помогите с кодом.
Создаем скрипт с запуском по изменению переменной. Добавляем в него все необходимые переменные, как описано здесь (https://simple-scada.com/help/script/changemulvar.html).
Создаем в нем процедуру с необходимым кодом.
Код скрипта:
Код: (delphi)
    { Variable - это та переменная, которая изменилась }
    if Variable.AsInt = -1 then
    begin
      // ...
    end;
, код между begin...end будет выполняться каждый раз когда любая переменная из заданного списка стала равна -1.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Ragnarok от 02 Марта 2018, 08:29:15
Создаем скрипт с запуском по изменению переменной.
Это не совсем то, что нужно. Например:
Код: (delphi)
begin
    if Variable.AsInt = -1 then
       text1.FontColor := clRed;
end.
Переменная стала -1, скрипт выполнился и цвет текста стал красным. Переменная стала 0, но цвет текста по-прежнему красный. Если делать так:
Код: (delphi)
begin
  if Variable.AsInt = -1 then
    text1.FontColor := clRed
  else
    text1.FontColor := clGreen;
end.
тогда переменная равна -1, цвет изменился, но другая переменная изменила значение, скажем стала 0, цвет меняется на зеленый, хотя одна из переменных по-прежнему равна -1.

Для себя сделал по-другому. Секундный скрипт с кодом:
Код: (delphi)
begin
  if (aVar1 = -1) or (aVar2 = -1) or (aVar3 = -1) or (aVar4 = -1) or (aVar5 = -1) or (aVar6 = -1) then
    Text1.fontColor := clRed
  else Text1.FontColor := clBlack;
end;
Теперь цвет красный, если хотя бы одна из переменных равна -1.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 02 Марта 2018, 08:39:37
Ragnarok, а почему секундный?
Сделайте все то-же самое, но в скрипте по изменению переменной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Марта 2018, 08:54:40
Цитировать
Сделайте все то-же самое, но в скрипте по изменению переменной.
Именно, а секундный скрипт будет впустую расходовать ресурсы.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Ragnarok от 02 Марта 2018, 08:55:52
Кстати, да. Так лучше. Так и сделаю
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Марта 2018, 10:02:34
Пишу дипломный проект, в котором присутствует автоматизированное управление котлоагрегатом и параметрическая диагностика.
Возник вопрос: как написать скрипт для управления над заслонкой?
еcolor=red]Есть заслонка, к нему прикрепил Поля(Field)- значения параметров и  три кнопки ( Откр, Стоп, Закр) - нужно чтобы заслонка меняла цвет в зависимости от нажатия кнопок и значение в Поле(Field) увеличивалась/уменьшалась при открытии/закрытии заслонки, а при нажатии СТОП сохраняла последнее значение. СКРИНШОТ 1
Вы можете просто связать поле, заслонку и кнопки "Открыть" и "Закрыть" (кнопки должны быть без фиксации) с одной целочисленной переменной. Первая кнопка должна записывать единицу в переменную. Вторая - ноль. Заслонка будет автоматически менять цвет на зелёный когда открыта и на серый когда закрыта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: tgeka86 от 22 Марта 2018, 09:05:47
Здравствуйте! Обнаружился неприятный баг в версии 2.2.7.1:
Необходим универсальный скрипт, который обрабатывал бы два DI сигнала и менял цветовую индикацию разгных объектов. Пусть будут два сигнала DI_1 и DI_2. На основную переменную - DI_1, на дополнительную - DI_2. Объекты Клапан и Изображение.
Цветовая схема:
Код
Если DI_1 = 1 DI_2 = 0 - зелёный цвет;
Если DI_0 = 1 DI_2 = 1 - серый цвет;
Если DI_1 = 1 DI_2 = 1 - красный цвет;
Если DI_1 = 0 DI_2 = 0 - серый цвет, жёлтое моргание;
Пишем скрипт (листинг ниже) и подвязываем его на оба события по основному и дополнительному тэгу. С приведённым листингом - объект изображение отрабатывает правильно по цветовой схеме, а вот клапан - нет.
Клапан работает двояко: если был сигнал DI_1 = 0, DI_2 = 1, пришло событие DI_1 = 1 - клапан становится зелёным (так не должно быть), а изображение - красным (как и положено).
Если был сигнал DI_1 = 1, DI_2 = 0, пришло событие DI_2 = 1 - клапан становится карсным как и положено.
Другие переменные на клапан не подвязывались.

Листинг:
Код: (delphi)
var
Color1_0, Font1_0, Color0_1, Font0_1, Color1_1, Font1_1, Color0_0, Font0_0, Flash1_1, Flash0_0:  Cardinal;
begin
Color1_0 := $00CE00;    //Green
Font1_0  := clBlack;
Color0_1 := clLightGray;
Font0_1  := ClBlack;
Color1_1 := ClRed;    //Green
Font1_1  := clBlack;
Color0_0 := clLightGray;
Font0_0  := clBlack;
Flash1_1 := ClNone;
Flash0_0 := clYellow;
//Если вызвавший объект - изображение
if Sender is TM_Image then
  with Sender as TM_Image do
    begin
      if  ((Variable.AsBool = true) AND (VariableEX.AsBool = false)) then
        begin
        Alpha := 255; Color := Color1_0;
        FlashColor := clNone;
        end;
      if  ((Variable.AsBool = false) AND (VariableEX.AsBool = true)) then
        begin
        Alpha := 255; Color := Color0_1;
        FlashColor := clNone;
        end;
      if  ((Variable.AsBool = true) AND (VariableEX.AsBool = true)) then
        begin
        Alpha := 255; Color := Color1_1;
        FlashColor := Flash1_1;
        end;
      if  ((Variable.AsBool = false) AND (VariableEX.AsBool = false)) then
        begin
        Alpha := 255; Color := Color0_0;
        FlashColor := Flash0_0;
        end;
    end;
//Если вызвавший объект - клапан
if Sender is TM_Valve then
  with Sender as TM_Valve do
    begin
      if  ((Variable.AsBool = true) AND (VariableEX.AsBool = false)) then
        begin
        Alpha := 255; Color := Color1_0;
        FlashColor := clNone;
        end;
      if  ((Variable.AsBool = false) AND (VariableEX.AsBool = true)) then
        begin
        Alpha := 255; Color := Color0_1;
        FlashColor := clNone;
        end;
      if  ((Variable.AsBool = true) AND (VariableEX.AsBool = true)) then
        begin
        Alpha := 255; Color := Color1_1;
        FlashColor := Flash1_1;
        end;
      if  ((Variable.AsBool = false) AND (VariableEX.AsBool = false)) then
        begin
        Alpha := 255; Color := Color0_0;
        FlashColor := Flash0_0;
        end;
    end;
end.
P.S.: у нас приобретены лицензии Simple Scada 2.2.7.1. версии Professional (с расиренной техподдержкой, ФКП "Комбинат "Каменский").
Просим также прислать последниие версии скады (ссылки наскачивание) на наш email.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 22 Марта 2018, 09:17:27
По данному вопросу (баг с клапаном) може писать также на мой email (до этого отписался мой коллега)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Марта 2018, 09:25:05
Здравствуйте.

Здесь нет ошибки. Когда Вы связываете клапан с переменной - он автоматически начинает менять цвет в зависимости от значения этой переменной. Прочтите эту статью (https://simple-scada.com/help/manual/valve.html). Т.е. встроенное поведение клапана перекрывает действия скрипта. Чтобы клапан не менял цвет автоматически нужно разорвать его связь с переменной. Для Вашей задачи возможно будет проще вместо стандартного клапана использовать компонент "Изображение" с текстурой клапана.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 22 Марта 2018, 09:36:05
Хорошо. Я это предполагал. Существуют ли планы добавить вторую дополнительную переменную к некоторым объектам? Это бы решило очень много проблем. Или добавить  отключение основной переменной от функционала клапанов, кнопок (и т.д.)?
Хочется работать с концепцией универсальных скриптов. Но одна доп переменная для многих задач это слишком мало. Часто сталкиваемся с тем что приходится писать неуниверсальные скрипты и добавлять тонны листинга с повторяющимся текстом и разницей лишь в названиях двух -трёх переменных.
Как ещё один вариант - сделать событие - изменилось значение переменных из списка.
С использованием изображений для этой задачи тоже не всё так просто: как только встаёт задача использования флешинга - возникают некоторые сложности с цветом (у меня было сообщение по этому поводу на примере трёхходового клапана, который мы нарисовали сами).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Марта 2018, 09:39:41
Цитировать
Как ещё один вариант - сделать событие - изменилось значение переменных из списка.
Такое событие есть начиная с версии 2.2.6.0. Пример реализации подробно описан здесь (https://simple-scada.com/help/script/changemulvar.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: GEW от 22 Марта 2018, 09:45:10
Я имел ввиду сделать подобное в свойствах объекта. Скриптом мы сейчас так и будем переделывать проект, просто когда несколько сотен таких связанных логикой переменных, заводить под них сотню дополнительных Result не слишком удобно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 22 Марта 2018, 19:27:16
У меня есть кнопка с аналоговым входом AI15 .получение сигнала AI15 для активации других кнопок какой скрипт следует писать для первой кнопки ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 22 Марта 2018, 20:44:40
как добавить паузу между Button14 и Button1  Я хочу, чтобы пауза составляла около 10 секунд
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Марта 2018, 09:50:32
Я имел ввиду сделать подобное в свойствах объекта. Скриптом мы сейчас так и будем переделывать проект, просто когда несколько сотен таких связанных логикой переменных, заводить под них сотню дополнительных Result не слишком удобно.
Рассмотрим вариант с добавлением произвольного количества доп. переменных для каждого объекта.

У меня есть кнопка с аналоговым входом AI15 .получение сигнала AI15 для активации других кнопок какой скрипт следует писать для первой кнопки ?
Не понятен Ваш вопрос. Нужно нажать другие кнопки при включении переменной AI15?

как добавить паузу между Button14 и Button1  Я хочу, чтобы пауза составляла около 10 секунд
Только через таймеры. Т.е. создать новую внутреннюю переменную vrTimer с типом данных Integer. На скрипт Button20_OnDataChange пишем код:
Код: (delphi)
begin
  Button14.Value := 0;
  vrTimer.Value := 10;
end.

Далее создаем такой секундный скрипт:
Код: (delphi)
begin
  if vrTimer.AsInt > 0 then
  begin
    vrTimer.Value := vrTimer.Value - 1;
    if vrTimer.AsInt = 0 then
      Button1.Value := 0;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 17 Апреля 2018, 04:04:29
Подскажите , как переменную типа REAL  (codesys ) вывести на скаду ?

Хочу вывести показания температуры с двумя знаками после запятой . В codesys есть переменная тип REAL , а в simple-scada SINGLE . Думаю , надо   в codesys real умножить на 100 и преобразовать в integer , а в скаде integer преобразовать в single и разделить на 100 . Не могу разобраться со скриптом преобразования типов (Преобразует целое число Value в строку).

Или как-то делается по другому .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpvit от 17 Апреля 2018, 06:44:15
Подскажите , как переменную типа REAL  (codesys ) вывести на скаду ?

Хочу вывести показания температуры с двумя знаками после запятой . В codesys есть переменная тип REAL , а в simple-scada SINGLE . Думаю , надо   в codesys real умножить на 100 и преобразовать в integer , а в скаде integer преобразовать в single и разделить на 100 . Не могу разобраться со скриптом преобразования типов (Преобразует целое число Value в строку).

Или как-то делается по другому .
а через какой opc передаете в скаду переменную? как она представлена в opc? Скажу на своем примере - у меня базис-21 контроллеры передают тоже в основном данные в формате реал, но через свой родной opc, в скаде вообще ничего не трогаю за исключением шкал. А modbus tcp устройства уже идут через aropc и вот для них нужно каждую переменную настраивать: масштабировать, подбирать порядок байт. Эт все к чему - скада всего лишь отображает то что ей передают, поэтому смотрите на opc сервер как он передает данные скаде
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 17 Апреля 2018, 16:06:36
ОРС от codesys .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 19 Апреля 2018, 09:54:50
Здравствуйте!

Цитировать
Подскажите , как переменную типа REAL  (codesys ) вывести на скаду ? Хочу вывести показания температуры с двумя знаками после запятой . В codesys есть переменная тип REAL , а в simple-scada SINGLE . Думаю , надо   в codesys real умножить на 100 и преобразовать в integer , а в скаде integer преобразовать в single и разделить на 100 . Не могу разобраться со скриптом преобразования типов (Преобразует целое число Value в строку).
Для вывода любой переменной (в том числе и с типом Real) в скаду не требуется использование скриптов. Если у Вас на OPC-сервере переменная настроена правильно и имеет тип Real, то можно:


Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 19 Апреля 2018, 22:44:46
Спасибо , разобрался .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: aleks218 от 27 Апреля 2018, 15:25:50
Добрый день!
Не подскажите в чём может быть ошибка не компилируется скрипт в  строке "UTF8Delete(aVar.AsUTF8String,30,i-30);"
Пишет Types if actual and formal var parameters must be identical
Код: (delphi)
var 
    aText: TM_Text;
    aVar: TM_Variable;
    s: string;
    i: integer;
begin
    aText := GetTextByName('TextV'+ IntToStr( Field1namevyt.Tag));  // ищем объект "Текст" с именем "TextV(I)"
    aVar:= GetVariableByName('Name_vyt'+ IntToStr( Field1namevyt.Tag));
    aVar.Value:= Name_vyt.Value ;
    i:= UTF8Length (aVar.AsUTF8String);
    if i > 30 then
      UTF8Delete(aVar.AsUTF8String,30,i-30);

    if FileExists('Ventyleit_'+ IntToStr( Field1namevyt.Tag)+'.txt', '') then
    begin
       TextFileOpen('Ventyleit_'+ IntToStr( Field1namevyt.Tag)+'.txt','' , fomRewrite, fcpUTF8);   // открываем файл для чтения
       TextFileWriteLn(aVar.AsUTF8String);
       TextFileClose;   // закрываем файл
    end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TeNQ от 27 Апреля 2018, 22:10:50
Непонятно почему, но компилятору не нравится преобразование типа переменной aVar в параметрах функции в данном случае. Если использовать промежуточную переменную, то код компилируется.
Код: (delphi)
var
  aTry: utf8string;
begin 
  aTry := aVar.AsUTF8String;
  if  i > 30 then
    UTF8Delete(aTry, 30, i-30);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Апреля 2018, 09:54:45
Процедура UTF8Delete (https://simple-scada.com/help/script/utf8delete.html) объявлена так:
Код: (delphi)
procedure UTF8Delete(var AStr: UTF8String; AFrom, ACount: Integer);
, перед параметром AStr стоит ключевое слово "var", это означает, что параметр должен быть передан по ссылке (работа напрямую с переменной), а не по значению (работа с локальной копией переменной). Т.е. данная процедура возьмёт указанную строковую переменную и будет работать с ней напрямую, меняя её. Поэтому передать свойство "aVar.AsUTF8String" в эту процедуру нельзя, нужно обязательно передавать переменную. Верное решение предложил TeNQ выше, нужно объявить отдельную строковую переменную и получить в неё значение "aVar.AsUTF8String", затем работать с этой переменной удаляя в ней символы.
Название: LongWord
Отправлено: kedr от 04 Мая 2018, 12:57:14
Два вопроса:
1. Типу переменной LongWord какой тип соответствует в Object Pascal? Есть ли что-то типа TM_Variable.AsLongWord ?
2. Если в скрипте в цикле несколько сотен раз читается/пишется TM_Variable.Value, имеет ли смысл заводить локальную переменную (lVar:=Sender.Value в начале и Sender.Variable.Value:=lVar в конце скрипта), или обращения непосредственно к свойству .Value достаточно эффективны?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 04 Мая 2018, 21:14:31
Цитировать
1. Типу переменной LongWord какой тип соответствует в Object Pascal? Есть ли что-то типа TM_Variable.AsLongWord?
Если объявляете локальную переменную в скрипте, то можно так и объявлять: "MyVar: LongWord;". При взятии значения переменной используйте TM_Variable.AsInt64.

Цитировать
Если в скрипте в цикле несколько сотен раз читается/пишется TM_Variable.Value, имеет ли смысл заводить локальную переменную (lVar:=Sender.Value в начале и Sender.Variable.Value:=lVar в конце скрипта), или обращения непосредственно к свойству .Value достаточно эффективны?
Идеальный вариант по производительности: взять значение перед циклом в локальную переменную и работать с ней, например:
Код: (delphi)
var
  i: integer;
  aValue: Integer;
begin
  aValue := myVariable.AsInt;
  for i := 0 to 1000000 do
  begin
    // здесь работаем с aValue вместо myVariable.AsInt
  end;
end.
Такой вариант быстрее, но вряд ли удастся заметить прирост в производительности "на глаз".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: atomix от 10 Мая 2018, 20:22:37
Как реализовать вот такое в скриптах (т.е. работа с СОМ объектами).

Код: (delphi)
V := CreateOleObject('PDFCreator.clsPDFCreator');
V.Test('ok test.');

Пишет ошибку "need insert 'IMPORT_ActiveX.pas'"
очень такое нужно, если это получится то я все проекты переведу на вашу скаду (мне она понравилась).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kedr от 10 Мая 2018, 22:32:51
Можно ли в скрипте пробежаться по всем переменным проекта, группы или тем, у которых имя начинается с определённой строки?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 11 Мая 2018, 10:35:46
atomix, на следующей неделе опубликуем обновление. В нём будет добавлена поддержка работы с COM-объектами.

Можно ли в скрипте пробежаться по всем переменным проекта, группы или тем, у которых имя начинается с определённой строки?
Нет, это невозможно. Если переменные имеют однотипные имена отличающиеся только номером, то можно перебрать переменные в цикле получая их по имени через функцию GetVariableByName, но это плохой вариант по производительности даже несмотря на то, что GetVariableByName выполняет поиск по хеш-таблице.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kedr от 11 Мая 2018, 14:40:53
Нет, это невозможно. Если переменные имеют однотипные имена отличающиеся только номером, то можно перебрать переменные в цикле получая их по имени через функцию GetVariableByName, но это плохой вариант по производительности даже несмотря на то, что GetVariableByName выполняет поиск по хеш-таблице.
Понятно, жаль.
Предлагаю ввести функции типа GetVariableByID и MaxVariableID для возможности прохождения по всем переменным в цикле.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: atomix от 11 Мая 2018, 16:34:23
Большое спасибо.

И еще Аваст ругается (пишет вирус IDP.Generic) и помещает файлы Server.exe и sscrep.exe в карантин.

А еще в скаде (SimpLight) есть такое - https://support.simplight.ru/knowledge-bases/2/articles/299-integratsiya-simp-light-i-oborudovaniya-radsel-ccu825

Может эти объекты (TIdHTTP и TlkJSON, или такие же по возможностям на ваш выбор, что вам легче внедрить) тоже сможете добавить будет вообще замечательно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 11 Мая 2018, 17:04:39
Здравствуйте!

Цитировать
И еще Аваст ругается (пишет вирус IDP.Generic) и помещает файлы Server.exe и sscrep.exe в карантин.
Simple-Scada использует систему защиты от взлома основанную на виртуализации кода. Если Ваш антивирус ложно определяет Simple-Scada 2, как вирус, то необходимо добавить сервер Simple-Scada 2 (Server.exe) и sscrep.exe в исключения. С результатами антивирусного анализа можно ознакомиться здесь (https://www.virustotal.com/ru/file/f424cf02b20b291f34135888c4b3e9209f94ac97bebbab488661648ef178f161/analysis/1498846119/).

Цитировать
Может эти объекты (TIdHTTP и TlkJSON, или такие же по возможностям на ваш выбор, что вам легче внедрить) тоже сможете добавить будет вообще замечательно
Поддержку контроллеров RADSEL добавлять не планируется.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Genrosol от 12 Мая 2018, 14:36:03
Здравствуйте, уважаемые разработчики!
Некоторое время назад обсуждался такой вопрос:
Цитировать
Может в базе данных SQL стоит создать дополнительную таблицу, состоящую из двух или трех столбцов (ID переменной, имя переменной в Simple-Scada, описание переменной в Simple-Scada)? Таким образом SQL-клиент смог бы выдать пользователю список переменных с именами и описанием для дальнейшей работы с архивами.
Где вы ответили:
Цитировать
Можем реализовать такую таблицу, нот только после решения более популярных задач.
Это кстати помогло бы в решении проблемы, озвученной kedr'ом:
Цитировать
Можно ли в скрипте пробежаться по всем переменным проекта, группы или тем, у которых имя начинается с определённой строки?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Мая 2018, 10:05:08
Здравствуйте.
Это кстати помогло бы в решении проблемы, озвученной kedr'ом:
ID переменных не подходят для перечисления в цикле, т.к. ID не упорядочиваются и могут содержать пропуски любого размера, соответственно поиск переменной по ID будет именно поиском (т.е. относительно "тяжелой" операцией), а не извлечением элемента по прямой ссылке. Для корректного перечисления переменных в цикле может подойти только глобальная переменная-массив со списком переменных.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Genrosol от 14 Мая 2018, 15:59:02
Если я правильно понял, задача kedr'а изначально заключалась в поиске переменных, у которых имя начинается с определённой строки, а уже потом появилось предложение реализовать поиск по ID. Соответственно, имею в БД таблицу со списком всех переменных, через SQL-запросы можно получать список переменных в любом необходимом виде.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Мая 2018, 16:04:24
Да, но это будет список имён переменных и их ID. Судя по всему с ними нужно как-то работать после получения списка, а чтобы работать с самими переменными нужно получить объекты TM_Variable.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Genrosol от 14 Мая 2018, 16:38:50
Имеете ввиду, что придется пробежаться по каждому элементу полученного списка, используя при этом функцию GetVariableByName, и вся эта процедура отнимет много ресурсов ПК?
Название: GetPing / StartPing
Отправлено: kedr от 14 Мая 2018, 17:36:11
Подскажите, пожалуйста, логику работы StartPing / GetPing.
У меня в проекте несколько устройств часто "отваливаются" на время ATimeOut в StartPing.

Обычно принято считать связь утерянной после нескольких потерянных пингов подряд.
Но для StartPing нельзя задать кол-во пингов.

Неужели GetPing выдает False после первого же утерянного пинга?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Мая 2018, 17:45:45
Имеете ввиду, что придется пробежаться по каждому элементу полученного списка, используя при этом функцию GetVariableByName, и вся эта процедура отнимет много ресурсов ПК?
Нагрузка на ПК будет зависеть от его конфигурации. Это будет просто плохой подход, вместо прямого перебора будет поиск переменной по имени / ID.

Неужели GetPing выдает False после первого же утерянного пинга?
Функция GetPing не учитывает кол-во попыток или предыдущие попытки. Она возвращает False, если последняя попытка пинга не удалась, т.е. устройство не ответило за отведённое ему время. Возвращает True в ином случае.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kedr от 14 Мая 2018, 20:12:46
Плохо.
Даже невозможно ввести собственный счетчик неудачных GetPing для устройства, поскольку программа не поддерживает массивы, сохраняющие значения между вызовами скрипта.
Какие будут советы и предложения? Кол-во пингуемых устройств - около сотни.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 15 Мая 2018, 09:40:19
Подсчет неудачных попыток сейчас можно реализовать только используя отдельные внутренние переменные в качестве счетчиков. Если останется немного свободного времени, то постараемся включить в ближайшее обновление отдельное событие для пинга.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kedr от 15 Мая 2018, 16:02:18
Да, создал переменные vNumPing1, vNumPing2... в отдельной группе.
Суть не сильно отличается от использования массива, хотя более ресурсоемко.

По поводу события для пинга.
Это хорошо, но придётся в любом случае от IP-адреса как-то переходить к объекту. Напрашивается глобальный хэшированный массив. Или объект типа TCollection с поиском по ключу.
Ну, или можно в TM_Control добавить текстовое поле Key и реализовать глобальную функцию типа GetControlByKey.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kedr от 15 Мая 2018, 16:03:21
Подскажите плз, можно ли обратиться с SQL-запросом к чужой (не своей) базе данных?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 16 Мая 2018, 05:30:00
Цитировать
Подскажите плз, можно ли обратиться с SQL-запросом к чужой (не своей) базе данных?
Для БД MySQL (при наличии прав доступа) удаётся обратиться с запросом к системной (чужой?) БД при условии,
что имя таблицы полное и не заключено в кавычки ``.

Кавычки ``, судя по сообщению об ошибке запроса, добавляют имя выбранной БД к имени таблицы.
Как и для всякой недокументированной возможности, применение остается на свой страх и риск.

Скрипт типа "Полностью запущен" заполняет таблицу информацией о всех таблицах БД, выбранной в проекте.
Код: (delphi)
begin
  Table1.Title := 'Таблицы БД    ' + GetDatabaseName;
  Table1.RunSQL('SELECT `TABLE_NAME`, `TABLE_ROWS`, `TABLE_COMMENT` FROM '
    + 'INFORMATION_SCHEMA.TABLES'              // полное имя таблицы не заключено в кавычки  ` `
    + ' WHERE `TABLE_SCHEMA` = ''' + GetDatabaseName + ''';', tsAll);
end.

Полностью пример (с отключенной БД) в приложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kedr от 16 Мая 2018, 23:02:22
Речь идет о БД другой системы, не Simple-Scada, на другом компьютере.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Мая 2018, 23:47:03
Подключиться к сторонней БД и получить из неё данные можно только в отчеты, используя систему отчетов (Reports.exe). Работать напрямую из проекта со сторонней БД сейчас нельзя.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: EricFlat от 23 Мая 2018, 15:06:56
Здравствуйте. Отладчика скриптов нет и не планируется в системе? Вопрос для меня критичный, не хочется для проверки скриптов каждый раз перезапускать клиента
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kedr от 24 Мая 2018, 08:34:32
Я не разработчик, но думаю, что вряд ли. Написать отладчик очень сложно.
Рекомендую для отладки активно использовать функцию Log_Add.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Мая 2018, 09:54:45
Здравствуйте. Отладчика скриптов нет и не планируется в системе? Вопрос для меня критичный, не хочется для проверки скриптов каждый раз перезапускать клиента
Здравствуйте. Внедрение отладчика для скриптов не планируется в ближайшем будущем. Планируется только добавить быстрый запуск проекта из редактора скады. К тому же и с отладчиком в большинстве случаев придется подключаться к проекту клиентом, например для отладки скрипта по событию OnClick кнопки. Придется сначала подключиться к проекту клиентом, найти эту кнопку на мнемосхеме и кликнуть её. Поэтому для событий, которые вызываются действиями пользователя внедрение отладчика не сильно упростит работу.

не хочется для проверки скриптов каждый раз перезапускать клиента
Перезапускать клиент не обязательно, достаточно перезапустить проект на сервере (https://simple-scada.com/help/manual/server-project.html). Клиент сам подключится к проекту и подхватит изменения в проекте.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: EricFlat от 31 Мая 2018, 10:16:44
Перезапускать клиент не обязательно, достаточно перезапустить проект на сервере (https://simple-scada.com/help/manual/server-project.html). Клиент сам подключится к проекту и подхватит изменения в проекте.
А вот тут не работает. Изменения подхватывает только веб-клиент. И только при обновлении страницы. Скада клиент проект не обновляет, даже при перезапуске проекта на сервере.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 31 Мая 2018, 10:25:22
EricFlat, если Вы внесли изменения в проект, сохранили их и перезапустили проект на сервере (нажатием кнопки стоп с квадратной иконкой и затем кнопки пуск с треугольной иконкой), то обычные клиенты подключенные к серверу просто не смогут работать пока не подхватят изменения проекта, т.к. они не выполняют никаких функций кроме визуализации данных с сервера. Убедитесь что Ваш клиент подключен именно к тому серверу на котором Вы перезапускаете проект, а не к другому серверу (например локальному на том же компьютере, на котором запущен клиент) и именно к тому проекту, который вы перезапускаете. Может быть когда Вы подключаетесь к серверу из клиента, то оставляете адрес localhost? Тогда будет просто запущена локальная копия сервера скады и перезапуски проекта на удаленном сервере скады конечно ничего не дадут.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: EricFlat от 31 Мая 2018, 11:42:59
Я не разработчик, но думаю, что вряд ли. Написать отладчик очень сложно.
Рекомендую для отладки активно использовать функцию Log_Add.
Нашел эту функцию, прописал в скрипт выполняемый каждую секунду, но не могу найти этот лог. Есть Client-log.txt, там нет никаких записей.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 31 Мая 2018, 13:19:18
Здравствуйте!

Процедура Log_Add добавляет сообщение в Log-файл сервера Simple-Scada(Server-log.txt) на ПК-сервере(ПК, на котором выполняется проект). Log-файл можно найти в папке "..\Simple-Scada 2\Logs".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: atomix от 04 Июня 2018, 16:07:54
Будут ли реализованы глобальные переменные в скриптах, а также функции вызываемые при старте проекта и остановке (например подключился первый клиент то вызывается некая функция старта, а если отключился последний живой клиент, то вызывается функция стопа).

Те переменные (внутренние виртуальные) не подходят у них нет значения хранить как Variant Type.

Также не хватает функции VarType и IsObject.

Пока на этом у меня застопоролось перевод проектов на вашу платформу.

Также при использовании скриптов в обработчике нажатия например от кнопки, возникает рядом с курсором мыши изображение колесика загрузки на доли секунды, может его не показывать если исполнение скрипта длится меньше секунды.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 04 Июня 2018, 16:19:38
Цитировать
функции вызываемые при старте проекта и остановке
Такие события уже есть (https://simple-scada.com/help/script/event-types.html): "Полностью запущен" и "Остановка проекта". Также при подключении каждого клиента выполняется событие "Клиент подключен" (https://simple-scada.com/help/script/client-connected.html).

Цитировать
Будут ли реализованы глобальные переменные в скриптах
Как Вы правильно отметили - виртуальные переменные в меню "Проект -> Переменные" это и есть глобальные переменные.

Цитировать
Те переменные (внутренние виртуальные) не подходят у них нет значения хранить как Variant Type.
Любая глобальная переменная, независимо от типа, который Вы выбираете, на самом деле является Variant переменной. Поэтому свойство Value такой переменной имеет тип Variant. А выбранный при создании тип данных влияет только на формат отображения и на некоторые преобразования.

Цитировать
Также не хватает функции VarType и IsObject. Пока на этом у меня застопоролось перевод проектов на вашу платформу.
Можете подробно описать задачу которую нужно решить и для чего конкретно нужно применить эти функции? На данный момент мы не знаем реальных задач в которых нельзя было бы обойтись без этих функций.

Цитировать
Также при использовании скриптов в обработчике нажатия например от кнопки, возникает рядом с курсором мыши изображение колесика загрузки на доли секунды, может его не показывать если исполнение скрипта длится меньше секунды.
Скада сама никогда не меняет курсор, поэтому мы не сможем на это повлиять (кроме как принудительно вызывать смену курсора на обычный в "бесконечном" цикле). Скорее всего его меняет ОС. Какие именно действия выполняются в этом скрипте? Может быть работа с файлами? Можете привести пример скрипта? Либо курсор меняется при выполнении любого скрипта?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: atomix от 05 Июня 2018, 08:57:29
Вставляем этот код в SimulationTimer и заводим глобальную переменную objTemp.

Вот так работает:
Код: (delphi)
function Test(param : variant) : Variant;
var
  WshNetwork  : Variant;
begin
  WshNetwork := CreateOleObject("WScript.Network");
  Field41.text :=  WshNetwork.ComputerName;
  //ShowMessageAll('Заголовок окна', WshNetwork.ComputerName, clNone);
end;

Вот так НЕ работает:
Код: (delphi)
function Test(param : variant) : Variant;
var
  WshNetwork  : Variant;
begin
  objTemp.Value := CreateOleObject("WScript.Network");
  Field41.text :=  objTemp.Value.ComputerName;
  //ShowMessageAll('Заголовок окна', objTemp.Value.ComputerName, clNone);
end;

VarType и IsObject нужны чтобы определить создался ли объект. может по другому как надо я не знаю подскажите.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Июня 2018, 11:02:47
Сервер перед присвоением выполняет проверку VarSameValue, которая вызывает исключение если значения нельзя сравнить (имеют разный тип). Поэтому присвоение прерывается. В ближайшем обновлении исключим эту проверку и присвоение objTemp.Value := CreateOleObject("WScript.Network"); будет работать, а значение objTemp.Value можно будет затем использовать в любом скрипте. Несмотря на это, мы рекомендовали бы работать с OLE объектами в пределах скрипта, чтобы правильно реализовать их по завершению скрипта, например:
Код: (delphi)
var
  WshNetwork  : Variant;
begin
  WshNetwork := CreateOleObject("WScript.Network");  // создаем объект
  Text1.Text :=  WshNetwork.ComputerName;
  WshNetwork := Unassigned;  // освобождаем объект
end.

При необходимости работы с объектом из другого скрипта лучше снова создать его, использовать и освободить:
Код: (delphi)
var
  WshNetwork  : Variant;
begin
  WshNetwork := CreateOleObject("WScript.Network");  // создаем объект
  Text2.Text := WshNetwork.EnumNetworkDrives.Count;
  WshNetwork := Unassigned;  // освобождаем объект
end.

Цитировать
VarType и IsObject нужны чтобы определить создался ли объект.
Можете не проверять и сразу работать с объектом, как в примерах выше. Сервер всё равно будет делать такую проверку автоматически и в случае ошибки Вы увидите соответствующее сообщение в журнале сервера.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: EricFlat от 08 Июня 2018, 13:51:23
Вопрос по процедурам Ping. Хочу использовать IP адрес в глобальной переменной G_IP типа string
Вот такая последовательность не работает.

На старте.
Код: (delphi)
begin
  G_IP.Value:='192.168.2.9';
end.
Код: (delphi)
begin
  StartPing(G_IP.AsStr, 5000);
end.
Каждую секунду.
Код: (delphi)
begin
  if GetPing(G_IP.AsStr) then
    begin
      G_ping.Value:=TRUE;
      G_sPing.Value:='ОК';
    end
  else
    begin
      G_ping.Value:=FALSE;
      G_sPing.Value:='-';
    end
end.
Если в процедуры передавать вместо G_IP явные указания IP в виде '192.168.2.9', то все работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 13 Июня 2018, 12:14:37
Код работает. См. пример во вложении (для версии 2.2.9.2). Может быть у Вас переменная G_IP внешняя (с OPC-сервера)? Тогда присвоение "G_IP.Value:='192.168.2.9'" может выполниться не моментально и StartPing пройдёт для пустого IP-адреса. И почему у Вас два разных скрипта для старта? Если G_IP внутренняя переменная, то можно написать так:
Код: (delphi)
begin
  G_IP.Value:='192.168.2.9';
  StartPing(G_IP.AsStr, 5000);
end.

Также больше нет необходимости проверять пинг каждую секунду. Для этой цели лучше использовать скрипт с типом события "Изменился пинг" (https://simple-scada.com/help/script/changed-ping.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: EricFlat от 13 Июня 2018, 13:51:20
Тогда присвоение "G_IP.Value:='192.168.2.9'" может выполниться не моментально и StartPing пройдёт для пустого IP-адреса. И почему у Вас два разных скрипта для старта?
Да, это переменная скады. Я использую их, как глобальные константы и в отдельном скрипте на старте раздаю значения.  Запуск пинга тоже на старте, с еще пустой константой, отсюда и ошибка. Буду задавать константы IP в скрипте старта пинга.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: beloleg86 от 15 Июня 2018, 14:08:02
есть много точек которые считывают информацию температуры в фаренгейтах, есть способ универсального скрипта перевода в цельсия? пока приходится каждой точке писать свой скрипт
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 17 Июня 2018, 20:08:33
Здравствуйте!

Можно обойтись без скриптов, используя функцию масштабирования значений переменной из одной шкалы в другую. Допустим, переменная в фаренгейтах принимает диапазон значений от -58 до 122. Создадим шкалу (https://simple-scada.com/help/manual/edit-scale.html) с этим диапазоном и назначим ее нашей переменной. Далее, перейдем на вкладку свойств переменной "Дополнительные (https://simple-scada.com/help/manual/variable-new.html)", активируем режим масштабирования и укажем соответствующую шкалу в цельсиях(см. скриншот). Значению "-58" гр. фаренгейта соответствует "-50" гр. цельсия, значению "122" гр. фаренгейта соответствует "50" гр. цельсия. Т.е., нам необходимо указать визуальную шкалу от -50 до 50. Готово! Теперь, полученные с контроллера значения в фаренгейтах будут автоматически преобразовываться в градусы цельсия.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Sergey_Em от 19 Июня 2018, 15:01:32
Добрый день, помогите решить проблему: есть плк работающее в режиме modbus slave и HMI в режиме modbus slave, которых опрашивает simple scada через OPC в режиме master. Вопрос: как с помощью скриптов сделать обработку, чтобы при изменении значения, либо в ПЛК, либо в HMI они менялись в зависимости от последнего измененного значения. Например, в плк температура уставка =  27 С и в HMI это же значения 27С, при изменении в ПЛК на 25С изменилось и в HMI и наоборот. Просьба не задавать вопросы зачем это нужно, можно же напрямую сделать и тому подобное. Заранее спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 19 Июня 2018, 16:05:59
Sergey_Em, я придумал 2 варианта:

1. делаем 2 скрипта на изменение переменных, один на PLCtemp, другой на HMItemp
в скрипте на PLCtemp делаем HMItemp := PLCtemp, в скрипте на HMItemp наоборот PLCtemp := HMItemp
при этом будет лишнее присвоение из-за срабатывания скрипта после присвоения и не совсем понятно что делать, если оба события произойдут вместе

2. делаем 1 скрипт на изменение обеих переменных и создаем 2 доп. переменные psPLCtemp и psHMItemp
дальше так:
Код: (delphi)
if (PLCtemp.value <> psPLCtemp.value) and (HMItemp.value <> psHMItemp.value) then
begin
    // что-то делаем, если обе переменные изменились вместе (присваиваем значения с нужным приоритетом);
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

if (PLCtemp.value <> psPLCtemp.value) then
begin
    HMItemp.value := PLCtemp.value;
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

if (HMItemp.value <> psHMItemp.value) then
begin
    PLCtemp.value := HMItemp.value;
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

как то так, может и не очень красиво, но работать должно
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 21 Июня 2018, 07:27:55
Здравствуйте ребята.Прошу помощи. Ну ни как не могу понять в чем проблема.
На сервере в S-S_2.2.9.1 Pro есть скрипт который прекрасно работает, но правда данные ячейки забираются из автозаполненной(SQL) таблицы


Так вот поставил себе на ноут демо тайм 2.2.9.2 для тестов проекта. Но в этой версии категорически не хочет забирать данные из ячейки.
Причем на ноуте к ячейкам привязаны переменные.
Подскажите может проблема не только в моей криворукости?
У меня просто нет 2.2.9.1 демо тайм для тестов.


Код: (delphi)
var // Упрощенный вид, но даже он не работает.
  aCell_ID:TM_TableCell;
begin
  aCell_ID := Table1.GetCell(2,2);
  if aCell_ID <> nil then
      vID_recept.Value := StrToInt(aCell_ID.Text);
end.                                     


Так же на сервере выходит необработанная ошибка.
         
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 21 Июня 2018, 11:32:12
Так же на сервере выходит необработанная ошибка.
ИМХО, что-то не так с данными в выбранной ячейке,- или текст из ячейки не удается преобразовать в число
или при преобразовании получается не совсем число
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Июня 2018, 11:42:38
Причем на ноуте к ячейкам привязаны переменные.
Здравствуйте. Если к ячейке привязана переменная, то нужно работать со значением переменной, а не с текстом ячейки, например:
Код: (delphi)
var
  aCell:TM_TableCell;
begin
  aCell := Table1.GetCell(1, 1);
  if aCell <> nil then
    if aCell.Variable <> nil then
      vID_recept.Value := aCell.Variable.AsInt;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 21 Июня 2018, 14:04:28
Спасибо!!! Что-то, если честно, даже не думал в этом направлении :(.
Цитировать
Подскажите может проблема не только в моей криворукости?
Все таки только в криворукости(
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 23 Июня 2018, 11:08:30
ТаймДемо, настроил отправку e-mail, тестовое письмо пришло.
Пишу скрипт:
Код: (delphi)
mailString: string; 
mailString := 'Пост№1 = '+ QuotedStr(f1.AsStr) +', Пост 2 = '+ QuotedStr(f2.AsStr)+ ' ';
SendMail('test', 'Отчет', mailString, 'адрес_получателя@mail.ru');
Ошибка access violatation at address xxxx in module server.exe
Не подскажете, в чем ошибка?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Июня 2018, 12:03:40
Здравствуйте.

Попробуйте открыть в Options.exe настройки E-Mail, удалить пароль и ввести его снова и сделать тест отправки. Затем закройте Options.exe, перезапустите сервер скады и попробуйте выполнить отправку из скады. Что-то меняется?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 23 Июня 2018, 15:49:26
Здравствуйте! Спасибо, ваш метод отправки помог  :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpvit от 25 Июня 2018, 12:26:24
Добрый день, подскажите как реализовать отсрочку по выдаче аварийных и предупредительных сообщение при перезапуске проекта. Секунд 30 нужно, а далее пусть выводятся штатно
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Июня 2018, 14:04:42
Здравствуйте!

Если требуется при перезапуске проекта пропустить выдачу сообщений по первому изменению переменных (например, если OPC-сервер долго запускается), то снимите флажок "Показывать сообщения по первому изменению" в настройках "Options.exe" -> вкладка "Simple-Scada Server (https://simple-scada.com/help/manual/settings-simple-scada-server.html)"(см. скрин во вложении). Другой возможности отсрочить выдачу сообщений нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Июня 2018, 14:21:41
Если галка стоит, то сообщения по первому изменению будут выводиться. Чтобы они не выводились ее нужно снять.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpvit от 25 Июня 2018, 14:34:11
Если галка стоит, то сообщения по первому изменению будут выводиться. Чтобы они не выводились ее нужно снять.
эффект есть, но не большой) хотел избавиться от пиликанья алармов во время тестирования ( часто приходиться перезагружать проект). Очень жду когда реализуется редактор/runtime client в одном флаконе) Чтобы удобнее переходить из режима редактора в рантайм)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 27 Июня 2018, 21:34:12
Здравствуйте.
Уважаемые, подскажите как в таблице сбросить цвет измененных ячеек таблицы на стандартный?
Немного распишу:
Допустим есть некая таблица с автозаполнением посредствам SQL запроса
В этой таблицы ребята (операторы поста) делают отметки. В последнем столбце таблицы ставится отметка "Добавлено"
В последнем обновлении S-S появилась возможность работы с цветом ячейки, сразу же захотелось исполнить давнюю мечту по выделению целой строки цветом.

Код: (delphi)
var
  aIndex:integer;
begin
  aIndex := tblTEST.RowIndex;
  if aCell.Variable <> nil then
    begin
      tblTEST.GetCell(1,aIndex).Color := RGB(217,255,255);
      tblTEST.GetCell(2,aIndex).Color := RGB(217,255,255);
      tblTEST.GetCell(3,aIndex).Color := RGB(217,255,255);
    end;
end.
                                           
Но есть одно но.....как вернуть цвет ячейки в исходное состояние, причем все сразу?
В таблицы с каждым обновлением всегда разное кол-во строк.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Июня 2018, 09:24:11
Здравствуйте.

Для возврата ячейки к обычному состоянию (без заполнения цветом) нужно присвоить цвету константу clNone.
Код: (delphi)
var
  aIndex: integer;
begin
  aIndex := tblTEST.RowIndex;
  if aCell.Variable <> nil then
    begin
      tblTEST.GetCell(1,aIndex).Color := clNone;
      tblTEST.GetCell(2,aIndex).Color := clNone;
      tblTEST.GetCell(3,aIndex).Color := clNone;
    end;
end.

Цитировать
..причем все сразу?
Аналогично для всех ячеек, только придется в цикле пройти по всем ячейкам. Это не очень хороший вариант, т.к. если таблица очень большая, то цикл может быть относительно долгим, плюс к этому каждое изменение цвета по каждой ячейке будет отправлено клиентам и если ячеек очень много, то и изменений придется отправить много.
Код: (delphi)
var
  I, J: Integer;
  aCell: TM_TableCell;
begin
  if (Table1.ColumnsCount > 0) and (Table1.RowCount > 0) then
    for I := 0 to Table1.RowCount - 1 do
      for J := 0 to Table1.ColumnsCount - 1 do
      begin
        aCell := Table1.GetCell(J, I);
        if aCell <> nil then
          if aCell.Color <> clNone then
            aCell.Color := clNone;
      end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 28 Июня 2018, 10:11:36
Спасибо за помощь!!!!!!!!!!
то и изменений придется отправить много.
Может у Вас есть возможность добавить функцию сброса выделенных цветом ячеек таблицы, хотя бы через массив столбцов? Типа- Table1.Columns[1..3].Color := clNone;(Это как образный пример)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Июля 2018, 09:29:27
Может у Вас есть возможность добавить функцию сброса выделенных цветом ячеек таблицы
Рассмотрим этот вариант.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 05 Июля 2018, 15:44:14
Есть 3 кнопки с фиксацией с переменными ( a1 , a2 , a3 ) , как сделать , чтобы при нажатии любых двух - третья исчезала ( или становилась не доступной ) . Т.е из 3-х кнопок оператор мог нажать  одну или две . Допустим , нажал 1-ю и 2-ю , а 3-ю мог нажать , только отключив 1-ю или 2-ю .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 05 Июля 2018, 21:17:33
serg, я б сделал скрипт на изменение переменных а1, а2, а3:
Код: (delphi)
begin
  if (a1.AsInt + a2.AsInt + a3.AsInt) >= 2 then
    begin
      if not a1.AsBool then Bt_a1.Visible := false;
      if not a2.AsBool then Bt_a2.Visible := false;
      if not a3.AsBool then Bt_a3.Visible := false;
    end
  else
    begin
      Bt_a1.Visible := true;
      Bt_a2.Visible := true;
      Bt_a3.Visible := true;
    end;
end.
И свойство Visible таки заменил бы на Enable, а то оно как-то не очень эстетично, когда вместо кнопки пустое место.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 07 Июля 2018, 12:37:39
Не получается по вашему скрипту .

Сделал по другому . Скрипт по событию - прошла секунда .

Код: (delphi)
begin
  if (Button1.AsInt + Button3.AsInt) > 1 then
    Button2.Visible := False
  else
    Button2.Visible := True ;
end. 

Три скрипта с соответствующими названиями кнопок . Скрипты работают , но кажется так не совсем правильно .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 07 Июля 2018, 13:28:52
Не получается по вашему скрипту .
Я перед публикацией ответа этот способ сам проверял.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 07 Июля 2018, 15:02:58
Вопрос к пользователю Simple_Scada
как Вы делаете код делфи в сообщениях?
в редакторе есть просто код, но это не то, а тега для кода делфи или нет или я его в упор не вижу.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 07 Июля 2018, 16:00:13
Здравствуйте!

Цитировать
Не получается по вашему скрипту. Сделал по другому. Скрипты работают , но кажется так не совсем правильно.
Victor_P предложил Вам правильный, рабочий вариант. Откройте редактор скриптов, создайте новый скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)", добавьте в него свои переменные(а1, а2, а3), скопируйте предложенный код и замените в нем имена кнопок, если у Вас они названы по другому. Пример создания скрипта с типом события "Изменились переменные" можно найти здесь (https://simple-scada.com/help/script/changemulvar.html).

Цитировать
Вопрос к пользователю Simple_Scada. Как Вы делаете код делфи в сообщениях?
Нужно выбрать обычный код и затем дописать [code=delphi]. Можете для примера открыть Ваше отредактированное сообщение выше.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: serg от 09 Июля 2018, 15:31:17
Спасибо за помощь . У меня , наверное древняя демо версия . Нет возможности создать скрипт ( по изменению переменных ) . Скачал новую демо версию - всё получилось . И с Enable тоже . Только не Enable , а с Enabled .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Sergey_Em от 10 Июля 2018, 11:21:11
Sergey_Em, я придумал 2 варианта:

1. делаем 2 скрипта на изменение переменных, один на PLCtemp, другой на HMItemp
в скрипте на PLCtemp делаем HMItemp := PLCtemp, в скрипте на HMItemp наоборот PLCtemp := HMItemp
при этом будет лишнее присвоение из-за срабатывания скрипта после присвоения и не совсем понятно что делать, если оба события произойдут вместе

2. делаем 1 скрипт на изменение обеих переменных и создаем 2 доп. переменные psPLCtemp и psHMItemp
дальше так:
Код: (delphi)
if (PLCtemp.value <> psPLCtemp.value) and (HMItemp.value <> psHMItemp.value) then
begin
    // что-то делаем, если обе переменные изменились вместе (присваиваем значения с нужным приоритетом);
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

if (PLCtemp.value <> psPLCtemp.value) then
begin
    HMItemp.value := PLCtemp.value;
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

if (HMItemp.value <> psHMItemp.value) then
begin
    PLCtemp.value := HMItemp.value;
    psPLCtemp.value := PLCtemp.value;
    psHMItemp.value := HMItemp.value;
    Exit;
end;

как то так, может и не очень красиво, но работать должно

1 вариант я сам уже пробовал, но меняются значения только в одну сторону. 2 вариант просто не компилируется, ошибку выдает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 10 Июля 2018, 20:09:08
Sergey_Em,
Цитировать
1 вариант я сам уже пробовал, но меняются значения только в одну сторону.

Вариант 1 аналогичен задаче обмена значениями двух переменных, т.е. необходима промежуточная переменная.

Скрипт по событию "Изменилось значение переменной связанной ..." для переменных PLCtemp и HMItemp:
Код
var i, j: integer;
begin
  with Sender as TM_Field do j := Value;  // запомнить изменившуюся переменную
  PLCtemp.Value := j;                             // изменить переменные
  HMItemp.Value := j;

  i := i + 1;          // счетчик вызовов этого скрипта
  Text1.Text := 'Событий = ' + IntToStr(i);
end.

Пример во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 10 Июля 2018, 21:11:30
  i := i + 1;          // счетчик вызовов этого скрипта
а можно подробнее?
как это счетчик вызовов?
это ж локальная переменная функции, она даже не static,
она ж сбросится в 0 при вызове этой функции.
Или я что-то пропустил?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 11 Июля 2018, 08:33:11
Счетчик вызовов показывает число прохождений этого участка программы с момента запуска проекта.
В данном примере - иллюстрация парных вызовов при изменении одной переменной, включая два вызова при инициализации переменных.

По поводу локальных переменных - нельзя, но если очень хочется (не в рабочем проекте)...
Цитата: « Сообщение от Simple-Scada  21 Июль 2017, 15:02:58 »
Локальные переменные в Pascal, Delphi, C, C++, C# и т.п. языках не инициализируются компилятором и это забота программиста. При каждом очередном вызове скрипта переменной выделяется область памяти и её структура может быть любой (зависит от того, что в ней хранилось ранее), соответственно и значение переменных после выделения памяти может быть каким угодно. Компилятор в Simple-Scada работает аналогично, но при первой инициализации все-таки обнуляет переменную, а при последующих выделяет ту же самую область памяти, что и в первый раз. Поэтому в переменной значение сохраняется (не касается динамических типов данных, например строк). При этом мы рекомендовали бы работать с локальными переменными как и в других языках, т.е. сначала инициализировать, а затем использовать, чтобы значение переменной всегда было очевидным.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 13 Июля 2018, 13:31:38
По поводу локальных переменных ...
Т.е. она все-таки static.
Понял, спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 03 Августа 2018, 11:57:56
подскажите пожалуйста , как можно разобрать строку  и потом собрать её снова , но только без не нужных символов , т.е у меня есть строка - это тэг с плк в формате  дата и время DT  в скаду он передаётся как строка вида он такого  DT#2018-09-03-12:01:03.569   а мне нужно получить
2018-09-03-12:01:03  - заранее благодарен.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 03 Августа 2018, 13:35:16
lipvasko, UTF8Copy (https://simple-scada.com/help/script/utf8copy.html)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: nwb от 16 Августа 2018, 11:22:04
Добрый день!
Возник вопрос как можно реализовать следующую функционал:
Имеется определённое количество двигателей с каждым из которых связано по 2-3 переменных: ток, частота, температура, например.
Как можно сделать так, что бы была одна универсальная таблица, а параметры отображаемые в ней, зависели от конкретно выбранного насоса?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 16 Августа 2018, 11:59:22
Добрый день,

Как при наступлении определенных условий проиграть несколько звуковых файлов подряд?
Код: (delphi)
if temp100.value = 10 then
  begin
    PlayUserSound("brew",'1.ogg',false);
    PlayUserSound("brew",'2.ogg',false);
    PlayUserSound("brew",'3.ogg',false);
  end;
 
при таком написании воспроизводится только файл 3.ogg
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 16 Августа 2018, 15:33:19
как при наступлении определенных условий проиграть несколько звуковых файлов подряд?
Самый простой вариант - в программе вроде Wave editor соедините все 3 файла в 1, вставьте тишину между звуками нужной длины и сохраните как 1 файл .ogg
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 16 Августа 2018, 16:59:57
Здравствуйте!

Добрый день!
Возник вопрос как можно реализовать следующую функционал:
Имеется определённое количество двигателей с каждым из которых связано по 2-3 переменных: ток, частота, температура, например.
Как можно сделать так, что бы была одна универсальная таблица, а параметры отображаемые в ней, зависели от конкретно выбранного насоса?

Если переменные имеют однотипные имена, то можно, например при клике по насосу подменять переменные в ячейках таблицы на нужные, при помощи функции GetVariableByName (https://simple-scada.com/help/script/getvariablebyname.html). Пример скрипта подмены переменных у объектов можно найти по ссылке (https://simple-scada.com/help/script/varsubs.html). По аналогии можно подменять переменные в ячейках таблицы:

Код: (delphi)
begin
  { берём ячейку на пересечении первого столбца и первой строки и
     привязываем к ней переменную MyVariable }
  Table1.GetCell(0, 0).Variable := MyVariable;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 20 Августа 2018, 17:30:15
Добрый день , опыта по запросам с базы данных нет ,а реализовать надо ,что пробую - особо не выходит, в общем проблема в следующем , необходимо взять 30 последних значений, одного тэга из БД,   со временем  записи  и вставить в таблицу, соответственно значение тега и времени записи. Заранее спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 20 Августа 2018, 20:43:30
lipvasko, это вопрос больше по SQL (а конкретно по его реализации в MySQL и документации по нему море), чем по simple-scada.
Думаю, запрос должен выглядеть как-то так:
Код
SELECT date, value FROM table ORDER BY date DESC LIMIT 30
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Августа 2018, 10:07:57
Цитировать
необходимо взять 30 последних значений, одного тэга из БД,   со временем  записи  и вставить в таблицу, соответственно значение тега и времени записи.
Здравствуйте. Как было отмечено выше -этот вопрос касается работы с SQL-запросами, а не Simple-Scada. Примеры подобных запросов можно найти в интернете (https://www.google.ru/search?q=mysql+%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C+%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5+%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&oq=mysql+%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C+%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5+%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&aqs=chrome..69i57.11653j1j7&sourceid=chrome&ie=UTF-8). Быстро проверить выполнение и получить результаты запросов можно через MySQLWorkbench (https://simple-scada.com/help/manual/mysql-workbench.html). Когда запрос создан и выполняет свои функции достаточно подставить его в скрипт Simple-Scada. Пример под Вашу задачу:
Код: (delphi)
var
  aQuery: string;
begin
  { формируем SQL-запрос в переменную aQuery }
  aQuery := 'SELECT * FROM (' +
    'SELECT `timestamp`, `value` FROM `trends_data`' +
    'WHERE id=1' +
    'ORDER BY `timestamp` DESC LIMIT 30' +
  ') AS Q ORDER BY `timestamp` ASC;';

  { выполняем запрос aQuery и выводим результат в таблицу Table1 }
  Table1.RunSQL(aQuery, tsSaveFixRow);
end.
В примере производится выборка архивных данных переменной с id=1.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 27 Августа 2018, 10:54:43
Добрый день , начал плотно заниматься скадой  и возникли вопросы
1) Глюк с AND т.е если я использую в условии связку   тэгов  инт=число  анд булл = фалсе ------ ошибка
2) если  я использую связку только по булам    a.value = false and b.value =true  -----ошибка
понимает так   a.value = false and b.AsBool =true
3) и самое не понятное - которое убило у меня пол дня , если два булевых тяга обрабатывать как условия через and , то происходит двойное выполнение условия , а если  их обрабатывать , последовательно , то все нормально
т.е  if  a=true and b= false then    глючит
     if a=true then     работает как надо
       if b =false then

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 27 Августа 2018, 11:02:23
Здравствуйте.

Никаких глюков нет, Вы забыли про скобки:
Код: (delphi)
var
  I: Integer;
  B: Boolean;
begin
  if (I = 0) and (B = false) then
  begin

  end;

  if (myVar1.Value = false) and (myVar2.Value = true) then
  begin

  end;
end.
Если скобки не указывать, например: "if a=true and b= false then", то сначала вычислится правая часть выражения, т.е. "true and b=false" (он будет true, если b=false, иначе результат будет false), затем результат сравнится с "a".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Genrosol от 28 Августа 2018, 18:52:25
Здравствуйте!

1. Вопрос касательно механизма работы окон в Simple-Scada, в частности примера "Подмены переменных у объектов" https://simple-scada.com/help/script/index.html?varsubs.html (https://simple-scada.com/help/script/index.html?varsubs.html).
Допустим у нас имеется несколько клиентов. На одном клиенте пользователь нажал на некий объект "Valve1", при этом произошел вызов окна "ValveWindow" с подменой переменных "Valve1_Cmd", "Valve1_Status", "Valve1_Mode". В это же время на другом клиенте пользователь нажал на объект "Valve2" и вызвал то же окно "ValveWindow" с подменной соответствующих переменных. Что будет отображаться в окнах на каждом клиенте: окно с переменными для "Valve2", или для каждого клиента свой экземпляр окна?

2. Не планируется ли добавить возможность привязки к объектам произвольное количество переменных, а не только основную переменную и дополнительную (подмена переменных у объектов - способ интересный, но усложняет процесс наладки в крупных АСУ ТП).

3. На форуме неоднократно поднимался вопрос о возможности группировки объектов или создания шаблонов. Ведутся ли работы по данному направлению?

Заранее спасибо, очень приятно работать с Simple-Scada!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 29 Августа 2018, 15:27:07
Здравствуйте!

Цитировать
Вопрос касательно механизма работы окон в Simple-Scada, в частности примера "Подмены переменных у объектов" https://simple-scada.com/help/script/index.html?varsubs.html.
Допустим у нас имеется несколько клиентов. На одном клиенте пользователь нажал на некий объект "Valve1", при этом произошел вызов окна "ValveWindow" с подменой переменных "Valve1_Cmd", "Valve1_Status", "Valve1_Mode". В это же время на другом клиенте пользователь нажал на объект "Valve2" и вызвал то же окно "ValveWindow" с подменной соответствующих переменных. Что будет отображаться в окнах на каждом клиенте: окно с переменными для "Valve2", или для каждого клиента свой экземпляр окна?
Если второй пользователь нажал объект позже, то у обоих будет отображаться окно с переменными для "Valve2". Подмена переменных происходит одновременно на всех клиентах - в примере (https://simple-scada.com/help/script/varsubs.html) имеется соответствующее предупреждение об этом. Поэтому, если клиентов несколько, то использовать подмену переменных следует с  осторожностью или не использовать вообще для избежания ситуаций, подобных описанной Вами.

По вопросам 2,3: мы планируем добавить поддержку шаблонных объектов, функции импорта и экспорта объектов между проектами. Какой-то определенный срок появления таких возможностей сейчас назвать сложно. Возможно, данные функции будут добавлять поэтапно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Genrosol от 29 Августа 2018, 16:09:11
Цитировать
Подмена переменных происходит одновременно на всех клиентах - в примере имеется соответствующее предупреждение об этом.
Невнимательно прочитал, так вопроса бы не возникло.
Получается подменять переменные в моем случае нельзя, но и для каждого объекта делать отдельное окно считаю очень затратным.
Попробую создать несколько экземпляров одного и того же окна (ValveWindow1, ValveWindow2 ...) и соответствующие переменные состояния каждого окна (активно окно или не активно). По нажатию на объект скриптом открывать свободное (не активное) окно. В случае, если все окна активны, закрывать одно из окон.

Цитировать
По вопросам 2,3: мы планируем добавить поддержку шаблонных объектов, функции импорта и экспорта объектов между проектами. Какой-то определенный срок появления таких возможностей сейчас назвать сложно. Возможно, данные функции будут добавлять поэтапно.
Главное, что это планируется.
Лично я в Simple-Scada (и не только в ней) очень редко использую готовые решения (например, объект "Заслонка" и его параметры "Ручной режим", "Открывается", "Авария", "Обслуживается"), все равно приходится реализовывать динамику через собственные скрипты (даже для такого объекта, как "Поле"). В связи с этим хотелось бы видеть какие-либо инструменты, позволяющие создавать пользовательские объекты.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ООО "БЛС инжинеринг" от 10 Сентября 2018, 22:04:12
Здравствуйте!

Подскажите как можно сделать скрипт под задачу типа калькулятора.
Прилагаю схему для понятия задачи.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Сентября 2018, 22:15:25
Здравствуйте.

Т.е. результат деления двух локальных переменных нужно записать во внешнюю переменную? Допустим локальные переменные называются vrA (целое) и vrB (вещественное). Переменная с OPC-сервера имеет имя vrOPC (целое). Тогда код будет таким:
Код: (delphi)
begin
  { здесь функция Round используется для округления результата деления до целого числа }
  vrOPC.Value := Round(vrA.Value / vrB.Value);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ООО "БЛС инжинеринг" от 10 Сентября 2018, 22:41:30
Спасибо работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ООО "БЛС инжинеринг" от 12 Сентября 2018, 18:32:08
Здравствуйте!

Как можно написать скрипт для задачи:
При открытии определённой странице включить по переднему фронту БИТ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: George от 12 Сентября 2018, 19:03:33
Добрый день.
Каким образом можно обработать значение, полученное с ОПС-Сервера и отобразить его в поле?
В настоящий момент приходится использовать 2 переменные - одна получает значение из ОПС-Сервера, другая (виртуальная) получает обработанное значение и выводится на экран.
Т.е. создаю скрипт, где выбираю переменную с ОПС-данными и в скрипте указываю виртуальную переменную и какое значение она должна получить...
 Пример моего скрипта:  vvar1(вирт.перем.) := 20/16384 * Tag1(тег с ОПС).  И эту "vvar1" отображаю на экране.

... и так приходится делать с каждой переменной :(

Есть к-либо более грамотное решение такой задачки?

Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Сентября 2018, 22:04:07
Как можно написать скрипт для задачи:
При открытии определённой странице включить по переднему фронту БИТ?
У страницы есть событие "OnEnter" которое выполняется каждый раз, когда пользователь переходит на страницу. Для включения бита переменной нужно использовать функцию SetBit (https://simple-scada.com/help/script/setbit.html), например:
Код: (delphi)
begin
  VarName.Value := SetBit(VarName.AsInt, 3, True); // записать 1 (true) в 4 бит переменной "VarName"     
end.

Пример моего скрипта:  vvar1(вирт.перем.) := 20/16384 * Tag1(тег с ОПС).  И эту "vvar1" отображаю на экране.
Есть к-либо более грамотное решение такой задачки?
Можно обойтись одним универсальным скриптом, но у вас ведь выполняется линейное изменение переменной, т.е. значение тега просто умножается на число 20/16384 = 0,00122. А значит можно обойтись вовсе без скриптов. Допустим Ваш OPC-тег имеет шкалу 0-100 и нужно умножать его на 0,00122. Тогда откройте его для редактирования в Редакторе и на вкладке "Дополнительные" (https://simple-scada.com/help/manual/index.html?variable-new.html#var_dop) включите режим масштабирования и рассчитайте визуальный минимум и визуальный максимум. Для этого просто берём текущую шкалу 0-100 и умножаем её на 0.00122. Получаем, виз. минимум: 0 * 0.00122 = 0. Виз. максимум: 100 * 0.00122 = 0.122. Теперь скада будет автоматически выполнять пересчет, причем это работает и в обратную сторону - при записи в OPC.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: George от 13 Сентября 2018, 17:24:56
Спасибо за ответ...  Вы сказали, что "...Можно обойтись одним универсальным скриптом..."

Если не затруднит, дайте пример универсального скрипта для моего случая...
Спасибо.

 " Для этого просто берём текущую шкалу 0-100 и умножаем её на 0.00122. Получаем, виз. минимум: 0 * 0.00122 = 0. Виз. максимум: 100 * 0.00122 = 0.122. Теперь скада будет автоматически выполнять пересчет, причем это работает и в обратную сторону - при записи в OPC."

Сделал все в точности, как было сказано...   Отображаются не совсем верные данные...  :(
Придется воспользоваться Вашим универсальным скриптом....
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ООО "БЛС инжинеринг" от 13 Сентября 2018, 19:39:02
Спасибо работает ;)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 13 Сентября 2018, 21:52:26
George, универсальный скрипт все же будет хуже во всём, чем использование визуальной шкалы, для универсального скрипта придется именовать переменные определённым образом и использовать поиск по имени, хотя задачу можно решить без скриптов.

Цитировать
Сделал все в точности, как было сказано... Отображаются не совсем верные данные...
Напишите что именно не так с результатом? Не хватает знаков после запятой? Может быть результат сильно округлён? Вышлите проект (или пример проекта) на support@simple-scada.com в котором расчеты выполняются неверно, мы исправим, если что-то не так.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: George от 14 Сентября 2018, 15:48:12
Прошу прощения.., был не прав... (были вбиты разные цифры для расчета...)
Все работает должным образом, как Вы и сказали.
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 25 Сентября 2018, 17:53:22
Недавно начал осваивать демо-версию Simple-Scada. Перелопатил все руководства, но не нашел ответа на вопрос такого характера. В проекте я создал переменную vrCounter (счетчик) с архивацией, но каждый раз при запуске проекта он начинает считать с нуля, а хотелось бы с последнего заархивированного значения. Есть наверно простое решение, но в Delphi я новичок. Подскажите, плз, чтобы не изобретать велосипед.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 25 Сентября 2018, 19:55:49
...а хотелось бы с последнего заархивированного значения...
При выходе сохраняете значение в файл или БД, при запуске восстанавливаете значение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 25 Сентября 2018, 20:02:39
Спасибо, до этого я додумался сам. Но неужели нет более красивого решения, ведь переменная архивируется. Почему она обнуляется, ведь в скрипте она не переобъявляется?
Код: (delphi)
begin
  if Field1.Variable.AsInt = 1 then   
    vrCounter.Value := vrCounter.Value +1;
    Field7.Text := IntToStr(vrCounter.Value);
end.     
 

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 26 Сентября 2018, 07:45:26
Подозреваю, что при запуске проекта на сервере все переменные инициализируются, а с retentive переменными симплскада работать не умеет.
Кстати, было бы не плохо добавить свойство retentive переменным и хранить все их значения в каком-то зашифровааном файле в папке проекта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Сентября 2018, 09:58:25
Цитировать
ведь переменная архивируется. Почему она обнуляется, ведь в скрипте она не переобъявляется?
Архивация используется для отображения трендов по переменным и не влияет на значение переменной после перезапуска.

Цитировать
Кстати, было бы не плохо добавить свойство retentive переменным
В ближайших обновлениях добавим возможность инициализации внутренних переменных любым значением при старте, а также возможность восстановления значения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 27 Сентября 2018, 18:26:58
Еще вопрос - пытаюсь создать свой отчет в демо-версии, но похоже, что это невозможно. Так?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 27 Сентября 2018, 20:39:17
Еще вопрос - пытаюсь создать свой отчет в демо-версии, но похоже, что это невозможно. Так?
В двух демо-версиях можно протестировать систему отчетов. В версии DEMO-64 можно построить отчет не более 5 раз после каждого перезапуска сервера скады. В версии DEMO-TIME не более 32 раз. Возможно у Вас отчет просто содержит какие-то ошибки и его не удается построить. Если это так, то Вы должны увидеть соответствующие сообщения о неудачном построении в журнале сервера (https://simple-scada.com/help/manual/server-journal.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 02 Октября 2018, 11:37:17
Спасибо, так оно и есть, превышено количество запусков отчета.
Еще вопрос: пытаюсь вызвать процедуру RunSQL() - никакой реакции. Видимо, она не работает в демо-версии? Но почему нет никакой ругани?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 02 Октября 2018, 15:08:51
Здравствуйте!

Процедура RunSQL недоступна в версии DEMO-64. Протестировать работу процедуры RunSQL можно на версии DEMO-TIME.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 02 Октября 2018, 18:20:27
Процедура RunSQL недоступна в версии DEMO-64. Протестировать работу процедуры RunSQL можно на версии DEMO-TIME.
Проверил - действительно... Спасибо еще раз. Буду раскручивать директора на покупку проф-версии.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: abarenov от 05 Октября 2018, 15:58:47
огромное спасибо...возможно ли к данному скрипту прибавить сообщение..которое будет появляться в логе (+звук), при плохом признаке качества переменной... естественно сообщение должно соответствовать  тому полю которое окрасилось в красный цвет..
Да, можно. Вот так:

Код
var
  aVar: TM_Variable;
begin
  // сначала проверяем что скрипт вызван объектом
  if Sender is TM_Object then
  begin
    // получаем переменную с которой связан объект
    aVar := TM_Object(Sender).Variable;

    // если не удалось получить переменную объекта, то прерываем выполнение скрипта
    if not Assigned(aVar) then Exit;

    if aVar.IsGoodQuality then
      TM_Object(Sender).Color := clLime
    else
      begin
        TM_Object(Sender).Color := clRed;
        AddMessage(Now, mkWarning, Sender.Name + '. Плохое качество тега!', TRUE, TRUE);
      end;
  end;
end.

Обратите внимание, что процедура AddMessage появилась только в Simple-Scada 2.2.0.0 (http://simple-scada.com/forum/index.php?topic=178.msg2930#msg2930). Обновите, если у Вас более старая версия.


Здравствуйте. В Simple Scada 2 имеется двадцать полей, в которые выводятся значения температур. Как можно периодически (по таймеру) подсвечивать поле с максимальным значением?
Здравствуйте. Правильнее будет не по таймеру, а по изменению (OnDataChange). Все поля придется перебирать в скрипте (в будущем сможем предложить лучшее решение, но пока только так). Далее подробное описание реализации.

Допустим наши поля называются Field1, Field2 ... Field20. Переходим в меню скриптов и нажимаем кнопку "Создать скрипт". В раскрывшемся окне вводим название скрипта, а тип события оставляем "Универсальный". И пишем такой код:

Код
var
  aMaxField: TM_Field;

  procedure GetMax(AField: TM_Field);
  begin
    AField.Color := clSilver;  // сбрасываем цвет поля на стандартный
    if AField.AsInt > aMaxField.AsInt then
      aMaxField := AField;
  end;

begin
  aMaxField := Field1;

  GetMax(Field1);
  GetMax(Field2);
  //... и так далее
  GetMax(Field20);

  aMaxField.Color := clIndianRed; 
end.

Готово. Теперь выделяем все 20 полей и на событие OnDataChange ставим этот скрипт.

Далее опишем код скрипта: есть локальная переменная aMaxField, которая сначала устанавливается равной первому полю Field1. Затем для каждого из полей вызывается подпроцедура GetMax в которую передается очередное поле. И если значение в переданном поле больше чем значение в aMaxField, то aMaxField приравнивается переданному полю. В итоге после всех процедур GetMax в переменной aMaxField будет поле с самым большим значением. Его мы и подсвечиваем красным цветом. В примере работа идет с целочисленными переменными. Если у вас в полях вещественные числа, то измените в коде AsInt на AsFloat.

может чтобы не перебирать поля связать их имя с переменной например таким образом
имя поля равно Field + ID переменной
а в переборе использовать GetFieldByName('Field' + inttostr(Variable.ID)) вместо Field1,Field2 и тп?
все равно ведь в скрипт будут добавляться переменные для отслеживания?
или если в качестве переменных в скрипте будут лежать TM_Field то может Variable.Maximum?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Октября 2018, 22:13:13
abarenov, сообщения которые Вы процитировали от 07 марта 2017 года, тогда в Simple-Scada было значительно меньше возможностей, функции поиска были недоступны (например GetFieldByName). Поэтому это было невозможно. Сейчас задачу можно решить по-другому.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 10 Октября 2018, 21:36:36
Добрый день,

долго мучился и обнаружил, что запись файла происходит по пути "SScada\projects\название проекта\user files", а исполнение из директории Sscada\

как  уровнять пути?

Код: (delphi)
TextFileOpen('smool.bat', '', fomRewrite, fcpUTF8);     { открыть файл для записи }

  { записать в файл строку }

  Textfilewriteln(textwrite);

  { закрыть файл }
  TextFileClose;

   { запуск }
   RunApplication('brew', 'smool.bat', ''); 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 11 Октября 2018, 10:07:36
Здравствуйте!

Если в функции TextFileOpen (https://simple-scada.com/help/script/textfileopen.html) оставить пустым параметр APath(полный путь к файлу), как это сделано у Вас, то будет взят стандартный путь: "\Simple-Scada\Projects\Папка_проекта\User files\". Также и с процедурой RunApplication (https://simple-scada.com/help/script/runapp.html) - во втором параметре AFileName нужно указать путь к приложению. Например, если нужно записывать в файл, расположенный в директории "D:\Моя папка\", а затем выполнить его, то код необходимо изменить так:

Код: (delphi)
TextFileOpen('smool.bat', 'D:\Моя папка\', fomRewrite, fcpUTF8);     { открыть файл для записи }
 
  { записать в файл строку }
 
  Textfilewriteln(textwrite);
 
  { закрыть файл }
  TextFileClose;
 
   { запуск }
   RunApplication('brew', 'D:\Моя папка\smool.bat', '');
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 12 Октября 2018, 18:23:48
Подскажите, пожалуйста, как нарисовать из скрипта эллипс при открытии экрана? Вариант с заранее нарисованным эллипсом и изменением свойства видимость слишком прост  :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Октября 2018, 20:51:12
Здравствуйте!

Создавать объекты из скрипта нельзя, поэтому самым простым вариантом будет изменение свойства объекта "Видимость".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 15 Октября 2018, 08:33:14
Добрый день подскажите, нужен скрипт для открытия картинки (JPEG) из проекта,  которая находиться на сервере (путь:\\\\hproliant\info_simplescada\Температурный график )
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 15 Октября 2018, 09:33:53
Спасибо! А можете добавить возможность рисовать точку, окружность, прямоугольник с заданными координатами из скрипта? При переходе на другой экран - графические примитивы удаляются.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Октября 2018, 22:33:26
Здравствуйте!

Цитировать
нужен скрипт для открытия картинки (JPEG) из проекта,  которая находиться на сервере (путь:\\\\hproliant\info_simplescada\Температурный график )
Для этого нужно запустить приложение для просмотра изображений(при помощи процедуры RunApplication (https://simple-scada.com/help/script/runapp.html)) и в параметры передать путь к файлу, например:
Код: (delphi)
begin
  RunApplication(GetClientName, 'mspaint.exe', '"\\hproliant\info_simplescada\Температурный график.jpeg"');
end.
При этом, не забудьте открыть доступ к нужному файлу на удаленном ПК.

Цитировать
А можете добавить возможность рисовать точку, окружность, прямоугольник с заданными координатами из скрипта?
Добавление такой возможности не планируется.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 18 Октября 2018, 10:30:34
А через скрипты или как-то иначе можно менять фоновую картинку? Во время работы клиента, естественно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 18 Октября 2018, 11:08:06
Здравствуйте!

Из скриптов можно менять цветовую схему проекта с помощью процедур SetColorSchemeAll (https://simple-scada.com/help/script/setcolorschemeall.html) и SetColorSchemeClient (https://simple-scada.com/help/script/setcolorschemeclient.html). Если требуется менять цвет фона страницы, то это можно сделать только разместив на странице фоновое изображение и менять его цвет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 18 Октября 2018, 11:22:30
Сторонняя утилита делает вычисления и результат выдает в виде картинки. Вот эту картинку мне динамически надо подгружать в скаду для отображения. Невозможно?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 18 Октября 2018, 15:06:54
Такой возможности нет. Можно только открыть изображение запустив через скаду стороннее приложение, например Paint, через RunApplication.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 23 Октября 2018, 18:00:31
1. Через RunApplication можно запустить браузер и передать в качестве адреса "192.168.0.100", чтобы сразу открылась нужная страница ?
2. Можно ли прочитать данные со страницы браузера, используя скрипты?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreiKov от 23 Октября 2018, 21:21:18
maks48, можно, например, так (https://simple-scada.com/forum/index.php?topic=576.msg5298#msg5298)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Октября 2018, 15:44:58
Цитировать
1. Через RunApplication можно запустить браузер и передать в качестве адреса "192.168.0.100", чтобы сразу открылась нужная страница ?
Да, можно, например:
Код: (delphi)
begin
  RunApplication(GetClientName, 'C:\Program Files\Internet Explorer\iexplore.exe', 'http://simple-scada.com');
end.

Цитировать
2. Можно ли прочитать данные со страницы браузера, используя скрипты?
Стандартными средствами нельзя.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 25 Октября 2018, 17:46:33
В двух демо-версиях можно протестировать систему отчетов. В версии DEMO-64 можно построить отчет не более 5 раз после каждого перезапуска сервера скады. В версии DEMO-TIME не более 32 раз.
Мы приобрели проф-версию, но почему-то через некоторое время отчеты все равно перестают запускаться. Что у нас не так?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Октября 2018, 17:50:31
В журнале сервера (https://simple-scada.com/help/manual/server-journal.html) выводятся какие-то сообщения связанные с построением отчетов?
Вы уверены, что на Вашем ПК установлена лицензионная версия и Вы запускаете именно её? Посмотрите что отображается в строке версия на странице "Состояние сервера" (https://simple-scada.com/help/manual/server-status.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 25 Октября 2018, 19:15:41
В журнале сервера (https://simple-scada.com/help/manual/server-journal.html) выводятся какие-то сообщения связанные с построением отчетов?
Вы уверены, что на Вашем ПК установлена лицензионная версия и Вы запускаете именно её? Посмотрите что отображается в строке версия на странице "Состояние сервера" (https://simple-scada.com/help/manual/server-status.html).
В журнале никаких сообщений об ошибках нет. На ПК стоит лицензионная версия сервера с ключом, и запущена именно она. Может, надо было удалить все демо-версии перед установкой лицензионной?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Октября 2018, 19:26:26
Удалять не нужно, главное чтобы был запущен именно лицензионный сервер, а не Demo-64 или Demo-Time. Также отчеты могут не строиться, если во время построения отчета возникают ошибки. Но в этом случае текст ошибки должен отобразиться в журнале сервера. У Вас отчет не строится ни одного раза? Или несколько раз строится и затем перестаёт? Вы проверяли журнал сервера после неудачных попыток построения отчета?

Какую версию скады Вы используете? Напишите запрос на support@simple-scada.com (http://support@simple-scada.com), с указанием организации или физ.лица приобретавшего лицензию. Мы вышлем последнюю версию.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 26 Октября 2018, 10:38:14
Удалять не нужно, главное чтобы был запущен именно лицензионный сервер, а не Demo-64 или Demo-Time. Также отчеты могут не строиться, если во время построения отчета возникают ошибки. Но в этом случае текст ошибки должен отобразиться в журнале сервера. У Вас отчет не строится ни одного раза? Или несколько раз строится и затем перестаёт? Вы проверяли журнал сервера после неудачных попыток построения отчета?
Надо еще понаблюдать. Возможно, в отчетах были ошибки, хотя в журнале никаких сообщений не было. Самое интересное, что в предварительном просмотре отчет формировался, а из клиента не вызывался, помогал только перезапуск сервера.

Какую версию скады Вы используете?
Версия 2.3.1.0, получена в октябре 2018 года, я думаю, что это самая-самая.
P.S. В журнале нашел сообщения типа "Подключен клиент системы отчетов", "Отключен клиент системы отчетов", "Отчет такой-то поставлен в очередь на отправку", "Отчет такой-то отправлен клиентам".  Что это означает?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Октября 2018, 18:08:10
Цитировать
В журнале нашел сообщения типа "Подключен клиент системы отчетов", "Отключен клиент системы отчетов", "Отчет такой-то поставлен в очередь на отправку", "Отчет такой-то отправлен клиентам".  Что это означает?
Это стандартные сообщения. Первые два выдаются если вы в редакторе отчетов нажимаете кнопку "обновить данные". Вторые два когда строите реальный отчет через скаду и он отправляется клиентам для просмотра. Если будут сообщения связанные с ошибками, то они будут выделены красным цветом.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 26 Октября 2018, 18:27:37
Спасибо за ответ, вроде разобрался. В одном из отчетов была ошибка с началом периода, после попытки его запуска переставали запускаться другие отчеты. Но в журнале никаких сообщений об ошибке не было.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 29 Октября 2018, 17:37:16
Не могу понять, как формируется отчет "по изменению". Почему добавляются строки, хотя ничего не меняется? Переменные тоже архивируются "по изменению". Как сделать, чтобы не было подряд повторяющихся строк? Прикладываю два фрагмента отчетов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Октября 2018, 18:12:55
Работает довольно примитивно. Он добавляет новую строку каждый раз, когда любая переменная изменилась, а меняются переменные в разное время, поэтому строки дополняются недостающими (обычно повторяющимися) данными. Допустим есть переменные vrA и vrB и они архивируются.

vrA меняется каждые две секунды:
Код
Время   | Значение
-------------------
00:00   | 1
00:02   | 2
00:04   | 3
00:06   | 4

vrB каждые три секунды:
Код
Время   | Значение
-------------------
00:00   | 10
00:03   | 20
00:06   | 30
00:09   | 40

И если добавить обе переменные в один источник данных "По-изменению", то все изменения отобразятся в одной таблице:
Код
Время   |   vrA   |  vrB   
--------------------------
00:00   | 1       |   10
00:02   | 2       |   ???
00:03   | ???     |   20
00:04   | 3       |   ???
00:06   | 4       |   30
00:09   | ???     |   40

Как видно возникает проблема. Каких-то значений не хватает. Например в архиве нет значения для переменной vrA в 00:03. Но известно, что в 00:02 значение было равно 2 и изменилось оно на 3 только в 00:04. Значит в 00:03 оно не менялось и было равно 2. Таким образом скада дополняет таблицу недостающими данными и в источнике данных мы имеем следующую таблицу:
Код
Время   |   vrA   |  vrB   
--------------------------
00:00   | 1       |   10
00:02   | 2       |   10
00:03   | 2       |   20
00:04   | 3       |   20
00:06   | 4       |   30
00:09   | 4       |   40

Так и получается таблица с якобы повторяющимися данными. На самом деле скада просто избавляется от пустот в таблице.

Как уменьшить количество повторяющихся строк?
В меню "Действия - Редактировать источники" , у источника данных можно выбрать по каким столбцам будут формироваться новые строки, а остальные столбцы можно выключить. Выбор активных столбцов показан на этих скринах: скрин1 (https://simple-scada.com/forum/index.php?action=dlattach;topic=507.0;attach=1554;image), скрин2 (https://simple-scada.com/forum/index.php?action=dlattach;topic=507.0;attach=1556;image).

Если рассматривать описанный выше пример, то можно было бы оставить включенной только переменную vrA, тогда новая строка будет создаваться только по изменению этой переменной и результат будет таким:
Код
Время   |   vrA   |  vrB   
--------------------------
00:00   | 1       |   10
00:02   | 2       |   10
00:04   | 3       |   20
00:06   | 4       |   30
Как видно, это позволяет избавиться от "лишних" строк, но часть данных vrB будет потеряна.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 29 Октября 2018, 20:02:12
Спасибо за подробный ответ. Я подозревал, что все происходит именно так, но не мог сформулировать. А можно в одном отчете создать несколько источников данных - один по изменению одной переменной, а другой - по изменению другой? Не избавит ли этот прием от пустых или повторяющихся строк?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 30 Октября 2018, 16:53:58
Можно. Если в источник поместить только одну переменную, то Вы увидите чистую выборку из БД по этой переменной, т.к. объединять её с выборками других переменных не придется. Недостаток только в том, что в отчете каждый источник данных будет отображен отдельной таблице, например таблица по переменной vrA и ниже таблица по переменной vrB.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 07 Ноября 2018, 10:06:10
На экране есть n окружностей. Как можно в цикле работать со свойствами всех объектов? Т.е. в скрипте не напрямую писать shape1.visible:= true; ...
a через ссылку или указатель на объект.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Ноября 2018, 10:13:47
maks48, имя объекта является именно указателем на объект. Перебрать объекты в цикле можно через функцию поиска по имени, например GetShapeByName (https://simple-scada.com/help/script/getshapebyname.html), если имена однотипные. Но это не идеальное решение и практически всегда можно обойтись без перебора, решив задачу с использованием универсального скрипта. Опишите задачу подробнее, нужно менять видимость фигуры в зависимости от значения переменной?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 07 Ноября 2018, 10:31:34
У меня есть 100 окружностей, например. Есть 100 замеров в бд. Результаты замеров я присваиваю координатам х и у окружностей для визуализации данных. Вот этот алгоритм я хочу реализовать в цикле.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Ноября 2018, 10:50:55
Тогда только перебором через GetShapeByName, что плохо, т.к. каждый раз на каждый объект будет выполняться поиск по имени. SCADA-система совершенно не подходит для решения подобных задач, поэтому любое возможное решение на скаде будет плохим по производительности и его будет трудно реализовать. Скорее всего Вам нужно использовать какое-то специализированное ПО.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Дмитрий_021 от 07 Ноября 2018, 12:14:34
Добрый день, можно ли к скрипту приявязать более 2 переменных (основной и дополнительной), скрипт используется для объекта - Поле.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 07 Ноября 2018, 17:57:22
Здравствуйте!

Да, можно. Для этого создайте скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)" и добавьте в него необходимые переменные. Примеры создания скрипта по событию "Изменились переменные" можно найти здесь (https://simple-scada.com/help/script/changemulvar.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: maks48 от 08 Ноября 2018, 10:37:25
Если из скрипта выполнить команду SELECT * FROM my_base, то в DataSet будет вся бд. Если какие-то ограничения на размер базы, число строк, столбцов?
Например, бд содержит 25 столбцов и 10000 строк. Корректно делать выборку одним запросом или лучше придумать алгоритм сортировки и вычитывать данные постепенно?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Ноября 2018, 19:25:31
Это зависит от производительности серверного ПК и операций, которые затем нужно выполнять с полученным набором данных. Можно просто заполнить таблицу БД данными на указанную величину и протестировать под конкретный серверный ПК. Если производительности не хватит, то нужно будет разделять запросы и выбирать данные по частям.
Название: Помогите со скриптом!
Отправлено: vyacheslav от 12 Ноября 2018, 07:46:47
Добрый день помогите правильно составить скрип. есть формула расчета температуры подачи и обратки по теплу, вот она :
Код
koef_rasch := (21 - t_narvozd) / (t_komfort + 43);
IF (t_narvozd >= -43) THEN
  t_zad := t_komfort + 61 * 0.5 * koef_rasch + (129 - t_komfort * 2) * 0.5 * EXPT(koef_rasch, 0.8);
ELSE
  t_zad := 95;
END_IF
t_zad_obr := t_zad - 25 * koef_rasch;
EXPT - это возведение в степень.
Помогите перевести ее в скрипт, все наименования, это переменные           
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Ноября 2018, 13:32:54
Здравствуйте.

Вот пример:
Код: (delphi)
begin
  koef_rasch.Value := (21 - t_narvozd.Value) / (t_komfort.Value + 43);
  if t_narvozd.Value >= -43 then
    t_zad.Value := t_komfort.Value + 61 * 0.5 * koef_rasch.Value +
            (129 - t_komfort.Value * 2) * 0.5 * Power(koef_rasch.Value, 0.8)
  else
    t_zad.Value := 95;

  t_zad_obr.Value := t_zad.Value - 25 * koef_rasch.Value;
end.

Но, если мы правильно поняли, переменные "koef_rasch" и "t_zad" нужны только во время проведения расчета, тогда их можно сделать локальными, например:
Код: (delphi)
var
  koef_rasch, t_zad: Double;
begin
  koef_rasch := (21 - t_narvozd.Value) / (t_komfort.Value + 43);
  if t_narvozd.Value >= -43 then
    t_zad := t_komfort.Value + 61 * 0.5 * koef_rasch +
      (129 - t_komfort.Value * 2) * 0.5 * Power(koef_rasch, 0.8)
  else
    t_zad := 95;

  t_zad_obr.Value := t_zad - 25 * koef_rasch;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kolya_asu от 12 Ноября 2018, 14:18:53
Добрый день. Коллеги, помогите пожалуйста в написании скрипта, нужно внешнею переменную (типа INT), преобразовать побитно во внутренние переменные (типа BOOL), Var0, Var1, Var2, и т. д. Кто то делал подобное? Заранее благодарю за любую подсказку в данном вопросе. Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Ноября 2018, 14:21:09
Здравствуйте.

См. функции для работы с битами (https://simple-scada.com/help/script/work-bits.html). Разбивать на биты лучше всего в скрипте по изменению переменной (https://simple-scada.com/help/script/changed-the-variables.html).
Код: (delphi)
begin
  Var1.Value := GetBit(VarName.AsInt, 0); // получить значение 1-ого бита переменной "VarName"   
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: aleks218 от 15 Ноября 2018, 23:49:16
Здравствуйте!
Не подскажите как из  скрипта для кнопки получить значение Tag(дополнительной переменной) подстраницы на которой находится эта кнопка .Скрипт должен быть универсальным без явного прямого обращения   
Код: (delphi)
var
  aVar: TM_Variable;
  aName: string;
  aTagPage: string;
  aStatus: string;
begin
  if Sender is TM_Object then
    with Sender as TM_Object do
      if VariableEx.Value = True then
      begin
        Visible := True;
        aName := IntToStr(Sender.Tag);
        aTagPage := IntToStr // (здесь необходимо получить значение дополнительного тега подстраницы которая активна);
        // aVar:= GetVariableByName ()
      end else
        Visible := False;

 { if  VariableEx.Value = True then   // если значение доп переменной объекта равно 1, то
   begin
     FlashColor := clYellow;     // включить мигание объекта жёлтым цветом
     AnimSpeed := 5;
   end else                      // иначе
     begin
       FlashColor := clNone;     // отключить мигание объекта
       AnimSpeed := 0;
     end;
 end; }
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 16 Ноября 2018, 12:14:59
Добрый день, подскажите как правильно написать скрипт. (он должен  быть универсальным) Есть лампочка, к ней привязана основная переменная, скрипт должен проверять что если число переменной выходит за рамки значения от 4 до -4 включая ноль (то есть если будет 5 и больше или -5 и меньше) то должно включать горение красным цветом. Спасибо за внимание
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Ноября 2018, 12:40:13
Не подскажите как из  скрипта для кнопки получить значение Tag(дополнительной переменной) подстраницы на которой находится эта кнопка
У страниц и подстраниц нет таких свойств. Они не могут быть привязаны к переменной, или к дополнительной переменной. У них есть только свойство Тег (целое число). Может быть нужно по номеру тега получить переменную. Например, если у страницы Тег = 200, то получить переменную с именем varable200? Если у другой страницы Тег = 111, то получить переменную с именем varable111 и т.д.?

Добрый день, подскажите как правильно написать скрипт. (он должен  быть универсальным) Есть лампочка, к ней привязана основная переменная, скрипт должен проверять что если число переменной выходит за рамки значения от 4 до -4 включая ноль (то есть если будет 5 и больше или -5 и меньше) то должно включать горение красным цветом. Спасибо за внимание
Вот пример:
Код: (delphi)
begin
  if Sender is TM_Object then
    with Sender as TM_Object do
      if (AsInt < -4) or (AsInt > 4) then
        Color := clRed
      else
        Color := clNone;
end.
Этот скрипт для события OnDataChange и подойдёт для всех объектов, которые связаны с переменной. Объект будет менять цвет на красный, если значение переменной меньше -4, или больше 4.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 17 Ноября 2018, 04:04:58
Здравствуйте!
Не подскажите как из  скрипта для кнопки получить значение Tag(дополнительной переменной) подстраницы на которой находится эта кнопка .Скрипт должен быть универсальным без явного прямого обращения   

Получить пары: <тэг текущей подстраницы> - <тэг объекта> можно следующими способами:

1. Разделить собственный тэг объекта на два поля: <тэг подстраницы><тэг объекта> с учетом количества объектов и подстраниц. 
Скрипт для десятичного представления тэга (до 100 объектов): <тэг подстраницы> * 100 + <тэг объекта>
Код: (delphi)
var
  aName: string;
  aTagPage: string;
begin
  . . .
  aName := IntToStr(Sender.Tag div 100);
  aTagPage := IntToStr(Sender.Tag mod 100);
  . . .
end.

2. Использование переменной для хранения тэга текущей подстраницы iTagPage.
   Скрипты для отслеживания перемещения по страницам/подстраницам:
   Событие "Пользователь перешел на эту страницу/подстраницу":
Код: (delphi)
begin
// для подстраницы - установить ее тэг, для страницы - восстановить тэг подстраницы, открытой последней на этой странице
  iTagPage.Value := Sender.Tag;
end.
   Событие "Пользователь покинул эту страницу":
Код: (delphi)
begin
  Sender.Tag := iTagPage.AsInt;    // запомнить тэг подстраницы, открытой последней на этой странице
    Начальные значения:
Тэг страницы равен тэгу первой подстраницы.
Начальное значение переменной iTagPage равно тэгу первой подстраницы первой страницы.

Пример для объектов типа Text (2 в 1: управление - индикация) во вложении.


P.S. На мой взгляд задавать вопрос "как сделать" следует в отдельной теме (поиск по названию темы, ответы в одном месте,
возможность продолжения).

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: aleks218 от 17 Ноября 2018, 22:56:29
Спасибо за ответ по поводу дополнительного тега под страницы!
Замысел заключался в необходимости отслеживания нажатия кнопки на определённой под странице.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kolya_asu от 03 Декабря 2018, 04:03:16
Здравствуйте.

См. функции для работы с битами (https://simple-scada.com/help/script/work-bits.html). Разбивать на биты лучше всего в скрипте по изменению переменной (https://simple-scada.com/help/script/changed-the-variables.html).
Код: (delphi)
begin
  Var1.Value := GetBit(VarName.AsInt, 0); // получить значение 1-ого бита переменной "VarName"   
end.
Здравствуйте. Попробовал повторить скрипт, но он почему то не работает. Что я сделал не правильно? Посмотрите пожалуйста.
Код: (delphi)
begin
  IntVar_1.Value := GetBit(MI120_Alarms.AsInt, 0);
  IntVar_2.Value := GetBit(MI120_Alarms.AsInt, 1);
  IntVar_3.Value := GetBit(MI120_Alarms.AsInt, 2);
  IntVar_4.Value := GetBit(MI120_Alarms.AsInt, 3);
  IntVar_5.Value := GetBit(MI120_Alarms.AsInt, 4);
end. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 03 Декабря 2018, 14:16:08
Добрый день! Помогите разобраться почему не работают функции работы с архивом.
Задача такая - получить по данным из архива разницу между минимальным и максимальным значением переменной за промежуток времени и результат занести в таблицу.
Архив заполнен случайными значениями переменной от 0 до 1000 (для теста), начальное время берётся из объекта календарь (переменная StartT):
Код: (delphi)
  // Заполнение суточной таблицы получасовыми отрезками
  if chbValue_2.Value = 1 then
    begin
      tbl_Ed.Visible := True;
      tbl_Ed.Caption := tblCapt;
      et := StartT;                   
      st := IncMinute(StartT,-30);  // Начало периода
        for i:=1 to 48 do
          begin
            st := IncMinute(st,30);
            et := IncMinute(et,30);
            ArchiveMin(EnergyAin_1,EnergyAin,st,et);
            ArchiveMax(EnergyAin_1,EnergyAout,st,et);
            tbl_Ed.Columns[0].Cells[i].Text := DateTimeToStr(st)+ ' - ' +TimeToStr(et);
            tbl_Ed.Columns[1].Cells[i].Text := FloatToStr(EnergyAout.Value-EnergyAin.Value);
          end;
    end;

Таблица заполняется нулями, хотя данные в архиве есть. Переменная EnergyAin_1 с ID = 8 в проекте архивируется, в Workbench данные записаны, все скрины во вложении.
Пробовал Average, Integral просто минимальное за период - всегда нули.
Scada версии Demo-Time 2.3.2

UPD. Пробовал сделать просто вывод в окна минимального и максимального значения за период с 12:10 по 12:40. Значения выводит верно, разность считает только при повторном выполнении скрипта. Почему в цикле не берёт значения из архива непонятно, подскажите куда копать или вообще может по-другому сделать? Думал о варианте с SQL-запросами, но там я получу все значения за сутки например, как потом из получасовых отрезков получить разность значений?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 04 Декабря 2018, 10:47:37
kolya_asu, в приведённом Вами коде берутся первые пять битов переменной MI120_Alarms и расставляются в переменные IntVar_1..IntVar_5 соответственно. Чтобы данный код работал, он должен находиться в скрипте с типом события "Изменились переменные" (https://simple-scada.com/help/script/event-types.html). Если скрипт не выполняется, значит либо переменная MI120_Alarms не изменяется, либо вы забыли добавить эту переменную в список переменных скрипта (https://simple-scada.com/help/script/changemulvar.html) (кнопка Выбрать переменные).

Timofei, все верно, ведь функции для работы с архивом выполняются асинхронно в отдельном потоке, т.к. они "тяжелые" и могут работать с произвольным кол-вом данных + у пользователей разные по производительности ПК. Вот код с комментариями:
Код: (delphi)
...
  { здесь мы запускаем вычисление архивного значения. Когда вычисления будут завершены,
    результаты запишутся в переменные EnergyAin и EnergyAout }
  ArchiveMin(EnergyAin_1, EnergyAin, st, et);
  ArchiveMax(EnergyAin_1, EnergyAout, st, et);
  { и сразу же, не дожидаясь завершения вычислений (ведь они могут занять сколько угодно
    времени), переходим к выполнению следующих строк скрипта }

  { здесь в переменных EnergyAin и EnergyAout всё ещё будут нули, т.к. вычисления архивных функций
    ещё не завершены }
  tbl_Ed.Columns[0].Cells[i].Text := DateTimeToStr(st)+ ' - ' +TimeToStr(et);
  tbl_Ed.Columns[1].Cells[i].Text := FloatToStr(EnergyAout.Value-EnergyAin.Value);
...
Поэтому правильнее было бы связать ячейки таблицы с переменными EnergyAin и EnergyAout, тогда скада сама отобразит их значения после завершения вычислений
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 04 Декабря 2018, 11:40:57
Цитата: Simple-Scada
Поэтому правильнее было бы связать ячейки таблицы с переменными EnergyAin и EnergyAout, тогда скада сама отобразит их значения после завершения вычислений
Спасибо за разъяснение, переделал с перемеными в ячейках, всё работает как надо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: p001p от 05 Декабря 2018, 22:43:31
День добрый.
Ситуация очень простая, но поставила в тупик.

Как реализовать скрипт "обратной связи" для модбас значения с ОРС сервера?

Дано:
2 задатчика, локальный и скада.
Устройство которое не имеет никаких средств для хранения значений и сразу "пропускает" значение в логику программы.

Пример работы:
1. На локальном изменили уставку, значение записалось в логику программы и в тэг А (тэг предназначен только для чтения).
2. Скада читает данный тэг А.
3. В самой скаде присутствует тэг В, который осуществляет запись в устройство. При этом, если мы записываем в тэг В, то тэг А остается без именений. И наоборот. Если мы записываем в тэг А, то тэг В остается без изменений.
4. Собственно вопросы по скрипту:
- как сделать проверку значения А==В и запись в тэг В значения тэга А если условие А=!В?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Декабря 2018, 21:12:58
Здравствуйте.

Цитировать
как сделать проверку значения А==В и запись в тэг В значения тэга А если условие А=!В?
Код: (delphi)
{ если значение тега А не равно значению тега B }
if (A.Value <> B.Value) then
  {  то записываем значение тега А в тег B }
  B.Value := A.Value;

Пример проверки на равенство:
Код: (delphi)
{ если значение тега А равно значению тега B }
if (A.Value = B.Value) then
begin
  // здесь можно расположить свой код
end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Labotrays от 13 Декабря 2018, 06:42:08
отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpvit от 13 Декабря 2018, 08:30:10
Добрый день, прошу подсказки:
как сделать фильтрацию антидребезга контактов с настраиваемым периодом с помощью скрипта.

Не спрашивайте лучше почему в скаде: просто нужно)
Спасибо заранее
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 13 Декабря 2018, 08:46:03
отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(
У кнопки есть выбор типа "С фиксацией", этого недостаточно чтобы сделать переключатель?

Добрый день, прошу подсказки:
как сделать фильтрацию антидребезга контактов с настраиваемым периодом с помощью скрипта.

Сомнительно что это на скаде получиться реализовать, скада обновляет значение тега с заданным интервалом (1 сек по-умолчанию). Можно конечно попробовать сделать скрипт изменились переменные и по ней запускать таймер, но я таймера не применял никогда, не совсем понятно из хелпа как они работают.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpvit от 13 Декабря 2018, 08:52:09
Сомнительно что это на скаде получиться реализовать, скада обновляет значение тега с заданным интервалом (1 сек по-умолчанию). Можно конечно попробовать сделать скрипт изменились переменные и по ней запускать таймер, но я таймера не применял никогда, не совсем понятно из хелпа как они работают.
Ну и я о том же, нужно видеть что повторяется включение, запустить таймер (с возможностью менять его значение) и если по прошествии заданного времени условие сохраняется - повторить включение.

управляющим устройством идет модуль МУ210. Принимающим состояние: МВ210 ( в нем еще сейчас включил антидребезг, может и хватит данной манипуляции ;D)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Labotrays от 13 Декабря 2018, 10:16:24
делается для операторов бабулек и высока вероятность принять включено за включить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 13 Декабря 2018, 13:51:20
делается для операторов бабулек и высока вероятность принять включено за включить.

Так сделайте в выключенном состоянии кнопку зелёного цвета с надписью "Включить", во включённом - красного с надписью "Отключить". Ещё и иконки поставьте информативные, никакая бабуля не спутает 8)

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpvit от 13 Декабря 2018, 14:04:05
отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(
чем Вас кнопка с фиксацией не устраивает? и в ней же как выше посоветовали выбираете цвет индикации состояния.
Если только нужно использовать кнопки без фиксации - то кнопку делаем прозрачной и подкладываем фигуру в размер кнопки с изменением фона по условию изменения доп переменной ( состояния кнопки). Оба варианта использую - так же операторы из "умных"
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Labotrays от 14 Декабря 2018, 05:15:50
что за манера вопросом на вопрос отвечать? я спросил - есть или нет? если нет то буду из кнопок городить
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpvit от 14 Декабря 2018, 05:45:54
если нет то буду из кнопок городить
Простите великодушно ;)
Но Ваш ник и Ваша манера так же отвечать, говорят сами за себя.
П.с. кнопка с фиксацией выполняет роль переключателя. Или вам графический элемент нужен с анимацией.....?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 14 Декабря 2018, 07:06:46
делается для операторов бабулек и высока вероятность принять включено за включить.

При данных условиях вполне подходит переключатель из объекта "Уровень" при условии, что его переменная доступа целого типа со шкалой [0-1].
Процесс переключения заключается в перемещении указателя мыши на движок, захвата движка и его перемещении более чем на половину шкалы, что более сложно, чем просто переместить указатель на объект и нажать ЛКМ.
"Пример" во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alan54 от 16 Декабря 2018, 16:22:35
Хотел задать свой вопрос, но нашел аналогичный полуторалетней давности и ответ на него.

...При этом мы хорошо понимаем, что описанные Вами функции будут очень полезны даже при решении небольших задач, поэтому пункты 1, 2, 4 (касаемо глобальных классов) и 7 будут реализованы в будущих обновлениях...
Можно узнать, когда они (глобальные процедуры) будут реализованы? Надоело один и тот же кусок кода размножать по нескольким скриптам...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Декабря 2018, 09:41:51
alan54, скорее всего в одном из двух ближайших обновлений добавим глобальные модули.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 24 Декабря 2018, 19:20:07
Simple-Scada У меня есть несколько кнопок.
Button123
Button124
Button125
У меня есть один выход PWM  ArduinoSerial0_D2
Как изменить этот скрипт, чтобы получить другое напряжение на выходе ArduinoSerial0_D2 а нет променя цвета.

Код: (delphi)
begin
// Sender - это объект, который вызвал скрипт(например поле, изображение и т.д.)
   if Button123 is TM_Object then     // проверяем, что Sender это объект
     with Button123 as TM_Object do   // приводим Sender к типу "TM_Object"
       case AsInt of               // если значение переменной связанной с объектом равно:
         1..25: Color := clYellow;     // от 1 до 5 - изменить цвет на красный
         26..50: Color := clChartreuse;   // 6 или 7 - изменить цвет на зеленый
         51..255  : Color := clRed;  // 8 - изменить цвет на желтый
       end;
end. 

   Нажатие кнопки Button123 на    ArduinoSerial0_D2 примерно 1волт
   Нажатие кнопки Button124 на    ArduinoSerial0_D2 примерно 2волт
   Нажатие кнопки Button125 на    ArduinoSerial0_D2 примерно 2волт
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 24 Декабря 2018, 20:17:09
Если требуется изменять значение переменной, то нужно использовать свойство переменной Value (https://simple-scada.com/help/script/varvalue.html). Например:

Код: (delphi)
begin
  { записываем значение 15 в переменную ArduinoSerial0_D2}
  ArduinoSerial0_D2.Value := 15;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 25 Декабря 2018, 12:42:43
Simple-Scada  скрипт не работает правильно.
Я хочу, чтобы при нажатии кнопки остальные не включались и на выходе имели, например, 1 вольт. Когда я нажимал вторую кнопку, первая выключалась, а вторая - на выходе, например, 2 вольт.

Мне действительно нужна эта опция, пожалуйста, настройте мой проект, который я вам отправляю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Декабря 2018, 17:36:30
Здравствуйте.

У Вас в проекте к кнопкам привязана одна и та же переменная "ArduinoSerial0_D2" и для каждой кнопки написан скрипт по событию OnDataChange, в котором меняется значение той же переменной "ArduinoSerial0_D2". Т.е., при нажатии на любую кнопку будут выполняться все скрипты, так как значение переменной "ArduinoSerial0_D2" изменится. Это неправильно.

Если Вам требуется при нажатии на первую кнопку записать в переменную "ArduinoSerial0_D2" значение 15, при нажатии на вторую кнопку значение 50, на третью 70 и т.д., то это можно сделать без использования скриптов. Оставьте у кнопки только одно состояние и установите для каждой кнопки необходимое значение - см. скриншот во вложении. Проект с примером во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 26 Декабря 2018, 11:10:13
Simple-Scada
Это именно то, что мне нужно, но мне нужно получить нулевое значение при повторном нажатии кнопки.
Как это можно сделать, но кнопки имеют две позиции, например, когда вы нажимаете один раз, значение равно 75, а при повторном нажатии значение равно нулю?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 26 Декабря 2018, 16:26:47
emoxristov!
 
Возможно Вам подойдет "радиокнопка", в примере два варианта алгоритма:
- не более одной нажатой кнопки (см. этот);
- только одна нажатая кнопка.

Кнопки с фиксацией и управляются битами переменной iButtons, тег кнопки равен битовой маске.
Переменная кнопок модифицируется скриптами по событию "Пользователь кликнул объект мышью"
Код
begin
  iButtons.Value := Sender.Tag and iButtons.AsInt;   //  не более одной нажатой кнопки
// действия по кнопкам
  case iButtons.AsInt of
      . . .
  end;
end.

Код
begin
  iButtons.Value := Sender.Tag;   // только одна нажатая кнопка
// действия по кнопкам
  case iButtons.AsInt of
      . . .
  end;
end.

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 26 Декабря 2018, 21:44:26
emoxristov!
 
Возможно Вам подойдет "радиокнопка", в примере два варианта алгоритма:
- не более одной нажатой кнопки (см. этот);
- только одна нажатая кнопка.

Кнопки с фиксацией и управляются битами переменной iButtons, тег кнопки равен битовой маске.
Переменная кнопок модифицируется скриптами по событию "Пользователь кликнул объект мышью"
Код
begin
  iButtons.Value := Sender.Tag and iButtons.AsInt;   //  не более одной нажатой кнопки
// действия по кнопкам
  case iButtons.AsInt of
      . . .
  end;
end.

Код
begin
  iButtons.Value := Sender.Tag;   // только одна нажатая кнопка
// действия по кнопкам
  case iButtons.AsInt of
      . . .
  end;
end.

А где поставил переменная ArduinoSerial0_D2 ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 27 Декабря 2018, 04:28:48
А где поставил переменная ArduinoSerial0_D2 ?

Присвоение значений переменной ArduinoSerial0_D2:
Код
var i:integer;
begin
  iButtons.Value := Sender.Tag and iButtons.AsInt;   //  не более одной нажатой кнопки
// действия по кнопкам
  case iButtons.AsInt of
    2: i := 15;  // значения взяты из примера Button_without_scripts
    4: i := 50;
    8: i := 75;
   16: i := 200;
  else
    i := 0;
  end;
  ArduinoSerial0_D2.Value := i;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 17 Января 2019, 12:35:50
Добрый день, подскажите как в этом скрипте:
Код: (delphi)
begin
  ReportView('my_client', 'Текущие данные');
end.
вместо определенного клиента, любой клиент нажавший на кнопку сформировать отчет получал его ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 17 Января 2019, 12:55:58
Здравствуйте.

Для этого нужно использовать функцию GetClientName (https://simple-scada.com/help/script/getclientname.html), которая возвращает имя клиента, который вызвал скрипт:
Код: (delphi)
begin
  ReportView(GetClientName, 'Текущие данные');
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: DikoSt от 21 Января 2019, 14:56:34
подскажите пожалуйста , как можно разобрать строку  и потом собрать её снова , но только без не нужных символов , т.е у меня есть строка - это тэг с плк в формате  дата и время DT  в скаду он передаётся как строка вида он такого  DT#2018-09-03-12:01:03.569   а мне нужно получить
2018-09-03-12:01:03  - заранее благодарен.
Думаю, что как-то так получится:
newString:=Copy(StringFromPLC; 2, 19 Integer);

всё время забываю с 0 начинают отсчитывать или с 1, поэтому 2 и 19 может придётся подправить.
Название: HTTP get/put запросы криптами
Отправлено: midnight1979 от 09 Февраля 2019, 12:07:57
Добрый день!

Возможно ли на уровне скриптов формировать GET/PUT http запросы????
Вариант с RunApplication не очень элегантный...

спасибо.
Название: Re: HTTP get/put запросы криптами
Отправлено: midnight1979 от 09 Февраля 2019, 15:33:56
Добрый день!

Возможно ли на уровне скриптов формировать GET/PUT http запросы????
Вариант с RunApplication не очень элегантный...

спасибо.

Отвечу пока сам себе - на каком решении на данный момент остановился и оно в принципе меня устраивает.
Суть вот в чем - наверняка многие знают про такую штуку как Blynk. Так вот - есть свой сервер Blynk и нужно было передавать значения переменных Simple Scada в проект Blynk'a.
Благо у последнего есть свой HTTP RESTful API. Присвоение и чтение переменных проекта Blynk осуществляется при помощи GET/POST запросов.
В итоге создал в проекте Simple Scada скрипт на изменение переменных, который отправляет значения этих переменных на сервер Blynk при помощи CURL.
Естественно чтобы запустить CURL - воспользовался методом RunApplication, но в моменты запуска (а переменные изменяются часто) появление черных (консольных) виндовых окошек, которые с завидной регулярностью появляются и пропадают - интерфейсно это ну просто НИКАК!!!

В итоге запускаю CURL, но при помощи VBS скрипта (передав в него в качестве параметров значения переменных Simple Scada) - в примере ниже - для двух таких переменных:
RunApplication(SS_SERVER_NAME, 'c:\curl\curl.vbs', FloatToStr(t1.Value, 0) + ' ' + FloatToStr(h1.Value, 0));

//-- сам скрипт --//
Set objArgs = WScript.Arguments
Set oShell = WScript.CreateObject("WScript.Shell")
oShell.Run "c:\curl\curl.exe ip-address:port/blynk_token/update/v0?value="+objArgs(0), 0, falseTRUE
oShell.Run "c:\curl\curl.exe ip-address:port/blynk_token/update/v1?value="+objArgs(1), 0, falseTRUE
//--добавлено
Set objArgs = Nothing
Set oShell = Nothing

PS. В скрипте изменены параметры shell.run c FALSE на TRUE и добавлено обнуление переменных (как заверяют мануалы - эти переменные и сами должны "убиться" по окончанию выполнения, но раз создал сам то и убей сам), иначе произойдут серьезные утечки в памяти...

Вот таким образом не появляется никаких черных окошек - всё работает в фоне.
Всем спасибо, может у кого нибудь есть и другие варианты решения этой задачи, но я пока остановился на вышеописанном.
Пример наипростейший - осуществляется опрос датчика температуры и влажности воздуха, эти данные попадают в Simple Scada с ArOPC-сервера, и скриптом уходят в мобильное приложение Blynk.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: midnight1979 от 10 Февраля 2019, 19:58:19
Функция RunApplication вызывает переполнение памяти при многократном вызове!
Если запускать приложение из скрипта изменения переменной (а это раз в 1-2 секунды) то происходит постепенный рост занимаемой процессом server.exe памяти!
Причем в процессах видно, что запущенная через RunApplication программа отработала и завершилась.
Почему происходит утечка памяти?????????

По факту после запуска сервера Simple Scada - при текущей конфигурации проекта - процесс server.exe занимает в памяти порядка 96 мб, за последующий час работы сервера он уже занимает 117 мб. и так до максимально возможного объема оперативки.

Очень жду ответа разработчиков...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 11 Февраля 2019, 09:54:16
Здравствуйте.

Цитировать
Возможно ли на уровне скриптов формировать GET/PUT http запросы?
Нет, но в будущем появятся такие функции в скриптах.

Цитировать
Функция RunApplication вызывает переполнение памяти при многократном вызове!
Почему происходит утечка памяти?
Скада для запуска приложений использует прямой вызов ShellExecuteExW из WinAPI (https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-shellexecuteexw), никаких доп. действий не выполняется. Если у Вас Windows 10, то возможно Вы столкнулись с ошибкой Windows, которая подробно описана здесь (https://stackoverflow.com/questions/53590512/how-to-avoid-memory-leaks-using-shellexecuteex) и здесь (https://social.msdn.microsoft.com/Forums/azure/en-US/33bade27-ad82-49a7-b9fa-f8eb55803470/shellexecute-leaks-handles?forum=windowsgeneraldevelopmentissues). Она была устранена в последних обновлениях Windows. По крайней мере у нас она не наблюдается в версии 1803 (сборка 17134.472).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: midnight1979 от 11 Февраля 2019, 15:00:14
Версия 1803 (17134.523)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Февраля 2019, 21:31:45
К сожалению в этом вопросе мы вряд ли сможем что-то изменить, т.к. для запуска приложений используется только код Windows. Видимо в сборке 17134.523 также присутствует проблема с ShellExecute (в этом случае можно рекомендовать только сменить версию или сборку ОС), либо утечка связана с чем-то другим. Если есть желание, отправьте нам на support@simple-scada.com текущую версию проекта. Мы можем проверить её на различных ПК, а также на наличие другие проблем (вдруг утечка памяти вызвана чем-то ещё?).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 13 Февраля 2019, 10:39:46
добрый день, подскажите правильность написание этого скрипта верна?

Код: (delphi)
begin
  RunApplication(GetClientName, GetProjectPath + 'Files\info_simplescada\Температурный график', '');
end.

Он не работает у меня в проекте
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Февраля 2019, 11:06:16
Здравствуйте.

"Температурный график" - это файл изображения? Если да, то необходимо через RunApplication открыть приложение для просмотра изображений и в параметры передать путь к файлу. Например:

Код: (delphi)
begin    
  { запустить Paint на клиенте, который вызвал скрипт и открыть изображение }
  RunApplication(GetClientName, 'mspaint.exe', GetProjectPath + '"Files\info_simplescada\Температурный график.jpeg"');
end.

Также, не забудьте указать верное расширение файла, например "Температурный график.jpeg"
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 13 Февраля 2019, 11:16:59
Нет это просто папка
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Февраля 2019, 11:26:52
Тогда нужно запускать проводник Windows(explorer.exe) и код будет таким:

Код: (delphi)
begin   
  { открыть папку в проводнике Windows }
  RunApplication(GetClientName, 'explorer.exe', GetProjectPath + 'Files\info_simplescada\Температурный график');
end.

Этот и другие примеры скриптов для RunApplication можно найти в руководстве по ссылке (https://simple-scada.com/help/script/runapp.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 14 Февраля 2019, 09:36:35
Подскажите возникли проблемы, как правильно исправить: этот код работает на сервере и этот файл лежит именно на сервере, но когда на клиенте выполняю эти действия он не находит этот файл так как локально его нет. как правильно прописать скрипт, чтоб он обращался к папке на сервере?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Февраля 2019, 16:52:22
Если требуется с клиента открыть папку на удаленном ПК, то использовать GetProjectPath не получится и нужно указывать полный путь к папке на сервере, например:

Код: (delphi)
begin   
  { открыть папку в проводнике Windows }
  RunApplication(GetClientName, 'explorer.exe', '\\192.168.1.10\info_simplescada\Температурный график');
end.

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

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: midnight1979 от 16 Февраля 2019, 20:43:36
К сожалению в этом вопросе мы вряд ли сможем что-то изменить, т.к. для запуска приложений используется только код Windows. Видимо в сборке 17134.523 также присутствует проблема с ShellExecute (в этом случае можно рекомендовать только сменить версию или сборку ОС), либо утечка связана с чем-то другим. Если есть желание, отправьте нам на support@simple-scada.com текущую версию проекта. Мы можем проверить её на различных ПК, а также на наличие другие проблем (вдруг утечка памяти вызвана чем-то ещё?).

Вероятно дело и версии, но решил все таки данную задачу пока со Скады снять. Во-первых - память утекает, во-вторых это не совсем задача для Скады таким способом через скрипты работать с API сторонних систем :)
Если бы были методы реализующие на языке скриптов запросы GET и PUT тогда возможно и на скаде бы оставил, а так написал собственного клиента OPC и сделал удобный интерфейс сопоставления тегов сервера с переменными проекта Blynk. - теперь каждый занимается своей задачей... :)

Но возможность работы с HTTP (а еще лучше через websockets) - очень ждем в Simple Scada...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Кумар от 26 Февраля 2019, 12:03:29
Здравствуйте.
Как можно отключить (завершить работу) Web-клиентов?
Используя процедуру CloseApplicationClient/CloseApplicationAll, скрипт срабатывает только для обычных клиентов и для web-клиентов, запущенных через созданную иконку на Android-устройстве.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 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.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 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мс., то правильнее всего это делать на контроллере.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Кумар от 28 Февраля 2019, 07:58:48
Цитировать
Проверим и по возможности добавим отключение web-клиентов через процедуры CloseApplicationClient/CloseApplicationAll.
Ок, будем ждать. Задача стоит именно в автоматическом отключении web-клиентов спустя некоторое время, при максимальном количестве подключенных клиентов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kolya_asu от 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.
Помогите добрые люди.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 07 Марта 2019, 20:31:20
Здравствуйте.

Цитировать
Есть внешняя переменная Temperature(ShortInt) с значением 2395, а надо  преобразовать в внутр. переменную Temp_float(Single), чтобы значение отображалось как  23,95.
Это можно сделать без использования внутренней переменной и скриптов. Откройте редактор переменных, дважды кликните по переменной Temperature, перейдите на вкладку свойств "Дополнительные (https://simple-scada.com/help/manual/index.html?variable-new.html#var_dop)" и установите свойство "Сдвиг запятой" равным "-2". Также, не забудьте назначить переменной соответствующую шкалу, например если переменная Temperature может принимать значения от 0 до 10000, то у нее должна быть шкала 0-10000.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kolya_asu от 08 Марта 2019, 01:00:39
Да точно, совсем забыл! Обязательно попробую завтра. А скажите пожалуйста, для моего развития, что не так я написал в скриптах? Почему не работает первый, а второй не компилится из-за ошибки? Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 08 Марта 2019, 10:48:30
Здравствуйте.

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

Второй не работает, потому что для записи целого числа в вещественное не требуется выполнять преобразования:
Код: (delphi)
var
  Temp_float: Single;
  Temperature: ShortInt;
begin
 Temp_float := Temperature;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: EvgeniySM от 11 Марта 2019, 09:04:04
Всем привет.

Есть переменная в контроллере, тип DWORD. В ней записаны секунды, общим количеством не более чем 86400 (полное количество секунд в сутках). Как можно отобразить на скаде в полях отдельно часы, минуты и секунды данной переменной с возможностью редактирования и без использования промежуточных внутренних переменных?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 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 - время в секундах.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 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.


Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 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.                       
Если указать явное имя клиента то скрипты работают.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 26 Марта 2019, 10:22:48
Здравствуйте.

Функция GetClientName (https://simple-scada.com/help/script/getclientname.html) не работает при вызове из события "OnDataChange", а также при вызове из системных типов событий "Запуск проекта", "Остановка проекта", "Выполнен SQL-запрос", "Прошла секунда", "Прошел час", "Отчет построен". Если указанные скрипты выполняются по одному из вышеперечисленных событий, то нужно явно указывать имя клиента.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 26 Марта 2019, 10:27:54
Спасибо!!!!!!!!!!!!!
Название: прошу помощи в написании скрипта
Отправлено: Олег Печёнов от 02 Апреля 2019, 14:04:09
Добрый день. помню тема была - не могу найти.

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

Благодарю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 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.

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

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 03 Апреля 2019, 12:43:48
Отлично!
Оперативно!
Спасибо!
Все работает!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 03 Апреля 2019, 12:52:00
Олег Печёнов, обязательно замените во втором скрипте по событию "Прошла секунда" локальную переменную "i" на глобальную внутреннюю переменную, иначе при переходе на новые версии скады скрипт будет работать непредсказуемо, т.к. локальные переменные могут получить произвольное значение при каждом выполнении скрипта. Напишите, если есть вопросы.
Код: (delphi)
begin
  vrTime.Value := vrTime.Value + 1;     // счетчик 0 - 9, отсчет временного интервала 10 сек
  if vrTime.Value < 10 - 1 then exit;
  // обработка данных за интервал 10 сек
   . . .
  vrTime.Value := 0;          // сброс таймера
  cntDI_01.Value := 0;        // сброс счетчика изменений DI_01 для следующего интервала
end.
, где vrTime - внутренняя переменная типа Integer.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 03 Апреля 2019, 17:56:56
Принято. Благодарю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 04 Апреля 2019, 16:02:28
Добрый день!
еще заявочка на скрипт.
переменная DO_06 должна семь секунд иметь значение 0, затем девять секунд значение 1,
и так циклично.
Благодарю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Апреля 2019, 21:17:38
Здравствуйте.
Нужно создать внутреннюю переменную: vrTimer, тип данных Integer. И секундный скрипт:
Код: (delphi)
const
  INTERVAL_1 = 7;
  INTERVAL_2 = 9;
begin
  if DO_06.AsInt = 0 then
  begin
    if vrTimer.AsInt < INTERVAL_1 then
      vrTimer.Value := vrTimer.Value + 1;
 
    if vrTimer.AsInt = INTERVAL_1 then
    begin
      DO_06.Value := 1;
      vrTimer.Value := 0;
    end;
  end else
    begin
      if vrTimer.AsInt < INTERVAL_2 then
        vrTimer.Value := vrTimer.Value + 1;
 
      if vrTimer.AsInt = INTERVAL_2 then
      begin
        DO_06.Value := 0;
        vrTimer.Value := 0;
      end;
    end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 06 Апреля 2019, 11:46:34
Алгоритм использующий область данных (а не команд) для задания временных последовательностей:

Код: (delphi)
const
  INTERVAL = 16;
  arDO_06: array [0..(INTERVAL - 1)] of integer =
            (0, 0, 0, 0, 0, 0, 0,        // образ выхода DO_06, в частности и не бинарный
            1, 1, 1, 1, 1, 1, 1, 1, 1);  //   или для нескольких выходов
begin
{  if vrTimer.AsInt < 0 then <обработка ошибки индекса массива> }

  if vrTimer.AsInt >= INTERVAL then vrTimer.Value := 0;
  DO_06.Value := arDO_06[vrTimer.AsInt];
  vrTimer.Value := vrTimer.Value + 1;
end.
 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 07 Апреля 2019, 10:18:54
Огромное спасибо за решения. Очень интересно!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 11 Апреля 2019, 11:28:24
Добрый день!
еще запрос на сложный скрипт.

если за 15 секунд переменная T2.Value не изменила значение, то переменной OT.Value :=0.

Благодарю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 12 Апреля 2019, 22:30:02
если за 15 секунд переменная T2.Value не изменила значение, то переменной OT.Value :=0.

Это одновибратор с перезапуском. Ниже приведены примеры для одновибратора с перезапуском и повторным пуском.

Пример 1. (переменная TimeCnt типа int64 или integer)
Скрипт "Изменились переменные" (T2):
Код: (delphi)
begin
  TimeCnt.Value := 0;   // начало отсчета по изменению переменной - перезапуск одновибратора
end.
Скрипт "Прошла секунда"
Код: (delphi)
const INTERVAL = 15;
begin
  if TimeCnt.Value >= INTERVAL then 
    OT.Value := 0                      // таймер сработал
  else
    begin
      OT.Value := 1; // если удалить эту команду, то одновибратор будет работать в режиме однократного запуска по OT=1
      TimeCnt.Value := TimeCnt.Value + 1;
    end;
end.

Пример предполагает последовательное выполнение скриптов из-за переменной TimeCnt, изменяемой в обоих скриптах.
Вполне возможно, что в последующих реализациях Simple-Scada скрипты станут обрабатываться паралллельно.

Пример 2. Аналог примера 1, но с изменениями переменной только в одном скрипте. (переменные TimeCnt и preTimeCnt типа int64 или integer)
Скрипт "Изменились переменные" (T2):
Код: (delphi)
begin
  preTimeCnt.Value := TimeCnt.Value;   // момент отсчета по изменению переменной - перезапуск одновибратора
end.
Скрипт "Прошла секунда"
Код: (delphi)
const INTERVAL = 15;
begin
  if (TimeCnt.Value - preTimeCnt.Value) >= INTERVAL then 
    OT.Value := 0                      // таймер сработал
  else
    begin
      OT.Value := 1; // если удалить эту команду, то одновибратор будет работать в режиме однократного запуска по OT=1
      TimeCnt.Value := TimeCnt.Value + 1;
    end;
end.

Пример 3. Основная обработка в скрипте по изменению переменных. (переменные TimeCnt и preTimeCnt типа int64 или integer)
Скрипт "Прошла секунда"
Код: (delphi)
begin
    TimeCnt.Value := TimeCnt.Value + 1;
end.
Скрипт "Изменились переменные" (T2, TimeCnt):
Код: (delphi)
const INTERVAL = 15;
begin
  if Variable.Name = 'T2' then preTimeCnt.Value := TimeCnt.Value;
  if Variable.Name = 'TimeCnt' then
    if (TimeCnt.Value - preTimeCnt.Value) > INTERVAL then
      OT.Value := 0
    else
      OT.Value := 1;
end.

Пример 4. Один скрипт, необходимое условие - уникальность изменения переменной T2 (например счетчик)
Код: (delphi)
const INTERVAL = 15;
var i: integer;
begin
  i := T2.Value;
  if i <> preT2.Value then TimeCnt.Value := 0;
  preT2.Value := i;
  if TimeCnt.Value >= INTERVAL then
    OT.Value := 0
  else
    begin
      OT.Value := 1;
      TimeCnt.Value := TimeCnt.Value + 1;
    end;
end.     

Пример 5. С использованием текущего времени. (Переменная  ChangeVarTime - типа DateTime)
Скрипт "Изменились переменные" (T2):
Код: (delphi)
begin
  ChangeVarTime.Value := NOW();   // начало отсчета по изменению переменной
end.
Скрипт "Прошла секунда"
Код: (delphi)
const INTERVAL = 15;
begin
  if SecondsBetween(NOW(), ChangeVarTime.Value) >= INTERVAL then  // сравнить с текущим временем события "Прошла секунда"
    OT.Value := 0
  else
    OT.Value := 1;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 27 Апреля 2019, 07:22:00
Здравствуйте.
В новой версии S-S не компилируется скрипт
Код: (delphi)
begin
  if not (Sender is TM_Button) then Exit;

  with Sender as TM_Button do
    if Assigned(VariableEx) then
        if GetBit(VariableEx.AsInt,7) then
          begin
            VariableEx.Value := SetBit(VariableEx.Value,7,False);
            VariableEx.Value := SetBit(VariableEx.Value,6,False);
          end else
            begin
              VariableEx.Value := SetBit(VariableEx.Value,6,False);
            end;
    end.
end.
     
Точнее он в редакторе скриптов компилируется, но когда сохраняем проект скрипт отмечается как скрипт с ошибками                         
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 27 Апреля 2019, 09:22:18
Здравствуйте.
У Вас в коде лишний "end." не принадлежащий ни одной конструкции.
Код: (delphi)
begin
  if not (Sender is TM_Button) then Exit;
 
  with Sender as TM_Button do
    if Assigned(VariableEx) then
      if GetBit(VariableEx.AsInt,7) then
      begin
        VariableEx.Value := SetBit(VariableEx.Value,7,False);
        VariableEx.Value := SetBit(VariableEx.Value,6,False);
      end else
        VariableEx.Value := SetBit(VariableEx.Value,6,False);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 27 Апреля 2019, 11:32:13
Интересно что пред идущая версия проглатывала данный скрипт.

И опять же, повторюсь. Он компилируется в редакторе скриптов без ошибок.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 27 Апреля 2019, 11:50:08
Верно. Раньше каждый скрипт был отдельной программой и его компиляция заканчивалась на "end.", поэтому компиляция проходила. Сейчас все скрипты компилируются в единую программу и каждый скрипт обязательно должен содержать один "end.".

Цитировать
И опять же, повторюсь. Он компилируется в редакторе скриптов без ошибок.
И это верно, пока Вы компилируете скрипт отдельно - ошибок не будет, он закончится на первом "end.". Но при сохранении проекта код скрипта будет помещён в общую программу вместе со всеми остальными скриптами и ошибка с двумя "end." выявится, что и происходит.

По сути, предыдущая версия компилятора разрешала реальную ошибку, игнорируя её. Теперь эта ошибка не игнорируется и должна быть исправлена, как и любая другая ошибка в коде.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 27 Апреля 2019, 12:04:33
Тогда сразу же хочется кнопку "Компилировать все"
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 27 Апреля 2019, 14:21:03
Еще одна непонятка.

Есть скрипт с запросом к БД
при компиляции выдает ошибку [Update_tblPremix]"begin" not found
Если закоментировать блок с CASE в запросе - то компиляция проходит без ошибок.
Код: (delphi)
{Заполняем таблицу tblPremix}
procedure Update_tblPremix;
var
  aQuery:string;
begin
  aQuery :=    'SELECT '+
               'DP_PRODUCT_ID '+
               ',AR_NAME '+
               ',AR_ARTICLECODE '+
//               ',CASE DP_PREMIX_STATUS1 WHEN 1 THEN ''X'' ELSE '''' END AS PREMIX_STATUS1 '+
//               ',CASE DP_PREMIX_STATUS2 WHEN 1 THEN ''X'' ELSE '''' END AS PREMIX_STATUS2 '+
//               ',CASE DP_PREMIX_STATUS3 WHEN 1 THEN ''X'' ELSE '''' END AS PREMIX_STATUS3 '+
//               ',CASE DP_PREMIX_STATUS4 WHEN 1 THEN ''X'' ELSE '''' END AS PREMIX_STATUS4 '+     
               'FROM CFG_DAYPROGRAM '+
               'INNER JOIN CFG_ARTICLE ON DP_PRODUCT_ID = AR_ARTICLE_ID '+
               'WHERE (DP_BATCHESDONE < DP_BATCHESSET AND DP_LOTNUMBER > 0 AND DP_PRODUCE = 1 AND DP_MODIFYTYPE <> ''D'') '+
                                    'OR DP_LOTNUMBER IN (SELECT DP_LOTNUMBER '+
                                    'FROM CFG_DAYPROGRAM '+
                                    'INNER JOIN CFG_BATCHES ON DP_LOTNUMBER = BD_LOTNUMBER '+
                                    'INNER JOIN CFG_UNITS ON UN_BATCHNUMBER = BD_BATCHNUMBER '+
                                    'WHERE BD_BATCHNUMBER > 1 '+
                                    'AND UN_MODIFYTYPE <> ''D'') '+
               'ORDER BY DP_PRODUCTIONNUMBER;';

  tblPremix.RunSQL(aQuery, tsSaveFixRow);
end;

begin
  if vUpdate_tblPremix.Value = true then    // если тру - то выполняем процедуру
    begin
      Update_tblPremix;
      vUpdate_tblPremix.Value := false;
    end;
end.                                 

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 27 Апреля 2019, 23:21:34
Здравствуйте.

Пока для успешного сохранения необходимо наличие пробела между запятой и case.

Аналогичная проблема и решение от Simple-Scada:
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Апреля 2019, 09:55:08
Цитировать
Тогда сразу же хочется кнопку "Компилировать все"
Добавим. Сейчас для перекомпиляции достаточно сохранить проект (Ctrl + S).

Цитировать
Есть скрипт с запросом к БД
при компиляции выдает ошибку [Update_tblPremix]"begin" not found
Если закоментировать блок с CASE в запросе - то компиляция проходит без ошибок.
А это ошибка, исправим в ближайшее время. В текущей версии её можно устранить: как и описал pan2000, добавьте пробел между запятой и case.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 28 Апреля 2019, 16:09:01
pan2000  Simple-Scada  Огромное спасибо!!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 28 Апреля 2019, 19:49:07
Дело не в пробеле, а в попытке нового компилятора рассматривать строковую константу, содержащую ключевые слова Delphi, как команду.
Причем до сборки строки из отдельных констант.
Код: (delphi)
var
  aQuery: string;
begin
  aQuery :=   ',Begin';        //   следующие строки сохраняются с ошибкой:
//  aQuery :=   ', Begin';     // не все пробелы одинаково полезны
//  aQuery :=   ',' + 'Begin'; // различие между значениями суммы констант и одиночной константой
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Апреля 2019, 21:38:18
Цитировать
а в попытке нового компилятора рассматривать строковую константу
Именно в этом и состоит ошибка. Но в приведённом deldemo коде пробел исправит ситуацию, т.к. в строке после CASE есть и END, который будет учтен как завершение CASE.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 30 Апреля 2019, 11:59:44
deldemo, отправили Вам ссылку на обновление с исправлением (Demo-time 2.3.4.8 (https://simple-scada.com/downloads/2348_067518D8-3D0E-4B82-BE4E/Simple-Scada%202.3.4.8%20(time-demo).exe)  /  Demo-64 2.3.4.8 (https://simple-scada.com/downloads/2348_067518D8-3D0E-4B82-BE4E/Simple-Scada%202.3.4.8%20(demo).exe)).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 14 Мая 2019, 07:51:53
Simple Scada
У меня есть три кнопки B1, B2, B3, как я могу сделать так, чтобы B3 имел скрипт для исключения скриптов B1 и B2? Когда я нажимаю B3, скрипты на B1 и B2 не работают?
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Мая 2019, 09:41:15
Здравствуйте.

Для этого можно использовать свойство "Enabled (https://simple-scada.com/help/script/enabled.html)". Когда оно равно "False" - кнопка будет отображаться, но будет не активна и на нее нельзя будет нажать. На событие OnClick кнопки B3 можно написать скрипт:
Код: (delphi)
begin
  B1.Enabled := False;
  B2.Enabled := False;
end.

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bacchus1 от 14 Мая 2019, 10:01:11
Добрый день!
Код: (delphi)
begin
    with Sender as TM_Object do
    if AsInt AND Sender.Tag = Sender.Tag then Sender.Color := clRed
      else Sender.Color := RGB(191,191,191);
    if Variable.IsGoodQuality = False then Sender.Color := clGray;
end.
Сервер пишет ошибку в последней строке:
Цитировать
Ошибка в скрипте "ChangeColor2Red" в строке 8. Access violation at address 0479C684. Read of address 0A569FA0
Компилируется скрипт без ошибок. В чем может быть дело?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Мая 2019, 10:54:31
Здравствуйте.

В скрипте не хватает конструкции begin...end после строчки with, поэтому with действует только на первый if...then. Нужно заключить в begin...end весь код после with:
Код: (delphi)
begin
    with Sender as TM_Object do
      begin
        if AsInt AND Sender.Tag = Sender.Tag then
          Sender.Color := clRed
        else
          Sender.Color := RGB(191,191,191);
        if Variable.IsGoodQuality = False then Sender.Color := clGray;
      end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bacchus1 от 14 Мая 2019, 13:20:15
Спасибо, все заработало.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 14 Мая 2019, 20:34:03
Simple Scada
Как я могу добавить эту строку  " Button14.Value := 0; " в скрипт фотографии?
Когда я нажимаю кнопку, я хочу, чтобы анимация работать, но не запускалась Button14.Value := 0;
Анимация работает, когда PLC получает сигнал от контактора, что он включен.
Большое спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Мая 2019, 12:59:25
Здравствуйте.

Код можно изменить так:
Код: (delphi)
begin
  { если значение переменной (в виде целого числа),
    которая связана с изображением больше нуля, то }
  if Image1.AsInt > 0 then
  begin
    Image1.AnimSpeed := 16; // запустить анимацию
    Button14.Value := 0;
  end else                  // иначе
    Image1.AnimSpeed := 0;  // остановить анимацию
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 24 Мая 2019, 09:03:57
Добрый день , как можно создавать текстовый файл со своим именем, скажем в имени файла должна быть дата, время и цифра , и не использовать для сохранения папку в основной программе , а в другом месте.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Мая 2019, 09:51:53
Здравствуйте.
Прочтите описание процедуры TextFileOpen из руководства (https://simple-scada.com/help/script/textfileopen.html) (параметр APath).

Цитировать
скажем в имени файла должна быть дата, время и цифра
Лучше всего использовать специальную функцию DateTimeToFileName (https://simple-scada.com/help/script/datetimetofilename.html) для имён файлов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: seriych от 29 Мая 2019, 12:25:41
Добрый день,
не получается решить проблему.
Есть таблицы и назначенные для них события OnCellClick (события OnClick и OnDblClick для таблиц не заданы). Есть поля, которые привязаны к внутренним переменным и с назначенными событиями OnDoneInput.
Проблема: если пользователь редактирует значение любого поля и нажимает "enter", а затем наводит мышь на любую таблицу и кликает, то событие OnCellClick с первого раза не срабатывает. Только со второго и последующих.
При этом, если после редактирования поля, провзаимодействовать с каким-то иным элементом, а не полем (например, с кнопкой), то все хорошо: во-первых само взаимодействие с эти элементом происходит с первого клика, во вторых OnCellClick на таблице после этого срабатывает с первого раза.
Непонятно, с чем это связано и как лечить. Пробовал всякими OnMouseLeave, OnMouseEnter, заставить поле потерять фокус, а таблицу принять, но все попытки безуспешны. Пробовал создавать поле, которое ни к чему не привязано и вообще без обработки событий (просто кидаем новое на форму) - все равно после взаимодействия с ним при переходе на таблицу OnCellClick срабатывает только со второго раза.

*Версия 2.3.3.0
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Июня 2019, 10:36:55
Здравствуйте.

Цитировать
Если пользователь редактирует значение любого поля и нажимает "enter", а затем наводит мышь на любую таблицу и кликает, то событие OnCellClick с первого раза не срабатывает.
Исправим в ближайшем обновлении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 05 Июня 2019, 17:49:52
Simple Scada мне нужна срочная помощь.У меня есть аналоговый вход, который я получаю от 0-20 мV датчиков.Какой сценарий я должен сделать, чтобы вызвать 5mV первую кнопку, 7mV вторую кнопку и 8,5mV третью кнопку.Могу ли я создать дополнительное окно для ввода для каждой кнопки при mV активировать.Буду очень признателен за вашу помощь
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 06 Июня 2019, 14:56:40
Здравствуйте.

Если нужно по изменению аналоговой переменной изменять значение переменной кнопки, то можно создать скрипт по событию OnDataChange объекта связанного с аналоговой переменной и в нем через свойство переменной Value (https://simple-scada.com/help/script/varvalue.html) записывать в переменную кнопки необходимое значение. Например:

Код: (delphi)
begin
  { записываем значение 1 в переменную ArduinoSerial0_D2}
  ArduinoSerial0_D2.Value := 1;
end.

Цитировать
Могу ли я создать дополнительное окно для ввода для каждой кнопки при mV активировать.
Да, окно можно создать через пункт меню "Окна (https://simple-scada.com/help/manual/windows.html)". Для вызова окна из скрипта нужно использовать процедуры ShowAll (https://simple-scada.com/help/script/wshowall.html), ShowClient (https://simple-scada.com/help/script/wshowclient.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 06 Июня 2019, 20:57:15
Simple Scada:
ArduinoSerial0_D2.Value := 1;    Вы имеете в виду, что 1 равен одному вольту, так ?
Как сделать милливольт, Я хочу активировать кнопку на милливольт?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpvit от 07 Июня 2019, 08:46:11
Simple Scada:
ArduinoSerial0_D2.Value := 1;    Вы имеете в виду, что 1 равен одному вольту, так ?
Как сделать милливольт, Я хочу активировать кнопку на милливольт?
Все зависит от представления переменной, если у Вас шкала этой переменной описана от 0 до 20 мВ, то в данном случае будет 1 мВ
с десятичными так же вопрос решается, через шкалу переменной, как опишите представление так и будет
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: emoxristov от 07 Июня 2019, 13:30:25
Будет ли это работать с 0-20 милливольт?
Пожалуйста, объясните, как ввести милливольт, вольт или импеданс.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 10 Июня 2019, 07:46:49
Добрый день, подскажите пожалуйста, обновил симпл до версии 2.3.5.0, перестали открываться отчеты с проекта. Скрипт выглядит таким образом:
Код: (delphi)
 begin
  ReportView(GetClientName, 'Электроэнергия - Гагарина, 8');
end.
что могло произойти?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 10 Июня 2019, 08:09:43
И как реагировать на это всплывающее окно? то есть не один скрипт из за этого не работает? раньше такого не было. и как мне найти проблемный скрипт среди тысяч?  в проекте возможно есть старые не действительные, даже не знаю где они лежат
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vyacheslav от 10 Июня 2019, 08:26:56
И вот говорит что здесь ошибка, можете помочь, какая? до обновления все работало!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Июня 2019, 09:53:00
Здравствуйте.

Все изменения в компиляции в версии 2.3.5.0 описаны здесь (https://simple-scada.com/help/script/compilerchange.html). Если обновиться не получается и не получается понять причину, то вышлите нам текущую версию проекта (или версию до перехода на 2.3.5.0) на support@simple-scada.com, наши специалисты в короткий срок обновят проект с учетом всех изменений в скриптах.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 10 Июня 2019, 16:29:01
добрый день , есть проблема , которая возникла  на пустом месте , скрипт работал, пока не увеличил количества строк в файле , в общем читаю текстовый файл ,сначала интежер , затем  строку
Код
  S := TextFileReadLn;                        
  B1.Value := StrToInt(S);
  S := TextFileReadLn;                   
  B1_STRING_24.Value := S;
где B1 тэг интежер , значение не читается а в логе сервера пишется что число пример:ошибка в скрипте строка  18    '5840' is not a valid integer value  , подскажите как это понимать, почему строка 5840 не может конвертироваться в интежер

подразобрался немного , в общем все дело в самом файле, получается так , если я цифры в текстовом файле просто набрал , то они читаются нормально, но если скопировал с другого файла , то  уже не читаются и в сервер летит ошибка , что то похожее происходит и со строкой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 10 Июня 2019, 19:16:15
lipvasko, может из-за того, что кодировки файлов разные.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 10 Июня 2019, 22:51:06
...
 подскажите как это понимать, почему строка 5840 не может конвертироваться в интежер
...

Ошибка StrToInt для аргумента завершающегося не цифрой:
Код: (delphi)
begin
  Text1.Text := IntToStr(StrToInt(' 5840'));    //  5840
  Text2.Text := IntToStr(StrToInt('5840 '));    // Ошибка в скрипте "Script_0" в строке 3.
end.                                          //  '5840 ' is not a valid integer value

Добавлено 13 июня 2019 года:
Посмотреть последовательность кодов символов переменной S типа String можно с помощью скрипта. Результат отображается в области Text1 четырехзначными шестнадцатиразрядными числами.

Код: (delphi)
var i: integer;
    aStr: string;
begin
  Text1.Text := '';
  aStr := S.AsStr;
  for i := 1 to Length(aStr) do
    Text1.Text := Text1.Text + IntToHex(integer(aStr[i]), 4) + ' ';
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 11 Июня 2019, 08:28:23
...
 подскажите как это понимать, почему строка 5840 не может конвертироваться в интежер
...

Ошибка StrToInt для аргумента завершающегося не цифрой:
Код: (delphi)
begin
  Text1.Text := IntToStr(StrToInt(' 5840'));    //  5840
  Text2.Text := IntToStr(StrToInt('5840 '));    // Ошибка в скрипте "Script_0" в строке 3.
end.                                          //  '5840 ' is not a valid integer value
РАЗОБРАЛСЯ , необходимо было удалять невидимые символы , до команды каретки , использовал нотепад++
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 11 Июня 2019, 09:57:38
Здравствуйте. Ошибка "... is not a valid integer value" возникает при попытке перевода строки (которая не является числом) в число. Хороший пример привёл pan2000, когда строка содержит число + лишние символы (например пробел, символы переноса строки и т.п.). Если Вы получаете эту ошибку, то можно со 100% уверенностью сказать, что строка содержит лишние символы помимо чисел и поэтому её не удаётся перевести в число. Если обнаружить их не получается, то вышлите нам файл из которого Вы выполняете чтение, мы опишем что именно не так в этом файле.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MixMix от 27 Июня 2019, 07:00:35
Добрый день! Подскажите нормально ли работают скрипты с конструкциями вида
Код: (delphi)
GetVariableByName(aName + '_Ypravl').Value := SetBit(GetVariableByName(aName + '_Ypravl').Value, 4, False);
или
Код: (delphi)
aQuery := 'UPDATE ' + Month + ' SET ' +                    //
          '`Text_1`=' + QuotedStr(GetVariableByName('edtDay_1_' + IntToStr(i)).Value) + ', ' +
          '`Text_2`=' + QuotedStr(GetVariableByName('edtDay_2_' + IntToStr(i)).Value) +
          ' WHERE `Day`=' + QuotedStr(IntToStr(i));
или лучше использовать промежуточные переменные?
Скрипты компилируется и работают без ошибок, просто хотелось бы знать на будущее.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Июня 2019, 00:19:56
Здравствуйте.
Приведённый код вполне допустим, но в первом примере промежуточные переменные могут сделать его выполнение быстрее за счет сокращения количества вызовов GetVariableByName, кроме того, повысится читаемость кода. Например:
Код: (delphi)
var
  aVar: TM_Variable;
begin
  aVar := GetVariableByName(aName + '_Ypravl');  // только один поиск переменной по имени
  aVar.Value := SetBit(aVar.Value, 4, False);
end.
Во втором примере как-то улучшить код через промежуточные переменные не получится.
В идеале нужно ещё учитывать ситуацию, когда GetVariableByName вернёт nil, если переменная с указанным именем не существует. Но если это произойдёт, то Вы увидите в журнале сервера соответствующие сообщения об ошибках при выполнении скрипта и сможете их исправить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 17 Июля 2019, 11:00:16
Добрый день , в  помощи не встретил (или не нашёл)как можно удалить текстовый фай , подскажите скрипт.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Июля 2019, 12:05:33
Здравствуйте. В ближайшее время добавим такую функцию и опубликуем обновление.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 01 Августа 2019, 09:31:19
Добрый день возник один вопрос: и так есть два ПК, на одном стоит отладочная версия триал по времени , а на другой коммерческая без ограничений (версии скады самое последние обновление)  и вот интересность на  триальной этот универсальный скрипт работает(после запуска клиента , все ок, с вирт. переменными)  а на полной нет , сразу переходит в иначе и на переменные ему все равно (так же с виртуальными и   настоящими с ПЛК)
Код: (delphi)
BEGIN
         if Sender is TM_Image then          // проверяем, что Sender это изображение
         with Sender as TM_Image do        // приводим Sender к типу "TM_Image"
        if AsBool  then
        Visible := True         //
        else                          // иначе
          Visible := False;
END.
и второй вопрос создавал новый проект , соответственно в офлайне , когда перенес на полную версию , сервер начал ругаться на половину переменных с OPC DA  сервера , передобавил их  уже на полной версии , и все ок , что за глюк не понял , все переменные  вносились в проект , почти одновременно, но ответ на первый вопрос важнее , не охота плодить прямые скрипты
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Августа 2019, 09:55:20
Здравствуйте.
Данный скрипт меняет видимость изображения в зависимости от того какое значение принимает переменная связанная с изображением. Кстати, его можно сократить так:
Код: (delphi)
begin
  if Sender is TM_Image then          // проверяем, что Sender это изображение
    with Sender as TM_Image do        // приводим Sender к типу "TM_Image"
      Visible := AsBool;
end.
Скрипты компилируются в программу при сохранении проекта и ни при каких обстоятельствах не могут начать работать по разному, независимо от того на какой версии скады они запущены, или на каком компьютере они запущены, ведь программа скомпилирована и не менялась. Поэтому причину нужно искать только в значениях переменных. Если при запуске на объекте вы видите что изображения скрылись, значит переменные с которыми они связаны приняли значение FALSE, в соответствии со скриптом. Либо второй вариант: в скриптах есть грубые ошибки, или ссылки друг на друга, или скрипты назначены не на события OnDataChange, а на OnDataChangeEx и так далее.
Если найти причину не получается, то вышлите нам проект на support@simple-scada.com для проверки с указанием проблемных изображений. Мы укажем на ошибки в скриптах, если они есть.

Цитировать
и второй вопрос создавал новый проект , соответственно в офлайне , когда перенес на полную версию , сервер начал ругаться на половину переменных с OPC DA  сервера, передобавил их  уже на полной версии , и все ок , что за глюк не понял , все переменные  вносились в проект , почти одновременно, но ответ на первый вопрос важнее , не охота плодить прямые скрипты
От переноса проекта на полную версию или Demo-Time ничего не меняется, эти версии не отличаются ничем, кроме ограничения по времени работы. Какие именно сообщения выдал сервер касаемо DA-переменных? Можем предположить что это были сообщения о том, что переменная в указанным адресом не существует на OPC-сервере. Если это так, значит на объекте куда Вы перенесли проект на OPC-сервере действительно нет переменных с теми адресами которые Вы указали при разработке проекта. А когда Вы их заново импортировали с OPC-сервера, то адреса считались с OPC-сервера и стали правильными, что логично. Опишем то же самое по шагам:
1. На одном компьютере мы разрабатываем проект. Устанавливаем скаду и OPC-сервер. Создаём на OPC-сервере группу "Group1" и в ней переменную "V1".
2. Импортируем переменную с OPC-сервера в скаду. Скада получит адрес переменной Group1.V1;
3. Запускаем проект и проверяем его в работе. Всё работает.
4. Переходим на другой компьютер. Устанавливаем скаду и OPC-сервер. Создаём на нём группу "Group2" и переменную "V1";
5. Проект мы сделали ранее, пробуем его запустить и получаем ошибку, ведь переменной с адресом Group1.V1 не существует. На новом ПК она имеет адрес Group2.V2;

Это то, что мы можем предположить из имеющейся информации, здесь приходится угадывать, так как мы не знаем какие именно сообщения об ошибках выдал сервер скады, по ним мы могли бы назвать точную причину. В целом, если на одном ПК всё работает, а на другом нет, значит причину нужно искать в разнице между этими ПК (как в примере выше с OPC-серверами), т.к. при переносе скады между ПК сама скада не меняется, как и её скрипты.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 01 Августа 2019, 11:24:55
по 1 вопросу , дело было не в скрипте ,а ва отображении элемента ,  и метода просмотра ,в общем в вэб некорректно отображаются элементы , а именно  лампочка , 2) в том то и дело ,что в опс сервере я видел эти переменные со значениями  с плк
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Августа 2019, 11:42:28
Цитировать
по 1 вопросу , дело было не в скрипте ,а ва отображении элемента ,  и метода просмотра ,в общем в вэб некорректно отображаются элементы , а именно  лампочка
Что именно не так с отображением лампочки? В обычном клиенте она скрыта, а в веб видна, или что-то другое?

Цитировать
2) в том то и дело ,что в опс сервере я видел эти переменные со значениями  с плк
Конечно переменные должны быть видны в OPC-сервере. Если они не будут там видны, то в скаду их можно даже не переносить. Прочтите наше сообщение выше, мы описали подробный пример того, как у переменных на двух OPC-серверах можно сделать разные адреса. В OPC-сервере они в обоих случаях будут отображаться, но читать их с OPC-сервера придётся по разным адресам. Нужно же делать так, чтобы проекты на OPC-серверах не отличались, чтобы OPC-клиенты (включая скаду) могли читать теги с OPC-серверов по одним и тем же адресам. Также ещё раз подчеркиваем, что мы не знаем какую ошибку выдавал сервер, поэтому мы только предполагаем что могло произойти. Чтобы сказать что-то подробнее нужно знать текст ошибки которую выдал сервер скады.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 01 Августа 2019, 11:55:32
у меня был просто красный круг(лампочка)   это я вижу в редакторе и в клиенте , но  в вэб  она теряет свойства  не видимости и отображается так же красным кругом , но (я случайно заметил) при срабатывании управляющего тега у нее появлялся черный контур (когда их 40 штук на экране , его не сразу заметишь) сейчас ушёл просто на круг ,  с ним пока вопросов нет
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AJR от 01 Августа 2019, 14:40:03
Здравствуйте. Подскажите пожалуйста по вопросу. Есть скада, модуль ввода и модуль вывода. Как можно через скаду связать два модуля. То есть, при включении кнопки в модули ввода должна включиться выход на модуле вывода
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 01 Августа 2019, 15:37:20
Здравствуйте. Подскажите пожалуйста по вопросу. Есть скада, модуль ввода и модуль вывода. Как можно через скаду связать два модуля. То есть, при включении кнопки в модули ввода должна включиться выход на модуле вывода

Здравствуйте. Я вообще отговорил бы Вас от этой затеи. SCADA нельзя использовать для связи автономных  модулей.
А если очень хочется то делается это через OPC Server для ваших модулей DI/DO. Переменный из OPC добавьте в SCADA и свяжите их скриптом "Изменились переменные".
Учтите! отключится или зависнит SCADA пропадет связь между двумя устройствами.  Лучше курить в сторону modbus rtu rs485 для связи двух модулей (если они находятся удаленно, то MOXA Вам в помощь)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AJR от 01 Августа 2019, 16:44:11
Я прекрасно понимаю, что скада не должна управлять. Благо механизм не категоричный, насос воды на башню. Предполагалось, что операторы Бабульки будут включать насос удалённо с большой кнопкой на стене. Работать мышкой они отказываются. Но и мне спокойнее. Если можно привязать тег-кнопку на клавиши на клавиатуре, было бы огонь.
Пысы. Моха. Если показать счёт на моху меня могут посадить за попытку доведения к самоубийству руководителя
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AJR от 01 Августа 2019, 16:57:04
Есть возможность привязать тег на сервере к комбинацию клавиш на клавиатуре? Как это можно организовать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Августа 2019, 22:00:05
Здравствуйте.

Цитировать
Есть скада, модуль ввода и модуль вывода. Как можно через скаду связать два модуля. То есть, при включении кнопки в модули ввода должна включиться выход на модуле вывода
Как правильно написал deldemo, Вам необходимо импортировать (https://simple-scada.com/help/manual/variable-import-opc.html) в скаду переменные модуля ввода и модуля вывода с Вашего OPC-сервера. Затем можно создать скрипт по событию "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)", добавить в него переменную модуля ввода(как описано в этом примере (https://simple-scada.com/help/script/changemulvar.html)) и написать скрипт:
Код
begin
  OutputMod.Value := InputMod.Value;
end.
, где InputMod - переменная модуля ввода, OutputMod - переменная модуля вывода. Таким образом, при изменении переменной InputMod ее значение будет записываться в переменную OutputMod.

Цитировать
Есть возможность привязать тег на сервере к комбинацию клавиш на клавиатуре? Как это можно организовать?
К сожалению, такой возможности нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AJR от 02 Августа 2019, 07:12:01
Можно подробнее?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 02 Августа 2019, 08:49:35
добрый день ,подскажите , а почему многие скрипты не работают в вэб , например  вызов окна,  как то можно в будущем это изменить
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 02 Августа 2019, 09:59:11
Здравствуйте.

Цитировать
Можно подробнее?
Поясните пожалуйста, что именно требуется объяснить подробнее?

Цитировать
добрый день ,подскажите , а почему многие скрипты не работают в вэб , например  вызов окна,  как то можно в будущем это изменить
С ограничениями, имеющимися при работе через web-клиент можно ознакомиться по ссылке (https://simple-scada.com/help/manual/comp-constraints.html). Привязка окон в web-клиенте, а также событие OnClick работает только у компонентов "Кнопка", "Флажок", "Список" "Фигура", "Текст", "Изображение", "Трубопровод", "Линия", "Резервуар", "Заслонка". Посмотреть пример вызова окон в web через скрипты можно на нашем web-сервере (https://web.simple-scada.com:8755/Web-demo) -> страница "Скрипты" -> пример №8. Если не получится разобраться, пришлите нам для проверки папку с проектом из директории "\Simple-Scada 2\Projects\Имя_проекта" на support@simple-scada.com и укажите какой скрипт не работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AJR от 02 Августа 2019, 10:02:11
Подробнее о скрипте. Как два тега с опс сервера привязать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 02 Августа 2019, 10:28:45
Подробнее о скрипте. Как два тега с опс сервера привязать.
А инструкцию читать не пробовал? Говорят, что помогает иногда.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 06 Августа 2019, 10:51:22
Здравствуйте.

Цитировать
Подробнее о скрипте. Как два тега с опс сервера привязать.
Добавить теги с OPC-сервера можно одним из следующих способов:

1. Импорт тегов с OPC DA (https://simple-scada.com/help/manual/variable-import-opc.html), OPC UA (https://simple-scada.com/help/manual/variable-import-opcua.html) сервера.
2. Импорт из файла (https://simple-scada.com/help/manual/variable-import-csv.html).
3. Добавление вручную (https://simple-scada.com/help/manual/variable-new.html).

После этого теги будут видны в редакторе переменных (https://simple-scada.com/help/manual/variable-editor.html) и с ними можно работать в проекте и скриптах.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 13 Августа 2019, 13:35:34
Добрый день , возможно ли сделать разбор строки , несколько значений через разделитель, и второе главное , возможно из одного скрипта вызвать другой скрипт, если да то как , какой синтаксис.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 13 Августа 2019, 21:12:21
Добрый день , ещё вопрос есть скрипт  в редакторе проходит компиляцию, а при сохранении нет , постоянно ищет begin или пишет внутренняя ошибка в ядре скады строка 0 символ 0, менял конструкцию разными способами , результат 0. Насколько понимаю работать это не хочет , а мне очень надо, что бы не плодить кучу скриптов .
Код: (delphi)
var
  i: integer;
  sw: string;
begin
  i := 99;
  while i <= 0 do
  begin
    sw := IntToStr(i);
    if FileExists('vesy_1_'+sw.'txt', 'C:Base/') and (read.Value) then
      RenameFile('C:Base/vesy_1_'+sw.'txt', 'C:Base/vesy_1.txt')
  end;

  i := i - 1;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 14 Августа 2019, 04:57:41
Странно почему проходит компиляцию в редакторе - у вас в этом цикле один "end;" лишний, скорее всего первый
Код: (delphi)
  begin
    sw := IntToStr(i);
    if FileExists('vesy_1_'+sw.'txt', 'C:Base/') and (read.Value) then
      RenameFile('C:Base/vesy_1_'+sw.'txt', 'C:Base/vesy_1.txt')
  end;
 
  i := i - 1;
  end;
и вы уверены, что вот здесь: "while i <= 0 do" правильное условие? Может нужно изменить знак на ">"?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 14 Августа 2019, 07:58:33
Странно почему проходит компиляцию в редакторе - у вас в этом цикле один "end;" лишний, скорее всего первый
Код: (delphi)
  begin
    sw := IntToStr(i);
    if FileExists('vesy_1_'+sw.'txt', 'C:Base/') and (read.Value) then
      RenameFile('C:Base/vesy_1_'+sw.'txt', 'C:Base/vesy_1.txt')
  end;
 
  i := i - 1;
  end;
и вы уверены, что вот здесь: "while i <= 0 do" правильное условие? Может нужно изменить знак на ">"?
да уверен, а по поводу енда, я же писал использовал разные конструкции , и энд убирал и добавлял беги и тд всегда один результат
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 14 Августа 2019, 08:05:51
Добрый день , возможно ли сделать разбор строки , несколько значений через разделитель, ...

Пример функции по разбору CSV-строки. Функция возвращает n-ое поле (n = 1..) или "пусто" для несуществующего поля.
Код: (delphi)
  function GetField(aStr: string; n: integer): string;
  var i, j: integer;
     aStr1: string;
  begin
    j := 1;                              // номер собираемого поля
    aStr1 := '';                         // собственно собираемое поле
    for i := 1 to Length(aStr) do begin
      if aStr[i] = ';' then begin        // проверить на разделитель
        if j = n then begin
          GetField := aStr1;             // поле найдено
          exit;
        end;
        aStr1 := ''; j := j + 1;         // на следующие поле
      end
      else aStr1 := aStr1 + aStr[i];     // продолжить собирать поле
    end;
    GetField := aStr1;                   // поле с номером n не найдено в строке
  end;


Цитировать
. .  и второе главное , возможно из одного скрипта вызвать другой скрипт, если да то как , какой синтаксис.
Единственный вызвыаемый из другого скрипт это "Изменились переменные". Можно было использовать для общего кода.


Добрый день , ещё вопрос есть скрипт  в редакторе проходит компиляцию, а при сохранении нет ...
Исправленный код:
Код: (delphi)
var
  i: integer;
  sw: string;
begin
  i := 99;
... и вы уверены, что вот здесь: "while i <= 0 do" правильное условие? Может нужно изменить знак на ">"?
Код: (delphi)
  while i > 0 do        // цикл выполнится 99 раз, i >= 0  - выполнится 100 раз 
  begin
    sw := IntToStr(i);
    if FileExists('vesy_1_' + sw + 'txt', 'C:Base/') and (read.Value) then  // ошибка выражения  +sw.'txt'
      RenameFile('C:Base/vesy_1_'+sw+'txt', 'C:Base/vesy_1.txt');
    i := i - 1;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 14 Августа 2019, 08:11:09
Спасибо , за + , все получилось !
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 14 Августа 2019, 08:13:48
И еще вопрос , может кому то покажется глупым , но подскажите правила расстановки  end  end;  и ;   и без ;  ...... компилятор пропускает много вариантов их расстановки и этим путает, в других языках , все как то наглядней
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 14 Августа 2019, 09:26:06
если в блоке всего одна строка кода, то ";" после нее можно не ставить
но лучше все-же ставить для однообразности кода
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Neskad от 14 Августа 2019, 10:57:18
Добрый день , возможно ли сделать разбор строки , несколько значений через разделитель, и второе главное , возможно из одного скрипта вызвать другой скрипт, если да то как , какой синтаксис.
Напрямую вызвать скрипт на выполнение из другого скрипта нельзя. Можно делать это косвенными методами (через событие "изменились переменные", "выполнен SQL-запрос"). Но вообще это обычно и не требуется. Если создать скрипт "глобальный модуль", то функции и переменные из этого модуля можно использовать в дальнейшем практически в любом другом скрипте. (насчет переменных - желательно не злоупотреблять).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Августа 2019, 11:19:10
И еще вопрос , может кому то покажется глупым , но подскажите правила расстановки  end  end;  и ;   и без ;  ...... компилятор пропускает много вариантов их расстановки и этим путает, в других языках , все как то наглядней
Символ ";" нужно ставить всегда в конце каждого блока кода. Примеры:
Код: (delphi)
// точка с запятой в конце блока if..then:
begin
  if (A = 0) then
    A := 1;
end.

// точка с запятой в конце блока if..then..else:
begin
  if (A = 0) then
    A := 1
  else
    A := 0;
end.

// точка с запятой в конце блока begin..end:
begin
  if (A = 0) then
  begin
    myProcedure_1;
    myProcedure_2;
  end;
end.

// точка с запятой в конце блока begin..end..else:
begin
  if (A = 0) then
  begin
    myProcedure_1;
    myProcedure_2;
  end else
    myProcedure_3;
end.

// точка с запятой и вложенные begin..end:
begin
  begin
    begin

    end else
      begin

      end;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 15 Августа 2019, 17:43:44
Спасибо за ответы ,но  возник вопрос  есть запрос
Код: (delphi)
 procedure WriteValueToTable_1;
     var
    aQuery: string;
  begin
  aQuery := 'INSERT INTO `vesy_1` ' +
            '(`timestamp`, `silos_1`, `silos_2`, `silos_3`, `silos_4`, `ves`, `naklad`) VALUES ' +
            '(NOW(), ' +Vesy_1_silos_1.AsStr+ ', ' +Vesy_1_silos_2.AsStr+ ', '
             + Vesy_1_silos_3.AsStr+ ', ' + Vesy_1_silos_4.AsStr+ ', ' + Vesy_1_ves.AsStr+ ', ' +   vesy_1_naklad.AsStr+ ');';
 RunSQL(aQuery, nil, 0);
  end;
ну соответственно  есть и база созданная , в ней
Код
timestamp()
int
int
int
int
int
VARCHAR(20)
и все вроде в базу  грузится ,но  переменная  vesy_1_naklad. это строка , и  её содержание как правило  , что то вроде  99-356,  и вот я заметил ,что в базу грузится математическое выражение , в самом проекте все нормально и выводится , что надо, когда я сделал её кириллицей , загрузка прекратилась , т.е. SQL рассматривает ее так же интежером , где я ошибся в запросе на добавление и как сделать правильно
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 16 Августа 2019, 08:05:13
Так QuotedStr(vesy_1_naklad.AsStr) нужно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 16 Августа 2019, 16:28:14
Так QuotedStr(vesy_1_naklad.AsStr) нужно.
спасибо , заработало
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dmitry_Impuls от 16 Августа 2019, 19:42:11
Добрый день.
Вопрос по работе с переменными...
Есть таблица (хранится в БД) ID переменной, еёимя и  требуемое значение.
Списки переменных и значений представляют собой наборы для проверок маршрутов (размеры списков разные).
Для проверки  сейчас используется запрос
Код: (delphi)
SELECT o.`VarName`,r.`Value` FROM `route` r,  `scadaobjects` o 

После его выполнения в цикле
Код: (delphi)
      aVar:=GetVariableByName(DataSet.Fields[0].AsUTF8String);
      if (Assigned(aVar)) and (aVar.Value=StrToInt(DataSet.Fields[1].AsUTF8String))
      then  ...
Но в таблице хранятся и ID переменной.

Вопрос - возможно ли обратиться к переменной по ID и не звать GetVariableByName?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Августа 2019, 09:29:04
Здравствуйте.
Добавим поиск переменной по ID в ближайшем обновлении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Kar от 28 Августа 2019, 19:19:39
Здравствуйте,
Есть возможность наладить обмен сообщениями со сторонним приложением? Лучше через simple-scada сервер.
Укажите пожалуйста дорогу где копать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Neskad от 29 Августа 2019, 09:00:12
Кажется, прямых документированных возможностей нет. Можно, например, через те-же OPC с виртуальными тегами, или через чтение-запись в общий файл, который можно и не на диске создать, а прямо в ОЗУ.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Августа 2019, 09:22:29
Здравствуйте.

Обмениваться данными можно либо через общий OPC-сервер, либо через файлы (https://simple-scada.com/help/script/workfile.html), либо через БД (https://simple-scada.com/help/script/dbscripts.html). Например: приложение записало данные в БД, скада считала данные из БД. Или приложение изменило переменные на OPC-сервере, скада отобразила эти переменные. Аналогично от скады в приложение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 29 Августа 2019, 12:18:24
Добрый день.
Бьюсь с отправкой смс - если отправляю сообщение кирилицей, то всё нормально. Если отправляю на латинице, то приходит абракадабра (вложение). Что посоветуете?
Код: (delphi)
Level1 := 'L1=no data';
Level2 := 'L2=no data';
SendSMS(Field_PhoneNumber.AsStr, DateTimeToStr(Now) + ', s.Vozzhaevka, MK 492. Uroven mazuta: ' + Level1 + ', ' + Level2, false);

И второй вопрос: создаю внутренний тег типа String, включаю свойство "Автоматическое восстановление". В программе записываю в него номер телефона, и после перезапуска программы он не сохраняется, приходится заново его вбивать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Августа 2019, 12:53:12
Здравствуйте.
Какой тип данных у переменных Level1, Level2?

Цитировать
И второй вопрос: создаю внутренний тег типа String, включаю свойство "Автоматическое восстановление". В программе записываю в него номер телефона, и после перезапуска программы он не сохраняется, приходится заново его вбивать.
Можете выслать проект для проверки на support@simple-scada.com с указанием проблемной переменной?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 30 Августа 2019, 04:41:04
По обоим вопросам написал на почту, так как проект общий.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dmitry_Impuls от 30 Августа 2019, 13:35:26
Добрый день.
Спасибо за оперативный ответ на предыдущий вопрос.

В документации сказано, что Ячейка (TM_TableCell) имеет свойство Variable и приведён пример
Код: (delphi)
  Table1.Columns[3].Cells[1].Variable.Value := 10;

В проекте есть 25 однотипных объектов с 64 свойствами.
Под объект приготовлено окно, делается привязка переменных при вызове окна OnShow
Код: (delphi)
var
  aNum : String;
  tblParam : TM_Table;
begin
  aNum:=IntToStr(Sender.Tag;);    // получили номер объекта
  tblParam := GetTableByName('tblParam'+aNum);
  if tblParam <> nil then
  begin
    tblParam.Tag:=IntToStr(Sender.Tag;); // передали его ниже
    tblParam.OnDataChangeEvent // обновили данные на объект
  end;
end;

Далее OnDataChangeEvent выводит актуальные данные (пример для времени шага)
Код: (delphi)
 tblParam := GetTableByName('tblParam'+aNum);
  if tblParam <> nil then
    with tblParam as TM_Table do
    begin
      Columns[2].Cells[1].Text:=SecondsToStr(GetVariableByName('StepRunTimeSet_T'+aNum+'_W').AsInt64);   
...
    end;

Оператору надо менять параметры техпроцесса. По OnCellClick попробовали менять переменную (тип в ОРС - на запись в контроллер)
Код: (delphi)
  begin
  with Cell do
    case Row of
       1:Variable.Value :=Text; // попытка присвоить отображаемое значение
       2:Variable.Value :=1800; // попытка писать число
...
    end;
  end;
Сервер выдаёт ошибку "Ошибка в скрипте Table_onClick в строке _номер_строки_с_присвоением_ Access violation at address 0389AA7. Read jf address 0CD1582."

Но варианты записи
Код: (delphi)
Table3.Columns[2].Cells[17].Variable:=GetVariableByName('StepMonTimeSet_T01_W');
StepMonTimeSet_T02_W.Value:=3600;
проходят успешно.

Получить тег объекта, чтоб определить имя переменной StepMonTimeSet_T01_W,StepMonTimeSet_T02_W ... StepMonTimeSet_T25_W нет возможности у процедуры параметр типа TM_TableCell.

Как быть в такой ситуации?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dmitry_Impuls от 30 Августа 2019, 14:57:24
:D
Как быть в такой ситуации?
очень просто... надо быть внимательней. Выводится текст, а меняется переменная... которой нет
после
  Columns[2].Cells[1].Text:=SecondsToStr(GetVariableByName('StepRunTimeSet_T'+aNum+'_W').AsInt64);
надо привязку всё-таки сделать...
  Columns[2].Cells[1].Variable:=(GetVariableByName('StepRunTimeSet_T'+aNum+'_W');
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 31 Августа 2019, 09:42:55
И второй вопрос: создаю внутренний тег типа String, включаю свойство "Автоматическое восстановление". В программе записываю в него номер телефона, и после перезапуска программы он не сохраняется, приходится заново его вбивать.
Переменная успешно восстанавливает своё значение, но сразу стирается скриптом "Button_ClearPhoneNumber_OnDataChange", ведь при запуске проекта переменные инициализируются и происходит выполнение OnDataChange скриптов. Используйте событие OnClick вместо OnDataChange чтобы скрипт выполнялся только по клику на объект.

Бьюсь с отправкой смс - если отправляю сообщение кирилицей, то всё нормально. Если отправляю на латинице, то приходит абракадабра (вложение).
Сделали исправление при отправке на латинице,  обновление будет в ближайшее время.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 02 Сентября 2019, 10:33:58
Переменная успешно восстанавливает своё значение, но сразу стирается скриптом "Button_ClearPhoneNumber_OnDataChange", ведь при запуске проекта переменные инициализируются и происходит выполнение OnDataChange скриптов. Используйте событие OnClick вместо OnDataChange чтобы скрипт выполнялся только по клику на объект.
Изначально я так и сделал (по событию OnClick), но мне нужно было, чтобы при этом работало подтверждение на действие. А при событии OnClick, подтверждение не обрабатывается.

Редак.
Сделал сейчас очистку по событию OnClick, а OnDataChange удалил - ничего не поменялось, номер в поле при загрузке пустой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Сентября 2019, 12:24:32
Цитировать
Изначально я так и сделал (по событию OnClick), но мне нужно было, чтобы при этом работало подтверждение на действие. А при событии OnClick, подтверждение не обрабатывается.
Для этого у Вас должна быть кнопка "с фиксацией", на событие OnClick нужно назначить стирание номера телефона, событие OnDataChange нужно удалить. Да и привязку кнопки к переменной можно убрать.

Цитировать
Сделал сейчас очистку по событию OnClick, а OnDataChange удалил - ничего не поменялось, номер в поле при загрузке пустой.
У нас после изменений в Вашем проекте всё работает как нужно, включая автовосстановление и кнопку с подтверждением. Вы перезапустили проект после внесения изменений? Если да, то пришлите текущую версию проекта, вероятно Вы что-о упустили.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dmitry_Impuls от 02 Сентября 2019, 20:05:51
По Вашему сообщению можно предположить:

Большое спасибо за ответ. Но он несколько запоздал.
Объекты одинаковые. Отличаются тегом. По тегу понимаем какие переменные брать.
И, да, привязка динамическая... лень тыкать мышкой было...

Смотрите первое сообщение на этой странице. Ошибка была в  том, что переменные не привязывались.
Просто выводились их значения в свойство Text.

Попутно вопрос возник.

А как отображаются объекты (текстовое поле, ячейка и т.д.) у которых привязан тег сервера/переменная и есть свойство Text?
Сейчас при вводе видно число секунд (ввод пользователя), потом их преобразование в формат времени.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 03 Сентября 2019, 03:18:52
Для этого у Вас должна быть кнопка "с фиксацией", на событие OnClick нужно назначить стирание номера телефона, событие OnDataChange нужно удалить. Да и привязку кнопки к переменной можно убрать.
Спасибо. Изменил кнопку на "С фиксацией" и всё заработало как надо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 03 Сентября 2019, 17:54:44
. . .
  Columns[2].Cells[1].Text:=SecondsToStr(GetVariableByName('StepRunTimeSet_T'+aNum+'_W').AsInt64);
надо привязку всё-таки сделать...
  Columns[2].Cells[1].Variable:=(GetVariableByName('StepRunTimeSet_T'+aNum+'_W');
Привязка переменной к Полю или Ячейке выводит на экран её значение в формате переменной, свойство ячейки Text не используется при редактировании ячейки.


А как отображаются объекты (текстовое поле, ячейка и т.д.) у которых привязан тег сервера/переменная и есть свойство Text?
1. Объект ТЕКСТ не редактируется (пока?), переменные связаны только с событиями.

2. Объект ПОЛЕ имеет собственную текстовую переменную с начальным значением устанавливаемым в редакторе и первоначально выводимой на экран.
В дальнейшем на экране отображается последнее изменение: или собственная переменная (запись свойства Text) или форматированная переменная (при привязке или изменении).
Чтение свойства Text при отсутствии привязки - из собственной переменной, при наличии - форматированное из переменной.
Редактирование с сохранением результата только в переменную, редактирование без привязанной переменной выполняется в числовом формате и не сохраняется.

3. Ячейка ТАБЛИЦЫ - комбинация из редактируемого ТЕКСТа и ПОЛЯ. Поведение аналогично объекту ПОЛЕ (приоритет по убыванию: переменная, Text переменной, Text ячейки).

Взаимную связь составляющих объектов ПОЛЕ и ячейка ТАБЛИЦЫ можно посмотреть в примере из вложения.

Цитировать
Сейчас при вводе видно число секунд (ввод пользователя), потом их преобразование в формат времени.

В примере можно смоделировать Ваш ввод.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 09 Сентября 2019, 11:37:20
Бьюсь с отправкой смс - если отправляю сообщение кирилицей, то всё нормально. Если отправляю на латинице, то приходит абракадабра (вложение).
Сделали исправление при отправке на латинице,  обновление будет в ближайшее время.
Обновление 2.3.6.0
Теперь СМС на латинице вообще не отправляются (даже абракадабра не приходит).
Если меняю параметр ACyrillic на True без изменения текста сообщения, то приходит 2 СМС на латинице (но меня так не устраивает).
Хотя если отправлять тестовое из Options.exe, то сообщение приходит.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 09 Сентября 2019, 12:29:06
Только что ещё раз проверили отправку:
 1. короткой SMS с кириллицей. SendSMS('79281112233', 'Авария 10', TRUE);
 2. длинной SMS с кириллицей. SendSMS('79281112233', 'Авария 10 Авария 10 Авария 10 Авария 10 Авария 10 Авария 10', FALSE);
 3. короткой SMS с латиницей. SendSMS('79281112233', 'Alarm number 10', FALSE); ;
 4. длинной SMS с латиницей. SendSMS('79281112233', 'Alarm number 10 Alarm number 10 Alarm number 10 Alarm number 10', FALSE);

Все SMS приходят корректно и с выключенными опциями "Менять режимы" и "Ждать ответа" и с включенными. USB-модем МТС 829F.
Также мы запустили Ваш проект, скрипт "Button_SendTestSMS_OnClick", в строке отправки SMS выключили кириллицу:
Код: (delphi)
SendSMS('79281112233', DateTimeToStr(Now) +
          ', s.Vozzhaevka, MK 492. Uroven mazuta: ' +
          Level1 + ', ' + Level2, FALSE);
Затем запустили проект и нажали кнопку "Button_SendTestSMS". Пришла одна SMS с текстом: "09.09.2019 12:22:07, s.Vozzhaevka, MK 492. Uroven mazuta: L1=0mm,, L2=0mm".

Если снова включить кириллицу, то приходит две смс:
1. "09.09.2019 12:22:07, s.Vozzhaevka, MK 492. Uroven mazut";
2. "a: L1=0mm,, L2=0mm";

Попробуйте в опциях выключить флажки "Менять режимы" и "Ждать ответа", сохранить, затем перезапустить сервер скады. Меняется ли что-нибудь?
Какой модем Вы используете?

Upd: есть предположение, что это из-за текстового режима отправки. Мы отправили Вам на почту тестовое обновление сервера скады которое всегда работает в цифровом режиме. Решает ли это обновление проблему?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 11 Сентября 2019, 09:57:50
Upd: есть предположение, что это из-за текстового режима отправки. Мы отправили Вам на почту тестовое обновление сервера скады которое всегда работает в цифровом режиме. Решает ли это обновление проблему?
С этим сервером работает!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 11 Сентября 2019, 10:09:33
Спасибо за информацию. Мы включили это изменение в официальную версию 2.3.6.0. Теперь отправка всегда в цифровом режиме. Также обратите внимание на опции "Менять режимы" и "Ждать ответа". Если у Вас отправка корректно работает без этих опций, то лучше их не включать. Тогда отправка будет быстрее. Данные опции нужно использовать только если без них отправка не работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: azrael454 от 13 Сентября 2019, 09:57:02
Вопрос: как в скриптах описать сравнение текущего времени с некоторым заданным? Например, мне нужно сбрасывать некоторые переменные по достижению определенного времени. Значит мне нужно сравнить текущее время с временем условия сброса в формате ЧЧ:ММ:СС. Какую функцию мне использовать для обозначения времени для сравнения? Сравнивать буду через SameTime.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Neskad от 13 Сентября 2019, 11:03:52
EncodeTime(ЧЧ, ММ, СС); В справке описаны в разделе "Время и дата/Формирование значения"
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: azrael454 от 13 Сентября 2019, 12:26:34
EncodeTime(ЧЧ, ММ, СС); В справке описаны в разделе "Время и дата/Формирование значения"
Спасибо за ответ
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bacchus1 от 23 Сентября 2019, 17:06:28
Добрый день!
Как возможно поменять картинки из скрипта? Мне нужно, чтобы по разным значениям тега появлялись разные изображения. Понятно, что можно наложить друг на друга несколько изображений и менять их видимость, но это неудобно.

Как я понял, свойство TextureName доступно только для чтения, поэтому через него не получится. Хотел сделать через анимацию. Т.е. менять свойство Frame, но опять же не получилось, при этом частота кадров была 0.
Возможно ли сделать статическую смену кадров (когда скорость анимации 0) из скриптов? Это была бы очень полезная функция, т.к. во многих скадах она реализована и активно используется.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 23 Сентября 2019, 18:58:19
Через номер фрейма в анимашке работало нормально.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bacchus1 от 24 Сентября 2019, 10:13:08
Теперь заработало.
Видимо я изначально вставил картинку как обычную, потом сделал из нее анимацию. Удалил и вставил заново, все заработало.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: azrael454 от 27 Сентября 2019, 10:14:52
Добрый день. Как можно реализовать сброс по времени? При достижении начала смены необходимо сбросить счетчики. Смены 3, идут одна за другой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Сентября 2019, 10:31:47
Ещё можно создать скрипт с типом события "Прошел час" и в нём написать такой код:
Код: (delphi)
begin
  if HourOf(Now) = 8 then // если сейчас 8 часов утра
  begin
    myVar1.Value := 0;    // то обнуляем переменные
    myVar2.Value := 0;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bacchus1 от 04 Октября 2019, 14:32:25
Добрый день!
Пробую менять LimitType у переменной из скрипта. Для проверки у поля поставил свойство Границы. Как-то странно работает изменение LimitType, то отключает проверку границ, то не отключает. Иногда поле так и остается красным, хотя переменная уже не превышает границу. Прошу протестировать корректность работы свойства LimitType.
Если я правильно понял, то при запуске клиента это свойство становится таким, как сконфигурировано в проекте. Это так? Если да, то возможно ли его сохранять наряду с уставками?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Октября 2019, 09:40:42
Здравствуйте.

Сейчас, при смене LimitType у объектов которые связаны с переменной не происходит обновление отображения. Визуально компоненты обновятся только после изменения граничных значений или при переходе значения переменной в одну из граничных областей. В будущем сделаем чтобы при смене LimitType происходило обновление объектов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: bacchus1 от 07 Октября 2019, 09:42:40
Спасибо за ответ. А что по поводу сохранения заданного из скриптов LimitType при повторно перезапуске сервера?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Октября 2019, 18:33:47
Сделаем чтобы значение LimitType сохранялось вместе с граничными значениями переменной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: VladD от 12 Октября 2019, 11:41:43
Добрый день...что не так?..пытаюсь управлять свойством Visible у объекта изображение...если через основную переменную (OnDataChange) скрипт работает и изображение то true то false, но вот через доп переменную..тот же самый скрипт (OnDataChangeEx)...это не работает совсем.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Октября 2019, 11:52:36
Здравствуйте.
Вы в скрипте с основной переменной объекта работаете? Если да, то он конечно не подойдёт на событие OnDataChangeEx, ведь нужно работать с доп. переменной (VariableEx).
Без кода скрипта трудно угадать что ещё может быть не так. Если в нём есть условия, то возможно они просто не проходят и т.п.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: VladD от 12 Октября 2019, 12:00:25
Спасибо...разобрался
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 15 Октября 2019, 13:09:28
Здравствуйте. Подскажите пожалуйста, возможно ли заполнять ComboBox через SQL запрос &
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dmitry_Impuls от 15 Октября 2019, 13:45:10
Здравствуйте. Подскажите пожалуйста, возможно ли заполнять ComboBox через SQL запрос &
Да
 :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Октября 2019, 21:54:11
Здравствуйте. Подскажите пожалуйста, возможно ли заполнять ComboBox через SQL запрос &
Здравствуйте. Для этого нужно отправить SQL-запрос на выполнение через RunSQL (пометить запрос уникальным тегом, например 20) и в отдельном скрипте с типом события "Выполнен SQL-запрос" убедиться что это запрос с тегом = 20. Далее пройти по полученному результату запроса и добавить каждую строку в раскрывающийся список через ComboBox.AddItem. Простой пример выполнения запроса и обработки результата описан в этой статье (https://simple-scada.com/help/script/getvardb.html).

Пример скрипта "Выполнен SQL-запрос" с комментариями:
Код: (delphi)
begin
  if DataSet.Tag = 20 then         // если набор данных помечен тегом 20
  begin
    ComboBox1.Clear;               // очищаем список
    if DataSet.IsEmpty then Exit;  // прерываем выполнение, если набор данных пуст
    while not DataSet.EOF do       // проходим в цикле по всем строкам полученного набора данных
    begin
      ComboBox1.AddItem(DataSet.Fields[0].AsStr);  // добавляем строку из первой колонки набора данных в список ComboBox1
      DataSet.Next;                // переходим к следующей строке набора данных
    end;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 17 Октября 2019, 06:59:42
Спасибо!!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 17 Октября 2019, 09:50:37
подскажите по какому принципу выставляются цифры  при архивировании в базы данных , поле таблицы качество?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Октября 2019, 09:51:53
0 - плохое качество тега (также качество 0 может быть у тега, если он ещё ни разу не считался с OPC-сервера);
1 - хорошее качество;
2 - первое значение после запуска проекта;
3 - значение на момент выключения проекта;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dmitry_Impuls от 17 Октября 2019, 09:54:15
Здравствуйте. Для этого нужно отправить SQL-запрос на выполнение через RunSQL (пометить запрос уникальным тегом, например 20) и в отдельном скрипте с типом события "Выполнен SQL-запрос" убедиться что это запрос с тегом = 20. Далее пройти по полученному результату запроса и добавить каждую строку в раскрывающийся список через ComboBox.AddItem. Простой пример выполнения запроса и обработки результата описан в этой статье (https://simple-scada.com/help/script/getvardb.html).

Позволю себе дополнить...
В запрос можно включить имя ComboBox`а по OnClick
Код: (delphi)
  if Sender is TM_ComboBox then
  with Sender as TM_ComboBox do
    aQuery:='SELECT '''+Name+''', `ItemName` FROM  `ItemList`;';

тогда будет универсальная обработка для любого ComboBox`а
Код: (delphi)
  if (aTag = 20) then  // наш запрос
  if (not (DataSet.IsEmpty)) then                                                        // не пустая выборка
    begin
      aCombo:=GetComboBoxByName(DataSet.Fields[0].AsUTF8String); // получили имя пославшего запрос объекта
      aCombo.Clear;                                                                            // очистили список
      aCombo.AddItem('');                                                                   // добавили (если надо)  первую пустую строку
      while not (DataSet.EOF) do
      begin
        aCombo.AddItem(DataSet.Fields[1].AsUTF8String);                     // заполняем список
        DataSet.Next
      end
    end
  else Exit;                                                                                        // если в выборке  нед данных - вышли

P.S. Есть неприятный момент - список разворачивается и тут же сворачивается.
P.P.S. Можно уменьшить длительность двойного клика в системе или чётче давить на мышку  ;D
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Октября 2019, 10:01:27
Цитировать
В запрос можно включить имя ComboBox`а по OnClick
Если нужно связать запрос с объектом, то использовать имя - плохое решение. Везде где это возможно, лучше избегать использования имён, т.к. в конечном счёте придётся искать ссылку на объект по имени, например через GetComboBoxByName и это затратная операция. Правильнее будет передавать объект напрямую в RunSQL:
Код
RunSQL(aQuery, ComboBox1, 20);

Затем обратиться к объекту можно также напрямую, через свойство DataSet.Sender, без поиска по имени.
Код: (delphi)
var
  aComboBox: TM_ComboBox;
begin
  aComboBox := DataSet.Sender as TM_ComboBox;
end.

Цитировать
Есть неприятный момент - список разворачивается и тут же сворачивается.
Да, вызов ComboBox.AddItem будет приводить к обновлению списка и если в этот момент список был развёрнут, то он свернётся.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Dmitry_Impuls от 17 Октября 2019, 15:01:32
Спасибо. Как-то упустил этот момент при чтении документации... :(
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: VladD от 21 Октября 2019, 08:10:17
Добрый день..Имеется переменная типа word, каждый бит которой работает со своим image на свойство color...возможно ли создать универсальный скрипт? Не нашел в свойсвах image работу с битами.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 21 Октября 2019, 09:07:43
Здравствуйте.

Да, возможно написать универсальный скрипт используя свойство изображения "Тэг". У изображений нужно задать свойство "Тэг" равным биту, по которому должен меняться цвет и написать такой скрипт:
Код: (delphi)
begin
  if Sender is TM_Image then        // сначала убедимся, что скрипт вызван объектом "Изображение"
    with Sender as TM_Image do      // далее будем работать с объектом Sender, как с изображением
      if GetBit(AsInt, Tag) = TRUE then
        Color := clGreen
      else
        Color := clRed;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 23 Октября 2019, 15:53:13
Приветствую ... возникли вопросы , один интересный , другой серьезный.,
1) есть скрипт по чтению из своей таблицы , одинаковый в 3-х местах (проект запущен , выполнение раз в 1 час и на кнопке ) интересность в том ,что таймштамп передается  первый час после запуска сервера  в формате год.мес.день час.мин.сек , а после примерно часа работы сервера (но было на 3-4 обновление) и далее год_мес_день час_мин_сек, почему так происходит , почему разделитель меняется?
2)Вопрос на будущее , есть MICROSOFT SQL SERVER, зная  пароль , имя пользователя и место откуда  мне нужны данные , смогу я из скады  выкачать данные с базы M SQLСЕРВЕРА? или не выйдет , если да то примерный скрипт для ознакомления, если можно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 23 Октября 2019, 22:46:23
Здравствуйте.

Цитировать
1) есть скрипт по чтению из своей таблицы , одинаковый в 3-х местах (проект запущен , выполнение раз в 1 час и на кнопке ) интересность в том ,что таймштамп передается  первый час после запуска сервера  в формате год.мес.день час.мин.сек , а после примерно часа работы сервера (но было на 3-4 обновление) и далее год_мес_день час_мин_сек, почему так происходит , почему разделитель меняется?
Куда передаётся? В скаду? В компонент таблица? Или в другой компонент? Или с неправильным форматом передаётся из скады в таблицу базы данных?

Цитировать
2)Вопрос на будущее , есть MICROSOFT SQL SERVER, зная  пароль , имя пользователя и место откуда  мне нужны данные , смогу я из скады  выкачать данные с базы M SQLСЕРВЕРА? или не выйдет , если да то примерный скрипт для ознакомления, если можно.
Сейчас можно только задать в параметрах БД проекта (меню Проект - Настройки - База данных) СУБД SQL Server. Но скада создаст в ней отдельную БД с нужной структурой и будет работать с этой БД, а обратиться к посторонним данных не получится. В будущем мы планируем дать возможность создавать отдельные подключения к множеству БД, чтобы можно было читать данные из них.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 24 Октября 2019, 13:00:45
Пишется сразу в таблицу, происходит так , запрос с определенным тэгом - ловится ответ в скрипт ответ от базы данных     с заранее заданным тэгом и отправляется сразу в таблицу
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 24 Октября 2019, 14:43:29
Приведите код скрипта которым выполняется заполнение таблицы.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 25 Октября 2019, 12:49:19
добрый день , подскажите какие настройки должны быть для работы с  OPC DA удаленным  ПК, как настраивать DCON
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 25 Октября 2019, 14:23:36
Приведите код скрипта которым выполняется заполнение таблицы.
Код: (delphi)
procedure s22; var aQuery: string;
begin
  aQuery := 'SELECT `timestamp`,`vesy`,`sort` value FROM `silosa_download`  ' +
    ' WHERE ID=22  ORDER BY `timestamp`  DESC limit 1;'; 
  RunSQL(aQuery, nil, 22);
end;

Код: (delphi)
  if DataSet.Tag = 22 then 
  begin
    Table4.Columns[1].Cells[1].text := DataSet[0].AsUTF8String; 
    Table4.Columns[2].Cells[1].text := DataSet[1].AsUTF8String;
    Table4.Columns[3].Cells[1].text :=  DataSet[2].AsUTF8String;
  end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Октября 2019, 20:34:28
В обновлении 2.3.6.2 (https://simple-scada.com/forum/index.php?topic=178.msg7628#msg7628) изменили формат на пользовательский при конвертации из наборов данных (DataSet), теперь формат всегда должен быть стандартный, т.е. "дд.мм.гггг чч:мм:сс".

подскажите какие настройки должны быть для работы с  OPC DA удаленным  ПК, как настраивать DCON
Настройки для разных OPC-серверов могут отличаться и обычно описаны в справке к OPC-серверу. Также в разных ОС настройки могут отличаться. Основные пункты настройки описаны в руководстве, в этом разделе (https://simple-scada.com/help/manual/dcom-set.html). Эти настройки проверены с ОС Windows 7 + OPC-сервер KepServerEx.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: VladD от 29 Октября 2019, 08:20:16
Добрый день...с чем может быть связано такое проявление..объект Field..тип связанной переменной single..разрешен ввод по адресу ПЛК (в ПЛК переменная Real)..при попытке ввода (во время кликанья мышью в поле объекта) возникает неопределенное число ("мусор") в синем фоне..если ввести сразу новое значение то оно вступает в силу, но если сбросить синий фон, то приходится удалять "мусор" ручками. Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Октября 2019, 09:53:36
Здравствуйте.

В последней версии 2.3.6.2 (пока не опубликована официально) мы исправили формат при вводе значений типа Double и Single в поле. Раньше значение могло отображаться с большим количеством знаков после десятичной запятой, что и происходит в Вашем случае, судя по описанию. Обновление можно скачать в этой теме (https://simple-scada.com/forum/index.php?topic=178.msg7628#msg7628). Если Вы используете лицензионную версию (с USB ключом), то отправьте запрос на support@simple-scada.com с указанием организации на которую приобреталась лицензия, мы вышлем ссылку.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: VladD от 29 Октября 2019, 18:02:58
Обновился..но проблема не ушла...выскакивают цифры точности
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Октября 2019, 18:05:24
Какой формат задан у переменной которую Вы пытаетесь изменить? Формат задаётся в окне редактирования переменной на вкладке "Дополнительные" (https://simple-scada.com/help/manual/index.html?variable-new.html#var_dop).
Можете для проверки выслать проект на support@simple-scada.com с указанием проблемного поля?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: VladD от 29 Октября 2019, 18:12:16
формат и 0.# и 0.##
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 29 Октября 2019, 18:14:59
Можете для проверки выслать проект на support@simple-scada.com с указанием проблемного поля?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: VladD от 29 Октября 2019, 18:17:06
Проект выслал ..проблемные поля..задание частоты для ПЧ
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 30 Октября 2019, 23:27:57
VladD, спасибо. Нашли причину, в ближайшее время включим исправление в версию 2.3.6.2.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MaxHari от 06 Ноября 2019, 18:13:27
Есть код, который планируется использовать минимум в 3-х скриптах OnDataChange

Код
cbSubstation := GetObjectByName('cb_Substation' + IntToStr(Sender.Tag)) As TM_ComboBox;
cbObject := GetObjectByName('cb_Object' + IntToStr(Sender.Tag)) As TM_ComboBox;
cbElements := GetObjectByName('cb_Elements' + IntToStr(Sender.Tag)) As TM_ComboBox;
Можно ли его как-то в универсальную процедуру засунуть?

И прошу прощения за, возможно, глупые вопросы:
Если мы в окне клиента меняем значение внутренней переменной, другие клиенты получат то же значение? Внутренние переменные хранятся на сервере?
Если записываем в поле, не связанное с переменной, какое-то значение, на других клиентских машинах будет то же самое значение?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Ноября 2019, 09:44:04
Цитировать
Можно ли его как-то в универсальную процедуру засунуть?
Приведённый код уже универсальный, ведь в нём нет обращений напрямую к какому-либо объекту, вместо этого обращение через Sender. Описание универсальных скриптов можно найти здесь (https://simple-scada.com/help/script/script-types.html). Поэтому Вы можете создать в меню скриптов новый скрипт с типом "Универсальный", вставить в него этот код и далее назначить полученный скрипт любому объекту, например на событие OnClick или другое. А код будет получать объекты cbSubstation, cbObject, cbElements по тегу того объекта к которому привязан скрипт. Только если объекты cbSubstation, cbObject, cbElements являются раскрывающимися списками, то гораздо производительнее был бы поиск именно среди списков, через GetComboBoxByName (https://simple-scada.com/help/script/getcomboboxbyname.html).

Цитировать
Если мы в окне клиента меняем значение внутренней переменной, другие клиенты получат то же значение? Внутренние переменные хранятся на сервере?
Если записываем в поле, не связанное с переменной, какое-то значение, на других клиентских машинах будет то же самое значение?
На сервере хранится всё. Все изменения также выполняются на сервере, а клиенты отображают текущее состояние проекта. Поэтому если что-то изменить в проекте, то все клиенты отобразят это изменение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MaxHari от 08 Ноября 2019, 21:20:10
Спасибо за подробное разъяснение, кое-то уже формируется)

Подскажите, пожалуйста:

1. В универсальных скриптах как лучше обращаться к свойствам Sender - как к родителю или к потомку через преобразование. К примеру,

Код
TM_Field(Sender).Value := some_var;
// либо
Sender.Value := some_var;
2. Из имени объекта вытаскивается строка, которая обрабатывается в процедуре. Эту обработку можно делать как внутри процедуры, так и внешне, до её вызова. Что лучше отправлять в качестве параметров процедуры - объект или строку?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Ноября 2019, 22:31:51
Цитировать
В универсальных скриптах как лучше обращаться к свойствам Sender - как к родителю или к потомку через преобразование.
По производительности оба способа равны, поэтому можно обращаться как угодно.

Цитировать
2. Из имени объекта вытаскивается строка, которая обрабатывается в процедуре. Эту обработку можно делать как внутри процедуры, так и внешне, до её вызова. Что лучше отправлять в качестве параметров процедуры - объект или строку?
Объект лучше.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 12 Ноября 2019, 08:23:54
Вопрос , а если  сервер и  клиент находятся не в одноранговой сети  и в разных подсетях , но пингуются без проблем , на основании множества примеров из интернета (дком настроен для всех (гостя), с отключением брандмаузера, изменением политик  ит.д.) , пробовал наладить связь, не выходит , ВОПРОС , а вообще реально наладить связь сервер клиент , находясь в разных подсетях и соответственно доменах?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 12 Ноября 2019, 11:08:31
Здравствуйте.

Инструкции по настройке DCOM обычно отличаются(иногда значительно) для различных OPC-серверов, поэтому правильнее всего использовать инструкцию по настройке используемого OPC-сервера. Для получения более точной информации по настройке DCOM рекомендуем обратиться к производителю используемого OPC-сервера. Касаемо настройки в разных подсетях удалось найти только информацию здесь (https://engl-braggison.livejournal.com/42535.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lengast от 13 Ноября 2019, 18:52:37
Здравствуйте. Пишу скрипты под задачу. Подскажите почему появляются ошибки.
Этот скрипт должен открывать окно по щелку, если значение переменной (булевой) истинно
Код
begin
  if HandMode = 1 then
      Window6.ShowAll; // показать окно
end.
Выдает ошибку "Incompatible types"

Скрипт 2. Задача- по нажатию кнопки передать переменной текущие время(которое на ОС клиента)
Код
begin
  if test1 = 1 then
  testtime1 := GetClientData;
  end;
  if test1 = 0 then
  testtime2 := GetclientData;
  end;
end.
Компилируется без ошибок, но если нажать "компилировать все", то получаю ошибку "Begin" not found.
Помогите пожалуйста
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Ноября 2019, 20:58:29
Здравствуйте.

Цитировать
Выдает ошибку "Incompatible types"
Правильно, потому что HandMode - это переменная(тип TM_Variable), а 1 это целое число(тип Integer). Если требуется сравнить значение численной переменной с числом, то нужно использовать свойство AsInt (https://simple-scada.com/help/script/varasint.html), т.е. взять значение переменной переведенное в тип Integer:
Код: (delphi)
begin
  if HandMode.AsInt = 1 then
      Window6.ShowAll; // показать окно
end.

Другие доступные свойства перевода значения переменной в необходимый тип доступны по ссылке (https://simple-scada.com/help/script/nonvert-values.html).

Во втором скрипте два лишних "end". Как и в первом скрипте нужно использовать значение переменной переведенное в необходимый тип. Если нужно записать в переменную текущее время, то нужно использовать функцию Now (https://simple-scada.com/help/script/now.html), скрипты выполняются сервером, поэтому будет взято текущее время сервера. Для приведенного скрипта достаточно одной конструкции if..then:
Код: (delphi)
begin
  if test1.AsInt = 1 then
    testtime1.Value := Now
  else
    testtime2.Value := Now;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lengast от 14 Ноября 2019, 17:54:04
Спасибо большое. Работает!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MaxHari от 16 Ноября 2019, 08:44:55
Здравствуйте!

Имеется 100 строковых переменных для автоматизации процесса. Их можно создать в глобальном модуле либо вычитывать из файла. Обращения относительно редкие.
Подскажите, пожалуйста, что лучше в плане производительности/безопасности?
Если таких переменных будет 1000 и более?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Ноября 2019, 22:38:46
Здравствуйте. Чтение с жесткого диска (файл) намного затратнее, чем чтение из оперативной памяти (глобальный модуль). Ещё есть третий вариант: объявить в глобальном модуле массив и один раз при запуске проекта считывать в него из файла список строковых переменных и затем брать значения через этот массив (т.е. через оперативную память). Тогда можно формировать список строк в текстовом файле не теряя в производительности.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lengast от 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.   
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Ноября 2019, 19:24:52
Значение переменных меняется через свойство Value (https://simple-scada.com/help/script/varvalue.html):
Код: (delphi)
begin
  if NameReportMake.AsInt = 1 then
    HeadReport.Value := 'Kultura 1';
  if NameReportMake.AsInt = 2 then
    HeadReport.Value := 'Kultura 2';
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: YurySh от 05 Декабря 2019, 21:24:24
Всем здравствуйте.

Подскажите как написать скрипт по проверке состояния флажков
К примеру есть 4 флажка:
1-ый - а
2-ый - b
3-ий - с
4 -ый - d
Хочу создать отчет по параметрам,чьи флажки активированы,  к примеру если активированы флажки 1.2.4 то создавать отчет по этим параметрам.
Подскажите как это сделать ?
Спасибо заранее.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 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;
так нормально будет выполняться скрипт?                       
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 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;" будто переменная локальная. Нужно определиться с какой переменной Вы работаете и использовать соответствующий вариант обращения к значению.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: YurySh от 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 ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 06 Декабря 2019, 12:07:26
возник очень интересный вопрос , скажем есть 2 скрипта выполняемые  каждую секунду , в одном из них используются данные рассчитанные в другом (данные простые если  число а= число б то число с =число д, типа того)  так вот  данные не рассчитываются , равны всегда 0, но если перенести в один скрипт то все отлично и данные рассчитываются как надо , теги соответственно описаны в переменных как внутренние , просто чем глубже  создаю проект ,тем более  лезут глюки на ровном месте , вчера например  несколько часов ловил глюк какого не было , использовал описанные в скрипте  временные  переменные , так вот пока перед самым использованием я их не обнулил , лезли непонятные числа. Еще хотелось бы знать как происходит обработка секундных тегов
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 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.
, либо можно будет пройти по битам (https://simple-scada.com/help/script/work-bits.html) в цикле и выполнить для каждого какое-то действие.


вчера например  несколько часов ловил глюк какого не было , использовал описанные в скрипте  временные  переменные, так вот пока перед самым использованием я их не обнулил , лезли непонятные числа.
Здесь нет никаких "глюков". Если Вы объявили локальную переменную в скрипте, то в момент выполнения скрипта ей будет выделена память и значение её будет совершенно случайным  (зависит от структуры оперативной памяти в момент запуска скрипта) до тех пор, пока Вы не инициализируете переменную первым значением. Поэтому нужно обязательно инициализировать локальные переменные перед использованием. Подробнее о инициализации переменных можно прочесть на любом сайте по запросу "локальные переменные delphi" (или object pascal), например здесь (https://delphicomponent.ru/109-globalnye-i-lokalnye-peremennye-v-delphi.html), а также в этом разделе руководства по скриптам (https://simple-scada.com/help/script/compilerchange.html).

так вот  данные не рассчитываются , равны всегда 0, но если перенести в один скрипт то все отлично и данные рассчитываются как надо...
Значит скрипты написаны неправильно, либо Вы в расчетах используете локальные переменные, которые в каждом скрипте свои и никак друг от друга не зависят. Можем гарантировать что программа скриптов всегда выполняется скадой одинаково (ведь это программа) в соответствии с её алгоритмом, независимо от того на каком ПК её запускают и от количества запусков (в ином случае ни один проект скады не мог бы работать стабильно). Если есть желание вышлите проект на support@simple-scada.com с указанием скриптов для проверки, мы назовём более точную причину по которой данные не считаются.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Vitaly Demidov от 08 Декабря 2019, 17:00:48
В проекте есть таймер, принимающий различные значения,  каким образом я могу архивировать его значения, в миллисекундах?  Архив либо при установке таймера на паузу( значение) , либо по нажатию кнопки.
Проблема именно в получении  числового значения таймера(отображаются  в поле "календарь"  значения нормально) 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 09 Декабря 2019, 16:06:32
Т.е. таймер это какая-то переменная типа DateTime в проекте? Нужно в какой-то момент получить её значение которое она принимала в прошлом? Если так, то достаточно включить у переменной архивацию по-изменению (https://simple-scada.com/help/manual/index.html?variable-new.html#var_archive) и затем можно будет получить значение переменной из архива за указанное время при помощи процедуры ArchieveValueByTime (https://simple-scada.com/help/script/archivevaluebytime.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MaxHari от 15 Декабря 2019, 14:58:07
Скажите, пожалуйста, если писать скрипт "По изменению переменных" с количеством переменных от 100 и выше, может ли это увеличить нагрузку на сервер? Можно ли как-то менять частоту опроса переменных в скрипте?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Декабря 2019, 16:25:11
MaxHari, если представить что все 100 переменных меняются каждую секунду, то это аналогично циклу от 0 до 100 раз в секунду. такой цикл крайне слабо увеличит нагрузку на сервер.

Цитировать
Можно ли как-то менять частоту опроса переменных в скрипте?
Нет, частота опроса переменной задаётся на этапе разработки проекта через свойство "Частота опроса" (https://simple-scada.com/help/manual/variable-new.html). Для каждой переменной можно задать свою частоту опроса.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Vitaly Demidov от 17 Декабря 2019, 06:24:50
Т.е. таймер это какая-то переменная типа DateTime в проекте? Нужно в какой-то момент получить её значение которое она принимала в прошлом? Если так, то достаточно включить у переменной архивацию по-изменению (https://simple-scada.com/help/manual/index.html?variable-new.html#var_archive) и затем можно будет получить значение переменной из архива за указанное время при помощи процедуры ArchieveValueByTime (https://simple-scada.com/help/script/archivevaluebytime.html).

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

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




Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Neskad от 17 Декабря 2019, 19:14:49
Беда в том, что переменная таймера не архивируется нормально, и принимает значение, не соответствующее миллисекундам, например.

В примере ниже - график переменной таймера из демо проекта, добавлена только архивация по изменению
Переменная таймера архивируется нормально, просто формат у неё - TDateTime.
Если вам надо, зачем-то, выводить в тренд значение этого таймера в миллисекундах, то придётся создать дополнительную виртуальную переменную типа Int64, выставить ей архивацию по изменению, и добавить скрипт "изменились переменные", где изменяющаяся переменная - ваш таймер.
Код: ("delphi")
// допустим переменная для миллисекунд называется MSec
MSec.Value:= MilliSecondsBetween(Variable.Value, 0);
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andy от 18 Декабря 2019, 16:43:35
Добрый день.
Решил попробовать свести данные по одному узлу в сводную таблицу, использовав в редакторе соответствующий элемент "Таблица".
Вопрос вот в чём- Можно изменить фон определенной ячейки с переменной в зависимости от ей значения (1-зеленый. 0-красный)?
Одна переменная может говорить, что  устройство работает "1" - все ок..зеленое.
Другая же сообщает об аварии "1" - в этом случае красным красить.
У меня получилось только все ячейки  скопом покрасить.
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Neskad от 18 Декабря 2019, 17:40:36
Да, можно, оказывается.  :)

Код: ("delphi")
var
  i, j, maxi, maxj: integer;
  cell: TM_TableCell;
begin
  maxi:= Table1.ColumnsCount - 1;
  maxj:= Table1.Columns[0].CellsCount - 1;
  for i:= 0 to maxi do
    begin
      for j:= 0 to maxj do
        begin
          cell:= Table1.GetCell(i, j);
          cell.Color:= RandomColor;
        end;
    end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andy от 19 Декабря 2019, 09:21:28
Да, можно, оказывается.  :)

Большое спасибо! Table1.GetCell(i, j) -ключевой момент для меня был.  Все получилось.
Еще один вопрос- Как правильно написать код, чтоб при нуле разом и цвет поменялся и текст?


Код
  case AsInt of
        0 : begin
 Table1.GetCell(1, 0).Text := 'Stop';
            Table1.GetCell(1, 0).Color := clRed;
end;
Разобрался, заработало.
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 19 Декабря 2019, 09:59:58
Здравствуйте.

Цитировать
Как правильно написать код, чтоб при нуле разом и цвет поменялся и текст?
Для этого нужно использовать конструкцию begin...end:
Код: (delphi)
case AsInt of
      0 :
      begin
        Table1.GetCell(1, 0).Text := 'Stop';
        Table1.GetCell(1, 0).Color := clRed;
      end;
end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 25 Декабря 2019, 15:54:38
Всем хорошего дня , подскажите как наиболее коротко и оптимально проверить строку, что она не сможет преобразоваться в интежер, т.е. в ней есть посторонние символы и буквы
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 25 Декабря 2019, 17:00:32
Всем хорошего дня , подскажите как наиболее коротко и оптимально проверить строку, что она не сможет преобразоваться в интежер, т.е. в ней есть посторонние символы и буквы
  Здравствуйте!
На мой взгляд, наиболее оптимальное разрешение спорных вопросов - использование исключений, в Вашем случае:
Код: (delphi)
begin
  try
    Text1.Text := IntToStr(StrToInt(aSTR.AsStr));  // попытались
  except
    Text1.Text := 'Увы, это не переводимая игра слов C(К/ф""Бриллиантовая рука"")';  // не удалось
  end.           

aStr - внутренний тег типа строка.
Пример во вложении (!)
 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Декабря 2019, 17:17:05
Здравствуйте.

Ещё часто подходит функция StrToIntDef (https://simple-scada.com/help/script/strtointdef.html), которая в случае неудачи возвращает заданное вами значение. Например:
Код: (delphi)
var
  I: Integer;
begin
  I := StrToIntDef(myString, -999); // в случае неудачи вернуть значение -999
  if I = -999 then
    Log_Add('Ошибка!');
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 25 Декабря 2019, 17:55:39
Здравствуйте.

Ещё часто подходит функция StrToIntDef (https://simple-scada.com/help/script/strtointdef.html), которая в случае неудачи возвращает заданное вами значение. Например:

Значение по умолчанию - это частный случай для ограниченного диапазона значений. Петрову поможет, а Сидорову - нет. Чем try, как общий случай, то плох?
Года три назад try - это был единственный вариант борьбы с отладкой по TeamViewer, когда проект на удаленной машине вставал 'раком' по завершении цикла отладки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Декабря 2019, 18:08:48
Цитировать
Чем try, как общий случай, то плох?
Почему плох? Мы же не случайно написали: "Ещё часто подходит функция StrToIntDef". Про "try..except" не стали писать ещё раз, т.к. Вы описали этот вариант в пред. сообщении. Но минус у "try..except" есть, он состоит в том, что каждый раз когда блок исключения будет выполняться, в журнал сервера будет выводиться аварийное сообщение, что может помешать просмотру других сообщений, если таких случаев будет много. Для StrToInt это будет сообщение "Ошибка в скрипте "имя_скрипта" в строке N. 'text' is not a valid integer value".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Den от 25 Декабря 2019, 18:21:48
Привет всем.
Купил версию Про ради
1. перекачки тэгов из теплокорректоров Логика в s7-1511
2. Телеграм-уведомлений.
3. Красивых отчётов с автоматической рассылкой по емейл.

Вопрос по отправке телеграм-сообщений: можно ли вставлять переменную в текст сообщения?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Декабря 2019, 18:28:42
Цитировать
Вопрос по отправке телеграм-сообщений: можно ли вставлять переменную в текст сообщения?
Конечно, например:
Код: (delphi)
begin
  SendTelegram('Значение переменной vrMyVar равно ' + vrMyVar.AsStr);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andy от 26 Декабря 2019, 16:46:15
Добрый день.
Имеется переменная  с опс сервера, которую нужно откорректировать -  прибавить 4 и результат вывести, например, в поле Field1.
Подскажите как это можно реализовать. 
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Den от 27 Декабря 2019, 11:33:39
Да.
Переменная в текст сообщения вставляется, в моём случае длинный String,
и норм отправляется.
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 27 Декабря 2019, 12:05:33
Здравствуйте.

Andy, допустим переменная с OPC-сервера будет с именем "MyVar", а откорректированная переменная с именем "MyVarCorrect". Для решения задачи нужно создать скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/event-types.html)", добавить в него переменную "MyVar" как это описано здесь (https://simple-scada.com/help/script/changemulvar.html) и написать такой код:
Код: (delphi)
begin
  MyVarCorrect.Value := MyVar.Value + 4;
end.

Теперь скрипт будет выполняться при каждом изменении переменной MyVar и в переменную MyVarCorrect будет записываться значение увеличенное на 4. Для вывода полученного значения, переменную MyVarCorrect можно связать с нужным Полем.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Andy от 27 Декабря 2019, 16:54:14
Спасибо! Сработало.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: dmitrii.zakharin@nurzhana от 30 Декабря 2019, 11:33:14
Добрый день. Уважаемые помогите пожалуйста.
Как сделать чтоб при нажатии на кнопку с фиксацией изменился определенный бит сетевой переменной ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Января 2020, 16:18:41
Здравствуйте. У кнопки есть свойство "Бит" (https://simple-scada.com/help/manual/button.html) которое отвечает за то какой бит переменной будет меняться при нажатии на кнопку. Просто введите номер бита который нужно менять в это свойство (биты нумеруются с нуля). И не забудьте привязать саму кнопку к переменной в которой нужно менять бит.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 05 Января 2020, 16:42:14
Добрый день, прошу помощи.

каким образом менять макс и мин у шкалы тренда?
т.е. каким образом сделать автоматическое маштабирование тренда в зависимости от переменной?

Благодарю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: dmitrii.zakharin@nurzhana от 06 Января 2020, 09:22:36
Здравствуйте. У кнопки есть свойство "Бит" (https://simple-scada.com/help/manual/button.html) которое отвечает за то какой бит переменной будет меняться при нажатии на кнопку. Просто введите номер бита который нужно менять в это свойство (биты нумеруются с нуля). И не забудьте привязать саму кнопку к переменной в которой нужно менять бит.

Спасибо все оказывается намного проще чем я делал
Код: (delphi)
var
  aValue: Integer;
begin
  aValue := lampa.AsInt;

  if knopka_2.Value then
  begin
    aValue := SetBit(aValue, 2, true);
     end else
    begin
      aValue := SetBit(aValue, 2, False);
          end;
  lampa.Value := aValue;

end.     
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Января 2020, 12:19:55
каким образом менять макс и мин у шкалы тренда?
т.е. каким образом сделать автоматическое маштабирование тренда в зависимости от переменной?
Тренд берёт шкалу из переменной. Откройте окно редактирования переменной (https://simple-scada.com/help/manual/variable-new.html) и назначьте ей ту шкалу в которой "плавает" значение переменной. Если Вы хотите расположить тренд в каком-то произвольном месте, то включите у тренда свойство "задать положение" и через свойства "от" и "до" настройте положение тренда. Описание всех этих свойств доступно в руководстве по ссылке (https://simple-scada.com/help/manual/index.html?editor-trends.html#trend_prop).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MaxHari от 21 Января 2020, 10:30:37
Если ли возможность где-то почитать про параллельные процессы в Скаде? Например, изменение переменной, смена пользователя, открытие файла и т.п.? Были ситуации, когда приходилост методом "тыка" решать различные задачи. Сейчас очередь скриптов часто переполняется, хочется разобраться, что может вызывать причину.

Также в скаде есть события "Запуск проекта" и "Полностью запущен". Можно ли где-то более подробно, чем в руководстве, почитать о том, какие процессы происходят на этих этапах. Страницы разрабатываемого проекта заполняются динамически полностью при старте, и проект слегка "подвисает". Хотелось бы разобраться, что куда распределить в проекте, поскольку он выдаёт разные результаты при заполнении объектов и инициализации тегов из скриптом с указанными выше событиями.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Января 2020, 09:24:23
Цитировать
Если ли возможность где-то почитать про параллельные процессы в Скаде?
Параллельно выполняются только тяжелые операции или операции, которые могут занять время, такие как вычисление архивных значений (https://simple-scada.com/help/script/work-with-archive.html), отправка e-mail или telegram-сообщений, построение отчетов. Работают следующим образом: Вы вызываете построение отчета в скрипте, но скада не строит его в тот же момент, вместо этого отчет начинает строиться в отдельном потоке, а код скриптов продолжает выполняться дальше. Вся эта информация никак не касается очереди скриптов и её переполнения и её можно не знать.

Цитировать
Сейчас очередь скриптов часто переполняется
Здесь всё очень просто. Все скрипты в скаде добавляются в очередь скриптов в том порядке в котором они были вызваны и выполняются последовательно друг за другом. Никакой параллельности у самих скриптов нет (два скрипта никогда не будут выполняться одновременно), т.к. это привело бы к хаотичности и нестабильной работе. Чтобы очередь скриптов переполнилась, нужно сделать в скриптах грубые ошибки, например зациклить скрипты на самих себя, чтобы очередь росла бесконечно. Или добавить в какой-то скрипт бесконечный цикл, чтобы он никогда не выполнился и соответственно не дал выполниться другим скриптам. Пример зацикленных друг на друга скриптов:
Код: (delphi)
// скрипт по изменению переменной vrA
procedure vrA_OnDataChange(Sender: TM_Control);
begin
  vrB.Value := Random(100);  // меняем значение переменной vrB
end.

// скрипт по изменению переменной vrB
procedure vrB_OnDataChange(Sender: TM_Control);
begin
  vrA.Value := Random(100);  // меняем значение переменной vrA
end.
В таких (и о других подобных) ситуациях скада будет выдавать отдельное сообщение в журнал о переполнении очереди скриптов.

Цитировать
Также в скаде есть события "Запуск проекта" и "Полностью запущен".
Скрипты с типом события "Запуск проекта" выполняются один раз - при запуске проекта на сервере.
Скрипты с типом события "Полностью запущен" после запуска проекта ждут пока будет выполнено подключение ко всем OPC-серверам и выполняются после подключения, либо когда выйдет лимит времени на подключение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MaxHari от 28 Января 2020, 14:39:48
Спасибо за подробное описание.

В части работы скриптов очень помогло, проект на старте стал меньше зависать при отсутствии opc-сервера.

С параллельными процессами у меня основные сложности возникли как раз при работе со скриптами OnDataChange на ComboBox'ах, которые заполнялись динамическими данными. В системе используются шаблоны, которые подставляются в комбобоксы, всего 3х10 штук (10 строк по 3 комбобокса). Пробовал сразу построчно с одной процедуры заполнять - скада не успевала уловить изменения, заполнить новые, и вытоге процесс не двигался. Пришлось перенести работу в пошаговое заполнение каждого последующего из предыдущего в OnDataChange. Позже, возможно, буду ещё дорабатывать - скорее всего отсюда и вылазять косяки с подвисанием очередей и перегрузкой системы, как вы описали.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MaxHari от 28 Января 2020, 14:57:55
Возникла проблема при установки верхней предупредительной границы на 2-х (возможно и более, пока не обнаружено) переменных.
В процедуру SetTagsSPs передаётся индекс объекта системы, по этому индексу в цикле определяются необходимые переменные spTag, значения mConstTag и тип spType границы, и данные передаются в SetSPToTag. Там уже идёт изменение граничного значения. На скрине видно, что значения на вход SetSPToTag поступают одни, а значение предупредительной границы не меняется - остаётся "10". С остальными переменными всё работает идеально.

Подскажите, пожалуйста, в чём может быть загвоздка?
Код: (delphi)
  procedure SetSPToTag(spTag: TM_Variable; spValue: double; spType: byte);
  begin
    DebugSP('[SetSPtoTag] spValue = ' + FloatToStr(spValue));
    case spType of
      1: begin
           spTag.HighWarning := spValue;
           DebugSP('[SetSPtoTag] ' + spTag.Name + ' SP1 set: ' + FloatToStr(spTag.HighWarning));
         end;
      2: begin
           spTag.HighAlarm := spValue;
           DebugSP('[SetSPtoTag] ' + spTag.Name + ' SP2 set: ' + FloatToStr(spTag.HighAlarm));
         end;
    end;
  end;

  procedure SetTagsSPs(objIndex: byte);
  var
    spTag, mConstTag: TM_Variable;
    spNum, spType: byte;
    objectId, mConstNumStr: string;
  begin
    DebugSP('[SetTagsSPs] in: objIndex = ' + IntToStr(objIndex));
    objectId := GetObjectIdByIndex(objIndex);
    for spNum := 1 to MCONST_SP_COUNT do
    begin
      spTag := GetVariableByName(objectId + '_' + mConstSPTag[spNum]);
      if Assigned(spTag) then
      begin
        spType := 2;
        repeat
          mConstTag := GetVariableByName(objectId + '_MCONST_' + intToStr(mConstSPNum[spType, spNum]));
          if Assigned(mConstTag) then
          begin
            DebugSP('[SetTagsSPs] ' + mConstTag.Name + ' = ' + mConstTag.AsStr);
            SetSPToTag(spTag, mConstTag.AsFloat, spType);
          end;
          Dec(spType);
        until spType = 0;
      end;
    end;
  end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Января 2020, 16:46:21
Сейчас, при изменении граничных значений выполняется проверка на их пересечение и скада не разрешает границам пересечься. Допустим есть переменная у которой верхняя аварийная граница равна 100, а нижняя предупредительная равна 50. Тогда верхнее предупредительное значение можно будет задать только в диапазоне от 50 до 100. И если выполнить присвоение "myVar.HighWarning := 40", то скада увидит что значение 40 пересекает НП границу, которая равна 50 и вместо 40 присвоит 50, чтобы исключить пересечение. Это безусловно неудобно и осталось от старых версий. В ближайшем обновлении отключим проверку на пересечение границ.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: MaxHari от 28 Января 2020, 23:58:06
Нашли наконец баг в проекте - у переменных вообще не были установлены границы в свойствах, в результате записывалась только верхняя аварийная граница, а предупредительная оставалась на значение "10".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 31 Января 2020, 08:13:25
Добрый день , как сделать допись в файл , именно допись со свободной строки , а не  перезапись файла
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 31 Января 2020, 10:29:59
Здравствуйте.

Доступные методы для работы с файлами можно найти в разделе руководства "Работа с файлами (https://simple-scada.com/help/script/workfile.html)". Если речь идет о текстовом файле, то для его открытия нужно использовать функцию TextFileOpen (https://simple-scada.com/help/script/textfileopen.html). Обратите внимание на параметр AOpenMode (https://simple-scada.com/help/script/tm_fileopenmode.html), который определяет метод открытия файла. Если необходимо при открытии переместить курсор в конец файла, то в параметре AOpenMode нужно указать fomAppend, пример ниже. Также, подобный вопрос обсуждался в данной теме (https://simple-scada.com/forum/index.php?topic=827.0).
Код: (delphi)
begin
  { открываем текстовый файл MyTextFile.txt из папки "\Simple-Scada\Projects\Папка_проекта\User files\"
    для добавления записи в конец файла }
  if TextFileOpen('MyTextFile.txt', '', fomAppend, fcpUTF8) then
  begin
    TextFileWriteLn(MyVar.AsStr);  // записываем значение переменной "MyVar" в конец файла
    TextFileClose;  // закрываем файл
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 13 Февраля 2020, 16:19:53
Подскажите , а можно как то скриптами  контролировать , есть ли связь с опс сервером? и второе , если опс отвалился , что происходит с переменной? остается последнее значение , насколько понял , а можно обнулять, если нет связи?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Февраля 2020, 22:29:02
Здравствуйте.
Уточните, какой OPC-сервер используется DA или UA? Сервер удаленный или локальный?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 14 Февраля 2020, 08:37:14
Доброе утро, в данном случае OPC DA, удаленный
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Февраля 2020, 15:55:09
Здравствуйте.

Сейчас, при потере связи с удаленным DA сервером остаются последние полученные с него значения. В обновлении 2.3.6.8 сделали чтобы переменные обнулялись  при разрыве связи с OPC-сервером (на обычных клиентах (не web) также отображаются иконки с восклицательным знаком).

Цитировать
Подскажите , а можно как то скриптами  контролировать , есть ли связь с опс сервером?
Можно воспользоваться перечисленными ниже способами и например выводить предупреждение при потери связи с удаленным ПК или ПЛК/устройствами, которые работают через этот OPC.
1. Можно проверять качество нужных тегов - см. свойство IsGoodQuality (https://simple-scada.com/help/script/varisgoodquality.html). 
2. Можно производить пинг ПЛК/ПК/устройства - см. процедуру StartPing (https://simple-scada.com/help/script/startping.html).
3. Можно использовать описанный здесь  (https://simple-scada.com/help/script/comm-control.html)способ контроля связи.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Banzai от 27 Февраля 2020, 03:57:12
Здравствуйте. Возникла необходимость прочитать атрибуты внешнего тега, с 5001 по 5009. Посмотрел тег через Matricon OPC Explorer, атрибуты есть.
Подскажите, как это можно сделать, если при импорте внешней переменной в ее свойствах есть атрибут Quality, DataStamp и все?
В качестве OPC используется система "Микон".
(https://i.ibb.co/HGw1N9c/image.jpg) (https://ibb.co/F8ZNsdQ)
pix картинки (https://ru.imgbb.com/)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Февраля 2020, 09:46:21
Здравствуйте.

Через скаду нельзя прочитать эти атрибуты. Скада во время работы подписывается на нужные теги и получает каждое изменение тега с атрибутами "значение" + "метка времени" + "качество тега". Во время импорта тегов через редактор скада читает "имя" + "тип данных" + "описание".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Banzai от 28 Февраля 2020, 14:53:56
Здравствуйте.

Через скаду нельзя прочитать эти атрибуты. Скада во время работы подписывается на нужные теги и получает каждое изменение тега с атрибутами "значение" + "метка времени" + "качество тега". Во время импорта тегов через редактор скада читает "имя" + "тип данных" + "описание".
Ясно. Спасибо за информацию.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 06 Марта 2020, 13:52:55
Заметил , что по запросу в SQL, 150 записей в обратной последовательности , возвращается не более 35 , в базе они имеются , прошу разъяснить данный момент , выводятся запросом сразу в таблицу , таблица подготовлена и имеет более 150 строк.Такое предположение , что сама функция RunSQL имеет ограничение. Хочу отметить что таблица из  базы данных выводиться целиком , т.е. используются все столбцы , а их 25.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 06 Марта 2020, 16:02:21
Попробуйте в коце запроса добавить limit 1000
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Марта 2020, 16:12:57
У RunSQL нет ограничений, но они есть у компонента Таблица:
Т.е. в обычном клиенте у Вас должны выводиться все строки (т.к. 150 строк меньше чем 8192). А на web-клиенте должно выводиться не более 82 строк. Для теста специально создали таблицу на 25 колонок и протестировали. Всё выводится в соответствии с описанием выше.
В ближайших обновлениях скады эти лимиты будут существенно увеличены.

Цитировать
возвращается не более 35
35 - это что-то странное. Такого лимита точно нет. Вы уверены что строк именно 35? Запрос точно выбирает более 35 строк? Используете web-клиент, или обычный клиент? Версия скады выше чем 2.2.6.0?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 11 Марта 2020, 10:27:37
35 - это что-то странное. Такого лимита точно нет. Вы уверены что строк именно 35? Запрос точно выбирает более 35 строк? Используете web-клиент, или обычный клиент? Версия скады выше чем 2.2.6.0?

Да вы правы около 80 , я пробовал на вэб клиенте , тогда все ясно, на клиенте без ограничений , спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 03 Апреля 2020, 10:14:31
Добрый день , подскажите возможно ли  с заполненной таблицы (с SQL таблицы, методом RunSQL)  экспортировать  в XSL
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Апреля 2020, 09:21:43
Здравствуйте. Нет, компонент Таблица не поддерживает функции экспорта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 07 Апреля 2020, 11:11:10
Подскажите пожалуйста , наиболее простой, автоматический способ распечатать содержимое окна , и желательно только его содержимое , в окне находиться таблица , вот её мне и надо распечатать .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 09 Апреля 2020, 21:46:42
Подскажите пожалуйста , наиболее простой, автоматический способ распечатать содержимое окна , и желательно только его содержимое , в окне находиться таблица , вот её мне и надо распечатать .

Вариант вывода таблицы на печать через построение отчета с последующей печатью:
- перед построением отчета необходимо подготовить данные из таблицы либо как CSV-файл, либо как таблицу БД;
- дождаться завершения построения файла или таблицы БД и запустить построение отчета с последующей печатью.

Пример скриптов при использовании файла для печати таблицы из трех столбцов ("параметры" - текст в ячейках, "уставки" и "значения" - ячейки связаны с переменными).
После изменения параметров и нажатия кнопки "Пуск" начинается отсчет таймера, по завершении отсчета формируется отчет.
Скрипт "Изменилась переменная (control, связанная с кнопкой "Пуск")":
Код: (delphi)
begin
  if GetBit(control.AsInt, 0) then begin
    Y7.Value := int(X7.Value);          // таймер интервала X7 - уставка, Y7 - текущее значение
    DTstart.Value := now;               // метка времени начала

    TextFileOpen('PrintTable.csv', '', fomRewrite, fcpANSI);
    TextFileWriteLn('');                // файл с пустой строкой
    TextFileClose;
  end;
end.

Скрипт "Прошла секунда"
Код: (delphi)
var i: integer;
    aReport: TM_Report;
begin
  if GetBit(control.AsInt, 0) then
    if CompareDateTime(Y7.Value, X7.Value) = -1 then
      Y7.Value := IncSecond(Y7.AsDateTime, 1)     // счет таймера
    else
      if Table1.Tag = 0 then begin                                   // Table1.Tag = 0  - запись файла
        TextFileOpen('PrintTable.csv', '', fomRewrite, fcpANSI);     // запись данных в CSV-файл
        TextFileWriteLn(';;');                                       // заголовок (имена столбцов)
        with Table1 as TM_Table do
          for i := 1 to 6 do
            TextFileWriteLn(UTF8ToString(GetCell(0,i).Text) + ';' + GetCell(1, i).Variable.AsStr + ';' + GetCell(2, i).Variable.AsStr);

        TextFileWriteLn(' Интервал;' + TimeToStr(DTstart.AsDateTime) + ';' + TimeToStr(Now));    // время начала и конца процесса
        TextFileClose;
        Table1.Tag := 1;
      end
      else begin    // Table1.Tag <> 0   - ожидание завершения записи файла и построение отчета
        if TextFileOpen('PrintTable.csv', '', fomReset, fcpANSI) then
          if TextFileReadLn = ';;' then begin          // первая строка содержит заголовок, файл записан
            aReport := ReportBuild('Print_1');
            aReport.View(ClientName.AsStr);            // осталось дождаться отчета для просмотра или печати (.Print)
            Table1.Tag := 0;                           // сбросить флаг построения отчета
            control.Value := 0;                        // завершено - отпустить кнопку и
          end;
        TextFileClose;
      end;
end.

1. Скрипты исключительно для примера, в рабочем варианте необходимо контролировать "бесконечный" цикл ожидания записи файла (записи таблицы БД), если запись "пошла не так".
2. При использовании таблицы БД необходимо дополнительно включить в таблицу упорядочивающий столбец строк исходной таблицы (номер строки).

Проект во вложении позволяет выбрать создание и просмотр отчета для файла, таблицы или файла и таблицы.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 10 Апреля 2020, 15:04:42
Добрый день , возник вопрос --- что это за ошибка в отчете и как с ней бороться , ошибка лезет при работе с любыми таблицами , в этой бд

Ошибка компиляции
В отчете 'silos_1' выявлена ошибка компиляции:'
Класс "Reports.silos_1.silosDataSource" уже содержит определение для "PK_"
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Апреля 2020, 10:26:24
Здравствуйте.

Цитировать
В отчете 'silos_1' выявлена ошибка компиляции:'
Класс "Reports.silos_1.silosDataSource" уже содержит определение для "PK_"
Извините за задержку с ответом, почему-то не пришло уведомление об ответе в теме.
Эта ошибка говорит о том, что в отчете есть объект имя которого конфликтует с другим объектом. Чтобы узнать какой именно объект привел к проблеме, нужно проверить отчет. Если есть желание, то вышлите текущую версию проекта на support@simple-scada.com для проверки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Вячеслав от 20 Апреля 2020, 13:38:58
Здравствуйте!
Существует ли полное описание команд, операторов и синтаксис для скриптов?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 20 Апреля 2020, 21:44:27
Здравствуйте.

В скриптах Simple-Scada используется Object Pascal компилятор. Обо всех командах и операторах присущих языкам Pascal/Delphi можно прочесть в интернете на сайтах связанных с языками Pascal/Delphi. Например, описание типов данных (http://www.delphibasics.ru/1Types.php) и ключевые слова (http://www.delphibasics.ru/1Keywords.php). Описание доступных свойств и методов скады можно найти в руководстве по скриптам (https://simple-scada.com/help/script/index.html). Примеры часто используемых скриптов можно найти в этом разделе (https://simple-scada.com/help/script/sample-scripts.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Вячеслав от 20 Апреля 2020, 22:44:06
К сожалению в руководстве информация раскрыта не полностью. Например не понятно как выполняется скрипт если нет вызывающего скрипт события. Могу ли я просто написать скрипт как программу которая будет что то рассчитывать и присваивать результат внешней переменной?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 21 Апреля 2020, 09:07:42
....как выполняется скрипт если нет вызывающего скрипт события...
Рискну предположить, что никак не выполняется.
...Могу ли я просто написать скрипт как программу которая будет что то рассчитывать и присваивать результат внешней переменной?...
А что мешает?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 21 Апреля 2020, 10:42:16
Цитировать
не понятно как выполняется скрипт если нет вызывающего скрипт события
Скрипты выполняются при возникновении события, к которому они привязаны, это могут быть события объектов (https://simple-scada.com/help/script/object-events.html) или события, доступные при создании нового скрипта (https://simple-scada.com/help/script/event-types.html). Если скрипт не связан ни с каким событием, то он не будет выполняться.

Цитировать
написать скрипт как программу которая будет что то рассчитывать и присваивать результат внешней переменной
Если требуется производить расчеты на основе каких-либо переменных, то можно использовать скрипт по событию "Изменились переменные" (https://simple-scada.com/help/script/changemulvar.html), добавив в него необходимые переменные - такой скрипт будет выполняться при изменении любой переменной из списка. Если требуется выполнять скрипт периодически через какой-то интервал времени, то можно использовать скрипт с типом события "Прошла секунда (https://simple-scada.com/help/script/second-passed.html)", добавив в него условие интервала, как в примере по ссылке (https://simple-scada.com/help/script/second-passed.html). Для максимального быстродействия проекта следует правильно подбирать событие, по которому должен выполняться скрипт, например если требуется производить сложение нескольких переменных, то лучше использовать скрипт по событию "Изменились переменные"(а не "Прошла секунда"), тогда скрипт будет выполняться только при изменении переменных, а не каждую секунду. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: gaargot1 от 30 Апреля 2020, 10:53:00
Добрый день,

Как при наступлении определенных условий проиграть несколько звуковых файлов подряд?
Код: (delphi)
if temp100.value = 10 then
  begin
    PlayUserSound("brew",'1.ogg',false);
    PlayUserSound("brew",'2.ogg',false);
    PlayUserSound("brew",'3.ogg',false);
  end;
 
при таком написании воспроизводится только файл 3.ogg
Тоже ломал голову, как не используя таймеры озвучивать динамические сообщения.
Решил не проигрывать аудиофайлики средствами скады, а генерировать строку в зависимости от событий и проигрывать этот текст через внешнее консольное приложение
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 07 Мая 2020, 20:06:36
Добрый! У меня не работает POST-запрос из примера:
Код: (delphi)
var
  aHTTP: TM_HTTP;
  aPOST: TM_HTTPPost;
begin
  aPost := TM_HTTPPost.Create;        // создаем данные для отправки
  aPost.Add('username=admin');        // !!!компилятор не ругается, а в логе сервера ОШИБКА Access violation at address!!!
  aPost.Add('password=my_password');  // добавляем второй параметр
 
  aHTTP := RequestHTTP;               // создаем экземпляр запроса
  aHTTP.Post('http://mysite.com/index.html', aPost); // вызываем POST
end.

Пишет: Ошибка в скрипте "POST_API" в строке 6. Access violation at address 00C6DDDA in module 'Server.exe'. Read of address 00000000

Также не понятна нужная структура запроса серверу. "Обвязку" запроса нужно самому писать или aHTTP.Post делает это сам?
Вот такие подобные конструкции нужны?:
Код: (delphi)
PostData := 'log=123&pass=456';
S := 'POST /a.php HTTP/1.0'#13#10+ // тип запроса (POST) и страница, к которой обращаемся
       'Host: 127.0.0.1'#13#10+ // имя сервера
       'Connection: Close'#13#10+ // закрывать подключение после того, как сервер вернёт данные
       'Content-Type: application/x-www-form-urlencoded'#13#10+ // в каком формате передаются данные
       'Content-Length: '+IntToStr(Length(PostData))+#13#10+ // размер данных
       #13#10+PostData; // сами данные
   



Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Мая 2020, 09:38:12
Здравствуйте.

Подтверждаем ошибку. В текущей сборке неправильно зарегистрирован конструктор класса TM_HTTPPost. В ближайшем обновлении исправим. Многие серверы поддерживают GET вместо POST, например можно попробовать так:
Код: (delphi)
var
  aHTTP: TM_HTTP;
  aQuery: string;
begin
  // формируем текст HTTP запроса
  aQuery := 'http://127.0.0.1/a.php?log=123&pass=456';
 
  aHTTP := RequestHTTP;   // создаём экземпляр запроса
  aHTTP.Get(aQuery, 0);     // вызываем GET с запросом aQuery
end.
Если Ваш сервер работает только с POST, то нужно дождаться обновления.

Цитировать
Также не понятна нужная структура запроса серверу. "Обвязку" запроса нужно самому писать или aHTTP.Post делает это сам?
Вот такие подобные конструкции нужны?
Стандартные заголовки запроса, как Host, Connection, Content-Type, Content-Length формируются автоматически и обычно их не нужно прописывать. Но при желании можно задать свои заголовки, например:
Код: (delphi)
aHTTP := RequestHTTP;
aHTTP.SetHeader('Host', '127.0.0.1');
aHTTP.SetHeader('Connection', 'Close');
aHTTP.SetHeader('ContentType', 'application/x-www-form-urlencoded');
Если Вы работаете с каким-то общедоступным сервером, то назовите его, мы можем перед обновлением проверить скаду с ним и опубликовать примеры запросов для этого сервера.


UPD: исправление с конструктором класса TM_HTTPPost добавили в обновление 2.3.6.12;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Мая 2020, 10:35:28
Здравствуйте.

Не нужно брать значение в виде строки, а затем переводить его в Integer. Берите значение сразу как Integer:
Код: (delphi)
DataSet.Fields[0].AsInt
Все свойства полей данных описаны в этой статье (https://simple-scada.com/help/script/tmdbfield.html) руководства.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 21 Мая 2020, 11:13:34
спасибо , да не подумал , об других свойствах этой функции
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 03 Июня 2020, 13:44:18
Цитировать
UPD: исправление с конструктором класса TM_HTTPPost добавили в обновление 2.3.6.12;

Спасибо, теперь вижу ответы от сервера по запросам POST.
Однако получаются только запросы, где отсутствуют параметры запроса.
По API мне после заголовка нужно отправлять ПАРАМЕТРЫ ЗАПРОСА в таком виде:
{
   "login":"user@cloud.by",
   "password":"123456"
}

Если добавляю любые символы, в aPost.Add('login":user@cloud.by'); -не важно что внутри Add, даже хотя бы один символ , то получаю ответ в Response: HTTP/1.1 400 Bad request
Если делаю зарос без строчки aPost.Add(' '); то получаю ответ в Response: HTTP/1.1 401 Unauthorized

Если делать просто GET запрос типа 'http://127.0.0.1/a.php?log=user@cloud.by&pass=123456', то ответ от сервера такой:
{"name":"Exception","message":"Неверный email или пароль.","code":0,"status":401,"type":"customException","error_status":1}

Вообще, как-нибудь возможно "подсмотреть" что отправляется в запросе aHTTP.Post и в каком виде?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 03 Июня 2020, 15:38:38
Цитировать
Если добавляю любые символы, в aPost.Add('login":user@cloud.by'); -не важно что внутри Add, даже хотя бы один символ , то получаю ответ в Response: HTTP/1.1 400 Bad request
Конечно, ведь если отправлять какие-то произвольные значения серверу, то сервер их не поймёт и выдаст сообщение о том, что запрос неправильный, что и происходит в Вашем случае (400 Bad request). Запрос нужно посылать строго в том формате, который требует сервер, никаких лишних символов в нём быть не должно.

Цитировать
Если делаю зарос без строчки aPost.Add(' '); то получаю ответ в Response: HTTP/1.1 401 Unauthorized
Тоже верно, ведь теперь Вы не посылали никаких непонятных серверу данных и ошибки "Bad request" не произошло. Но при этом Вы и не авторизовались, о чём и говорит сервер сообщением "401 Unauthorized".

Цитировать
aPost.Add('login":user@cloud.by');
В этом запросе пропущена двойная кавычка в самом начале, очевидно что он не будет правильно распознан сервером. Возможно правильный формат такой: aPost.Add('"login":user@cloud.by');
, это если сервер требует именно такой формат, сначала имя параметра в кавычках, затем двоеточие, затем значение параметра.

Цитировать
Если делать просто GET запрос типа 'http://127.0.0.1/a.php?log=user@cloud.by&pass=123456', то ответ от сервера такой:
{"name":"Exception","message":"Неверный email или пароль.","code":0,"status":401,"type":"customException","error_status":1}
Это уже больше похоже на рабочую версию запроса, т.к. сервер дал понятный ответ "Неверный email или пароль". Вы точно уверены в том что указали верный e-mail и пароль? Также обратите внимание, что в этом GET запросе Вы передаёте логин как параметр с именем "log", но в других местах Вы пишете "login", а также "pas" и "password". Ваш сервер допускает оба варианта "log" / "login", "pas" / "password"? Или всё таки какой-то один вариант. Если сервер требует имя параметра "login", то указывайте именно так, т.е.:
http://127.0.0.1/a.php?login=user@cloud.by&password=123456

Цитировать
Вообще, как-нибудь возможно "подсмотреть" что отправляется в запросе aHTTP.Post и в каком виде?
Можно попробовать снимать трафик через Wireshark или подобное ПО, но зачем, если ответы сервера дают нужную информацию, как описано выше.

Цитировать
{
   "login":"user@cloud.by",
   "password":"123456"
}
Это JSON-формат запроса, его обычно передают через TStringStream, который мы не выносили в скрипты, но можем добавить в будущем (обычно для JSON также указывают ContentType как json). Сейчас можно попробовать и напрямую:
Код: (delphi)
var
  aHTTP: TM_HTTP;
  aPOST: TM_HTTPPost;
begin
  aPost := TM_HTTPPost.Create;        // создаем данные для отправки
  aPost.Add('{"login":"user@cloud.by","password":"123456"}'); // добавляем данные

  aHTTP := RequestHTTP;               // создаем экземпляр запроса
  aHTTP.SetHeader('ContentType', 'application/json');   
  aHTTP.Post('http://127.0.0.1/a.php', aPost); // вызываем POST
end.

Цитировать
По API мне после заголовка нужно отправлять...
Если у Вас есть описание API, то дайте нам ссылку на него (можно выслать на support@simple-scada.com), тогда было бы понятно какие запросы требует сервер и вышеописанные вопросы решатся сами собой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: torchinsky от 29 Июня 2020, 00:45:16
Есть переменная с контроллера типа Word.
Первые 3 бита показывают в каком режиме работает установка.
0 - Режим 1
1 - Режим 2
2 - Режим 3

На экране рисую отображение всего этого дела. Оч удобно и красиво получилось сделать с помощью button с enabled = false. По факту это не кнопка уже, красивая такая метка. НО! Нужно отобразить 4ю кнопку "Неактивное"....
Решил попробовать через второстепенную переменную и событие на ее изменение. Написал скрипт и не нашел способа программно изменить текущий state кнопки.
Я понимаю, что можно создать локальную переменную, ее привязать как основную и в скрипте менять значение...но я не хочу так, ибо их придется делать 36 ибо 36 установок...
Можно не рисовать вообще или по другому выводить сообщение, о том что установка неактивна....
Еще можно оставить у кнопки 1 state и просто менять ей цвет...Но хотелось бы большей однотипности в поведении этих кнопок...

Просто хочется без таких решений сказать кнопке "измени состояние"...Такое как нить возможно?

Пример скрипта

Код
begin
  if Sender is TM_Button then
      with Sender as TM_Button do
        if GetBit(VariableEx.Value , 0) = false and GetBit(VariableEx.Value , 1) = false and GetBit(VariableEx.Value , 2) = false then
           setState(1);   // это фантазии
        else
           setState(0);   // это фантазии
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: torchinsky от 29 Июня 2020, 01:46:55
И еще один вопрос...не совсем по скриптам: никто не пробовал проекты делать и синхронизировать работу через git или другие системы контроля версий? Есть какие либо рекомендации или не вариант совсем?

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 29 Июня 2020, 05:29:09
Нужно отобразить 4ю кнопку "Неактивное"....
Здравствуйте!
Это кнопка с восьмью состояниями. Бонусом - индикация запрещенных комбинаций. При отсутствии оных - можно обойтись кнопкой с пятью состояниями. См. пример во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: torchinsky от 29 Июня 2020, 21:36:26
Здравствуйте!
Это кнопка с восьмью состояниями. Бонусом - индикация запрещенных комбинаций. При отсутствии оных - можно обойтись кнопкой с пятью состояниями. См. пример во вложении.

За пример спасибо. Возьму на вооружение прием с кнопкой и состояниями. Но этот пример не совсем решает мою проблему. Во вложении примерный вид элемента управления как я его себе представляю. Это все заблокированные кнопки. по ним нажимать нельзя. Только в качестве отображения)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 30 Июня 2020, 04:17:35
Но этот пример не совсем решает мою проблему. Во вложении примерный вид элемента управления как я его себе представляю.
     Здравствуйте!
Во вложении пример возможной реализации элемента управления.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: msigx680 от 30 Июня 2020, 15:58:28
Здравствуйте! На первых страницах темы был пример реализации таймера наработки оборудования https://simple-scada.com/forum/index.php?topic=145.30
Но он в последней версии не открывается, может у кого есть пример реализации?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Июля 2020, 17:42:13
Здравствуйте.

Цитировать
Оч удобно и красиво получилось сделать с помощью button с enabled = false. По факту это не кнопка уже, красивая такая метка.
Для таких целей правильнее использовать компонент "Текст (https://simple-scada.com/help/manual/text.html)", его внешний вид можно настроить также как у кнопки на Вашем скриншоте(см. вложение). 

Цитировать
На первых страницах темы был пример реализации таймера наработки оборудования https://simple-scada.com/forum/index.php?topic=145.30
Для такой задачи сейчас можно использовать процедуры для работы с таймерами (https://simple-scada.com/help/script/timers.html). Пример можно найти в демо-проекте -> страница "Скрипты" -> "Простые скрипты(1)" -> Пример №3. Также, время наработки можно получить по архивным данным переменой при помощи процедуры ArchiveTimeOn (https://simple-scada.com/help/script/archivetimeon.html). Если требуется создать отчет времени наработки/простоя, то пример такого отчета можно найти по ссылке (https://simple-scada.com/help/report/rep-time-work-idle.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 13 Июля 2020, 13:22:59
Возник вопрос, как контролировать работоспособность скады, у меня скада используется для сбора и обработки  данных по производству, счетчики и т.д., и постоянно мониторить её работоспособность , часто не выходит , она зависает второй раз , за неделю, сейчас перегрузил сам сервер (ПК).   При зависании,  вэб интерфейс работает, но данные не изменяются , скрипты не работают, но  на первый взгляд , все нормально, в логах нет ничего интересного, хотелось бы в такие моменты отсылать письмо на адрес, но как это сдель если сама скада "мертвая".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Saurin от 14 Июля 2020, 09:33:53
Здравствуйте, как отправлять сообщения телеграмм боту (сообщение содержит текущее значение переменной) с помощью GET запроса?
из руководства по скриптам копипастил в проект, но он по чему то не работает, саму ссылку с гет запросом вставляю в браузер - сообщение присылается.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Июля 2020, 10:29:59
lipvasko, это ненормальная ситуация и нужно разобраться, что приводит к зависанию сервера. Такое возможно если в скриптах допущены грубые ошибки, например зацикливание скриптов друг на друга, из-за чего очередь скриптов будет расти бесконечно. Или имеется скрипт с бесконечный циклом, который никогда не выполнится и соответственно не даст выполниться другим скриптам. Пример зацикленных друг на друга скриптов:

Код: (delphi)
// скрипт по изменению переменной vrA
procedure vrA_OnDataChange(Sender: TM_Control);
begin
  vrB.Value := Random(100);  // меняем значение переменной vrB
end.
 
// скрипт по изменению переменной vrB
procedure vrB_OnDataChange(Sender: TM_Control);
begin
  vrA.Value := Random(100);  // меняем значение переменной vrA
end.
В таких (и других подобных) ситуациях скада будет выдавать отдельное сообщение в журнал сервера (https://simple-scada.com/help/manual/server-journal.html) о переполнении очереди скриптов.

Ошибки в скриптах, которые невозможно определить на этапе компиляции будут выводиться в журнал сервера (https://simple-scada.com/help/manual/server-journal.html). Откройте журнал сервера и просмотрите его на предмет наличия ошибок в скриптах, если в журнале имеются скрипты с ошибками, то их нужно исправить. В журнале будет указано имя скрипта, при выполнении которого возникла ошибка, а также номер строки вызвавшей ошибку. Также, для отладки скриптов можно в настройках Options.exe активировать опцию "Лог скриптов (https://simple-scada.com/help/manual/settings-simple-scada-server.html?anchor=other)".

Если не получится разобраться, пришлите нам на support@simple-scada.com текущую версию проекта, а также целиком папку Logs из директории "...\Simple-Scada 2\Logs". Также уточните, Вы используете последнюю версию 2.3.6.12 или более старую?

Saurin, для отправки Telegram-сообщений, не нужно использовать GET запросы. Для отправки сообщений через Telegram необходимо произвести предварительную настройку следуя инструкции (https://simple-scada.com/help/manual/telegramset.html). После этого можно отправлять Telegram-сообщения из скриптов используя процедуру SendTelegram (https://simple-scada.com/help/script/sendtelegram.html). Для отправки значения переменной в Telegram-сообщении можно использовать свойство переменной AsStr (https://simple-scada.com/help/script/varasstr.html), например:
Код: (delphi)
begin
  SendTelegram('Значение переменной = ' + MyVar.AsStr);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Saurin от 14 Июля 2020, 10:32:51
Это да, но если стоит задача отправлять сообщения в разные телеграмм боты?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 14 Июля 2020, 14:09:57
Да использую последнюю версию , в логах не было , сейчас и ранее , информации по превышению очереди скриптов,  зацикленных скриптов , так же не наблюдал.

Вопрос, при записи  в текстовый файл, необходимо записать информацию на кириллице (по русски) перепробовал уже кучу кодировок в  функции открытия файла ,а в блокноте все равно в  файле не читается информация по русски , вопрос какую кодировку использовать для вывода файл , что бы блокнотом читалось нормально.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 14 Июля 2020, 15:21:12
Вопрос, при записи  в текстовый файл, необходимо записать информацию на кириллице (по русски) перепробовал уже кучу кодировок в  функции открытия файла ,а в блокноте все равно в  файле не читается информация по русски , вопрос какую кодировку использовать для вывода файл , что бы блокнотом читалось нормально.
Используй юникод.
В блокноте поменяй шрифт и(или), возможно, кодировку. А лучше используй notepad++.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 14 Июля 2020, 16:56:40
Так весь смех в том, что после юникода , я даже нотепадом в ютф8 прочитать не могу
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Июля 2020, 17:09:08
lipvasko, удобнее всего использовать UTF8. Но, судя по описанию, Вы неправильно записываете в файл, а кодировка здесь не при чем. Можно предположить что при записи Вы смешиваете разные типы данных - UTF8String и string.

Saurin, отправлять через разных ботов нельзя (через несколько токенов). Обычно создают одного бота (и один токен) и через него рассылают множеству получателей в чаты. Или в группу, на которую подписаны получатели. Можно используя Telegram API реализовать и свою отправку через GET-запросы, но это будет сложно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 14 Июля 2020, 17:40:30
Возможно , тогда как можно записать текст ,  на кириллице , не объявляя переменную стринг или ютф8 стринг а просто  такого вида  +'это мир' ?  я , так пробовал писать на латинице и все было ок.
пишу в файл так TextFileWriteLn(DateTimeToStr(Now) +' Создан новый файл ' );
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 15 Июля 2020, 08:59:33
Добрый день, ещё подскажите , можно ли читать текстовые файлы по сери , в расшаренных папках и как это сделать , пример пожалуйста.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 15 Июля 2020, 12:17:03
Подскажите, пожалуйста в чем может быть проблема.
Имеется таблица Table_term, показывающая температуру по дням из БД.
В сервере периодически возникает ошибка: "Ошибка в скрипте Global в строке 162. Access violation at address 00F425D1 in module 'Server.exe'. Read of address 000000BD"
Строка 162 - это: aVal := aCell.Variable.AsSingle;    // получим значение в ячейке

Код: (delphi)
// Раскраска ячеек таблицы в зависимости от значения температуры термоподвески
procedure TableColorCell();
var
  iRow, iCol : integer;
  aCell: TM_TableCell;
  aVal : Single;
begin
  if Table_term.RowCount > 0 then
    for iRow := 1 to (Table_term.RowCount-1) do        // Цикл со второй строки таблицы до конца
      for iCol := 2 to (Table_term.ColumnsCount-1) do  // Цикл с третьего столбца таблицы до конца
      begin
        aCell := Table_term.GetCell(iCol, iRow);       // Получим нужную ячейку
        if aCell <> nil then
        begin
          aVal := aCell.Variable.AsSingle;    // получим значение в ячейке

          if aVal >= Tmax_warning then        // Если значение больше предупредительной уставки, то
            if aVal >= Tmax_alarm then        // Если значение больше аварийной уставки, то
              aCell.Color := clIndianRed      // Раскрашиваем фон ячейки в красный цвет
            else
              aCell.Color := RGB(255,255,128) // Раскрашиваем фон ячейки в желтый цвет
          else
            aCell.Color := clWhite;           // Раскрашиваем фон ячейки в белый цвет, если значение в норме
        end;
      end;
end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 15 Июля 2020, 20:58:41
   Здравствуйте!

lipvasko, по-видимому компилятор не привел тип строки, нужно явно указать тип функцией UTF8Encode(' Создан новый файл ').

Миханик, очень похоже на отсутствие переменной привязанной к ячейке.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 15 Июля 2020, 22:34:27
lipvasko, вот правильный вариант:
Код: (delphi)
TextFileWriteLn(UTF8ToString(DateTimeToStr(Now)) +' Создан новый файл ');

Цитировать
ещё подскажите , можно ли читать текстовые файлы по сери , в расшаренных папках и как это сделать , пример пожалуйста.
Можно, также как и в обычных папках, только в пути нужно указывать сетевой адрес. Но нужно учитывать, что при сбоях в сети обращения к файлам по сети могут выполняться значительно дольше, что может отразиться на скорости работы скады.

Миханик, как отметил pan2000, у Вас какая-то ячейка таблицы не связана с переменной. Т.е. "aCell.Variable" равно nil. В результате Вы пытаетесь получить свойство ".AsSingle" из несуществующей переменной, что недопустимо. Нужно либо связать ячейку с переменной, либо исправить код и добавить в него проверку на nil, вот так:
 
Код: (delphi)
...
  aCell := Table_term.GetCell(iCol, iRow);       // Получим нужную ячейку
  if aCell <> nil then
    if aCell.Variable <> nil then
    begin
      ...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 16 Июля 2020, 12:10:56
lipvasko, вот правильный вариант:
Код: (delphi)
TextFileWriteLn(UTF8ToString(DateTimeToStr(Now)) +' Создан новый файл ');
Выражение:
Код: (delphi)
UTF8ToString(DateTimeToStr(ADateTime: TDateTime): String)
подразумевает две конвертации: неявную String->UTF8 и явную UTF8->String, на мой взгляд проще явно указать тип компилятору:
Код: (delphi)
String(DateTimeToStr(Now)) + ' Создан новый файл ';
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Июля 2020, 12:43:33
pan2000, в руководстве и скаде устаревшее описание функции DateTimeToStr. Она возвращает UTF8String. Поэтому конвертация на самом деле одна. В ближайшее время исправим описание.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 21 Июля 2020, 11:23:06
Добрый день, можно ли читать текстовые файлы в одной  подсетисети , в расшареных папках и как это сделать , если можно пример скрипта, пожалуйста.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Июля 2020, 11:27:22
Здравствуйте, мы отвечали на этот вопрос в этой теме выше, цитата:
Цитировать
Можно, также как и в обычных папках, только в пути нужно указывать сетевой адрес. Но нужно учитывать, что при сбоях в сети обращения к файлам по сети могут выполняться значительно дольше, что может отразиться на скорости работы скады.
для скады чтение по сети не отличается от чтения по локальному пути. Разница только в том, что вместо локального пути указывается сетевой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Saurin от 24 Июля 2020, 13:28:51
Цитировать
Saurin, отправлять через разных ботов нельзя (через несколько токенов). Обычно создают одного бота (и один токен) и через него рассылают множеству получателей в чаты. Или в группу, на которую подписаны получатели. Можно используя Telegram API реализовать и свою отправку через GET-запросы, но это будет сложно.

У меня есть ключ отправки сообщения телеграмм боту через GET запрос, он работает в браузере. Что нужно , что бы он работал из скады?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 28 Июля 2020, 10:35:19
Здравствуйте.

Для отправки сообщений через Telegram необходимо произвести предварительную настройку следуя инструкции (https://simple-scada.com/help/manual/telegramset.html). После этого можно отправлять Telegram-сообщения из скриптов используя процедуру SendTelegram (https://simple-scada.com/help/script/sendtelegram.html). Если требуется рассылать сообщения разным наборам пользователей, то для этого можно создать группы, на которые будут подписаны нужные пользователи. Далее можно отправлять сообщения в требуемую группу используя ID группы(узнать ID группы можно на этом этапе настройки (https://simple-scada.com/help/manual/index.html?telegramset.html#chatid) Telegram-сообщений). Сообщения отправленные в группу получат все пользователи подписанные на эту группу. Можно отправить сообщение как в одну группу,  так и сразу в несколько групп, например:
Код: (delphi)
begin
  { отправить Telegram-сообщение в одну группу }
  SendTelegram('Авария котла!', '258579674');
 
  { отправить Telegram-сообщение в две группы }
  SendTelegram('Авария котла!', '258579674, 568479675');                   
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 11 Августа 2020, 17:16:37
Здравствуйте, мы отвечали на этот вопрос в этой теме выше, цитата:
Цитировать
Можно, также как и в обычных папках, только в пути нужно указывать сетевой адрес. Но нужно учитывать, что при сбоях в сети обращения к файлам по сети могут выполняться значительно дольше, что может отразиться на скорости работы скады.
для скады чтение по сети не отличается от чтения по локальному пути. Разница только в том, что вместо локального пути указывается сетевой.

Вопрос, а учетные данные возможно вводить(логин и пароль), и если да то как?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 11 Августа 2020, 17:43:16
Нет. Учетные записи пользователей в Windows относятся к операционной системе. Скада на них не влияет, она только читает и записывает файлы в те папки, которые Вы укажете ей. Если Windows не позволит скаде писать/читать данные из указанной папки, то скада ничего сделать не сможет. Чтобы скада могла считать файл, Вы должны запустить её под тем пользователем Windows, который имеет права на доступ к папке. Тогда ОС не будет препятствовать скаде и всё будет работать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 12 Августа 2020, 14:53:46
Как разобрать такую строку, что бы получить   "Мука карусель В2"  из  строки вида "14.07.2020    15:07:44      Мука карусель В2             35831,82      711           50            2120320 "    пробовал использовать команду  копи и ютф8копи, результат в первом случае "1", во втором   вместо букв "?" и в конце "1"
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 12 Августа 2020, 20:22:21
Цитировать
Как разобрать такую строку, что бы получить   "Мука карусель В2"  из  строки вида
Если заранее известно, что искомый текст всегда начинается (например) с 28 символа, то можно сначала через UTF8Copy удалить лишние символы в начале строки, скопировав символы с 28 символа до конца строки. Далее можно в цикле проходить по символам и копировать их в отдельную строку до тех пор, пока не дойдём до места с двумя пробелами подряд. В результате останется искомая строка. Пример цикла по символам строки:
Код: (delphi)
var
  I: Integer;
  aStr: string;
begin
  aStr := 'Моя строка';
  for I := 1 to Length(aStr) do
  begin
    if aStr[I] = ' ' then
    begin
      // текущий перебираемый символ является пробелом
    end;
  end;
end.

Цитировать
пробовал использовать команду  копи и ютф8копи, результат в первом случае "1", во втором   вместо букв "?" и в конце "1"
Это значит, что в ходе преобразований строк Вы смешали строки разных типов (например UTF8String + String). Это разные типы поэтому строка при таком сложении испортится. При сложении строк их всегда нужно приводить к какому-то одному типу.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: azrael454 от 13 Августа 2020, 16:22:48
Добрый день.

Возможно ли реализация вот такого паттерна.

Есть обьект - кнопка настроек. Есть два пользователя: 1 и 2.

Может ли объект кнопка выполнять разные функции, в зависимости от того, какой пользователь сейчас авторизован?

При нажатии пользователем 1 открывается доп.окно настроек.
При нажатии пользователем 2, кнопка является своего рода выпадающим списком, который показывает другие кнопки, каждая из которых вызывает свое доп.окно настроек.

Можно конечно не усложнять и просто завязать через доступ к кнопкам настроек, но получается перегруженный интерфейс.

Как подобное можно в скриптах реализовать?

Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 15 Августа 2020, 01:56:13
Может ли объект кнопка выполнять разные функции, в зависимости от того, какой пользователь сейчас авторизован?

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

Можно при выполнении скрипта "Авторизация пользователя" каждому пользователю присвоить идентификатор (пример для двух пользователей). "Разделяемая" кнопка Button1 с основной переменной iButton:
Код: (delphi)
begin
  if auLogin = 'user1' then Button1.Tag := 1 else Button1.Tag := 0;  // идентификатор пользователя 1 или неизвестного пользователя
  if auLogin = 'user2' then Button1.Tag := 2;                        // идентификатор пользователя 2 - при необходимости использования
                                                                     //   в нескольких скриптах можно объявить внутренней переменной
  iButton.Value := 0;    // установить в исходное состояние кнопку, разделяемую двумя пользователями (и все прочие объекты и переменные)
end.
Группу объектов пользователя 2 можно скрыть посредством непрозрачного объекта (Text1) с управлением видимостью и расположенного "выше" экранируемых объектов или индивидуальным управлением видимостью каждого объекта.
Скрипт для кнопки по событию "Изменилось значение переменной iButton связанной с объектом":
Код: (delphi)
begin
  Text1.Visible := not ((Button1.Tag = 2) and (iButton.AsInt <> 0)); // экранировка группы объектов
  if (Button1.Tag = 1) and (iButton.AsInt <> 0) then Window1.ShowAll;
  if iButton.AsInt = 0 then Window1.CloseAll;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 18 Августа 2020, 09:15:34
Добрый день, подскажите , а глобальный скрипт , может выводить только 1 переменную- результат, или их может быть несколько? просто от скрипта с  одной переменной на выходе, толку мало , когда сложный алгоритм надо рассчитать , со множеством переменных , на выходе, и когда этот алгоритм применяется несколько раз в разных местах.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Августа 2020, 16:50:51
Здравствуйте.

Для этого используют out-параметры (http://delphibasics.ru/Out.php). Пример глобальной процедуры с двумя выходными параметрами:
Код: (delphi)
procedure MyProc(out AResult1, AResult2: Integer);
begin
  AResult1 := 1;
  AResult2 := 2;
end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 20 Августа 2020, 09:04:10
Добрый день, не совсем понял, как  обращаться к AResult1 и AResult2, со стороны вызова глобальной процедуры , обычно указывается один результат , как указать несколько  т.е.
функция------
Код: (delphi)
function mySum(A, B: Integer): Integer;
begin
  Result := A + B;
end;
вызов-----
Код: (delphi)
var
  aNum1, aNum2, aSum: Integer;
begin
  aNum1 := 10;
  aNum2 := 15;
  aSum := mySum(aNum1, aNum2);    //как вызвать правильно несколько результатов? можно ли их вызывать по отдельности?
end.

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Августа 2020, 09:24:47
Процедура с двумя результатами типа Integer:
Код: (delphi)
procedure MyProc(out AResult1, AResult2: Integer);
begin
  AResult1 := 1;
  AResult2 := 2;
end;

Использование:
Код: (delphi)
var
  aRes1, aRes2: Integer;
begin
  MyProc(aRes1, aRes2);
  // здесь переменные aRes1 и aRes2 будут равны 1 и 2. Т.к. их изменила процедура MyProc.
end;
Аналогично Вы можете сделать процедуру которая будет возвращать сколько угодно результатов, через out-параметры.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 20 Августа 2020, 15:54:50
Вопрос, а почему не получается в данный алгоритм вызова , вставить напрямую переменную  интежер со списка переменных (например a1.value), а не объявленную в скрипте.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Августа 2020, 20:51:05
Если параметр объявлен как "out" или "var", то переменная напрямую передаётся в процедуру/функцию. Но "a1.value" является свойством, а не переменной. Свойство нельзя передать как "out" или "var" параметр. Вместо этого можно объявить локальную переменную в скрипте и скопировать в неё значение свойства, затем передать её как out-параметр.
Либо просто объявите как "out" только те параметры, которые нужны для вывода. А все остальные параметры оставьте обычными, тогда можно будет передавать свойства.

Например здесь параметры AInp1, AInp2 обычные, в них можно передать свойство. А AResult1, AResult2 объявлены как "out":
Код: (delphi)
procedure MyProc(AInp1, AInp2: Integer; out AResult1, AResult2: Integer);
begin
  if (AInp1 = 1) then AResult1 := 1 else AResult1 := 0;
  if (AInp2 = 1) then AResult2 := 1 else AResult2 := 0;
end;

Использование:
Код: (delphi)
var
  aRes1, aRes2: Integer;
begin
  MyProc(a1.value, a2.value, aRes1, aRes2);
end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Lihoj от 26 Августа 2020, 14:26:47
Добрый день! Уже все обыскал! Нужен скрипт для уровня по температуре. Есть основной тег температура в комнате, а дополнительный тег - включение обогревателя - подключается к полю с нижней предупреждающей границей. В общем что б уровень работал как терморегулятор!(http://)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Vitaly Demidov от 27 Августа 2020, 06:13:35
Доброго дня! Возникли следующие вопросы.

Задача: нужно периодически (раз в секунду, например) доставать данные из таблицы MySQL. но не одно значение, а несколько колонок и  строк одновременно, по нескольким параметрам. Например, все данные запроса(их может быть больше), таблица во вложении.



Вопрос - Как реализовать это, используя  DataSet.Fields[0] ?

Проблема в том, что  используя примеры из руководства, можно взять данные только первой строки. Как прочитать данные второй, третьей..десятой?  Пробовал выполнять несколько запросов , раз в секунду- как результат, данные записываются в переменные хаотично, то из одного запроса, то из другого, не смотря на разные тэги(как мне показалось).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 27 Августа 2020, 10:23:13
Vitaly Demidov, например так:

Код: (delphi)
if not DataSet.IsEmpty then
    begin
      DataSet.First;
      Repeat
        //Ваш код
        DataSet.Next;
      Until DataSet.EOF;
    end;
    end;
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 27 Августа 2020, 16:38:12
Здравствуйте.

Lihoj, обычно подобные задачи решаются на контроллере. В скаде Вы можете описать необходимое поведение через скрипты. Если требуется выполнять какие-либо проверки по изменению переменной уровня, то можно написать скрипт по событию OnDataChange уровня, такой скрипт будет выполняться при изменении значения переменной связанной с уровнем. В скрипте Вы можете выполнять необходимые проверки и в зависимости от каких-либо условий включать/отключать обогреватель изменяя значение нужной переменной. Получить нарушенную границу переменной можно через функцию GetValueZone (https://simple-scada.com/help/script/getvaluezone.html) или через свойства границ переменной HighAlarm (https://simple-scada.com/help/script/extra-properties.html), HighWarning (https://simple-scada.com/help/script/extra-properties.html), LowWarning (https://simple-scada.com/help/script/extra-properties.html), LowAlarm (https://simple-scada.com/help/script/extra-properties.html).

Vitaly Demidov, см. этот ответ (https://simple-scada.com/forum/index.php?topic=145.msg3655#msg3655), в нем подробно описано как работать с DataSet если в полученной выборке более одной строки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Lihoj от 28 Августа 2020, 09:25:26
Simple-Scada, Спасибо за ответ! Буду реализовывать терморегулятор в контроллере!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 28 Августа 2020, 11:44:17
Доброго дня, подскажите, можно как то найти файл определенного расширения, не зная его имени , по дате создания, т.е. нужен последний созданный файл в папке с определенным расширением.  А еще вопрос можно обратиться к файлу как например в питоне ,  с неизвестными символами в названии файла например  "Total_12??.??.??_??.txt , где ? - любой символ ,и соответственно открыть любой файл который соответствует условию? Или только полное имя файла?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 28 Августа 2020, 11:51:36
Цитировать
Доброго дня, подскажите, можно как то найти файл определенного расширения, не зная его имени , по дате создания, т.е. нужен последний созданный файл в папке с определенным расширением.
Нужно использовать функцию ScanDirectory. Она подробно (с подходящим примером) описана в руководстве (https://simple-scada.com/help/script/scandirectory.html). По отметке времени ".Timestamp" можно определить файл созданный/отредактированный последним и работать с ним. Расширение файла можно проверить через свойство ".Ext".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 28 Августа 2020, 12:08:35
Здравствуйте.
Подскажите, формирую таблицу вот таким скриптом Table1.RunSQL(aQuery, tsAll);
А как узнать, что таблица сформирована и с ней можно работать?
Вопрос к тому, что я формирую таблицу и потом сразу вызываю скрипт обработки данных в таблице (подсвечиваю нужные ячейки). Но ячейки подсвечиваются не всегда, вот я и думаю, что может скрипт обработки выполняется раньше, чем успевает заполниться таблица.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 31 Августа 2020, 08:25:06
Здравствуйте. Возможно открыть цвет заголовка таблицы для записи?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 31 Августа 2020, 09:56:42
Здравствуйте.

Подскажите, формирую таблицу вот таким скриптом Table1.RunSQL(aQuery, tsAll); А как узнать, что таблица сформирована и с ней можно работать?
К сожалению узнать о выполнении SQL-запроса отправленного от таблицы - нельзя. Постараемся добавить таблице отдельное событие на этот случай.
UPD: в версиях 2.4.0.3 и выше у таблицы есть событие OnDoneSQL для отслеживания выполнения SQL-запросов

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

Возможно открыть цвет заголовка таблицы для записи?
Да, откроем в одном из будущих обновлений.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: azrael454 от 31 Августа 2020, 15:45:44
Добрый день.

Имеется ли возможность отслеживать состояние окна? Если оно открыто, то делать те действия, а если закрыто, то другие.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Сентября 2020, 09:57:20
Здравствуйте.

Проект и его скрипты исполняются сервером скады на серверном ПК. Окна открывают клиенты, поэтому возможна ситуация. когда на одном клиенте окно открыто, а на другом оно же закрыто. У каждого окна есть два события OnShow (выполняется когда любой клиент отрыл окно) и OnClose (когда любой клиент закрыл окно). Если Вам эти события подходят, то можете решить задачу с их помощью.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: azrael454 от 02 Сентября 2020, 11:39:48
Спасибо, не совсем подходит.

Задача у меня стоит такая, что я спроектировал маленькое меню, кнопками которых я вызываю отдельные окна. Соответственно, чтобы понимать какое окно открыто / закрыто, я меняю цвет у кнопки, привязанной к окну. На нее же я могу закрыть окно, но при этом я могу закрыть окно "крестиком", который не скроешь никак и отслеживать его нажатие или отжатие тоже нельзя.

То есть баг вот в чем. Есть две цепочки:
Чтобы мне еще раз окно вызвать, мне нужно нажать на кнопку, чтобы скинуть ей состояние и она поменяет цвет, и только потом я снова могу открыть окно. Решений этой задачки я вижу два:
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Сентября 2020, 12:02:06
Цитировать
закрыть окно "крестиком"... и отслеживать его нажатие или отжатие тоже нельзя.
Отслеживать можно. Крестик закрывает окно, соответственно в окне вызывается событие OnClose. В нём можно сбрасывать цвет кнопки.

То, что Вы описали подходит только для проекта с одним клиентом. Если клиентов несколько, то это будет выглядеть как беспорядочное мигание кнопки. Допустим к проекту подключился клиент и нажимает на кнопку открывая и закрывая окно, и кнопка меняет цвет. Все остальные клиенты будут видеть мигание кнопки (хотя сами не открывали и не закрывали окна и не нажимали на кнопку).
Исходя из вышеописанного, реализация выделения объекта по нажатию (или по наведению мыши) подходит только для проектов с одним клиентом и нужно этого избегать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: azrael454 от 02 Сентября 2020, 12:26:51
Я поэтому и пишу, что не совсем подходит.

Я правильно понял, что при проекте на несколько клиентов, если нажимается на одном клиенте одна кнопка и выделяется цветом, то это увидят все, не смотря на права доступа и прочее?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 02 Сентября 2020, 17:48:18
Да, Вы правильно поняли. Все объекты проекта существуют в единственном экземпляре. Если создать в проекте кнопку Button1 и подключиться к нему с нескольких клиентов, то на всех клиентах Вы увидите одну и ту же кнопку Button1. Если, к примеру через скрипт происходит смена цвета кнопки Button1, то соответственно данное изменение отобразится на всех клиентах. Права доступа пользователей (https://simple-scada.com/help/manual/editor-users.html) не имеют никакого отношения к изменению свойств объектов через скрипты, они используются для ограничения доступа пользователя к объектам(например, если доступ пользователя ограничен, то он не сможет нажать на кнопку, ввести значение в поле и т.д.).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 04 Сентября 2020, 15:48:28
Добрый день!
Задача по значению тэга менять пользовательское изображение. Сделала анимацию из отдельных изображений. Написала скрипт на OnDataChange:
Код: (delphi)
begin
  if Sender is TM_Image then   // проверяем, что Sender это объект
    with Sender as TM_Image do // приводим Sender к типу "TM_Image"
      case AsInt of
      0:  Frame := 1;        // изменить кадр на стоп
      1:  Frame := 2;        // изменить кадр на работа
      2:  Frame := 3;        // изменить кадр на ОП
      3:  Frame := 4;        // изменить кадр на ОП
      4:  Frame := 5;        // изменить кадр на ПП
      end;
end.
Но изображение не меняется. Может, что-то не учла в других свойствах изображения?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 04 Сентября 2020, 15:55:18
Здравствуйте.

Перепроверьте следующие пункты:
Если после этого выявить проблему всё равно не получается, то вышлите проект на support@simple-scada.com, мы укажем точную причину.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 07 Сентября 2020, 15:02:40
Добрый день!
Можно ли в скриптах работать и с основной переменной и с дополнительной. Например, есть поле Field, в нём отображается основная переменная, а фон поля изменяется по доп. переменной. Мой скрипт по изменению доп. переменной почему то не работает.
Код: (delphi)
begin
if Sender is TM_Shape then
with Sender as TM_Shape do
  case VariableEx.AsInt of
    0: Color := clGray;
    1: Color := clRed;
   end;
end.
Какую я сделала ошибку?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 07 Сентября 2020, 15:23:21
Здравствуйте.

Цитировать
Например, есть поле Field
В скрипте происходит работа с объектом как с "Фигурой (https://simple-scada.com/help/manual/figure.html)"(TM_Shape) и если данный скрипт назначен на событие Поля, то он не будет выполняться. Если указанный скрипт нужно применить к объекту Поле, то нужно изменить его так:
Код: (delphi)
begin
  if Sender is TM_Field then
    with Sender as TM_Field do
      case VariableEx.AsInt of
        0: Color := clGray;
        1: Color := clRed;
       end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 07 Сентября 2020, 15:56:38
Можно ли в TM_Text. text вводить 2 строки? Т.е. фразу со знаком переноса строки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 07 Сентября 2020, 16:31:46
Да, это возможно. Пример:
Код: (delphi)
begin
  Text1.Text := 'Строка 1' + CharToStr(#10) + 'Строка 2';
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 08 Сентября 2020, 15:56:02
Добрый день!
У TM_Text нужно менять сам текст и цвет.
Вот мой скрипт:
Код: (delphi)
begin
if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
    if Mode.VALUE=TRUE then
    begin
      case AsInt of
        0: begin Text := 'РАБОТА В АВТОМАТИЧЕСКОМ РЕЖИМЕ ОСТАНОВЛЕНА'; Color := clWhite; end;
        1: begin Text := 'РАБОТА В АВТОМАТИЧЕСКОМ РЕЖИМЕ';  Color := clBlue; end;
        2: begin Text := 'АВТОМАТИЧЕСКИЙ РЕЖИМ. АВАРИЯ!';  Color := clRed; end;
       end;
    end else
    begin
      Text := 'РЕЖИМ НАЛАДКИ'; Color := clWhite;
    end;
end.
Текст меняется, а его цвет нет. Пробовала менять цвет рамки текста - не меняется. Что я делаю не так?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 08 Сентября 2020, 16:06:03
Здравствуйте.

Цвету шрифта соответствует свойство FontColor, не Color. Все базовые свойства описаны здесь (https://simple-scada.com/help/script/tm_control.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Миханик от 09 Сентября 2020, 08:07:09
Подскажите, формирую таблицу вот таким скриптом Table1.RunSQL(aQuery, tsAll); А как узнать, что таблица сформирована и с ней можно работать?
К сожалению узнать о выполнении SQL-запроса отправленного от таблицы - нельзя. Постараемся добавить таблице отдельное событие на этот случай.
UPD: в версиях 2.4.0.3 и выше у таблицы есть событие OnDoneSQL для отслеживания выполнения SQL-запросов
Большое спасибо за оперативность. Теперь всё работает как надо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 09 Сентября 2020, 14:04:11
Добрый день!
В отчётах не отображаются значения переменных из БД. Такое ощущение, что БД не подключена. Просто подключить периодический источник данных не работает. Как подключиться к MySQL?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 09 Сентября 2020, 19:01:28
Здравствуйте.

Порядок установки MySQL рассмотрен по ссылке (https://simple-scada.com/help/manual/mysql.html). После установки MySQL нужно настроить подключение к БД через редактор, для этого необходимо перейти к настройкам БД (Проект -> Настройки -> База данных (https://simple-scada.com/help/manual/index.html?editor-settings.html#set_db)), заполнить параметры подключения и нажать кнопку "Проверить", если появится окно с информацией об успешном соединении с БД, значит соединение прошло успешно и можно сохранить проект. Далее нужно у требуемых переменных настроить архивацию - см. вкладку свойств переменной "Архив (https://simple-scada.com/help/manual/index.html?variable-new.html#var_archive)". После этого переменные будут архивироваться в БД и по архивным данным можно будет формировать необходимые отчеты. Руководство по системе отчетов доступно по ссылке (https://simple-scada.com/help/report/index.html). Примеры создания отчетов можно найти по ссылке (https://simple-scada.com/help/report/sample-reports.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 10 Сентября 2020, 08:49:08
Делаю всё так, как в руководстве, Бд проверяю, переменные архивирую, но в отчётах ничего нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 10 Сентября 2020, 09:34:13
При формировании отчёта по этому примеру: https://simple-scada.com/help/report/per-rep.html предварительный просмотр выдает ошибку по интервалу - он не подтягивается из БД. И вообще ничего не подтягивается. Хотя БД работает, подключена, проверяется, данные архивируются
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 10 Сентября 2020, 19:53:32
Здравствуйте.

Цитировать
Делаю всё так, как в руководстве, Бд проверяю, переменные архивирую, но в отчётах ничего нет.
Можем гарантировать, что если создать отчет строго в соответствии с примерами (https://simple-scada.com/help/report/sample-reports.html), то он точно будет работать без ошибок.

Цитировать
При формировании отчёта по этому примеру: https://simple-scada.com/help/report/per-rep.html предварительный просмотр выдает ошибку по интервалу - он не подтягивается из БД. И вообще ничего не подтягивается. Хотя БД работает, подключена, проверяется, данные архивируются
Переменную-интервал не требуется архивировать в БД. Значение интервала можно задать в редакторе отчетов(описано в середине примера периодического отчета (https://simple-scada.com/help/report/per-rep.html)) или если требуется изменять интервал из скады, то можно связать переменную-интервал отчета с нужной переменной проекта. Для начала можно создать простейший отчет на примере периодического отчета (https://simple-scada.com/help/report/per-rep.html) и затем, когда будет понятен принцип работы с системой отчетов, вносить в него необходимые изменения. На скриншоте видно, что в отчете имеются ошибки в выражениях, которые нужно исправить. Убедитесь, что у переменной-интервал задано корректное значение(см. скриншот во вложении), возможно вместе с числом по ошибке были введены какие-либо лишние символы. Если не разберетесь, пришлите нам на support@simple-scada.com текущую версию проекта для проверки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 11 Сентября 2020, 15:08:13
В итоге отчёта необходимо подсчитать сколько раз встречается число или строковая константа во всём отчёте. Подскажите, пожалуйста, как это сделать. Пробовала функцию COUNT, но компилятор выдаёт ошибки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Сентября 2020, 21:23:40
Здравствуйте.

Цитировать
Пробовала функцию COUNT, но компилятор выдаёт ошибки.
Если компилятор выдает ошибки, значит они точно есть и их нужно исправить. Ошибка на скриншоте может выдаваться, например если в отчете отсутствует источник с именем "Источник2", но при этом он используется в выражении. Без проверки отчета сложно сказать в чем именно ошибка.

Описание работы с итогами в отчете, а также примеры выражений можно найти по этим ссылкам: ссылка 1 (https://www.stimulsoft.com/ru/documentation/online/user-manual/index.html?report_internals_totals_calculation_of_totals_associated_with_bands.htm), ссылка 2 (https://www.stimulsoft.com/ru/documentation/online/user-manual/index.html?report_internals_totals_calculation_of_totals_not_associated_with_bands.htm). Для подсчета количества строк по условию можно использовать функцию CountIf, например в выражении ниже будет рассчитано количество строк со значением 64 в колонке "Уровень":
Код
{CountIf(Данные.Уровень == 64)}
, где "Данные" это источник данных, "Уровень" это колонка, по строкам которой нужно произвести подсчет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 14 Сентября 2020, 09:07:51
Доброе утро!
При попытке сформировать отчёт со строковыми переменными, при попытке запустить отчёт на предварительный просмотр появляется сообщение (во вложении). Так только со String-переменными - остальное всё работает нормально. Помогите, пожалуйста!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Сентября 2020, 20:20:41
Здравствуйте.

Архивировать можно только численные переменные, строковые переменные не архивируются (поэтому скада не может получить из БД данные для этой переменной и передать их в источник данных). Варианты использования строковых переменных в отчете без их архивации можно найти в этом обсуждении (https://simple-scada.com/forum/index.php?topic=601.msg5424#msg5424).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Bairam от 15 Сентября 2020, 07:36:41
Добрый день. Можно ли использовать в скриптах шаблонные подстановки типа %Номер канала% ? Каким образом их использовать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Сентября 2020, 09:30:21
Здравствуйте.

Опишите подробнее, какую задачу Вы хотите решить и для чего хотите использовать шаблонные подстановки в скрипте?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Bairam от 15 Сентября 2020, 10:07:09
Здравствуйте.

Опишите подробнее, какую задачу Вы хотите решить и для чего хотите использовать шаблонные подстановки в скрипте?

По нажатию на аналоговый параметр шаблонный появляется шаблонное окно с настройками этого канала. Одна из кнопок этого окна "Маскирование включить/отключить" изменяет границы тега с "Аварийные и предупредительные" на "Не выбрано" и обратно. Хотел использовать скрипт вида
Код
begin
    if AI%Номер канала%_inuse.LimitType = ltAlarmsAndWarnings then AI%Номер канала%_inuse.LimitType := ltNone
    else AI%Номер канала%_inuse.LimitType := ltAlarmsAndWarnings;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Сентября 2020, 12:44:55
Для шаблонов можно использовать только универсальные скрипты (https://simple-scada.com/help/script/script-types.html). Как мы понимаем, данный скрипт установлен на событие OnClick кнопки, тогда можно в дополнительной переменной кнопки указать подстановку "AI%Номер канала%_inuse" и написать универсальный скрипт для этой кнопки, в котором изменять тип границ доп. переменной:
Код: (delphi)
begin
  if Sender is TM_Button then    // проверяем, что Sender это кнопка
    with Sender as TM_Button do  // приводим Sender к типу "TM_Button"
      if VariableEx.LimitType = ltAlarmsAndWarnings then VariableEx.LimitType := ltNone
      else VariableEx.LimitType := ltAlarmsAndWarnings;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 17 Сентября 2020, 13:43:27
Добрый день!
Нужно подсчитывать промежуток времени между измерениями. Т.е. вычитать из значений колонки Источник.Время предыдущее значение этой колонки. Если использовать функцию Previos , то она преобразует DateTime в Object. Как преобразовать обратно - не знаю...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 17 Сентября 2020, 20:40:59
Здравствуйте.

Чтобы в ячейке отобразить разницу во времени между предыдущим значением колонки "Время" и его текущим значением, нужно использовать такое выражение:
Код: (c#)
{DateDiff(
  (DateTime)Данные.Время,
  StrToNullableDateTime((string)Previous(Данные, "Время"))
)}
, где "Данные" - имя источника данных. "Время" - колонка времени в источнике данных.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 18 Сентября 2020, 09:45:44
Доброе утро!
Не получается так сделать...
пишу так: {(string)Previous(Источник2,"Время")}
ошибка: Фото1

пишу так: {(DateTime)Previous(Источник2,"Время")}
ошибка: Фото2

пишу так: {StrToNullableDateTime((string)Previous(Источник2,"Время"))}
ошибка: Фото3
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 18 Сентября 2020, 18:12:55
Здравствуйте.

Проверили Ваш отчет. В нём нужно удалить рассчитываемые колонки "Время_Prev" и "dTime", т.к. они не нужны для решения описанной задачи (но, если хотите, можете сделать и с ними, на основе нижеописанного). Далее в колонке "Время от предыдущей регенерации" нужно изменить выражение "{Источник2.dTime}" на такое:
Код: (c#)
{
  PreviousIsNull(Источник2, "Время") ?
    TimeSpan.FromSeconds(0) :
    DateDiff(
      (DateTime)Источник2.Время,
      (DateTime)Previous(Источник2, "Время")
    )
}
Теперь в колонке будет отображаться разница во времени.

Далее в итогах для "Минимальное время между регенерациями" и "Максимальное время между регенерациями" использовать следующие выражения:
Код: (c#)
{MinTime(
  PreviousIsNull(Источник2, "Время") ?
    TimeSpan.FromSeconds(0) :
    DateDiff(
      (DateTime)Источник2.Время,
      (DateTime)Previous(Источник2, "Время")
    )
)}

Код: (c#)
{MaxTime(
  PreviousIsNull(Источник2, "Время") ?
    TimeSpan.FromSeconds(0) :
    DateDiff(
      (DateTime)Источник2.Время,
      (DateTime)Previous(Источник2, "Время")
    )
)}
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: zabazu от 24 Сентября 2020, 09:51:50
Здравствуйте!

Возможно ли получить название исполняемого скрипта? Не нашел в документации.

Допустим, скрипты по событию изменения переменных, имеют свой префикс. Необходимо использовать функцию IsFirstChange, не прописывая каждому скрипту название.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 26 Сентября 2020, 11:02:43
Здравствуйте.

Получить имя исполняемого скрипта нельзя. По описанию не понятно, для чего это требуется? Опишите подробно, что Вы хотите сделать и приложите скрипт, о котором идет речь.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: zabazu от 30 Сентября 2020, 07:38:44
К примеру, в скрипте отслеживается изменение переменных ряда однотипных тегов в одном узле. Каждому узлу- свой именованный скрипт с префиксом, свои переменные с префиксом.

Код: (delphi)
var
  v_cycle: shortint;
  sm: smallint;
  aVar: TM_Variable;
  vName: UTF8string;
begin
if First_start.Value = 0 {and (имя.скрипта.IsFirstChange = false)} then //защита от записи
 begin
 vName := UTF8Encode(Variable.Name);
 UTF8Delete(vName,8,1);
 aVar := GetVariableByName(UTF8ToString(vName));
 if Assigned(aVar) then
  begin
  sm := Variable.OriginalAsInt;
  sm := sm * 10;
   if GetBit(sm,15) = true then
    begin
     v_cycle := 0;
     while v_cycle < 15 do
      begin
       sm := InverseBit(sm,v_cycle);
       v_cycle := v_cycle + 1;
      end;
     sm := sm + 1;
    end;
  aVar.Value := sm ;
  end;
 end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 01 Октября 2020, 11:57:41
Добрый день!
Формирую отчёт типа: переменная - время изменения переменной. Сама переменная архивируется 1 раз в 5с. В отчёте Источник данных "по изменению".
при генерации отчёта в него попадают строки с интервалом около 00:00:00,011 - т.е. 11мс. Переменная так быстро меняться не может - проверено. Да и архивируется раз в 5 секунд. В чём может быть дело?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Елена от 01 Октября 2020, 15:40:58
Добрый день!
В проекте есть переменные, читаемые с OPC, и внутренние переменные. При включении клиента первыми определяются и начинают архивироваться внутренние переменные, а с задержкой на доли секунды - переменные с OPC. В результате в отчёт попадают 2 строки с разницей во времени доли секунды. Как это сгладить? Источник данных в отчёте "По изменению" и пишется только эта внутренняя переменная, но всё равно 2 раза, хотя она сама не изменяется.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Октября 2020, 17:01:13
Здравствуйте.

Прочтите внимательно эту статью (https://simple-scada.com/help/report/changesourcework.html), в ней подробно объясняется как работает источник "по-изменению", почему в отчете могут появляться "лишние" строки и что можно сделать чтобы таких строк стало меньше.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Александр2103 от 01 Октября 2020, 17:43:01
Подскажите, где посмотреть и информацию о скрипта которые выполняются автоматически в нужное время, скажем каждый день в 20:00?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Октября 2020, 19:13:24
Здравствуйте.

Для этого можно использовать скрипт с типом события (https://simple-scada.com/help/script/event-types.html) "Прошел час", см. пример скрипта по ссылке (https://simple-scada.com/help/script/hour-passed.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 03 Октября 2020, 00:15:24
Добрый день!
Прошу помощи.
Требуется скрипт.
присвоение переменной DeltaT.value разницы T1.Value через каждые 10 секунд.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: niyaz от 03 Октября 2020, 13:54:03
Добрый день!
Прошу помощи.
Требуется скрипт.
присвоение переменной DeltaT.value разницы T1.Value через каждые 10 секунд.
Здравствуйте.
Не совсем понял разницы T1.Value с чем.
Код: (delphi)
const
  INTERVAL = 10;  // Интервал таймера 10 сек
begin
  vrTimer.Value := vrTimer.Value + 1; // накапливаем секунды в vrTimer
 
  // если прошло больше, чем INTERVAL секунд с последнего срабатывания таймера
  if vrTimer.Value >= INTERVAL then
  begin
    // код размещенный здесь будет выполняться каждые 10 секунд
    DeltaT.Value:= T2.Value - T1.Value; // присваиваем переменной DeltaT.Value результат вычисления T2.Value - T1.Value
    vrTimer.Value := 0; // обнуляем счетчик
  end;
end.
"vrTimer" виртуальная переменная с типом данных Integer. Код представленный выше надо разместить в скрипте с типом события "Прошла секунда".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 03 Октября 2020, 22:24:55
Спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 04 Октября 2020, 07:46:14
 
присвоение переменной DeltaT.value разницы T1.Value через каждые 10 секунд.
Не совсем понял разницы T1.Value с чем.
     Здравствуйте.

Для вычисления изменения переменной за интервал времени необходимо добавить виртуальную переменную previousT1 для хранения предыдущего значения переменной T1, локальную temporaryT1 для текущего значения переменной T1 и изменить скрипт следующим образом:
Код: (delphi)
const
  INTERVAL = 10;  // Интервал таймера 10 сек
var temporaryT1: <тип T1>;
begin
  vrTimer.Value := vrTimer.Value + 1; // накапливаем секунды в vrTimer

  // если прошло больше, чем INTERVAL секунд с последнего срабатывания таймера
  if vrTimer.Value >= INTERVAL then
  begin
    // код размещенный здесь будет выполняться каждые 10 секунд
    temporaryT1 := T1.Value;     // для разностных схем следует использовать только одно значение в качестве конечного и начального на смежных интервалах
    DeltaT.Value := temporaryT1 - previousT1.Value; // присваиваем переменной DeltaT.Value результат изменения T1.Value за интервал
    previousT1.Value :=  temporaryT1;               // сохраняем как предыдущее значение для вычисления следующей разности

    vrTimer.Value := 0; // обнуляем счетчик
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 12 Октября 2020, 16:02:01
Здравствуйте! Не работает процедура ########.CloseClient(GetClientName);  по событию Выполнен SQL запрос.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 12 Октября 2020, 22:29:26
Здравствуйте.
См. описание функции GetClientName (https://simple-scada.com/help/script/getclientname.html) - она не работает в скриптах "Выполнен SQL запрос".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 13 Октября 2020, 07:06:15
Извиняюсь. Что-то упустил этот момент.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: msigx680 от 14 Октября 2020, 01:08:20
Здравствуйте! Подскажите пожалуйста по такому вопросу: В OPC сервер отдаю переменную "in32scada" типа DWORD.
Добавляю ее в скаду, создаю внутреннюю переменную "myvar1" типа BOOL. Создаю обьект, к нему привязываю "myvar1".
Создаю универсальный скрипт, в OPC изменения значения видны, но в скаде не работает, что не так?
Задача передать 32 значения в скаду одной переменной, и на каждое создать определенные скрипты для индикации состояний.

begin
  if Sender is TM_Image then        // сначала убедимся, что скрипт вызван объектом изображение
    with Sender as TM_Image do      // далее будем работать с объектом Sender, как с изображением
      begin
          if GetBit(in32scada.AsInt,1) = true
             then FlashColor := clGreen // включить мигание объекта зеленым цветом
    else
        Color := clBlack;
          end;
   end.     
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 14 Октября 2020, 09:54:58
. . .   
в OPC изменения значения видны, но в скаде не работает, что не так?
Задача передать 32 значения в скаду одной переменной, и на каждое создать определенные скрипты для индикации состояний.
. . .


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

Скорее всего не вызывается скрипт по причине отсутствия события: либо скрипт не назначен на событие, либо отсутствует связь переменных in32scada и myvar1.

Для групп объектов с одинаковым поведением определяемым битом из in32scada, можно построить следующие схемы:
 - основная переменная объекта in32scada, номер бита упакован в свойство Tag объекта, скрипт на событие "Изменилась основная переменная":
Код: (delphi)
begin
  if Sender is TM_Image then   // сначала убедимся, что скрипт вызван объектом изображение
    with Sender as TM_Image do // далее будем работать с объектом Sender, как с изображением
      if GetBit(AsInt, Tag) then begin
        FlashColor := clGreen; // включить мигание объекта зеленым цветом
        Color := clWhite;      // второй цвет мигания
      end else begin
        FlashColor := clNone;  // выключить мигание объекта
        Color := clBlack;      // цвет объекта в этом (false) состоянии
      end;
end.
;
 
- основная переменная объекта myvar<i>, где i - номер бита, скрипт на событие "Изменилась основная переменная":
Код: (delphi)
begin
  if Sender is TM_Image then   // сначала убедимся, что скрипт вызван объектом изображение
    with Sender as TM_Image do // далее будем работать с объектом Sender, как с изображением
      if AsBool then begin
          FlashColor := clGreen; // включить мигание объекта зеленым цветом
          Color := clWhite;      // второй цвет мигания
        end
      else begin
          FlashColor := clNone;  // выключить мигание
          Color := clBlack;      // цвет объекта в этом (false) состоянии
        end;
end.
, связь переменных in32scada и набора myvar<i> осуществляет скрипт "Изменилась переменная in32scada":
Код: (delphi)
var i: integer;
    aVar: TM_Variable;
begin
  for i := 0 to 31 do begin       // в реальном проекте можно ограничить цикл или индивидуальные присвоения переменным без анализа наличия
    aVar := GetVariableByName('myvar' + IntToStr(i));
    if aVar <> nil then aVar.Value := GetBit(Variable.AsInt, i);
  end;
end.
При наличии нескольких групп объектов необходимо для каждой группы написать свой скрипт.

Схемы различаются количеством переменных и вызовов скрипта (в первом - для всех объектов, во втором - только для объектов с изменившейся битовой переменной).   
Во вложении пример для общей и индивидуальных переменных, проект после разархивирования необходимо пересохранить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: msigx680 от 14 Октября 2020, 18:19:21
Добрый день! Спасибо большое за ответ!
Цитировать
связь переменных in32scada и набора myvar<i> осуществляет скрипт "Изменилась переменная in32scada"
Так заработало!
var i: integer;
    aVar: TM_Variable;
begin
for i := 0 to 31 do begin
   aVar := GetVariableByName('alarmstopnor48');
   if aVar <> nil then aVar.Value := GetBit(Variable.AsInt, 0);     //1

   aVar := GetVariableByName('avtomat_nor48');
   if aVar <> nil then aVar.Value := GetBit(Variable.AsInt, 1);     //2
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Октября 2020, 20:16:03
msigx680, это очень плохой код, половина действий просто бесполезны. Зачем выполнять цикл от 0 до 31, если в цикле выполняются одни и те же действия для одних и тех же битов. Нет смысла присваивать одно и то же значение 32 раза, достаточно сделать это один раз. Зачем искать переменную по имени, если можно обратиться к ней напрямую?
Исходя из вышеописанного код, который Вы написали можно заменить двумя строчками кода:
Код: (delphi)
begin
   alarmstopnor48.Value := GetBit(Variable.AsInt, 0);     // 1
   avtomat_nor48.Value := GetBit(Variable.AsInt, 1);      // 2
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Олег Печёнов от 14 Октября 2020, 21:07:46
Добрый день,

читал, изучал - не нашел ответ.

при наступлении условия А = 1 запускается таймер. эта часть у меня работает.

как сделать, что бы при таймере в одну минуту и десять секунд  B = 1 ?

Благодарю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 16 Октября 2020, 09:57:02
Здравствуйте.

Методы для работы с таймерами описаны здесь (https://simple-scada.com/help/script/timers.html). Методы для работы с датой/временем описаны здесь (https://simple-scada.com/help/script/datetime.html). При выполнении условия нужно запустить таймер при помощи процедуры TimerStart, например: TimerStart(MyTimer, 0); Затем создать новый скрипт с типом события "Изменились переменные", добавить переменную MyTimer в список отслеживаемых скриптом переменных и написать скрипт:
Код: (delphi)
const
  TIMEOUT = 70; // пауза в секундах
begin
  if (TimerGetState(Variable) = 1) then
    if SecondsBetween(Variable.AsDateTime, 0) >= TIMEOUT then
      begin
        TimerReset(Variable);
        MyVar.Value := 1;
      end;
end.
Если требуется постоянно через интервал времени выполнять какое-то действие, то можно использовать пример по ссылке (https://simple-scada.com/help/script/second-passed.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 20 Октября 2020, 16:03:27
Доброго дня, сложилась  ситуация с последней версией ,  установил посл. версию, пока демо по времени , и заметил что при  вызове  сообщения  скриптом,  сервер  диагностирует ошибки и соответственно скрипт не выполняется , в предыдущей версии все было отлично  , изначально проект создав   версии демо 64 , ошибка следующая  15:55:12.368 | Ошибка в скрипте "CheckBox1_OnDataChange" в строке 5. Access violation at address 00F1F4AE in module 'Server.exe'. Read of address 00000014
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 20 Октября 2020, 16:13:31
Здравствуйте.

Значит в скрипте точно есть ошибка и нужно ее исправить. См. строку 5 скрипта и подумайте, в чем может быть ошибка. Если не разберетесь, пришлите нам папку с проектом для проверки на support@simple-scada.com.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 20 Октября 2020, 16:24:49
Здравствуйте.

Значит в скрипте точно есть ошибка и нужно ее исправить. См. строку 5 скрипта и подумайте, в чем может быть ошибка. Если не разберетесь, пришлите нам папку с проектом для проверки на support@simple-scada.com.
Ошибка появляется строго на строке с вызовом сообщения, , повесил на кнопку этот скрипт    Message11.Show(1);    и снова  ошибка в сервере, 11 сообщение и его состояние 1 , существуют в проекте
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Октября 2020, 16:46:56
Цитировать
Ошибка появляется строго на строке с вызовом сообщения, , повесил на кнопку этот скрипт    Message11.Show(1);    и снова  ошибка в сервере, 11 сообщение и его состояние 1 , существуют в проекте
Исправили. Обновление отправили Вам на e-mail.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: quarian от 30 Ноября 2020, 11:32:22
Здравствуйте. Нужен совет.
Есть две переменных, связанных с одним устройством. Первая переменная дискретная, может принимать значения 0 или 1. Вторая переменная является счётчиком для первой типа LongWord. Есть три состояния устройства:
    1-первая переменная = 0, устройство в норме;
    2-первая переменная = 1, счётчик увеличился на 1, устройство в аварии;
    3 - первая переменная мигает, раз в секунду изменяя своё значение (0,1,0,1,0...), вторая переменная соответственно инкрементируется на 1 каждую секунду.
Задача состоит в том, чтобы разделить эти состояния и вывести соответствующее предупреждение.
С первыми двумя состояниями вопросов не возникает. Третье состояние я решил определять с помощью скорости изменения второй переменной - счётчика. Если изменяется быстрее, какого-то значения, то считаем, что третье состояние наступило. (Возможно, Вы можете предложить лучший способ).
Написал универсальный скрипт в шаблоне для фигуры, символизирующей устройство.
Код: (delphi)
var
  timeOfPreviousValue: TDateTime; //хранит время
  speedOfChanging: Double; //скорость изменения переменной (производная по времени)
  s: String; //сообщение о неисправности
begin
  if Sender is TM_Shape then
    with Sender as TM_Shape do
      speedOfChanging := 0.0;
      timeOfPreviousValue := IncSecond(Now, -interval.value); //interval - глобальная переменная времени задержки
      ArchiveValueByTime(TM_Shape(Sender).VariableEx, previousValue, timeOfPreviousValue); //запрос из архива значения, полученного на interval времени раньше
      Text2.Text := IntToStr(TM_Shape(Sender).VariableEx.AsInt64); //для отладки
      Text3.Text := IntToStr(previousValue.AsInt64); //для отладки
      if previousValue.Value <> 0 then //проверка на тот случай, когда в архиве недостаточно данных
      begin
        if (TM_Shape(Sender).VariableEx.AsInt64 - previousValue.AsInt64) > 0 then //проверка на ноль
          speedOfChanging := (TM_Shape(Sender).VariableEx.AsInt64 - previousValue.AsInt64)/interval.Value; //вычисление скорости изменения второй переменной
          Text4.Text := FloatToStr(speedOfChanging); //для отладки
        if speedOfChanging > 0.5 then //условие, при котором наступает третье состояние
          begin
            s := "Неисправность УКМ" + UTF8ToString(Sender.Hint);
            AddMessage(Now, mkAlarm, s,  true, true);
          end;
      end;
end.
Возникли следующие вопросы.
1. При попытке обращения к локальной переменной типа TM_Variable, в которую я передал результат функции ArchiveByTime в логе сервера появилась ошибка access violation. Поэтому создал глобальную переменную previousValue. Правильно ли я понимаю, что нет способа возвращать значение в локальную переменную? Не хотелось бы создавать отдельную переменную для каждого устройства.
2. Если создавать отдельную переменную для каждого устройства, то для работы в универсальном скрипте нужно будет использовать поиск по имени, а в имя протаскивать подстановку какого-нибудь поля? (hint, name).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 30 Ноября 2020, 22:17:01
Здравствуйте.

Опишите подробно, какую именно задачу Вы пытаетесь решить при помощи этих двух переменных? Если они нужны для контроля связи, то можно использовать способ описанный здесь (https://simple-scada.com/help/script/comm-control.html). Также, не понятно для чего требуется две переменных, если все описанные состояния можно получить из первой переменной и для чего определять скорость изменения переменной если и так известно, что она изменяется раз в секунду?

В приведенном скрипте используются вычисления на основе архивных функций - это плохой способ. Также, следует учитывать, что функция ArchiveValueByTime является асинхронной, т.е. она создает запрос к БД и ожидает пока он выполнится. Не гарантируется, что он всегда будет выполняться моментально. Например, если СУБД нагружена какими-то другими запросами, то ей может потребоваться какое-то время на их выполнение и результат ArchiveValueByTime будет выдан с какой-то задержкой. Поэтому, вызывать архивные функции и в том же скрипте производить вычисления с результатом данных функций неправильно, т.к. на момент выполнения вычислений результата может не быть. Правильный вариант - это вызвать архивную функцию, а затем по изменению переменной-результата(т.е. когда архивная функция гарантированно выполнится) производить вычисления.

По вопросам:
1. Правильно.
2. Да, такой вариант возможен.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: quarian от 01 Декабря 2020, 10:39:36
Здравствуйте. Спасибо за быстрый ответ.
Попробую более подробно описать задачу.

Переменные один и два, это, на самом деле, переменные OPC-сервера, связанные с одним дискретным входом модуля ввода (первая отвечает за состояние этого входа, а вторая за встроенный в модуль ввода счётчик). Один вход модуля ввода контролирует состояние одного устройства. Как я уже говорил, состояний у устройства три: в первом состоянии (99 процентов времени) логический ноль; второе состояние это авария, когда на входе появляется единица и горит до тех пор, пока обслуживающий персонал не предпримет некоторые физические действия; третье же состояние, когда на входе 0 и 1 сменяют друг друга с периодом в 1 секунду, говорит о неисправности самого устройства, его измерительной схемы.
Задача состоит только в том, чтобы различать состояния этих устройств (контроль связи будет осуществляться при помощи другого механизма). Задержка с распознаванием третьего состояния не сильно важна (до 5-10 секунд норм).
Устройств будет достаточно большое количество (около 1000), и 99 процентов времени они будут находится в первом состоянии, поэтому выполнения скриптов по времени я стараюсь избегать.
Использование второй переменной (счётчика модуля ввода) обусловлено моим страхом того, что изменение состояния первой может в какой-то момент синхронизироваться с частотой опроса и в этом случае скада будет считать, что устройство в первом или втором состоянии, в то время как оно уже минуту в третьем. При этом не хочется жёстко фиксировать время опроса, потому что для меня непонятно как поведёт себя OPC и скада при увеличении количества устройств и чем придётся пожертвовать для нормальной работы.

Вы правы насчёт архивной функции - я перемудрил. Гораздо проще и надёжнее держать две глобальные переменные: одну с предыдущим значением, а вторую с меткой времени, когда это значение было получено. И уже на основе этих двух переменных производить вычисления.

Ещё раз спасибо за помощь.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Декабря 2020, 22:26:27
Здравствуйте.

Для такой задачи сложно подобрать максимально простое решение. Во вложении пример проекта основанного на "первой переменой" и на двух универсальных скриптах по изменению основной и доп. переменной связанной с объектом. На каждый объект создана внутренняя переменная для подсчета изменений - данная переменная должна быть указана в качестве дополнительной для объекта. Имена переменных имеют однотипные названия, для упрощения работы в скриптах и шаблонах. В секундном скрипте значения счетчиков уменьшаются. В скрипте по изменению основной переменной счетчик изменений увеличивается. По достижении установленного значения(в примере через 5 сек.) выдается сообщение и изменяется цвет объекта. Переход в норму также происходит с задержкой, т.к. по другому не определить, было единичное изменение переменной или она постоянно меняется 0/1. Какой-то более простой способ решения подобрать не получилось, но даже при 1000 переменных описанный способ не должен сказаться на производительности.

Цитировать
изменение состояния первой может в какой-то момент синхронизироваться с частотой опроса и в этом случае скада будет считать, что устройство в первом или втором состоянии
Как Вы указали: " 0 и 1 сменяют друг друга с периодом в 1 секунду". Значит Вам нужно установить частоту опроса данных переменных = 500мс., тогда описанная ситуация никогда не возникнет и не нужно будет использовать вторую переменную.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: quarian от 03 Декабря 2020, 06:38:11
Здравствуйте.
Спасибо за простое и изящное решение :). Взял его как основу.
Вы помогли мне выбраться из своей собственной зацикленности) Попытка отказаться от выполнения скриптов по времени, действительно, привела меня в тупик.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Вячеслав от 13 Декабря 2020, 21:07:44
Здравствуйте! Подскажите как решить такой вопрос. Из OPC считывается значение температуры и выводится на экран. Но есть одна особенность-отрицательная температура вычисляется как Треал=Тполуч-65536. Для этого я создал скрипт по изменению переменной Тполуч.:
Код: (delphi)
var
a: integer;
S: String;
begin
{ условия для поля }
  if Sender is TM_Field then     // проверяем, что Sender это поле
    with Sender as TM_Field do   // приводим Sender к типу "TM_Field"
       if AsInt > 100 then       // если значение температуры больше 100 то
        begin                    // температура отрицательная и вычисляем ее значение
          a:=0;                  // сбрасываем старое значение временной переменной
          a:=AsInt-65536;        // вычисляем отрицательную разницу температуры
          S:= IntToStr(a);       // преобразуем значение с минусом в текстовую строку
          Text:= S;              // выдаем строку в свойство текста элемента поля
         end;
end.
Но с ним обнаружилась одна проблема. Все работает только когда экранная форма с элементом Поле открыта. Если форму закрыть и вернуться обратно то элемент Поле показывает значение Тполуч. То есть скрипт не запускается так как переменная Тполуч. за это время не изменилась.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Декабря 2020, 22:41:43
Здравствуйте.

В каком диапазоне может меняться значение приходящее с датчика температуры и какая шкала должна быть в скаде? Например, с датчика приходит значение в шкале 0 - 100, а необходимо его отображать в шкале 0 - 150, тогда нужно использовать режим масштабирования - см. описание опции "Сдвиг запятой (https://simple-scada.com/help/manual/varextra.html)". Это наиболее правильный способ, не требующий использования скриптов. Если режим масштабирования не подходит, то см. другие варианты ниже.

Чтобы описанные расчеты работали корректно, нужно назначить полю доп. переменную = Тполуч, а основную переменную не назначать и написать скрипт по событию OnDataChangeEx(изменилась доп. переменная):
Код: (delphi)
 begin
{ условия для поля }
  if Sender is TM_Field then     // проверяем, что Sender это поле
    with Sender as TM_Field do   // приводим Sender к типу "TM_Field"
       if VariableEx.AsInt > 100 then       // если значение температуры больше 100 то
         Text:= IntToStr(VariableEx.AsInt - 65536)
       else
         Text:= IntToStr(VariableEx.AsInt);
end.
Но, если требуется архивировать рассчитанное значение переменной(или например использовать его в других скриптах), то лучше создать внутреннюю переменную и записывать результат расчета в нее. Тогда можно будет при необходимости использовать эту переменную в трендах, скриптах, отчетах и т.д. Для такого способа нужно указать в основной переменной поля нашу внутреннюю переменную(при этом доп. переменная поля = Тполуч) и внести небольшие изменения в скрипт:   
Код: (delphi)
begin
{ условия для поля }
  if Sender is TM_Field then     // проверяем, что Sender это поле
    with Sender as TM_Field do   // приводим Sender к типу "TM_Field"
       if VariableEx.AsInt > 100 then       // если значение температуры больше 100 то
         Value := VariableEx.AsInt - 65536
       else
         Value:= VariableEx.AsInt;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Вячеслав от 17 Декабря 2020, 21:47:08
 ;)Спасибо за помощь! Первый вариант кода работает именно так как необходимо. Просто в голову не приходило что скрипт можно запустить только с дополнительной переменной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: mihanikus45rus от 05 Января 2021, 12:24:22
Добрый день. При создании скрипта скада не видит имя обьекта, и при компиляции пишет что не обьявленный. Обьект(например Shape49) расположен в окне №2. Причём в окне №1 все работает. То есть в окне №2 10 обьектов, и ни один не виден при создании скрипта. Перенёс обьект из окна №2 в окно №1 - стал видимым для скрипта. Версия скады 2.4.0.12 demo time. Может я что то упустил?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Января 2021, 13:58:26
Здравствуйте.

Возможно Вы создали шаблонное окно, тогда объекты в нём действительно не будут видны в скриптах и это правильно, т.к. на основе шаблонного окна может быть создать множество окон с множеством отдельных объектов (о которых скада не знает на этапе компиляции). Если окно обычное, но объекты всё равно не видны, то вышлите проект для проверки на support@simple-scada.com.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: mihanikus45rus от 05 Января 2021, 14:09:41
Спасибо, действительно шаблонное. Всё работает.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: dima_k от 17 Января 2021, 15:36:33
пытаюсь создать модальное окно (почти, чтобы для оператора не было возможности тыкать в то, что видно за пределами окна).
Кладу bg:TM_Shape на всю закладку. и когда надо показать окно - есть кнопка Btn1 с событием OnClick:
  bg.Visible:=true;
  bg.Layer:=9999;
  WinRecipe.ShowAll;
в закладке есть еще кнопка со скриптом перехода на главное окно
PageMain.GoToPageAll;     
(bg - это объект TM_Shape, WinRecipe - окно)
окно WinRecipe появляется, но все другие объекты, которые по идее находятся под bd продолжают получать фокус ввода.
в окне WinRecipe есть кнопка у нее скрипт по click:
  bg.Visible:=false;
  bg.Layer:=1;
  WinRecipe.CloseAll;

После нажатия на эту кнопку окно WinRecipe скрывается и дальше чертичто. Клавиша Btn1 срабатывает со второго раза, клавиша перехода на главное окно вообще не работает.


P.S. Как бы сделать модальные окна?

PPS RowIndex у таблицы  давно хотелось бы самому устанавливать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 18 Января 2021, 11:03:37
Здравствуйте.

Модальное окно реализовать не получится, в том числе методом, которым Вы пытаетесь это сделать. Также, следует учитывать, что изменения свойств объектов применяются для всех клиентов, т.е. если скрыть объект "Фигура", то он будет скрыт на всех клиентах, независимо от того, на каком клиенте нажали кнопку выполняющую скрипт скрытия объекта. Поэтому, при наличии более 1 клиента данный способ абсолютно не рабочий.

Цитировать
Клавиша Btn1 срабатывает со второго раза, клавиша перехода на главное окно вообще не работает.
При желании, Вы можете прислать нам для проверки проект из директории "...\Simple-Scada 2\Projects\Имя_проекта" и мы скажем почему именно это происходит.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 19 Января 2021, 05:52:24
  В текущей версии (для последующих не гарантировано) Simple-Scada можно создать модальное окно добавив к обычному окну четыре шторки, окружающие это окно. Т.к. окно (и его объекты) перекрывают страницу, то шторки блокируют доступ к объектам страницы, в т.ч. и все элементы управления страницы, включая переходы по страницам и т.д.

Для нескольких клиентов можно определить правила вызова окна (только один клиент, несколько, для конкретного пользователя ...).

Пример во вложении (процесс создания шторок в комментарии скрипта).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: dima_k от 19 Января 2021, 11:56:55
Прикольное решение.

Может кто подскажет, как в таблице передвигать фокус ввода на нужную клетку или хотя бы строку?
Свойство RowIndex у таблицы readOnly.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 02 Февраля 2021, 10:01:49
Доброго дня,  второй раз сталкиваюсь с  некорректной обработкой  оператора not , условие  такое
 if not  aaa.value then   нормально не обрабатывается ,  ааа- переменная bool
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 02 Февраля 2021, 10:06:49
Здравствуйте.

Оператор not всегда работает правильно. Дело в том, что свойство Value переменной является типом Variant (http://www.delphibasics.ru/Variant.php) и может интерпретироваться компилятором, например, как число. Если Вам известен тип данных, то берите значение в этом типе, например:
Код: (delphi)
if not aaa.AsBool then 
или
Код: (delphi)
if aaa.AsBool = false then 

Также, рекомендуем ознакомиться с описанием частых ошибок в скриптах - ссылка (https://simple-scada.com/help/script/debugscripts.html). Данная ошибка там также рассмотрена - см. пример №2 (https://simple-scada.com/help/script/debugscripts.html?anchor=comptf).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 02 Февраля 2021, 22:07:07
Это понятно, но всегда использовал if aaa.value then, и всегда компилятор , понимал , что  true  , это та же 1, а  вот  с falsе, так не выходит,  а почему тогда работает  if aaa.value = false then, понятно, что лучше использовать  AsBool и т.д.,но это часто неудобно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 04 Февраля 2021, 10:20:00
Потому, что true это только true и больше ничего, а false это все, что не true.
А вот фразу "понятно, что лучше использовать  AsBool и т.д.,но это часто неудобно." вообще не понял. Это требования/условия/синтаксис конкретного языка программирования. При чем тут удобство вообще?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 23 Февраля 2021, 17:22:44
Я хочу добавить коды смайлов для отправки в телегу сообщений, дав им какие-то имена, чтобы можно было вставить нужный смайл в сообщение, обратившись к имени переменной(константы).

Я попробовал создать внутреннюю переменную String и предустановить в качестве значения код смайла, но обращение к этой переменной при формировании строки возможно только посредством обращения к свойству .Value. Но в таком случае вместо смайла в строку вставляется сам код.

Подскажите, можно ли, и если да, то как реализовать такой подход, чтобы я мог сопоставить коду смайла какое-то имя и использовать в коде скриптов именно это имя?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Февраля 2021, 22:23:36
Я попробовал создать внутреннюю переменную String и предустановить в качестве значения код смайла, но обращение к этой переменной при формировании строки возможно только посредством обращения к свойству .Value. Но в таком случае вместо смайла в строку вставляется сам код.
Не нужно создавать отдельную переменную через меню "Переменные". Объявите константу в коде скрипта, или в глобальном модуле и используйте её.
Код: (delphi)
const
  smile: string = #$274C;
begin
  //...
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 08 Апреля 2021, 19:27:42
Добрый день. Спасибо за ответ. константы пробовал использовать, но компиляция почему-то не выполнялась (и было сообщение о внутренней ошибке компиляции без каких-либо ссылок на мои скрипты). Возможно это было связано с использованием версии 2.5.3 (у вас отмечалось, что в обновлении 2.5.4 исправлены какие-то проблемы с компиляцией строковых констант). Пока выкрутился написанием скрипта, который принимает строку с названием и возвращает строку с кодом. Вариант с константами мне нравится больше. Но это мелочи, и на данный момент проблема решена.

Сейчас вопрос в другом. Я хочу создать два виртуальных списка, один список содержит код продукта, второй список - название продукта (в роли второго списка будет выступать ComboBox). То есть человек будет видеть вменяемое название продукта и выбирать его из выпадающего списка, а дальше скрипт сопоставит выбранному продукту код из другого списка и выполнит некоторое действие над ним.
Все содержимое предполагается парсить снаружи из csv-файла.

Пытался применить код из руководства чтобы создать два списка в глобальном модуле, но при попытке компилировать указывает ошибку и выделяет строку с объявлением самой первой глобальной функции, которая следует сразу за этим кодом.

Код
var
    sl800ProductsNames, sl800ProductsCodes: TM_StringList;

implementation

initialization
    sl800ProductsNames := TM_StringList.Create;
    sl800ProductsCodes := TM_StringList.Create;

finalization
    FreeAndNil(sl800ProductsNames);
    FreeAndNil(sl800ProductsCodes);

Подскажите, пожалуйста, где ошибся? Если приведенный участок кода удалить, то компилируется без ошибок.

Вот скриншот редактора:

(https://i.ibb.co/FYC5H8F/image.png)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 10 Апреля 2021, 00:52:11
   Здравствуйте, metamorphogenesis.

  Ошибка в том, что функция repeatSign оказалась в разделе finalization. Её нужно перенести в раздел implementation:
Код: (delphi)
interface
var
    sl800ProductsNames, sl800ProductsCodes: TM_StringList;

function repeatSign(const sign: string; const count: integer): string;

implementation

function repeatSign(const sign: string; const count: integer): string;
var i: integer;
    temp: string;
begin
  temp := '';
  for i := 1 to count do temp := temp + sign;
  Result := temp;
end;

initialization
    sl800ProductsNames := TM_StringList.Create;
    sl800ProductsCodes := TM_StringList.Create;

finalization
    FreeAndNil(sl800ProductsNames);
    FreeAndNil(sl800ProductsCodes);
end.

Достаточно ли обосновано применение списков строк? Возможно проще использовать пару объектов ComboBox.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 12 Апреля 2021, 08:26:21
Ошибка в том, что функция repeatSign оказалась в разделе finalization. Её нужно перенести в раздел implementation:

Спасибо большое. Теперь структура понятнее.


Достаточно ли обосновано применение списков строк? Возможно проще использовать пару объектов ComboBox.

Тогда один из комбо-боксов мне придется прятать, потому что пользователь будет взаимодействовать только с одним из них. А если комбо-бокс нужен только для того, чтобы хранить список, то разве создание самого списка без визуальной оболочки не было бы логичнее?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 12 Апреля 2021, 23:47:10
Тогда один из комбо-боксов мне придется прятать, потому что пользователь будет взаимодействовать только с одним из них. А если комбо-бокс нужен только для того, чтобы хранить список, то разве создание самого списка без визуальной оболочки не было бы логичнее?
Да, конечно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 13 Апреля 2021, 16:36:30
Коллеги, подскажите.

Почему этот код работает
Код: (delphi)
while not TextFileEOF do 
    AddMessage(Now, mkMessage, TextFileReadLn, True, True);

А этот - нет?
Код: (delphi)
var line: String;
...
while not TextFileEOF do begin
    line := TextFileReadLn;
    AddMessage(Now, mkMessage, line, True, True);
end;

Уже два дня бьюсь над скриптом, пока методом исключения не добрался до данного вопроса.  :-\
И еще второй, чуть туповатый вопрос: Как вы прикладываете именно delphi-код в сообщение на форуме?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 14 Апреля 2021, 08:14:22
Коллеги, подскажите.
Могу конечно ошибаться, но может функция не принимает значение переменной
procedure AddMessage(ATime: TDateTime; AKind: TM_MessageKind; const AText: string; AUnconfirmed, ASound: Boolean);
там указано const, важно это или нет хз. То есть текст в ' ' она берет нормально, возвращаемое значение из функции чтения из файла тоже, а из локальной переменной нет. А пробовали не в локальную переменную писать а во внешнюю?
P.S. для выделения кода надо указать "code=delphi"
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 14 Апреля 2021, 08:46:39
Могу конечно ошибаться, но может функция не принимает значение переменной
Проверил ваше предположение. Скорее всего причина не в этом, потому что этот код работает:
Код: (delphi)
var line: String;
...
line := 'test';
AddMessage(Now, mkMessage, line, True, True);
По всей видимости проблема именно в строке line := TextFileReadLn;

За подсказку по делфи благодарю.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 14 Апреля 2021, 11:28:27
metamorphogenesis, почему Вы решили что код не работает? Оба варианта о которых Вы пишете работают правильно, в том числе в Вашем проекте, который Вы высылали на почту техподдержки (оба варианта одинаково выводят строки из текстового файла в сообщения). После вызова скрипта проверьте журнал сервера скады (https://simple-scada.com/help/manual/server-journal.html), может быть у Вас скрипт вовсе не выполняется из-за ошибок в других частях кода и его выполнение прерывается. Если так, то в журнале сервера будет выведено аварийное сообщение.

Если разобраться не получается, то вышлите новую версию проекта, в которой, как Вы считаете есть проблема, потому что проверять приведённые Вами части кода бессмысленно, т.к. они идентичны и работают одинаково.

Кстати, в ходе теста обнаружили грубую ошибку в скрипте "Global_script". Ключевое слово "end." стоит перед секциями "initialization" и "finalization", поэтому они никогда не выполняются. В результате скрипт "load_OnClick" будет прерываться на 68 строке. "end." обязательно должен быть в конце модуля:
Код: (delphi)
...
// warning sending
procedure sendWarning;
begin
    sendDirect('А сообщения об аварии я буду отмечать таким значком - ' + ICON_WARNING);
end;

initialization
    sl800ProductsNames := TM_StringList.Create;
    sl800ProductsCodes := TM_StringList.Create;

finalization
    FreeAndNil(sl800ProductsNames);
    FreeAndNil(sl800ProductsCodes);

end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 14 Апреля 2021, 13:17:07
Кстати, в ходе теста обнаружили грубую ошибку в скрипте "Global_script". Ключевое слово "end." стоит перед секциями "initialization" и "finalization", поэтому они никогда не выполняются. В результате скрипт "load_OnClick" будет прерываться на 68 строке. "end." обязательно должен быть в конце модуля:
Именно это и было причиной проблемы. Большое спасибо за указание на эту ошибку, даже не знаю, сколько я бы искал еще.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 15 Апреля 2021, 09:59:49
Здравствуйте!

Есть необходимость перехода на другие подстраницы по нажатию на текст. Я взял код из примера и заменил на нем TM_Button на TM_Text

Код
var
  aSubPage: TM_SubPage;
begin
{ ищем подстраницу с именем SubPage + значение свойства Тэг }
  aSubPage := GetSubPageByName('SubPage' + IntToStr((Sender as TM_Text).Tag));
  if aSubPage <> nil then                      // если подстраница существует
    aSubPage.GoToSubPageClient(GetClientName); // то, перейти на нее
end.

В обычном клиенте все прекрасно работает, а в web-клиенте - нет. Текст выделяется при наведении, но при клике ничего не происходит.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Апреля 2021, 11:07:23
Здравствуйте.

Проверили, переход по страницам по нажатию на текст в web работает корректно.

1. Откройте настройки проекта (https://simple-scada.com/help/manual/editor-settings.html) -> Общие -> опция Web-доступ (https://simple-scada.com/help/manual/genset.html). У Вас установлен доступ "с управлением"? Если нет, то скрипты по нажатию на объекты выполняться не будут. Установите данную опцию "с управлением", сохраните проект, перезапустите его на сервере и протестируйте снова.
2. В web отрисовка производится средствами браузера, поэтому важно, чтобы объект который должен быть доступен для клика находился в верхнем слое и не был перекрыт другими объектами. Можно выделить объект текст, перейти в меню "Действия" и нажать "На передний план". После чего можно сохранить проект, перезапустить его на сервере и протестировать работает ли переход?

Если причина не в перечисленном выше, то пришлите нам для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\Имя_проекта" и укажите, какие объекты Текст нужно проверить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 15 Апреля 2021, 11:29:26
Причина была в веб-доступе без управления, спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: titanicnwa от 19 Апреля 2021, 09:03:37
Вопросы по классу TM_Window.
1. Изменение свойств объекта TM_Window.H и TM_Window.W работают только при смене страницы/подстраницы. Так и задумывалось?
2. Окно автоматически закрывается при смене страницы/подстраницы. Каким образом его можно оставить?
3. Компоненты в окне, которые размещены за пределами окна все равно отрисовываются.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 19 Апреля 2021, 09:55:27
1. Изменение свойств объекта TM_Window.H и TM_Window.W работают только при смене страницы/подстраницы. Так и задумывалось?
Честно говоря, мы не предполагали что кто-то будет менять размеры окон во время работы проекта и разрабатывали окна как статические объекты постоянного размера. А свойства W, H автоматически наследовались компилятором из базового класса TM_Control. В будущем возможно сделаем их доступными только для чтения.

2. Окно автоматически закрывается при смене страницы/подстраницы. Каким образом его можно оставить?
Это невозможно.

3. Компоненты в окне, которые размещены за пределами окна все равно отрисовываются.
Да, поэтому в редакторе объекты не удастся переместить за пределы окна перетягиванием, или через инспектор объектов. Предполагается, что все объекты будут находиться в окне.

Видимо Вы пытаетесь сделать из окна какой-то динамический компонент со скрытой частью, которая отображается по требованию пользователя. Окна совсем для этого не предназначены.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 22 Апреля 2021, 13:09:44
Здравствуйте!

Подскажите пожалуйста, можно ли в процессе работы, из скрипта менять текстуру изображения? На код "image679.TextureName := 'onsm';" компилятор ругается, что свойство только для чтения.

Если нельзя, посоветуйте, как можно реализовать графическую кнопку-переключатель, чтобы при нажатии на нее изменялась некая переменная и изменялся внешний вид кнопки?  (как во вложении)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 22 Апреля 2021, 14:36:24
strs, можно ж сделать анимашку и переключать кадры.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 22 Апреля 2021, 16:28:52
Да уж, способ( Но пробую хотя бы так, но не получается. Создал анимацию из двух кадров, присвоил текстуру этому изображению, написал скрипт
Код
begin
    if Sender is TM_Image then
      with Sender as TM_Image do
        if Frame = 1 then
          Frame := 2
        else
          Frame := 1;
  end
Скорость анимации сделал равной 0, скрипт этот повесил на событие OnClick для изображения - и ничего не работает. Причем даже в переменную не получается считать текущий кадр
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 23 Апреля 2021, 15:05:51
Все работает.
К огоньку (Пламя2) прицепил приведенный код и все нормально переключается.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 23 Апреля 2021, 16:38:45
Все работает.
К огоньку (Пламя2) прицепил приведенный код и все нормально переключается.
Прикольно. Заменил текстуру на огонек - заработало. Вернул свою текстуру - работает. Что было - не понятно.

Спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 26 Апреля 2021, 12:19:02
Здравствуйте. Прошу помощи, пожалуйста.
Как избавится от запроса в каждом цикле? (Предполагаю, что нужно загнать в массив, но не понимаю как это сделать)

Код: (delphi)
var
  aNumStr: integer; // номер строки при чтении файла
{ выгружаем коды во временную таблицу в БД }
procedure InsertDmCod;
var
  aQuery: string;
begin
  aQuery := 'INSERT INTO DmExplorer.dbo.TMP_DeFileRead (DFR_DmCod, DFR_TimeStamp) '+
            'VALUES (' +QuotedStr(vrUploadStr.AsStr)+', '+SQLServerDateTime(Now, dttMillisecond)+  ')';
  RunSQL(aQuery, nil, 3);
end;

{ выгружаем серийный номер выгрузки в таблицу БД   }
procedure InsertSN;
var
  aQuery: string;
begin
  aQuery := 'INSERT INTO DmExplorer.dbo.CFG_DeArhiveTask (DAT_SN, DAT_TimeStamp) '+
            'VALUES (' +QuotedStr(vrUploadStr.AsStr)+', '+SQLServerDateTime(Now, dttMillisecond)+  ')';
  RunSQL(aQuery, nil, 5);
end;

{ выгружаем задание на печать в БД }
procedure InsertTaskPrint;
var
  aQuery: string;
begin
  aQuery := 'UPDATE DmExplorer.dbo.CFG_DeArhiveTask '+
            'SET DAT_TaskPrint = ' +vrUploadStr.AsStr+
            'WHERE DAT_TaskID = SELECT TOP(1) DAT_ID FROM DmExplorer.dbo.CFG_DeArhiveTask ORDER BY DAT_ID DESC';
  RunSQL(aQuery, nil, 6);
end;

{ выгружаем задание на печать в БД }
procedure InsertTotalCod;
var
  aQuery: string;
begin
  aQuery := 'UPDATE DmExplorer.dbo.TMP_DeTaskInfo '+
            'SET DTI_TotalCod = ' +vrUploadStr.AsStr+
            'WHERE DTI_TaskID = SELECT TOP(1) DAT_ID FROM DmExplorer.dbo.CFG_DeArhiveTask ORDER BY DAT_ID DESC';
   RunSQL(aQuery, nil, 7);
end;

{ вспомогательная процедура для обработки отдельной строки }
  procedure ProcStr(const AStr: string);
  var
    I: Integer;
    aBuf: string;
    aQuery: string;
    { эта подпроцедура вызывается каждый раз когда из строки было извлечено
      значение отделённое ";" }
    procedure OnDone;
    begin
      if aBuf = '' then Exit;                     // игнорируем пустые значения
        vrUploadStr.Value := aBuf;                // записываем данные из буфера
      if aNumStr = vrNumStrSN.AsInt then          // записываем в БД сирийный номер выгрузки
        InsertSN;
      if aNumStr = vrNumStrPrintTask.AsInt then   // записываем в БД задание на печать
        InsertTaskPrint;
      if aNumStr = vrNumStrTotalCod.AsInt then    // записываем в БД общее количество кодов в файле
        InsertTotalCod;
      if aNumStr > vrFirstStrDM.AsInt then        // если номер строки больше чем уставка -> записываем DM коды в TMP_DeFileRead
        InsertDmCod;                              // записываем в БД}
      aBuf := '';                                 // затем обнуляем буферную строку
    end;
  begin
    aBuf := '';
    for I := 1 to Length(AStr) do       // проходим по каждому символу строки в цикле
      if aStr[I] <> 'CR+LF' then        // если текущий символ не "CR+LF", то
      begin
        if aStr[I] <> ' ' then          // игнорируем пробелы
          aBuf := aBuf + AStr[I]        // добавляем символ в буферную строку
      end else                          // если дошли до ";", то
        OnDone;                         // работаем с полученным значением

    OnDone;                             // вызываем завершающую процедуру напоследок
  end;         
{ Очищаем таблицу }
procedure CleanTableBD;
var
  aQuery: string;
begin
  aQuery := 'truncate table DmExplorer.dbo.TMP_DeFileRead'; //Очищаем таблицу

  { Отправляем запрос на выполнение с тегом = 1 }
  RunSQL(aQuery, nil, 4);
end;

{PRG************************************************************************************************************************}
begin
  imgLoad1.Visible := true;
  // открываем текстовый файл для чтения
  if TextFileOpen('MyCSV.csv', 'D:\Home\Simple-Scada 2 (time-demo)\Projects\DmExplorer\User files\', fomReset, fcpDefault) then
  begin
    CleanTableBD;                                      // очищаем временную таблицу в БД перед загрузкой DM кодов из файла
    aNumStr := 0;                                      // сбрасываем счетчик пропуска служебных строк
    while not TextFileEOF do                           // цикл с проходом по каждой строке текстового файла
      begin
        aNumStr := aNumStr + 1;                            // счетчик строк
        ProcStr(TextFileReadLn);
      end;
    TextFileClose;                                     // закрываем файл
    imgLoad1.Visible := false;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 26 Апреля 2021, 20:54:15
Как избавится от запроса в каждом цикле?
Вариант с накоплением запросов в списке с их последующим выполнением после заполнения списка:
1. создание списка в глобальном модуле:
Код: (delphi)
interface

var
  myList: TM_StringList;          // объявляем список с именем myList

implementation

initialization                    // во время запуска проекта
  myList := TM_StringList.Create; // создаём список

finalization                // во время выключения проекта
  FreeAndNil(myList);       // !!! обязательно удаляем список

end.
2. Собственно запись в список во всех процедурах:
Код: (delphi)
procedure InsertDmCod;
begin
  myList.Add('INSERT INTO DmExplorer.dbo.TMP_DeFileRead (DFR_DmCod, DFR_TimeStamp) '+
             'VALUES (' +QuotedStr(vrUploadStr.AsStr)+', '+SQLServerDateTime(Now, dttMillisecond)+  ')');
end;
3. Запуск цикла по списку:
Код: (delphi)
{PRG************************************************************************************************************************}
begin
  imgLoad1.Visible := true;
  . . .
    MyList.Clear;                // очистить список
    while not TextFileEOF do                           // цикл с проходом по каждой строке текстового файла
      begin
        . . .
      end;
    TextFileClose;                                     // закрываем файл

    MyLisyIndex.Value := 0;                              // индекс текущего элемента списка
    if MyList.Count > 0 then RunSQL(MyList[0], nil, 4)   // запуск цикла по непустому списку
    else imgLoad1.Visible := false;
  end;
end.
4. Цикл по списку (скрипт "Выполнен SQL-запрос"):
Код: (delphi)
begin
  if DataSet.Tag = 4 then begin
    MyLisyIndex.Value := MyLisyIndex.AsInt + 1;      // индекс текущего элемента списка = параметр цикла
    if MyList.Count > MyLisyIndex.AsInt then RunSQL(MyList[MyLisyIndex.AsInt], nil, 4)
    else imgLoad1.Visible := false;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 26 Апреля 2021, 21:31:07
Спасибо!!!!  :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 29 Апреля 2021, 15:29:37
Добрый день! Только приступил к работе с этой симпатичной рограммой и сразу столкнулся с вопросом который ни как не могу уложить в голове в виду его простоты . Мне необходимо показывать и скрывать 4 элимента(крышка люка) которые будут символизировать текущее положение реальной двери роторной печи. Каждой картинке я из ПЛК отправляю бит_1 крышка видна, 0 скрыта. создал скрипт под первую кртинку:

Код: (delphi)
if Image6. AsBool = True then   // если значение переменной изображения = 1, то
    Image6. Visible := True   // показать изображение
  else                       // иначе
    Image6.  Visible := False; // скрыть изображение
end.

Создал скрипт под 2 картинку:

Код: (delphi)
begin
    if Image7. AsBool = True then   // если значение переменной изображения = 1, то
    Image7. Visible := True   // показать изображение
  else                       // иначе
    Image7.  Visible := False; // скрыть изображение
end.
Всё логично. Переменные у каждой картинке свои.  Каждой картинке присвоил свои скрипт. Подключаюсь к клиенту и в результате FOLSE любой из двух переменных ,,гасит,, синхронно две картинки. (Первая переменная =0  - картинки погасли,=1 появились. Вторая переменная =0  -картинки погасли,=1появились). Ничего не понял, ято не такю :-\
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 29 Апреля 2021, 16:50:24
Здравствуйте.

Для описанной задачи, гораздо проще будет объединить все изображения в одно и разделить его на кадры как это описано по ссылке (https://simple-scada.com/help/manual/pictures.html). Затем можно будет написать один универсальный скрипт для смены кадров изображения (https://simple-scada.com/help/script/imgframe.html) по необходимым условиям. По приведенным скриптам: они должны работать, если не работают, значит Вы в чем-то допустили ошибку, например связали изображения с одной и той же переменной и т.д. Если разобраться не получится, пришлите нам для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\Имя_проекта" и укажите, какой скрипт нужно проверить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 30 Апреля 2021, 10:17:00
Спасибо за оперативный ответ. Нашёл причину-неправильно настроен бал ОПС сервер, прилетал только первая пнременная , остальные оставались в False. Кстати а есть инструменты проверить реальное состояние внешних переменных непосредсвенно в СКАДЕ?(демоверсия по времени) :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 30 Апреля 2021, 10:27:45
В редакторе просмотреть текущее значение переменной нельзя. Разместите на мнемосхеме компонент Поле (https://simple-scada.com/help/manual/field.html), свяжите его с требуемой переменной, сохраните и запустите проект. В поле будет отображаться текущее значение переменной.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: nikolai_mikhailov от 03 Мая 2021, 15:56:00
Не могу никак разобраться с воспроизведением аудио. А именно со скриптом PlayUserSound.
В описании написано "Воспроизводит пользовательский звуковой файл (в формате ".ogg" или ".wav") из папки "Simple-Scada\Sounds\" на заданном клиенте."
Я написал, к примеру, такой скрипт:

begin
  PlayUserSound(GetClientName, '2.ogg', FALSE);
end.

Если я переименую "UserSound.ogg" (который идет с демо-проектом) в '2.ogg', то всё работает. Если же я использую свой собственный файл с таким названием (или любым другим, то при запуске скрипта ничего не происходит, в ответ тишина)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 05 Мая 2021, 15:45:03
Добрый день! Подскажите пожалуста. Хочу использовать в проекте ЛАМПА накаливания, чтобы она начала мигать когда переменная = TRUE. Использовал скрипт для её анимацииЖ
Код: (delphi)
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(т.е. имитация не зажённой лампы).  И второё как изменить цвет ,,горящей,, лампы на красный, а потухшей оставитьт серым? Спасибо. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 05 Мая 2021, 15:59:29
Код: (delphi)
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.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 06 Мая 2021, 08:10:00
Как просто! Спасибо. Уточните пожалуста где можно узнать побольше об этом языке чтобы понимать структуру написания этих скриптов?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 06 Мая 2021, 09:04:53
Прошу не пинать, пытаюсь разобраться но не зная об этом языке ничего перебираю комбинации кода и они как правило не работают, вот так и рождаются вопросы... Вставил картинку и присвоил скрипт её исчезновения по булевой переменной -работает. Хотел её в момент отображения заставить мигать, чтобы привлечь внимание оператора, и объединил первый скрипт со скриптом анимации. Она по-прежнему исчезает - появляется , но вот в момент появления мигать отказывается. Попрате меня пожалуйста:
Код: (delphi)
 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.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 06 Мая 2021, 09:31:17
Руководство по скриптам (https://simple-scada.com/help/script/index.html)
Дополнительно можно прочесть в интернете на сайтах связанных с языками Pascal/Delphi.

Код: (delphi)
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.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Мая 2021, 10:49:15
Если я переименую "UserSound.ogg" (который идет с демо-проектом) в '2.ogg', то всё работает. Если же я использую свой собственный файл с таким названием (или любым другим, то при запуске скрипта ничего не происходит, в ответ тишина)
Вы уверены, что звуковой файл, который Вы используете действительно сохранён в формате ogg? Также убедитесь, что проигрываемый звук не слишком тихий. Можно повторить проблему, затем выключить клиент скады и проверить лог-файл "Client-log.txt" из папки "Logs\", нет ли в нём сообщений о неудачной загрузке файла звука. Можете выслать файл на support@simple-scada, мы проверим его у себя.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 06 Мая 2021, 10:57:26
Извиняюсь за назойливость, скопировал Ваш скрипт исчезает-появляется исправно, но мигать отказывается. Может он работает с анимироваными обектами (в которых есть nколичиство кадров, а с простыми обектами ни как? На всякий случай прикладываю скрин свойсва (стрелка импортированая в формате PNG) 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 06 Мая 2021, 11:41:37
Может он работает с анимироваными обектами в которых есть nколичиство кадров
Всё верно, для мигание цветом (https://simple-scada.com/help/script/flashing.html), будет такой скрипт:

Код: (delphi)
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.
Или в инспекторе объектов у изображения выбрать "Цвет мигания" (https://simple-scada.com/help/manual/general-properties.html), тогда скрипт будет такой:

Код: (delphi)
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.


Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 06 Мая 2021, 14:32:43
Спасибо уже применил! :D
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Игорь32 от 09 Мая 2021, 17:14:17
 Добрый день . Такая проблема  . Есть 3 Воздуходувки  они работают по очереди и если  не хватает мощности включается 2 или 3 сразу (в зависимости что показывает датчик )  на все 3 сдедал 3 переменых  от одного источника и написал скрипты
для 1 вентилятора
Код
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 вентилятора
Код
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 вентилятора
Код
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 вентиляторе поочерёдно  вместо паузы сброс.

Можно как то исправить  что бы просто работало на пузу когда  нет включения и считало без скачков  ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 11 Мая 2021, 09:11:26
     Здравствуйте, Игорь32.

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

Для таймера нежелательны повторные старты, пример универсального скрипта для объекта "Текст". Основная переменная - управление таймером. Событие "Изменилась значение основной переменной".
Код: (delphi)
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.
Во вложении пример с шаблоном для вентилятора и просто группой объектов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Игорь32 от 11 Мая 2021, 13:37:52
Здравствуйте pan2000

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

Код
 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. Хотелось бы конечно что бы разработчики исправили это неприятную вещь со сбросом таймеров при перезагрузке клиента или пк  хотя бы в платных версиях .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 12 Мая 2021, 01:49:52
Осталась вторая проблема -  это  откат времени после работы  2 или 3  одновременно вентилятора и переход в обычный режим. нашол один интересный факт если сделать тайм аут  приходяшего сигнала   Допустим приходит 2 потом 7  и между ними сделать 0 то все работает корректно (Возможно стоит поставить задержку на приходящий сигнал в 1 секунду да и всё или можно реализовать как то в скаде межу переключениями ?
По опыту работы с таймером можно отметить три его особенности:
1. Не пытаться повторно запустить таймер.
2. Новое начальное значение таймера можно установить только из состояния "Сброс".
3. Работающий таймер только пишет в таймерную переменную.
Все остальное это видимость принудительного изменения значения таймерных переменных на значения из файла при изменении состояния любого вентилятора.
Цитировать
Вообще операторы жалуются на сброс таймеров после рестарта пк или проекта
Это не сброс таймеров, а банальное переписывание нулевого значения из файла (было создано при первом запуске проекта).

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


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

Цитировать
...есть вариант  забирать время из контролера  и передавать на скаду... Правда не знаю как реализовать вытягивание битов  с 3 воздуходувок  через 1 тег...
Правильно получать значения времени наработки непосредственно из контроллера. Но у модуля SR3NET01 только по четыре шестнадцатиразрядных регистра для записи и для чтения. Т.е. всего-навсего по 64 бита. Можно увеличить количество путем страничного доступа к данным. Но это уже вопрос к автору программы и вычислительными ресурсами контроллера.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Игорь32 от 12 Мая 2021, 12:27:54
Посмотрел Ваш проект, очень много для себя открыл , особенно работу с шаблонами . Спасибо большое
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 21 Мая 2021, 19:47:17
Есть глобальный скрипт, в нем объявлена глобальная константа, значение которой берется из результата выполнения описанной тут же глобальной функции.
Код: (delphi)
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?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Мая 2021, 20:59:24
Цитировать
Значение первой константы будет вычисляться при каждом обращении к ней из скрипта, или только один раз, или как?
Один раз.

Функция RGB это одна из встроенных в компилятор функций, которая описана в руководстве по ссылке (https://simple-scada.com/help/script/rgb.html). Поэтому не нужно писать собственную функцию. Также нужно учитывать, что переменные цветов в скаде имеют тип данных Cardinal. Ещё цвета можно указывать в шестнадцатеричном виде:
Код: (delphi)
interface

const
  CLR_LED_ON1: Cardinal = RGB(67, 67, 67);
  CLR_LED_ON2: Cardinal = $434343;

implementation

end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: niyaz от 30 Мая 2021, 12:53:21
Здравствуйте.
Хотелось бы узнать можно ли через скрипт снять выделение строки ? Например: пользователь выбрал строку в таблице нажал на кнопку, скрипт сработал, выделение строки в таблице снялось. Это необходимо, чтобы пользователь заново выбрал необходимую ему строку в таблице и значения переменных перезаписались.
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 01 Июня 2021, 10:45:29
Здравствуйте.
Такой возможности нет. Выделение может снять только пользователь.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 01 Июля 2021, 22:59:22
Здравствуйте! Подскажите, есть ли возможность исследовать признак качества переменной? Например, мы считываем отдельные биты из word-переменной из OPC-сервера во внутренние булевы переменные. Нужно, чтобы если качество исходной переменной "бэд",  то и у внутренних выставлялось "бэд".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: msigx680 от 02 Июля 2021, 19:08:42
Здравствуйте! Подскажите как правильно решить задачу:
Считываю данные из счетчика Эл. Энергии в тренд, как писать в тренд с учетом коэффициента трансформации, т.е. значение переменной умножить на число и его уже писать в тренд?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 02 Июля 2021, 21:07:21
Здравствуйте.

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

Цитировать
как писать в тренд с учетом коэффициента трансформации, т.е. значение переменной умножить на число и его уже писать в тренд?
Для этого нужно создать новую внутреннюю переменную, в скрипте произвести необходимые вычисления с исходной переменной и записать результат во внутреннюю переменную. У внешней переменной архивацию выключить, а у внутренней включить и использовать ее в трендах. Универсальный скрипт для подобной задачи можно применить если переменные, в которые нужно записывать рассчитываемые значения будут иметь однотипные имена, например исходная переменная имеет имя "Var1", а пересчитанная переменная имеет имя "Var1_Calc" и т.д. Тогда в скрипте можно использовать поиск переменной по имени через GetVariableByName (https://simple-scada.com/help/script/getvariablebyname.html). В этом случае, можно создать скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changemulvar.html)", добавить в список скрипта нужные переменные, которые требуется умножать на коэффициент и написать такой универсальный скрипт:
Код: (delphi)
var
  aVar: TM_Variable;
begin
  { ищем переменную, в которую нужно записать преобразованное значение }
  aVar := GetVariableByName(Variable.Name + '_Calc');

  { если переменная найдена, то записать в нее значение переменной умноженное на коэффициент }
  if aVar <> nil then
    aVar.Value := Variable.Value * 0.89;
end.
, где 0.89 - это коэффициент, на который нужно умножить переменную, Variable - переменная, изменение которой привело к выполнению скрипта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 08 Июля 2021, 21:53:56
подскажите, возможно ли из скрипта получить доступ к массиву timeTrends[] временного тренда, размещенного в шаблонном окне?


В шаблон передается слово состояния и в трендвьювере на каждый бит предусмотрен график. Хотелось бы, открыв шаблон, иметь возможность в этом окне прятать/показывать каждый график, привязанный к соответствующему биту слова.


Если это можно решить отличным от скрипта способом, подскажите, пожалуйста, как именно. Спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 09 Июля 2021, 09:56:15
    Здравствуйте.

подскажите, возможно ли из скрипта получить доступ к массиву timeTrends[] временного тренда, размещенного в шаблонном окне?
Для управления видимостью трендов, расположенного в шаблонном окне объекта "Временные тренды", можно привязать подстановку управляющей переменной к основной или дополнительной переменной объекта.
Скрипт по изменению переменной:
Код: (delphi)
var i: integer;
begin
  with Sender as TM_TimeTrendViewer do
    for i := 0 to TimeTrendsCount -1 do TimeTrends[i].Visible := GetBit(AsInt,i);  // или NOT GetBit...
end.
.
Во вложении пример шаблонного окна с управлением видимостью трех трендов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 09 Июля 2021, 10:10:50
Большое спасибо, сейчас затестю :)


@тестирует


UPD. Работает чётенько, как и задумано. Еще раз спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vaarman от 10 Июля 2021, 14:01:10
Здравствуйте!
Прошу помочь разобраться с работой функции setbit
Имеется следующий код
Код: (delphi)
var
  VarNm: Variant;    //объявляем внутренние переменные
  dwStatus: Int64;  //объявляем внутренние переменные
  dwCmd: Int64;    //объявляем внутренние переменные

begin

  if not (Sender is TM_Object) then   // если скрипт вызван не объектом, то прерываем выполнение
    Exit;
  with (Sender as TM_Object) do

    VarNm := TM_Object(Sender).Variable.Name;     // получаем имя переменной, которая привязана к этому объекту

    dwStatus:= GetVariableByName('GV_' + VarNm + '_dwStatus').Value; //ищем переменную  с именем 'GV_' + VarNm + '_dwStatus' и получаем ее значение (переменная из OPC сервера типа longword)
    dwCmd:= GetVariableByName('GV_' + VarNm + '_dwCmd').Value;  //ищем переменную  с именем  'GV_' + VarNm + '_dwCmd' и получаем ее значение (переменная из OPC сервера типа longword)

     if  GetBit(dwStatus, 5) = true  then       //проверяем, если 5 бит переменной dwStatus равен единице, то
    dwCmd:=SetBit(dwCmd,  1, True);        // устанавливаем 1 бит переменной dwCmd в единицу
end.
 

Так вот, все работает корректно ровно до момента  dwCmd:=SetBit(dwCmd,  1, True). То есть считываются значения правильно, но не записывает нужный мне бит. Может связано с приведением типов переменных? Может подскажите, заранее спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 10 Июля 2021, 22:12:00
Здравствуйте.
 
Код: (delphi)
var
  VarNm: Variant;
  dwStatus, dwCmd: TM_Variable;
begin
  if not (Sender is TM_Object) then   // если скрипт вызван не объектом, то прерываем выполнение
    Exit;

  VarNm := TM_Object(Sender).Variable.Name;     // получаем имя переменной, которая привязана к этому объекту
  dwStatus:= GetVariableByName('GV_' + VarNm + '_dwStatus'); //ищем переменную  с именем 'GV_' + VarNm + '_dwStatus'
  dwCmd:= GetVariableByName('GV_' + VarNm + '_dwCmd');  //ищем переменную  с именем  'GV_' + VarNm + '_dwCmd'
 
  if (dwStatus <> nil) and (dwCmd <> nil) and (GetBit(dwStatus.Value, 5))  then    //если переменные существуют, и 5 бит переменной dwStatus равен единице, то
    dwCmd.Value := SetBit(dwCmd.AsInt64,  1, True);        // устанавливаем 1 бит переменной dwCmd в единицу
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vaarman от 11 Июля 2021, 00:36:20
Спасибо за подсказку!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 12 Июля 2021, 16:01:33
Добрый день. У меня два вопроса.


1. На двух клиентах разный интервал мигания, проект один. На дальнем ТВ правильно.
https://dropmefiles.com/YidkO (https://dropmefiles.com/YidkO)


2. команды
Код: (delphi)
    CloseApplicationClient(getClientName);  
    MinimizeApplicationClient(getClientName); 
применяются ко всем открытым клиентам. Каждая команда размещена в своем отдельном скрипте, который привязан к событию онклик кнопки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 15 Июля 2021, 22:41:18
Здравствуйте.

Цитировать
На двух клиентах разный интервал мигания, проект один. На дальнем ТВ правильно.
Если Вы используете процедуру смены частоты мигания "SetFlashInterval", то причина нам известна и теперь устранена.

Цитировать
применяются ко всем открытым клиентам. Каждая команда размещена в своем отдельном скрипте, который привязан к событию онклик кнопки.
Вероятно у Вас клиенты имеют одинаковые имена. Задайте на разных клиентах разные имена через утилиту настроек (https://simple-scada.com/help/manual/settings-simple-client.html?anchor=servset). Второй вариант - Вы вызываете getClientName в скрипте который выполняется сервером, что неправильно (см. описание функции в руководстве (https://simple-scada.com/help/script/getclientname.html)). Также непонятно, зачем Вы вызываете "CloseApplicationClient" два раза. Достаточно одного раза.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 16 Июля 2021, 16:08:18
Блин,  это я хотел одну команду переименовать в минимайз и позабыл

Скрипт привязан к событию onClick, как я написал.

Попробую настроить имя клиента.


@пробует настроить имя

Да, имя по умолчанию пустое на всех клиентах, потому и так. Спасибо, переименование клиентов в настроках решило проблему.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 19 Июля 2021, 22:18:37
Доброго дня, ув. разработчики и коллеги! Возник такой вопрос.

В скаде расставлены барграфы, шкалу которых я хочу размечать однотипно по одному и тому же принципу. Для этой цели был написан один универсальный скрипт, который  по крайним значениям шкалы переменной барграфа рассчитывает, сколько нужно меток, чтобы шкала барграфа получилась красивой и с нужным шагом.

Проблема в том, что единственный способ применить этот скрипт к барграфу, который я нашел - это событие onDataChange. Так это сейчас и работает, но разметить барграф нужно по сути только один раз, а так выходит, что скрипт выполняется регулярно, и я переживаю, что при расширении проекта этот декоративный скрипт может избыточно увеличить нагрузку (понимаю, что современные мощности легко ее преодолевают, но факт есть факт, все выполнения скрипта, кроме первого, - не нужны, от чего и ресурс на их исполнение затрачивается, и лог засоряется), потому что некоторые данные обновляются с частотой опроса.

Можете порекомендовать какой-то альтернативный способ однократно обновить одним скриптом свойство каждого объекта исходя из индивидуальных параметров каждого из них?


UPD. С утра вернулся к работе и вспомнил об идее использовать какое-нибудь свойство объекта для хранения служебной информации (к примеру, текст подсказки). Попробую реализовать запись туда факта успешной разметки шкалы и прерывать выполнение скрипта при обнаружении этого факта. Постоянный вызов скрипта по-прежнему будет иметь место, но по крайней мере, скрипт будет завершаться на первой же строчке.

Разработчики, подскажите, эффективнее ли в теории такой подход, чем полноценное выполнение скрипта (в котором 20 строк, несколько математических операций и несколько уровней вложенности условий)?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 20 Июля 2021, 16:45:47
    Здравствуйте.
... но разметить барграф нужно по сути только один раз ...
...  единственный способ применить этот скрипт к барграфу, который я нашел - это событие onDataChange ...
1. Если у барграфа не используется дополнительная переменная, то достаточно назначить скрипт разметки на событие по изменению доп. переменной, в качестве которой используется одна новая переменная. При ее инициализации (запуск проекта) для каждого барграфа будет однократно выполнен скрипт разметки.

2. Можно назначить скрипт разметки на событие по двойному клику мыши и однократно вызывать скрипт для всех барграфов при запуске проекта. Скрипт "Полностью запущен" (барграфы задаются перечислением или в цикле):
Код: (delphi)
var i: integer;
begin
  Bargraph1.OnDblClickEvent;
  Bargraph2.OnDblClickEvent;
  . . .
  Bargraph100500.OnDblClickEvent;
// или
  for i := 1 to 100500 do GetObjectByName('Bargraph' + IntToStr(i)).OnDblClickEvent;  // это только пример
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 21 Июля 2021, 11:01:57
Большое спасибо, есть из чего выбрать)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 21 Июля 2021, 21:51:27
Еще вопрос.Сейчас рефакторится метод, и ссылки на объекты, с которыми работаю внутри, я теперь получаю по имени, которое скармливаю методу.

до рефакторинга:
Код: (delphi)
procedure refreshSettings(const productsNames: TM_StringList);  //  вызывается refreshSettings(sl800ProductsNames)
begin
    ...
    productsNames.Clear;                                        // очищается sl800ProductsNames
    ...
end;
после рефакторинга:
Код: (delphi)
procedure refreshSettings(const lineName: string);                               //  вызывается refreshSettings('sl800')
var
    productsNames: TM_StringList;
begin
    ...
    productsNames := TM_StringList(getObjectByName(lineName + 'ProductsNames')); // из имени получается ссылка на sl800ProductsNames
    productsNames.Clear;                                                         // EXCEPTION
    ...
end;

Проблема в том, что после рефакторинга я ловлю исключение
Unhandled exception in module "global" at line 570. Access violation at address 01776AFB in module 'Server.exe'. Read of address 00000004

Что я делаю не так? Благодарю за помощь.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 22 Июля 2021, 08:06:40
Проблема в том, что после рефакторинга я ловлю исключение
Unhandled exception in module "global" at line 570. Access violation at address 01776AFB in module 'Server.exe'. Read of address 00000004

Что я делаю не так? Благодарю за помощь.

При попытке получить объект по имени, скрипт наткнулся на имя которого не существует в проекте, отсюда и исключение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Июля 2021, 09:48:32
Все функции поиска описанные по этой ссылке (https://simple-scada.com/help/script/search-functions.html) работают с объектами мнемосхем, окнами и переменными (созданными в меню редактирования переменных). Они никак не связаны с теми переменными и объектами, которые Вы создаёте в скриптах. Поэтому при попытке найти StringList функция getObjectByName вернёт нулевой указатель (nil), а при попытке к нему обратиться будет выдана Access violation.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 22 Июля 2021, 18:49:38
Спасибо. Важное уточнение, думал что к объектам относятся все объекты без исключения. Тогда отменить/передумать рефакторинг.

На всякий случай дополните статью в справке об этом. Но если вы добавите возможность искать и такие объекты - будет вообще превосходно!  :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Июля 2021, 21:44:26
Цитировать
Но если вы добавите возможность искать и такие объекты - будет вообще превосходно!
Такой возможности точно не будет, т.к. она слишком расточительна в плане производительности и на наш взгляд бессмысленна. Также она потребует добавления строкового представления имени в оперативной памяти реальному адресу объекта. Из 100% объектов Вы скорее всего будете использовать очень малый процент, а большинство других пользователей вообще не используют поиск по имени. В целом, если Вы пришли к тому, что приходится использовать поиск объектов по имени в скриптах, то с большой вероятностью структуры данных в Вашем коде плохо организованы или использован неправильный подход для решения задачи. Например, мы при создании скады никогда не использовали поиска объектов/переменных по имени, хотя однотипных структур очень много. У других программистов тоже никогда не видели кода в котором для обращения к объекту выполнялся бы его поиск по имени.
Если у Вас нет других вариантов, то можно создать свой список и заносить в него соответствие объект -> имя в виде строки, а затем выполнять поиск по имени с помощью этого списка.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 26 Июля 2021, 13:47:35
В целом, если Вы пришли к тому, что приходится использовать поиск объектов по имени в скриптах, то с большой вероятностью структуры данных в Вашем коде плохо организованы или использован неправильный подход для решения задачи.

Это обусловлено ресурсоёмкостью функции поиска объектов? Просто я использую поиск по имени в каждом проекте. Может я делаю неправильно, но возьмём самую распространенную задачу - Изменение цвета по биту переменной.
В руководстве она описана так:
Код: (delphi)
begin
  if Sender is TM_Image then        // сначала убедимся, что скрипт вызван объектом "Изображение"
    with Sender as TM_Image do      // далее будем работать с объектом Sender, как с изображением
      begin
        {меняем цвет изображения по основной переменной}
        if GetBit(AsInt, 3) = TRUE then Color := clGreen else Color := clRed;
        {меняем скорость анимации изображения по доп. переменной "VariableEx"}
        if GetBit(VariableEx.AsInt, 1) = TRUE then AnimSpeed := 10 else AnimSpeed := 0;
      end;
end.
То есть к каждому изображению нужно привязать переменную и назначить 2 события по изменению переменной.

Либо можно назначить изображениям однотипные имена вроде "m0", "m1" .. "m15" и искать их в цикле скрипта "Изменились переменные".
Код: (delphi)
var
  obj: TM_Image;
  i: Integer;
begin
  for i:=0 to 63 do                               
   begin
     obj := GetImageByName('m'+IntToStr(i));
     if obj <> nil then
      if GetBit(int1.Value,i) then obj.Color:= clLime else obj.Color:= clNone;
      if GetBit(int2.Value,i) then obj.Animspeed := 10 else obj.Animspeed := 0;
   end;
end.
То есть если у нас 2 переменные по 64 бита, и 64 объекта на мнемосхеме, универсальный скрипт выполнится 64(128) раз при изменении 1 бита в каждом слове? Либо 1(2) раза выполнится скрипт "Изменились переменные". Если поиск настолько ресурсоёмкий, то может мне стоит пересмотреть свой подход в реализации этих задач. Поправьте если ошибся, может это работает иначе чем я описал.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 26 Июля 2021, 16:38:08
В нашем предыдущем сообщении речь шла о добавлении функции поиска для всех объектов, включая объекты объявленные пользователем в скриптах, это было бы действительно ресурсоёмко.
Если говорить только о существующих функциях поиска, как "GetImageByName" и т.п., то они работают максимально быстро (используется поиск по хеш-таблице). Но и эти функции пользователи чаще всего используют там, где без них можно обойтись. Если рассматривать задачу с битами, которую Вы привели, то вариант с "GetImageByName" будет работать быстрее и в данном случае использование "GetImageByName" оправдано. Это пример правильного использования функции поиска по имени, к сожалению мы встречаем такое редко в проектах пользователей.
Название: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 26 Июля 2021, 19:16:20
Добрый вечер. Подскажите пожалуйста, возникла необходимость управлять релейными выходами коонтроллера. Для того, чтобы получить доступ к управлению ними, необходимо ввести пароль (записать 5 значений в 5 регистров). Пароль нужно вводить, только если в регистре №121 содержится "0", если "1" - то пароль был введен и сессия активна. Как только сессия становится не активной и в регистре 121 - "0", то нужно опять повторять ввод пароля (в пять регистров записывать 5 значений.) В OPC сервере если руками выставить значения этих переменных, то как бы все работает на стороне контроллера. Но как это сделать в скада? я импортировал эти 6 переменных и не знаю как это реализовать. Возможен ли скрипт: при изменении переменной с "1" в "0", записать в 5 переменных 5 значений и чтобы это делалось автоматически. Либо чтобы при нажатии одной кнопки записывалось 5 переменных. Если это очень просто, прошу сильно не ругать, я только начинаю первые шаги в освоении SCADA, скрипты тоже никогда не писал к сожалению.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 27 Июля 2021, 08:37:41
Возможен ли скрипт: при изменении переменной с "1" в "0", записать в 5 переменных 5 значений и чтобы это делалось автоматически. Либо чтобы при нажатии одной кнопки записывалось 5 переменных.


Конечно. Вы можете создать скрипт с типом "изменилась переменная", затем справа вверху выбрать переменную, изменение с 1 в 0 которой вы отслеживаете, а в скрипте выполнить простую проверку и запись значений
Код: (delphi)
begin
    if variable.AsInt = 0 then
    begin
        var1.value := ...;
        var2.value := ...;
        var3.value := ...;
        var4.value := ...;
        var5.value := ...;
        // действия, когда сессия неактивна
{ если вам нужно действие, когда сессия активна, удалите строки 10 и 14
    end
    else begin
        // действия, когда сессия активна
}
    end;
end.

Во второй строке вы проверяете значение той переменной, изменение которой вызвало скрипт. Вы можете явно проверять значение переменной по ее имени, но это лучше делать, если вы уверены, что вам это необходимо (то есть изменилась одна переменная и вызвала скрипт, в котором вы проверяете значение, например, совершенно другой переменной). Так же учтите, что если вы добавите в скрипт какие-то другие переменные, то скрипт будет вызван и их изменением тоже, и поведение программы может оказаться отличным от ожидаемого.Чтобы записать переменные нажатием кнопки, перейдите во вкладку событий объекта (кнопки/картинки  и т.д.), в строке события onClick нажмите на кнопку "...", при этом создастся новый скрипт, который будет вызван по нажатию на объект. В тело скрипта вставьте само действие - строки 4-8 из выше приведенного примера.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 27 Июля 2021, 12:01:01
Спасибо огромное, все получилось и все работает. Но теперь я думаю, что лучше такой скрипт реализовать в OPC сервере, чтобы можно было управлять контроллером даже при если скада не запущена.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: metamorphogenesis от 28 Июля 2021, 06:56:43
Лучше это реализовать прямо в контроллере, чтобы контроллер мог принимать меры предосторожности даже если ОРС не запущен/нет связи с ним.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 04 Августа 2021, 11:15:41
Здравствуйте. Подскажите пожалуйста, в скриптах с типом события "изменились переменные" можно обратиться к этой самой переменной не по имени? Если нет, возможно ли добавить такую возможность? Поясняю: у меня есть в проекте много однотипных скриптов типа:
Код
if (B24_220.Value = false)   and  (IsFirstChange() = false) then
     AddMessageToGroup(Now, mkAlarm, 4, 'Котельная 24 - нет сети 220В!', true, true);       
Скрипт выполняется по изменению переменной "B24_220" и не смотря на то, что она уже указана в редакторе скрипта, я вынужден писать ее имя в коде. [Если такой возможности нет], было бы гораздо удобнее, если бы можно было просто написать:
Код
if (var0.Value = false)   and  (IsFirstChange() = false) then
     AddMessageToGroup(Now, mkAlarm, 4, 'Котельная 24 - нет сети 220В!', true, true);       
Чтобы компилятор понимал, что var0 - это первая переменная из списка, var1 - вторая и т.д. Тогда скрипт можно было бы просто копировать, заменяя сообщение и выбирая разные переменные.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 04 Августа 2021, 12:47:42
Здравствуйте.
Сообщения можно добавлять/редактировать без использования скриптов, через меню сообщений (https://simple-scada.com/help/manual/edit-message.html). Для создания множества однотипных сообщений можно использовать шаблонные сообщения (https://simple-scada.com/help/manual/templatemessage.html). При создании шаблона сообщения (https://simple-scada.com/help/manual/templatemessage.html), в подстановках можно использовать спец. значения (https://simple-scada.com/help/manual/index.html?templusefultips.html#templ1), например добавить в сообщение описание переменной используя подстановку %#var_desc%. При работе с сообщениями нужно всегда стараться использовать штатную систему сообщений и шаблонные сообщения. Добавлять сообщения через скрипты целесообразно только в крайних случаях, когда по каким-либо причинам невозможно использовать штатную систему сообщений.

Код
if (B24_220.Value = false)  
При сравнении значения переменной лучше использовать явное приведение значения переменной (https://simple-scada.com/help/script/nonvert-values.html) к нужному типу. Например, при сравнении с True/False нужно брать значение переменной переведенное в тип Boolean(свойство AsBool (https://simple-scada.com/help/script/varasbool.html))

Подскажите пожалуйста, в скриптах с типом события "изменились переменные" можно обратиться к этой самой переменной не по имени?
Для получения доступа к переменной, изменение которой привело к выполнению скрипта "изменились переменные" можно использовать параметр Variable.

Код: (delphi)
 if (Variable.AsBool = false)   and  (IsFirstChange = false) then
     AddMessageToGroup(Now, mkAlarm, 4, 'Котельная 24 - нет сети 220В!', true, true);
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 04 Августа 2021, 13:22:07
Здравствуйте.
Сообщения можно добавлять/редактировать без использования скриптов, через меню сообщений (https://simple-scada.com/help/manual/edit-message.html). Для создания множества однотипных сообщений можно использовать шаблонные сообщения (https://simple-scada.com/help/manual/templatemessage.html).
Но при перезапуске проекта они тут же все будут выданы. Тут ключевое "IsFirstChange() = false", не понимаю, почему этого нет в стандартном функционале сообщений, как и задержек на срабатывание.

При сравнении значения переменной лучше использовать явное приведение значения переменной (https://simple-scada.com/help/script/nonvert-values.html) к нужному типу. Например, при сравнении с True/False нужно брать значение переменной переведенное в тип Boolean(свойство AsBool (https://simple-scada.com/help/script/varasbool.html))
Учту, спасибо.

Для получения доступа к переменной, изменение которой привело к выполнению скрипта "изменились переменные" можно использовать параметр Variable.

Код: (delphi)
 if (Variable.AsBool = false)   and  (IsFirstChange = false) then
     AddMessageToGroup(Now, mkAlarm, 4, 'Котельная 24 - нет сети 220В!', true, true);
Спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 04 Августа 2021, 14:38:20
Но при перезапуске проекта они тут же все будут выданы. Тут ключевое "IsFirstChange() = false", не понимаю, почему этого нет в стандартном функционале сообщений

Для того, чтобы не выдавались сообщения при перезапусках проекта в настройках Options.exe (https://simple-scada.com/help/manual/settings-common.html) на вкладке "Simple-Scada Server" имеется опция "Показывать сообщения по первому изменению (https://simple-scada.com/help/manual/settings-simple-scada-server.html?anchor=other)", если ее отключить, то сообщения при перезапусках не будут выдаваться.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 05 Августа 2021, 02:14:29
Доброй ночи.
Глупый вопрос.
Имеется шаблон для устройств.
Устройства подобные и по своей сути однотипные, но с незначительными изменениями относительно друг друга.
Допустим, в одной приточно-вытяжной машине есть ПЧ, в другой отсутствует рекуператор, в другой нет заслонок и т.д.
Как мне создать некий один универсальный шаблон, для всех типов устройств.
Допустим если в шаблоне к некому полю, тексту, изображению скады не привязана переменная , скрыть этот объект, возможно ли это?
Тогда при клонировании установок, не нужно детально разбираться с каждой индивидуально:
есть переменная => есть поле, текст, изображение., нет привязки=> скрыть поле, текст, изображение.
Или эту задачу можно решить другим методом?
Заранее спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 05 Августа 2021, 08:30:09
Допустим если в шаблоне к некому полю, тексту, изображению скады не привязана переменная , скрыть этот объект, возможно ли это?
Тогда при клонировании установок, не нужно детально разбираться с каждой индивидуально:
есть переменная => есть поле, текст, изображение., нет привязки=> скрыть поле, текст, изображение.
Я решал эту задачу следующим способом: для объектов в шаблоне назначал подсказку %hint% либо значение Тега объекта %num% либо Подпись %name% в случае с чекбоксом.
К таким объектам привязывал Доп.переменную, которая выступала триггером для вызова скрипта OnDataChangeEx. Если нужно скрыть объект на шаблоне, значит в подстановке указывал
'-' для текстовых параметров или 0 для числовых. Переменная-триггер всегда меняла своё значение через InverseBit при переходе на страницу с шаблонами или открытии окна с шаблоном. При этом срабатывает универсальный скрипт
Код: (delphi)
begin
  with Sender as TM_CheckBox do
    begin
      if Caption = '-' then Visible := False        //Если вместо названия датчика прочерк, скрыть чекбокс
      else Visible := True;                         //Название есть - отобразить чекбокс
    end;
end.
Сюда можно дописать поля, кнопки и прочие объекты, назначить скрипт на OnDataChangeEx. Решение может немного и топорное, но работает как нужно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 05 Августа 2021, 09:50:27
Здравствуйте.

В обновлении 2.5.8 шаблонам и окнам добавлено событие OnInit и функция GetTemplateObject, которые позволяют легко решить эту задачу. Допустим в шаблоне есть заслонка Valve1 и изображение Image1, которые нужно скрывать, если они не связаны с переменной. Тогда на событие OnInit шаблона пишем такой код:
Код: (delphi)
var
  aObj: TM_Object;
begin
  aObj := GetTemplateObject('Image1');
  aObj.Visible := aObj.Variable <> nil;

  aObj := GetTemplateObject('Valve1');
  aObj.Visible := aObj.Variable <> nil;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Aister от 05 Августа 2021, 11:45:00
Здравствуйте. Не получается решить задачку изящным способом. Подскажите пожалуйста как лучше ее реализовать.
Суть задачи в следующем. Требуется отправлять телеграм уведомления по трем типам событий:
1) Выход значения за аварийные границы с пропуском первого уведомления(при старте проекта). Решено скриптом "выход за границы" и добавлением группы переменных.
2) То же, что и в первом условии, но нужна обработка дополнительной булевой переменной. К примеру, сообщение отправится при выходе температуры холодильника за границы, НО, если условный переключатель "Работа" включен.
3) Сообщение в случае: Bool = TRUE И (Значение переменной больше верхней аварийной границы И Таймер обратного отсчета закончил работу). По сути - задержка выхода величины на нормальный уровень за заданное время.

Еще одна опциональная задачка. Можно ли каким-то образом устроить "сегрегацию" пользователей Телеграм, или создать несколько групп. И отправлять сообщения, в зависимости от переменной(или группы переменных), вызвашей отправку, в нужную группу(Или списку пользователей).

Заранее спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 05 Августа 2021, 14:13:29
Здравствуйте.
В обновлении 2.5.8 шаблонам и окнам добавлено событие OnInit и функция GetTemplateObject, которые позволяют легко решить эту задачу.
Большое спасибо. Заработало. ;)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 05 Августа 2021, 23:53:26
Здравствуйте.

Цитировать
Суть задачи в следующем. Требуется отправлять телеграм уведомления по трем типам событий:
Для второй задачи можно использовать следующий способ: переменные, по которым настроены границы и переменные "Работа" должны иметь однотипные имена. Например, переменная температуры холодильника №1 - Temp1, переменная работы холодильника Temp1Work, холодильник №2 - Temp2 и Temp2Work и т.д. Тогда можно в скрипте использовать поиск переменной "Работа" по имени и далее использовать ее в скрипте, например:
Код: (delphi)
var
  aVar: TM_Variable;
begin
  // пропускаем первое изменение
  if not IsFirstChange then Exit;
  // ищем переменную "Работа", соответствующую сработавшей переменной
  aVar := GetVariableByName(Variable.Name + 'Work');
  // если переменная существует, то..
  if aVar <> nil then
    // если переменная "Работа" = True
    if aVar.AsBool then
    // отправляем сообщение в зависимости от того, в какой зоне находится значение переменной
    case Variable.GetValueZone of
     -2: SendTelegram('Нарушена НА граница переменной ' + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
     -1: SendTelegram('Нарушена НП граница переменной ' + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
      0: SendTelegram('Значение вернулось в норму '     + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
      1: SendTelegram('Нарушена ВП граница переменной ' + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
      2: SendTelegram('Нарушена ВА граница переменной ' + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
    end;
end.
     
Для третьей задачи можно применить тот же подход, но вместо задержки настроить у переменных необходимую зону нечувствительности для выдачи сообщений о нарушении границ (https://simple-scada.com/help/manual/varextra.html). Это позволит избежать дублирующихся сообщений при колебании значения переменной на границах.

Цитировать
Можно ли каким-то образом устроить "сегрегацию" пользователей Телеграм, или создать несколько групп.
Проще всего будет создать несколько групп в Telegram (https://www.google.com/search?q=%D0%BA%D0%B0%D0%BA+%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C+%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%83+%D0%B2+%D1%82%D0%B5%D0%BB%D0%B5%D0%B3%D1%80%D0%B0%D0%BC&sxsrf=ALeKk03bs1hElje4lPYzcgJCgBDE7YXGtg%3A1628196232449&ei=iE0MYY7tGreFwPAPvNOUqAo&oq=%D0%BA%D0%B0%D0%BA+%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C+%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%83+%D0%B2+%D1%82%D0%B5%D0%BB%D0%B5%D0%B3%D1%80%D0%B0%D0%BC&gs_lcp=Cgdnd3Mtd2l6EAMyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgYIABAHEB4yBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDoHCAAQRxCwAzoHCAAQsAMQQzoECAAQDToICAAQBxAKEB46CAgAEAgQBxAeSgQIQRgAUPOiCViorAlgoLMJaAJwAngAgAHcAYgBiwiSAQUyLjQuMpgBAKABAcgBCsABAQ&sclient=gws-wiz&ved=0ahUKEwiO0bzQ35ryAhW3AhAIHbwpBaUQ4dUDCA4&uact=5), распределить пользователей по этим группам и отправлять сообщения в нужные группы.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 10 Августа 2021, 16:52:18
Добрый день. Пытаюсь проникнуться в идеологию.
Возник вопрос.

Создал шаблон в виде графического строчного примитива:
Код
[%назв. установки%] [%номер пом.%].......[%index%_температура_1] [%index%_температура_2] [%index%_температура_3] [%index%_температура_4]....
Далее создаю таблицу, путем копирования этого шаблона построчно с указанием переменных %...%:
Код
[%назв. установки%] [%номер пом.%].......[%index%_температура_1] [%index%_температура_2] [%index%_температура_3] [%index%_температура_4]
[%назв. установки%] [%номер пом.%].......[%index%_температура_1] [%index%_температура_2] [%index%_температура_3] [%index%_температура_4]
[%назв. установки%] [%номер пом.%].......[%index%_температура_1] [%index%_температура_2] [%index%_температура_3] [%index%_температура_4]
Получаю некую сводную инф. таблицу.
С целью экономии рабочего пространства пытаюсь "объединить" столбцы температуры.
Т.е. создать некий всплывающий список, который бы выбирал, что именно показывать в этом столбце: 1,2,3 или 4 температуры.

Как я пытаюсь это сделать:
1. создаю внутреннюю переменную "Filter_Column", подвязанную к ComboBox.
2. поле температуры в шаблоне имеет свойства: переменная - %index%, доп. переменная - Filter_Column.
3. создаю скрипт для поля температуры по изменению доп. переменной:
Код: (delphi)
begin
  if Sender is TM_Field then
    with Sender as TM_Field do
      case Filter_Column_Ahu.value of
        0 :   Variable := GetVariableByName(AsStr + '_температура_1');
        1 :   Variable := GetVariableByName(AsStr + '_влажность_212');
        2 :   Variable := GetVariableByName(AsStr + '_температура_3');
        3 :   Variable := GetVariableByName(AsStr + '_любое_другое_строковое_значение');
      end;
end.
4. Предполагаю, что при выборе ComboBox, в столбце будет фигурировать та переменная, которая необходима пользователю в данный момент.

Не получается )=
Есть подозрение, что я не верно передаю в скрипт %.....%.
Прошу помощи.

Возможна реализация данной мысли в другом исполнении.
P.S. %Index% - включает в себя много информации => "стринговое" значение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 12 Августа 2021, 10:35:09
Здравствуйте.

В скрипте Вы ищите переменные по имени через GetVariableByName, но не проверяете их существование. Возможно, имеются ошибки в формировании имен переменных и их не находит, из-за чего будет возникать ошибка при выполнении скрипта - подробнее см. по ссылке (https://simple-scada.com/help/script/debugscripts.html?anchor=errsearch). Откройте журнал сервера скады (https://simple-scada.com/help/manual/server-journal.html) и посмотрите, нет ли в нем ошибок выполнения скриптов. Если не разберетесь, пришлите для проверки на support@simple-scada.com текущую версию проекта из директории "..\Simple-Scada 2\Projects\".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 12 Августа 2021, 11:35:24
С целью экономии рабочего пространства пытаюсь "объединить" столбцы температуры.
Т.е. создать некий всплывающий список, который бы выбирал, что именно показывать в этом столбце: 1,2,3 или 4 температуры.

Здравствуйте.
Посмотрите пример, возможно Вы что-то подобное описали?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 12 Августа 2021, 13:25:57
Спасибо, за пример. Да, именно такую конструкцию я и хотел увидеть.
Но, для ее реализации вы используете свойство переменной Tag, который вы передаете в шаблон и который является целочисленным значением.
В моем же случае нужно передавать строку.
Получилось решить задачу используя свойство: "подсказка". Т.е. в  "подсказку" записал %index% и в скрипте обрабатываю это значение.
Код: (delphi)
begin
  if Sender is TM_Field then
    with Sender as TM_Field do
      case Filter_Column_Ahu.value of
        0 :   Variable := GetVariableByName(Hint + '_Температура1');
        1 :   Variable := GetVariableByName(Hint + '_Влажность1');
        2 :   Variable := GetVariableByName(Hint + '_любое другое тестовое значение');
      end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 17 Августа 2021, 14:31:46
Добрый день. Небольшой вопрос по использованию таймера. Есть кнопка (Btn1) с подсветкой, подсветкой управляет релейный выход контроллера (переменная OPC - K1). При  нажатии кнопки Btn1, в SCADA выводится сообщение о ее нажатии и в соответствующее поле выводится время нажатия. Как реализовать отклик, т.е. при нажатии на кнопку ( только если в SCADA зарегистрировалось нажатие, сгенерировалось сообщение и зафиксировалось время!) чтобы пропала подсветка на 2 секунды (K1.Value := 29) и потом снова включилась (K1.Value :=31). В контроллере эту задумку осуществить не получится(это контроллер компании Новатэк, там не все так просто в плане написания логики работы). А также есть ли возможность если кнопка Btn1 не нажималась 120 минут то реализовать мигание (записывать раз в секунду в переменную K1 команду вкл-выкл: 29, 31)?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 17 Августа 2021, 17:43:28
Здравствуйте.

Пример использования таймера:

Удобнее использовать таймер с обратным отсчетом, и задавать интервал для таймера по нажатию на кнопку с дополнительной проверкой, что таймер уже запущен, чтобы пользователь не смог перезапустить таймер при повторных нажатиях на кнопку. Для этого нужно создать новую внутреннюю переменную типа Integer, например, с именем vrTimer, и два новых скрипта.

1. Скрипт для кнопки на событие OnClick (https://simple-scada.com/help/script/general-events.html):

Код: (delphi)
begin
  if vrTimer.Value = 0 then vrTimer.Value := 20;
end.

2. Скрипт с типом события "Прошла секунда (https://simple-scada.com/help/script/second-passed.html)" с таким кодом:
Код: (delphi)
begin
  if vrTimer.Value > 0then
     begin
      vrTimer.Value := vrTimer.AsInt -1;
       if vrTimer.Value = 0 then
         begin
           // КОД РАЗМЕЩЕННЫЙ ЗДЕСЬ БУДЕТ ВЫПОЛНЯТЬСЯ ПО ТАЙМЕРУ

         end;
     end;
end.

Примеры, мигание цветом, без использования таймера, можно посмотреть по ссылке  (https://simple-scada.com/help/script/flashing.html)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 18 Августа 2021, 06:40:33
Спасибо. Но наверное вы меня не правильно поняли. Кнопка и подсветка не в СКАДе. Это физическая кнопка (в OPC - Btn1), которая расположена на фабрике, и подсветка тоже на этой кнопке (24в постоянки которые коммутируются выходом контроллера (К1 в OPC)). И условие немного отличается, при повторном нажатии ( при условии, что уже прошло n секунд с момента последнего нажатия) на эту кнопку таймер должен сбрасываться, а вот если ее не нажимать(переменная Btn1 не изменялась) то по истечению 120 минут лампа на кнопке должна начать мигать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 25 Августа 2021, 08:42:27
 По предыдущему вопросу все получилось отлично. Работает. Подскажите пожалуйста еще один момент? как реализовать маршрут: т.е. чтобы регистрация нажатия кнопок проходила только в определенной последовательности. Допустим есть кнопки Btn1, Btn2, Btn3 они находятся в помещении повышенной опасности, которое с заданной периодичностью должно осматриваться. Но осмотр должен идти по строго заданному маршруту, вдоль которого и расположены эти кнопки. Если кнопки нажаты не последовательно, то регистрация нажатия должна происходить с пометкой о нажатии не в правильной последовательности в виде сообщения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 25 Августа 2021, 09:41:46
Если кнопки нажаты не последовательно, то регистрация нажатия должна происходить с пометкой о нажатии не в правильной последовательности в виде сообщения.
Как один из вариантов решения задачи - Создать внутреннюю переменную типа Word, скрипт "Изменились переменные" - Btn1, Btn2, Btn3
Код: (delphi)
//Скрипт по изменению переменных Btn1, Btn2, Btn3. BtnWord внутренняя переменная типа Word
begin

  if Btn1.AsBool = True then
    BtnWord.Value := SetBit(BtnWord.Value, 0, True); //Если нажата кнопка 1 устанавливаем во внутренней переменной бит 0
  if Btn2.AsBool = True then
    BtnWord.Value := SetBit(BtnWord.Value, 1, True); //Если нажата кнопка 2 устанавливаем во внутренней переменной бит 1
  if Btn3.AsBool = True then
    BtnWord.Value := SetBit(BtnWord.Value, 2, True); //Если нажата кнопка 3 устанавливаем во внутренней переменной бит 2

   if BtnWord.Value=0 then Exit                                                                                   
   else if (BtnWord.Value<>1) and (BtnWord.Value<>3) and (BtnWord.Value<>7) then            //Нарушена последовательность нажатия
     AddMessage(Now, mkWarning, 'Нарушен маршрут осмотра помещения ...', True, False)
   else if BtnWord.Value=7 then BtnWord.Value := 0;       //Маршрут пройден, обнулить слово

end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 26 Августа 2021, 08:06:41
Спасибо. подскажите пожалуйста как модифицировать ваш скрипт, я задачу немного упростил. У меня на обьекте есть кнопки с световой индикацией, по истечению заданного промежутка времени они начинают мигать (в скада это сопровождается визуализацией), также выводится соответствующее сообщение. Мигание осуществляется посредством изменения переменной в плк. Как с помощью этого скрипта сделать так, чтобы мигание прекратилось только тогда, когда нажались все три кнопки(не одновременно и не обязательно в строгой последовательности) и в этот момент сбросилась переменная vrTimer в 0, чтобы начать отсчет по новой?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 26 Августа 2021, 20:17:22
   Здравствуйте.

Сброс таймера vrTimer в 0 по трем кнопкам Btn1, Btn2, Btn3 с управлением подсветкой кнопок К1, К2, К3.
Предполагается, что кнопки реагируют на нажатие только при завершению интервала контроля, т.е. когда кнопки мигают. Нажатия кнопок запоминаются в переменной состояние кнопок vrBtnState. Для разрешения реагирования на кнопки в любой момент времени достаточно удалить условие проверки состояния таймера: (vrTimer.AsInt < (Tmax - 2)).
После нажатия всех трех кнопок может выполняться проверка на правильный порядок нажатия 1-2-3 или 3-2-1.
Скрипт "Изменились переменные Btn1, Btn2, Btn3":
Код: (delphi)
const Tmax = 120 * 60;       // константа используется в двух скриптах - её можно перенести в глобальный модуль
begin
  if vrTimer.AsInt < (Tmax - 2) then exit;  // интервал контроля ещё не истек (рано кнопки нажимать). Для исключения контроля удалить оператор
  if not Variable.AsBool then exit;         // переход в false - игнорировать
  if Variable = btn1 then begin K1.Value := 29; vrBtnState.Value := SetBit(vrBtnState.AsInt, 0, true); end;    // запомнить нажатые кнопки
  if Variable = btn2 then begin K2.Value := 29; vrBtnState.Value := SetBit(vrBtnState.AsInt, 1, true); end;
  if Variable = btn3 then begin K3.Value := 29; vrBtnState.Value := SetBit(vrBtnState.AsInt, 2, true); end;

// СОСТОЯНИЕ КНОПОК - другой оператор должен быть закомментирован или удален
//  этот оператор контролирует порядок нажатия кнопок 1-2-3 или 3-2-1
  case vrBtnState.AsInt of
  2, 5: vrBtnState.Value := SetBit(vrBtnState.AsInt, 3, true);   // установить флаг ошибки порядка нажатия кнопок
     7: vrTimer.Value := 0;              // сброс таймера
    15: begin
          vrTimer.Value := 0;            // сброс таймера
          AddMessage(Now, mkWarning, 'Он шел на Одессу, а вышел к Херсону...(матрос-партизан Железняк)', true, false);
        end;
  end;
//   этот оператор контролирует факт нажатия всех кнопок
//  if vrBtnState.AsInt = 7 then vrTimer.Value := 0;              // сброс таймера

end.

Скрипт "Прошла секунда":
Код: (delphi)
const Tmax = 120 * 60;       // константа используется в двух скриптах - её можно перенести в глобальный модуль
begin
  vrTimer.inc(1, 0, Tmax);

  case vrTimer.AsInt of
  1: vrBtnState.Value := 0;       // сброс регистра нажатых кнопок
  2, Tmax - 1: begin
                 if not Getbit(vrBtnState.AsInt, 0) then K1.Value := 31;      // включать индикатор не нажатой кнопки
                 if not Getbit(vrBtnState.AsInt, 1) then K2.Value := 31;
                 if not Getbit(vrBtnState.AsInt, 2) then K3.Value := 31;
               end;
  Tmax: begin
          K1.Value := 29;     // выключить индикаторы кнопок
          K2.Value := 29;
          K3.Value := 29;
          vrTimer.inc( -2);
        end;
  end;
end.


Возможно ещё нужен контроль времени нажатия всех трёх кнопок.

Пример во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 31 Августа 2021, 13:07:29
Спасибо большое за помощь. С помощью ваших инструкций и помощи форумчан я смог  за 2 недели разработать и внедрить готовую систему контроля пожарной безопасности(хоть и на довольно примитивном уровне). До всей этой работы я вообще не знал ничего о ОРС, о конструировании SCADA, о базах данных и о написании скриптов.  Тема очень интересная и было очень приятно с этим всем разбираться. Описание и разъяснение к вашему продукту написано настолько подробно и объемно, что у меня возникли вопросы только на финальном этапе наладки. Все подано в очень удобоваримом виде. Много иллюстраций. Огромная благодарность разработчикам и тем, кто помог на форуме.  :) :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 05 Сентября 2021, 10:14:16
Здравствуйте!

Есть необходимость видеть в интерфейсе оператора, запущена ли служба опроса модемов. Нашел пример для Делфи (приведен ниже), но не знаю, можно ли его применить в скриптах скады или это невозможно.
При попытке вставить первую часть кода в скрипт типа "глобальный модуль", получаю ошибку File "WinSvc.PCU not found".

Если напрямую в скриптах скады это сделать невозможно, может посоветуете, как по-другому можно вывести статус службы в интерфейс?
Код: (delphi)
uses
  WinSvc;
 
function ServiceGetStatus(sMachine, sService: PChar): DWORD;
{******************************************}
  {*** Parameters: ***}
  {*** sService: specifies the name of the service to open
  {*** sMachine: specifies the name of the target computer
  {*** ***}
  {*** Return Values: ***}
  {*** -1 = Error opening service ***}
  {*** 1 = SERVICE_STOPPED ***}
  {*** 2 = SERVICE_START_PENDING ***}
  {*** 3 = SERVICE_STOP_PENDING ***}
  {*** 4 = SERVICE_RUNNING ***}
  {*** 5 = SERVICE_CONTINUE_PENDING ***}
  {*** 6 = SERVICE_PAUSE_PENDING ***}
  {*** 7 = SERVICE_PAUSED ***}
  {******************************************}
 
var
  SCManHandle, SvcHandle: SC_Handle;
  SS: TServiceStatus;
  dwStat: DWORD;
begin
  dwStat := 0;
  // Open service manager handle.
  SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT);
  if (SCManHandle > 0) then
  begin
    SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS);
    // if Service installed
    if (SvcHandle > 0) then
    begin
      // SS structure holds the service status (TServiceStatus);
      if (QueryServiceStatus(SvcHandle, SS)) then
        dwStat := ss.dwCurrentState;
      CloseServiceHandle(SvcHandle);
    end;
    CloseServiceHandle(SCManHandle);
  end;
  Result := dwStat;
end;
 
function ServiceRunning(sMachine, sService: PChar): Boolean;
begin
  Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService);
end;

Код
if ServiceRunning(nil, 'Имя службы') then
begin
{Действия если служба запущена}
end else
begin
{Действия если служба не запущена}
end;

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 06 Сентября 2021, 20:00:35
Здравствуйте.

Компилятор выдал правильную ошибку о том, что модуль WinSvc, подключенный в приведённом Вами коде не найден, ведь его нет.

Цитировать
Если напрямую в скриптах скады это сделать невозможно, может посоветуете, как по-другому можно вывести статус службы в интерфейс?
В скаде сейчас нет какого-то простого способа проверить статус службы. Если служба во время работы обновляет какие-то файлы, то можно через скаду проверять время последнего изменения и реагировать если время давно не менялось.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 08 Сентября 2021, 07:38:26
     Здравствуйте.
Есть необходимость видеть в интерфейсе оператора, запущена ли служба опроса модемов.
  Получить состояние служб можно с помощью командного процессора.
Однако командный процессор всегда запускается в видимом окне, что крайне нежелательно. Запустить командный процессор без видимого окна можно в файле сценария VBScript. Полученные данные перенаправляются в файл. Далее следует дождаться обновления данных в файле и обработать их.

Пример из вложения после ввода имени службы получает её состояние.
Создается и запускается файл сценария и запоминается текущее время. Скрипт запрашивает информацию о службе и записывает её в файл результата. Далее с периодом 1 сек сканируется директория файла результата до наступления критерия обновления файла - его наличие с датой превышающей запомненную и ненулевой длиной или до наступления тайм-аута. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 09 Сентября 2021, 14:19:56
Пример из вложения после ввода имени службы получает её состояние.
Спасибо! Была проблема, из-за русского имени пользователя в винде не создавался текстовый файл. Но с переездом в "D:\" все заработало.
Вопрос: а зачем сканировать директорию на наличие файла, если мы точно знаем как он называется и можем открыть его напрямую?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 09 Сентября 2021, 17:51:39
Вопрос: а зачем сканировать директорию на наличие файла, если мы точно знаем как он называется и можем открыть его напрямую?
Файл результата открывается как перезаписываемый - т.е. новый замещает старый. Узнать что файл обновился можно по изменению даты записи файла, она должна быть больше чем дата начала выполнения скрипта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 10 Сентября 2021, 08:42:44
Файл результата открывается как перезаписываемый - т.е. новый замещает старый. Узнать что файл обновился можно по изменению даты записи файла, она должна быть больше чем дата начала выполнения скрипта.

Все равно не понял. Мы же и так можем узнать дату файла, зная имя. Ну да ладно, в итоге привел к такому виду, вроде все работает:

Код: (delphi)
var
    aPath: String;
    i: integer;
    tempString: String;
const
    servName:string = 'iRZ_Collector_Server';
begin

if SecondOf(Now) = 0 then begin    //проверяем статус службы и создаем файл с информацией 1 раз в минуту
  aPath := GetProjectPath + 'User Files\';
  StartTime.Value := NOW;                                       // начало ожидания
// чтение состояния службы через VB скрипт для подавления вывода окна командной строки
  TextFileOpen('Service.vbs', aPath, fomRewrite, fcpUTF8);
  TextFileWriteLn('Set WshShell = CreateObject("WScript.Shell")');
  TextFileWriteLn('WshShell.Run "cmd /A /C sc query ' + servName + '> ""'                // выполнить команду чтения состояния службы
  + 'D:\Service.txt""", 0');                                                             //  и записать результат в файл
  TextFileWriteLn('Set WshShell = Nothing');
  TextFileClose;
  RunApplication(SS_SERVER_NAME, aPath + 'Service.vbs', '');    // выполнить VBS-файл

  end;

  /////////////////////////////////////////////////

   if SecondOf(Now) = 2 then begin    //считываем файл для анализа через 2 секунды после создания

    if (FileExists('Service.txt', 'D:\')) and (SecondsBetween(FileAge('D:\Service.txt'), StartTime.AsDateTime) < 10) then begin  // условия корректности файла

       TextFileOpen('Service.txt', 'D:\', fomReset, fcpCyrillic_windows866); //открываем файл

       tempString := UTF8Encode(TextFileReadLn);     //переходим к требуемой строчке в файле
       tempString := UTF8Encode(TextFileReadLn);
       tempString := UTF8Encode(TextFileReadLn);
       tempString := UTF8Encode(TextFileReadLn);
           if tempString = '        Состояние          : 4  RUNNING ' then
             begin txtService.Text := 'Служба опроса модемов работает';
                   txtService.BorderColor := clLime;
             end
           else if tempString = '        STATE              : 1  STOPPED ' then
             begin txtService.Text := 'Служба опроса модемов остановлена';
                   txtService.BorderColor := clRed;
             end
           else
             begin txtService.Text := 'Ошибка получения статуса службы опроса модемов';    //в нужной строчке не те данные, которых мы ожидали
                   txtService.BorderColor := clYellow;
             end;

        TextFileClose;          // закрыть файл
    end
    else begin txtService.Text := 'Ошибка получения статуса службы опроса модемов'; //файл не существует либо слишком старый
               txtService.BorderColor := clYellow;
         end;

    end;   // if SecondOf(Now) = 2
end.

Спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 10 Сентября 2021, 14:02:02
   Здравствуйте.
Мы же и так можем узнать дату файла, зная имя.
Мой пример предполагает однократный запрос состояния службы с минимальным временем отклика, анализ наличия обновленного файла начинается с 0 секунды относительно запроса.

В Вашем случае это автомат состояний с периодом в 60 тактов, запрос выполняется в 0, а анализ во 2 тактах. Сам процесс получения данных асинхронный, и можно ожидать что он завершится за 2 секунды. Но если информация о состоянии файла обновится через 3 секунды и более, то возникнет ошибка.
Поскольку процесс получения состояния службы периодический и не связан с действиями оператора (как в примере), то анализ файла можно смело перенести до 55 такта (секунды).

Вывод названия параметра на разных языках ("Состояние" <-> "STATE") это, предположительно, отголосок локализации ОС. Я бы проверял строку на наличие подстрок ": 4  RUNNING" и ": 1  STOPPED".

И ещё одна особенность автомата при запуске проекта, с вероятностью 1/30 в течение первой минуты будет выдано сообщение "Ошибка получения статуса службы опроса модемов".
Для устранения этого можно использовать условие (начальное значение переменной - 0) :
Код: (delphi)
(if SecondOf(Now) = 2) and (StartTime.AsFloat > 1) then begin    //считываем файл для анализа через 2 секунды после создания и только после запуска скрипта
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 13 Сентября 2021, 08:23:21
Поскольку процесс получения состояния службы периодический и не связан с действиями оператора (как в примере), то анализ файла можно смело перенести до 55 такта (секунды).
Так и сделаю пожалуй.

Вывод названия параметра на разных языках ("Состояние" <-> "STATE") это, предположительно, отголосок локализации ОС. Я бы проверял строку на наличие подстрок ": 4  RUNNING" и ": 1  STOPPED".
Проект работает на конкретном компьютере, универсальность не требуется, поэтому усложнять лишний раз не хочется.

И ещё одна особенность автомата при запуске проекта, с вероятностью 1/30 в течение первой минуты будет выдано сообщение "Ошибка получения статуса службы опроса модемов".
Для устранения этого можно использовать условие (начальное значение переменной - 0)
Совсем не критично, перезапуски - редкое явление. Но раз есть возможность улучшить - почему бы и нет.

Спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 13 Сентября 2021, 12:41:58
Добрый день. В своем проекте использую скрипт из примера, который вывод на основной экран состояние связи с ПЛК (привязанно к пингу: Есть пинг - есть связь, нет пинга - нет связи).
Код выглядит следующим образом:
Код
begin
if pingdata.Result then
ping_plc.color := clgreen
else begin
ping_plc.color := clred;
AddMessage (Now, mkAlarm, 'Отсутствие связи с контроллером', true, false);
end;
end
В такой реализации аварийное сообщение о потере связи генерируется постоянно (в течении всего времени отсутствия связи).
Подскажите как реализовать однократное появление сообщения при потере связи и подобное сообщение когда связь востановилась?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 13 Сентября 2021, 13:13:32
   Здравствуйте.
В такой реализации аварийное сообщение о потере связи генерируется постоянно (в течении всего времени отсутствия связи).
Подскажите как реализовать однократное появление сообщения при потере связи и подобное сообщение когда связь восстановилась?
В качестве флажка однократного действия можно использовать свойство ping_plc.color
Код: (delphi)
begin
  if pingdata.Result then begin
    if ping_plc.color <> clgreen then <действия при восстановлении связи>;
    ping_plc.color := clgreen;
  end
  else begin
    if ping_plc.color <> clred then AddMessage (Now, mkAlarm, 'Отсутствие связи с контроллером', true, false);
    ping_plc.color := clred;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: KungLao от 13 Сентября 2021, 14:45:11
Спасибо, все работает именно так как нужно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 14 Сентября 2021, 09:24:48
Вопрос к разработчикам.
Имеется несколько 16-битных переменных, которые нужно распаковать на булевы через функцию GetBit. Скажите пожалуйста, как будет рациональнее по использованию вычислительных ресурсов - сделать для каждой по отдельному скрипту "изменились переменные", либо сделать один скрипт и проверять, какая изменилась через "if variable.Name = 'xxx' "?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Сентября 2021, 11:24:48
Здравствуйте.

Компоненты "Кнопка (https://simple-scada.com/help/manual/button.html)" и "Флажок (https://simple-scada.com/help/manual/checkbox.html)" могут работать с битами напрямую - см. свойство "Бит". Поэтому, если требуется работа с битами в данных компонентах, то в этом случае можно обойтись без скриптов. Сообщения также могут работать с битами переменной.

Если требуется распаковать переменные на биты, например для изменения цвета объекта, скорости анимации и других целей, то лучше всего использовать однотипные имена переменных/объектов и один скрипт "Изменились переменные" с применением функций поиска (https://simple-scada.com/help/script/search-functions.html), к примеру как описано в этом сообщении (https://simple-scada.com/forum/index.php?topic=145.msg9708#msg9708). Данный способ будет наиболее производительным.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 01 Октября 2021, 16:28:15
Здравствуйте!

Подскажите, можно ли перебрать несколько однотипных переменных (объявленных в редакторе переменных) по имени в цикле?

Например, есть переменные temp0, temp1, temp2 ... temp23 типа integer, нужно в цикле for сложить их значения.

Массивы ведь на запись использовать нельзя, или я путаю?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 01 Октября 2021, 20:54:06
Например:
Код: (delphi)
var
  I: integer;
  Sum: Int64;
  aVar: TM_Variable;
begin
  Sum := 0;
  for I := 0 to 23 do
  begin
    aVar := GetVariableByName('temp' + IntToStr(I));
    if aVar <> nil then
      Sum := Sum + aVar.AsInt;
  end;

  tempSum.Value := Sum;
end.
В результате выполнения данного скрипта, в переменную "tempSum", запишется сумма переменных temp0 ... temp23.

Про массивы см. по ссылке (https://simple-scada.com/forum/index.php?topic=989.msg8299#msg8299).

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: strs от 04 Октября 2021, 08:16:31
Понял, спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: 2s19 от 07 Октября 2021, 11:35:50
Товарищи помогите пожалуйста дилетанту, есть шкала от одного до 100 надо чтобы при изменении на 20 нажималось пять кнопоккрутил вертел шаблонные скрипты никак не могу кнопке значение 1 присвоить жалуется при компиляции. Хотел что то типа этого изобразить. Но пальцы кривые, извилины ровные...
begin
  case Level1.AsInt of                   // если значение переменной поля равно:
    1..20  Button1.Value = 1 else Button1.value= 0;         
    21..40   : Button2.Value = 1 else Button2.value= 0; ; 
    41..60  : Button3.Value = 1 else Button3.value= 0; ;   
    61..80   : Button4.Value = 1 else Button4.value= 0; ; 
    81..100 : Button5.Value = 1 else Button5.value= 0; ;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 07 Октября 2021, 13:34:05
2s19, стандартный компилятор своим заменил? Если нет, то в case никаких else нет и небыло никогда.
Присваивай всем кнопкам 0, а потом по кейсу нужным ставь 1.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 07 Октября 2021, 16:03:00
Добрый день. Возник вопрос.

Имеется шаблон, в котором есть картинка, анимация которой происходит один раз по нажатию на нее.
Написал универсальный скрипт: при нажатии frame = 0; animspeed = 40;
Свойства картинки: циклиность 0, кадр 0.
Все работает, но проблема в том, что если нажал на изображение, после чего перешел на другую страницу и вернулся обратно,
произойдет 1 цикл анимации, что и логично т.к. при первом нажатии я изменил animspeed = 40;

Как красиво решить проблему?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 07 Октября 2021, 22:45:19
   Здравствуйте.

Все работает, но проблема в том, что если нажал на изображение, после чего перешел на другую страницу и вернулся обратно,
произойдет 1 цикл анимации, что и логично т.к. при первом нажатии я изменил animspeed = 40;
Установить свойство animspeed в 0 можно при уходе со страницы. Сообщить экземпляру шаблона об этом можно посредством переменной, изменяющейся (доп.переменная) или вызывая событие по изменению основной при уходе со страницы.
Пример во вложении. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 08 Октября 2021, 11:24:06
Спасибо за ответ.
Проблема в том, что я использую шаблон, и эта картинка уже использует свойства "переменная" и "доп. переменная" в собственных нуждах.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 08 Октября 2021, 12:22:30
Это не проблема. :)  Можно не использовать переменные изображения, но добавить в шаблон объект связанный с переменной сброса animspeed. Правда для версий не младше  2.5.8.0 См. вложение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 08 Октября 2021, 12:36:10
Цитировать
Это не проблема. :)  Можно не использовать переменные изображения, но добавить в шаблон объект связанный с переменной сброса animspeed. Правда для версий не младше  2.5.8.0 См. вложение.
Ого, вот оно как. Понял логику. Спасибо большое.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 12 Октября 2021, 12:26:40
Еще глупый вопрос. Можно ли скрыть целиком шаблон, встроенный в окно?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 15 Октября 2021, 14:39:46
Снова добрый день. Опять за помощью. :'(

1.  Имеется необходимость управлять оборудованием с помощью импульсов.
Сперва сделал все с помощью секундных таймеров. Все работало. Решил оптимизировать и упростить вариант исполнения.
Для этого написал два скрипта:
один на кнопку, который при нажатии изменяет внешнюю переменную в 1, и ставит флаг в 1, указывая на то, что переменная меняется именно со Scadы.
второй на скрытое поле, который по изменению внешней переменной в 1 (при условии, что флаг 1) изменяет ее в 0.
Все работает.
Но есть нюанс. Если после первого нажатия на кнопку, нажать в короткий промежуток времени кнопку второй раз, второй скрипт (который как раз таки запускается по изменению внешней переменной) не выполняется второй раз и внешняя переменная остается в 1.

Я подразумеваю, что внешняя переменная просто не успевает принять нулевое значение на момент нажатия кнопки второй раз.
Как от этого избавиться? или есть другой вариант управления фронтами?

2. Есть два события. Одинарное и двойное нажатие на кнопку мыши.
Допустим мне нужно, чтобы на одну кнопку были два этих события. Один раз нажал - отрылось одно окно, два раза - другое.
Но если я назначаю эти два события на кнопку, то у меня не получается запустить только "двойное нажатие", одновременно запускается
и первое. Т.е. нет паузы после первого нажатия, событие выполняется сразу. Я все правильно понимаю?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Октября 2021, 17:20:56
Здравствуйте.

1. Подобные схемы для управления рекомендуем не использовать, т.к. они потенциально небезопасны. Например, если в Вашей схеме в переменную запишется 1 и в это время оборвется связь с ПЛК, зависнет/выключится ПК, то в ней так и останется 1 и значение не сбросится на 0, что может привести к каким-либо негативным последствиям. Если Вы хотите применять подобную схему, то сброс значения на 0 лучше производить в ПЛК. Т.е. в скаде использовать кнопку "с фиксацией" (https://simple-scada.com/help/manual/button.html) с одним состоянием, которая записывает фиксированное значение 1, а сброс на 0 производить в ПЛК. Либо можно использовать кнопку "без фиксации", тогда при нажатии в переменную кнопки будет записываться 1, а при отпускании 0(при необходимости, можно задать другие значения). А самый лучший вариант - это использовать для управления кнопку "с фиксацией".

2. Так сделать не получится, событие двойного клика всегда начинается с одиночного клика. Одновременно на одном объекте использовать оба этих события не получится.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 18 Октября 2021, 14:25:58
Спасибо за ответ.
1. Метод управления зашит в PLC, без возможности, что-либо поменять там.
Поэкспериментировал с кнопкой без фиксации. Все работает. Но есть нюанс ((:
Импульсы мне надо подавать одной кнопкой на разные переменные в зависимости от состояний флагов в PLC.
В следствии чего вместо кнопки я попытался использовать Tm_image
(при нажатии: записываю 1 в соответствующую переменную, при отпускании: записываю 0 в соответствующую переменную).
Не работает. Почему-то скрипт "onClick" выполняется только после того как я отпустил кнопку мыши, что собственно говоря аналогично методу: "OnMouseUp".
Поправьте меня, если ошибаюсь.
2. Понял.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 18 Октября 2021, 14:55:16
Почему-то скрипт "onClick" выполняется только после того как я отпустил кнопку мыши, что собственно говоря аналогично методу: "OnMouseUp".
OnClick вызывается если пользователь нажал и отпустил ЛКМ. OnMouseUp вызывается при отпускании ЛКМ. Поэтому, эти два события будут срабатывать одновременно.
OnClick - вызывается при нажатии, а затем отпускании над одним и тем же элементом (после нажатия, можно убрать указатель с элемента, отпустить кнопку и скрипт не сработает). OnMouseUp - вызывается при нажатии над элементом и отпускании в любом месте (не обязательно над элементом). Это единственная разница между ними. Т.е. OnMouseUp на практике можно использовать только если требуется по нажатию на элемент 100% выполнить скрипт.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 18 Октября 2021, 15:14:16
Понял, спасибо. Буду экспериментировать дальше.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 20 Октября 2021, 06:49:33

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

1. ... нажать в короткий промежуток времени кнопку второй раз ...
Блокировка повторного нажатия в течение некоторого временного интервала.
Цитировать
2. ... Допустим мне нужно, чтобы на одну кнопку были два этих события...
Событие по одиночному нажатию выполнится через некоторый временной интервал, при условии что в этом интервале не выполнялось событие по двойному нажатию. Действия по одиночному событию начинаются с некоторой задержкой относительно одиночного нажатия.
Алгоритм несколько проблемный из-за использования временного интервала между двумя асинхронными событиями и применим только в случае отсутствия фатальных последствий при ошибке определения кратности нажатия.  Т.е. так можно: "Одиночное нажатие - окно просмотра состояния объекта, двойное - окно изменения параметров", а так нельзя - "Одиночное нажатие - включить двигатель, двойное - выключить".

...OnClick - вызывается при нажатии, а затем отпускании над одним и тем же элементом (после нажатия, можно убрать указатель с элемента, отпустить кнопку и скрипт не сработает)...
И это можно использовать для выбора варианта действия по схеме: "пользователь нажал/дважды_нажал" - "пользователь "сдвинул" объект".

Примеры во вложении (необходимо пересохранить проект).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 20 Октября 2021, 12:05:35
Ого. Спасибо за помощь.

1. Разобрался.
2. Глянув решение в присланном проекте, разобрался, но слегка заплутал (: и не совсем понял ваш комментарий:
Цитировать
между двумя асинхронными событиями и применим только в случае отсутствия фатальных последствий при ошибке определения кратности нажатия.  Т.е. так можно: "Одиночное нажатие - окно просмотра состояния объекта, двойное - окно изменения параметров", а так нельзя - "Одиночное нажатие - включить двигатель, двойное - выключить".

Это конечно выходит за рамки понятия "Simple" Scada (; , и я вряд ли буду использовать этот метод в проекте.
При сопровождении проекта, следующий человек будет крыть меня благим матом (((;
Со стороны обывателя, данный способ не вызывает трудностей:
нажал кнопку, ждем второго нажатия, если нажатия не произошло => 1 событие, если произошло второе нажатие => 2 событие. сбрасываем таймер.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 20 Октября 2021, 19:47:05
... разобрался, но слегка заплутал (: и не совсем понял ваш комментарий:
Два асинхронных события - имеется ввиду, что временной интервал между ними имеет некоторое распределение и его среднее значение зависит от используемого ПК, что и создает проблему с величиной интервала контроля. Причем среднее очень мало зависит от загруженности сервера, в частности от количества обрабатываемых событий, объема вычислений, графики и объема архивируемых данных. А вот задержка от физического нажатия клавиши мыши до вызова скрипта по однократному нажатию, на "загнанном" сервере, может визуально составлять несколько секунд.
Событие для контроля интервала - "Прошла секунда", в свою очередь асинхронное по отношению к событию нажатия, и очень бы не хотелось тратить лишнюю секунду для гарантированного превышения интервала контроля. В алгоритме при первом, после нажатия клавиши, событии "Прошла секунда" контролируется задержка между ними, и при её достаточной величине считается, что это одиночное нажатие, в противном случае решение откладывается до следующего события "Прошла секунда".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 25 Октября 2021, 11:26:47
А можете теперь все то-же расписать, но с условием, что ExtVar может измениться "с той стороны"? Например есть еще один сервер работающий с тем-же регистром и нам надо переключить кнопки в актуальное положение? При том что щелкать по ним могут фактически одновременно. :-\
Для этого достаточно написать обратный универсальный скрипт на событие OnDataChangeEx для кнопок:

Код
begin
  if not (Sender is TM_Object) then Exit;

  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      Value := VariableEx.Value;
end.
Тогда виртуальная переменная будет всегда иметь актуальное значение и работа будет корректной.

Я так понимаю, в данной структуре уже нет необходимости после обновления, можно не использовать внутреннюю переменную?:
"улучшенная работа с внешними переменными (значение на присвоение временно хранится в оперативной памяти);"

Еще момент (;
Имеется переменная int32, биты которой управляют разными функциями. Так же биты этой переменной могут меняться из вне.
Все замечательно, все работает.
Но если методично последовательно включать/выключать эти биты, возникает ситуация:
после отправки в OPC сервер значения, PLC не мгновенно это дело обрабатывает и с неким запаздыванием возвращает ответ.
и этот ответ уже не коррелирует со значением вводимым со Scada=> вновь нажатые кнопки сбрасываются...
Как лучше решить эту проблему?


P.S. Ситуация более менее стабилизировалась при изменении опроса переменной обратной связи в 20 мс (Цикл в PLC 200мс).
до:
https://drive.google.com/file/d/1zy6FY_BrciNz-h9qFaCBbibRUd1nS8Zb/view?usp=sharing (https://drive.google.com/file/d/1zy6FY_BrciNz-h9qFaCBbibRUd1nS8Zb/view?usp=sharing)
после:
https://drive.google.com/file/d/1ciD5fKBIhy9thffB2z9OLWi0Av1OhEU2/view?usp=sharing (https://drive.google.com/file/d/1ciD5fKBIhy9thffB2z9OLWi0Av1OhEU2/view?usp=sharing)


Название: Вопросы по скриптам в Simple-Scada 2
Отправлено: msigx680 от 26 Октября 2021, 21:30:12
Здравствуйте! Помогите пожалуйста со скриптом уровня (есть переменная уровень (шкала), задача менять цвет от значения в одном скрипте):
Код
{ условия для уровня }
  begin
  if Sender is TM_Level then          // проверяем, что Sender это уровень
     with Sender as TM_Level do        // приводим Sender к типу "TM_Level"
        if AsInt < 70 then             // если перем. меньше 70, то
          BackgroundColor := clRed    // изменить цвет фона уровня на красный
             else                          // иначе
               BackgroundColor := clBlue; // изменить цвет фона уровня на синий
                end begin

                if AsInt > 98 then             // если перем. ,больше 98, то
                   BackgroundColor := clRed    // изменить цвет фона уровня на красный
                   else                          // иначе
               BackgroundColor := clBlue; // изменить цвет фона уровня на синий
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 26 Октября 2021, 22:57:41
Здравствуйте.

Цитировать
Я так понимаю, в данной структуре уже нет необходимости после обновления, можно не использовать внутреннюю переменную?
Вы процитировали очень старое сообщение 2017г. Сейчас не требуется создавать подобные скрипты при работе с битами.

Цитировать
Имеется переменная int32, биты которой управляют разными функциями. Так же биты этой переменной могут меняться из вне.
Если переменная используется для управления битами в скаде и при этом может изменяться с ПЛК, то при таком подходе в любом случае будут проблемы. В моменты, когда изменение переменной из скады и из ПЛК будет происходить близко по времени, будет создаваться впечатление, что "вновь нажатые кнопки сбрасываются". Такая же ситуация будет если к этому добавляются задержки в работе ПЛК или OPC-сервера. Немного сгладить это можно уменьшив частоту опроса переменной, но это не решит проблему полностью. Если цикл в PLC 200мс., то нет смысла задавать частоту ниже 100мс., а лучше всегда задавать максимально большую частоту опроса, которая подходит под требования проекта - это позволит снизить нагрузку на ПЛК и OPC-сервер.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 26 Октября 2021, 23:07:47
Цитировать
Помогите пожалуйста со скриптом уровня (есть переменная уровень (шкала), задача менять цвет от значения в одном скрипте):
Для подобной задачи не требуется использовать скрипты. Задайте у переменной необходимые границы (https://simple-scada.com/help/manual/varextra.html), например верхнюю аварийную 98, нижнюю аварийную 70. Затем выделите Уровень и активируйте у него свойство "Границы (https://simple-scada.com/help/manual/level.html)". После этого, уровень будет изменять цвет на красный если значение будет выше 98 или ниже 70. При необходимости можно управлять границами переменных из клиента, а также включить автогенерируемые сообщения при нарушении границ (https://simple-scada.com/help/manual/managing-bounds-var.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 29 Октября 2021, 12:47:56
Приветствую всех.
Задача в скриптах преобразовать Word в SmallInteger
Чтобы число от 0 to 65535 стало -32768 to 32767?

Нашел такой способ решения, или есть проще?
Код: (delphi)
begin
  // перевести значение переменной из шкалы "0 - 65535" в шкалу "-32768 - 32767" и вывести результат в Variable1
  if  Variable1.Value > 32767 then
    Variable1.Value := Scaling(32768,65535,-32768,-1, Variable1.Value);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 29 Октября 2021, 20:51:39
Здравствуйте.
В скаде это можно сделать без использования скриптов (если реальная шкала переменной 0..65535), используя режим масштабирования - см. описание опции "Сдвиг запятой (https://simple-scada.com/help/manual/varextra.html)" в руководстве. В Вашем случае, необходимо у переменной задать шкалу (https://simple-scada.com/help/manual/edit-scale.html) min= 0, max= 65535, перейти на вкладку "Дополнительные", включить режим масштабирования(кнопка напротив опции "Сдвиг запятой (https://simple-scada.com/help/manual/varextra.html)") и задать "Виз. минимум" = -32768, "Виз. максимум" = 32767.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 31 Октября 2021, 04:41:18
Спасибо за ответ. Знаю про эту опцию и сразу ей и пытался пользоваться, но в моем случае она "не работает". Дело в том что текущее значение внутренней переменной (которая SmallInteger) присваивается в скриптах, а масштабирование видимо работает только для внешних переменных при передаче/преобразовании от OPC в SCADA.
У меня же: -есть внешняя переменная DWORD. Потом эта переменная становится двумя внутренними WORD через HiWord и LoWord. А дальше нужно из них сделать вместо WORD два SmallInteger.
Наверное, более элегантно мою задачу не решить  ???
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Ноября 2021, 16:38:10
Да, масштабирование через настройку переменной подходит только для внешних переменных. В скриптах для этих целей нужно использовать функцию Scaling.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 02 Ноября 2021, 11:51:56
   Здравствуйте.

...Наверное, более элегантно мою задачу не решить  ???
Разобрать переменную на поля можно посредством пользовательского типа данных - записи:
Код: (delphi)
type TwoSmallint = record  SmallintLo, SmallintHi: Smallint; end;
var
  temp: TwoSmallint;
begin
    Longword(@temp)^ := LongWord(dwInput.AsInt);  // копирование "байт в байт" в переменную temp
    smiHi.Value := temp.SmallintHi;               // разбор данных по структуре записи
    smiLo.Value := temp.SmallintLo;
end.
Пример во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 02 Ноября 2021, 14:42:54
Спасибо, красиво получилось!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vigorts от 04 Ноября 2021, 20:37:49
Здравствуйте! Подскажите пожалуйста.
В скрипте "изменились переменные"  есть битовая переменная, по изменению отправляется сообщение в телеграмм.
Как распаковать на булевые, что бы по их изменению отправлялись сообщения.
От программирования далёк, только начал вникать. Хорошо бы пример. Спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vigorts от 05 Ноября 2021, 12:31:51
Разобрался.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Botsmall от 11 Ноября 2021, 17:11:05
Добрый день. Вопрос немного похож на предыдущий в этой ветке.
Как с помощью внешней переменной типа Integer изменять свойство видимости Alpha типа Byte (С учетом масштабирования).
Не могу разобраться, как привести все к одному типу данных в пределах одного скрипта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 12 Ноября 2021, 22:48:29
Здравствуйте.

В каком диапазоне меняется переменная Integer? Если в том же, что и прозрачность 0-255, то можно записывать значение переменной напрямую в свойство Alpha. Если переменная Integer меняется в другом диапазоне, то можно использовать функцию Scaling (https://simple-scada.com/help/script/scaling.html), задав в ней диапазон в котором изменяется переменная Integer в качестве исходной шкалы и 0-255 в качестве целевой шкалы. В примере ниже переменная Integer изменяется в диапазоне 0-1000, используется скрипт по событию OnDataChange и переменная привязана к основной переменной объекта.
Код: (delphi)
begin
  if Sender is TM_Object then
    with Sender as TM_Object do
      Alpha := Trunc(Scaling(1000,0,255,0, Variable.AsInt));
end.
Это универсальный скрипт, его можно использовать для других подобных объектов, назначив на событие OnDataChange.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 20 Ноября 2021, 22:58:06
Приветствую.
Вопрос такой: Есть ли возможность написать скрипт перехода на страницу "Активных сообщений", подобно переходу:
Код: (delphi)
begin
  GoToMessagesAll; // переход в меню сообщений на всех клиентах                           
end.

И еще такое заметил (ни на что не влияет в принципе):
Такое не компилируется. При сохранении проекта выдает ошибку компиляции скриптов - не совпадение типов Integer и VOID в строке 3:
Код: (delphi)
begin
Text1.Text:=IntToStr(SysGet(SYS_UNCONFIRMED_COUNT)); //кол-во неподтвержденных сообщений
Text2.Text:=IntToStr(SysGet(SYS_ACTIVE_COUNT));  //кол-во активных сообщений
end.

А вот так все компилируется и работает:
Код: (delphi)
begin
Text1.Text:=IntToStr(SysGet(0)); // или SYS_UNCONFIRMED_COUNT  в аргументе, не важно
Text2.Text:=IntToStr(SysGet(1)); // допускает только const=1. SYS_ACTIVE_COUNT - ошибка при сохранении проекта
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Ноября 2021, 20:20:44
Здравствуйте.

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

Цитировать
И еще такое заметил (ни на что не влияет в принципе):
Такое не компилируется. При сохранении проекта выдает ошибку компиляции скриптов - не совпадение типов Integer и VOID в строке 3:
У нас корректно компилируются и работают обе версии. Видимо причина в чем-то другом. Может быть в проекте есть объект (или процедура/функция) с именем как у константы SYS_ACTIVE_COUNT. Просьба выслать на support@simple-scada.com текущую версию проекта в которой воспроизводится проблема, тогда мы сможем указать точную причину из-за которой код не компилируется.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 22 Ноября 2021, 09:04:54
У нас корректно компилируются и работают обе версии. Видимо причина в чем-то другом. Может быть в проекте есть объект (или процедура/функция) с именем как у константы SYS_ACTIVE_COUNT.
Все верно, название скрипта было: SYS_ACTIVE_COUNT
 :-[
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: indevr от 26 Ноября 2021, 14:40:20
Здравствуйте.
Необходим помощь со скриптом, который возвращает значение вчерашнюю дату при открытии проекта.
Использовал из примера скрипт :
Код: (delphi)
var
  aDate: TDateTime;
begin
  aDate:= Tomorrow;
end.
значение в поле показывает текущую дату.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 26 Ноября 2021, 20:49:03
Здравствуйте.
Необходим помощь со скриптом, который возвращает значение вчерашнюю дату при открытии проекта.

Можно сделать без использования скриптов. Для этого нужно использовать внутреннюю переменную созданную через редактор переменных (https://simple-scada.com/help/manual/variable-editor.html) с типом данных "DateTime" и указать в "Начальное значение (https://simple-scada.com/help/manual/varmain.html#:~:text=%E2%80%A2-,%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5,-%2D%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8F%D0%B5%D1%82%2C%20%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC%20%D0%B1%D1%83%D0%B4%D0%B5%D1%82)" "Yesterday"(Возвращает предыдущий день). Затем привязать эту переменную к необходимому полю. См. скриншот во вложении.

Или использовать скрипт на событие "Запуск проекта (https://simple-scada.com/help/script/launch-project.html)". Если "Поле" связано с переменной типа "DateTime", то скрипт будет такой:
Код: (delphi)
begin
  vrDate.Value := Yesterday;
end.
Где " vrDate" это переменная созданная через редактор переменных (https://simple-scada.com/help/manual/variable-editor.html) с типом данных "DateTime".

Если нужно вывести дату без использования переменной, то можно использовать скрипт на событие "Запуск проекта (https://simple-scada.com/help/script/launch-project.html)":
Код: (delphi)
begin
  Field1.Text := DateToStr(Yesterday);
end.
Где Field1 это поле в которое необходимо вывести дату.

Но, для вывода даты/времени удобнее всего использовать компонент "Календарь (https://simple-scada.com/help/manual/calendar.html)", у него можно задать необходимый формат отображения даты/времени, а также при необходимости настроить внешний вид аналогичный компоненту "Поле".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: indevr от 29 Ноября 2021, 10:00:27
Большое спасибо, получилось. :)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Rindzin от 29 Ноября 2021, 12:57:48
Добрый день.
Как добавить в редакторе скриптов в меню "Вставить код" свой код?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 30 Ноября 2021, 10:06:18
Здравствуйте.

Свой код в данное меню добавить нельзя и добавление такой возможности не планируется.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: VladislavVladimirovich от 01 Декабря 2021, 21:33:03
Коллеги, здравствуйте!
Возникла необходимость написать скрипт, создающий таблицу имя которой является переменной вводимой в поле.
Пробовал разные варианты вроде :

Код: (delphi)
aQuery := 'CREATE TABLE IF NOT EXISTS' + QuotedStr(table_name.AsStr) + ' (' +
    '`id` INT NOT NULL AUTO_INCREMENT,' +
    '`magn_rec` VARCHAR(45) NOT NULL,' +
    '`servo_rec` VARCHAR(45) NOT NULL,' +
    '`gas_rec` VARCHAR(45) NOT NULL,' +
    '`comment` VARCHAR(60) NULL,'+
    'PRIMARY KEY(`id`),' +
    'UNIQUE KEY `name_UNIQUE` (`id`)' +
    ') ENGINE=InnoDB DEFAULT CHARSET=utf8;';
Скрипт всегда компилируется, но запрос не выполняется, выдает ошибку синтаксиса sql.

В тексте выше строковая переменная являющаяся именем таблицы - table_name.
Если не пытаться использовать "переменное" имя, то скрипт нормально работает и таблица создается. Прошу подсказать как решить вопрос
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 02 Декабря 2021, 09:37:58
Здравствуйте.
Код: (delphi)
aQuery := 'CREATE TABLE IF NOT EXISTS' + '`' + table_name.AsStr + '`' + ' (' +
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 02 Декабря 2021, 12:40:52
Вопрос про архивы.
Код
Pump1DayReport : ARRAY [1..366] OF TDateTime
; - объявлено в unit GlobalModule;
kns_12_worktime1day_1 - архивируемая переменная в редакторе.
Хочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия.
Код
ArchiveValueByTime(kns_12_worktime1day_1, Pump1DayReport[i - 1], aDate);

Как обыграть? Пока ошибка несоответствия типов. Спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: engineer0800 от 02 Декабря 2021, 16:34:33
Добрый вечер!
Появилась такая проблемма с отправкой СМС.
На телефон Андроид сообщения приходят, а на служебный кнопочный старый телефон НЕ приходят.
GSM модем Телеофис RX101-R4.
Галочки: "ждать ответа" и "менять режимы" испробовал.
Запись сообщений в кирилице и латинице испробовал.
Скрипт:
Код: (delphi)
begin
alarm_1.Value:=GetBit(bity_ot_skvazhiny.AsInt,2); // Авария частотника скважина 1
// Авария частотника скважина 1
 if alarm_1.Value then
    begin
     if not Memory_alarm_1.Value then // не отсылалась смс
      begin
       SendSMS('79024194140','Авария частотника скважина 1');
       slovo_1.Value:=SetBit(slovo_1.AsInt,2,true);
       Memory_alarm_1.Value:=True;
      end
     else
      begin
       slovo_1.Value:=SetBit(slovo_1.AsInt,2,false);
      end;
    end
 else
   begin
    Memory_alarm_1.Value:=False;
   end;                                   
end.
Буду рад подсказкам с вашей стороны.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 02 Декабря 2021, 22:50:05
Здравствуйте.

Цитировать
Хочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия. Как обыграть? Пока ошибка несоответствия типов.
Ошибка несоответствия типов возникает из-за того, что у Вас массив имеет тип TDateTime, а результат ArchiveValueByTime должен записываться в переменную(TM_Variable) - см. описание по ссылке (https://simple-scada.com/help/script/archivevaluebytime.html). Через массив данную задачу решить не получится. В любом случае придется создать необходимое количество внутренних переменных для хранения результатов ArchiveValueByTime. Можно назвать их однотипно, тогда можно будет в цикле вызвать ArchiveValueByTime и записать результаты в нужные переменные используя функцию GetVariableByName (https://simple-scada.com/help/script/getvariablebyname.html), например:
Код: (delphi)
var
 I: Integer;
 aVar: TM_Variable;
begin
  for I := 1 to 10 do
  begin
    aVar := GetVariableByName('MyVar' + IntToStr(I));
    if aVar <> nil then   // если переменная существует
      ArchiveValueByTime(kns_12_worktime1day_1, aVar, aDate);
  end;
end.
, после чего можно проверять значение требуемой переменной. Также, учитывайте, что ArchiveValueByTime это архивная процедура. Не рекомендуется вызывать их слишком часто и в больших количествах.


Цитировать
Появилась такая проблемма с отправкой СМС. На телефон Андроид сообщения приходят, а на служебный кнопочный старый телефон НЕ приходят.
Ни скада-система, ни модем не знают и не могут знать/определить, на какой именно телефон производится отправка. Отправка всегда производится одинаково - по указанному номеру телефона и никак не зависит от типа телефона, его возраста и т.д. Если на один из телефонов SMS приходят, то значит отправка SMS настроена корректно и нужно разбираться со вторым телефоном. Проверьте, что на этот телефон вообще приходят SMS, например отправьте на него SMS с другого телефона. Убедитесь, что при тестировании у Вас точно выполняются условия скрипта. Лучше всего при тестировании использовать простейший скрипт по клику на кнопку, без каких либо условий, например:
Код: (delphi)
begin
   SendSMS('79024194140','Авария частотника скважина 1');                             
end.
, установите данный скрипт на клик первой кнопки и аналогичный скрипт на клик второй кнопки, после чего производите тестирование. Проверьте, что Вы точно правильно указываете номер телефона. Возможно, после внесения изменений в проект/скрипты Вы не перезапустили проект, тогда причина в этом. При внесении изменений в проект его необходимо перезапустить на сервере скады (https://simple-scada.com/help/manual/server-project.html).

Цитировать
Галочки: "ждать ответа" и "менять режимы" испробовал. Запись сообщений в кирилице и латинице испробовал.
Не нужно просто так менять настройки отправки - их изменение имеет смысл только в случае если отправка SMS не работает. Верните настройки по-умолчанию и протестируйте, если хотя бы на один телефон SMS приходит, то настройки корректные и нужно разбираться со вторым телефоном. Также, при изменении настроек нужно обязательно перезапустить сервер скады (https://simple-scada.com/help/manual/server-status.html), чтобы изменения вступили в силу.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 03 Декабря 2021, 00:48:57
    Здравствуйте.
Хочу в отдельном скрипте в цикле выдергивать архивные значения в массив, далее по изменению интересующего элемента массива производить действия.
Функция ArchiveValueByTime() асинхронная, так просто в цикле она работать не будет. Для синхронизации с циклом можно предварительно переменной-результату присвоить незначимое значение (вне области возвращаемых значений), вызвать функцию и получить правильный результат по событию "Изменилась переменная-результат" с игнорированием незначимого значения.
Во вложении пример заполнения таблицы и массива архивными значениями за каждый день в течение года. Выбирается год (2019..2022) и часы-минуты первого вычисления, далее с периодом ровно один день. Правильно учитывается длина года. Функция, предположительно, не экстраполирует "в будущее", т.е. просто не возвращает значение и цикл не завершается (2021,2022). Для завершения можно использовать тайм-аут или ограничивать цикл по предварительно полученному из БД максимальному значению временной метки переменной.
Предварительно необходимо подключить свою базу данных.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 07 Декабря 2021, 11:22:03
Приветствую. Есть ли возможность добавлять знаки табуляции в формируемую строку для дальнейшей записи ее в файл?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 07 Декабря 2021, 12:54:57
Здравствуйте.

Код: (delphi)
var
  aText: String;

begin
  aText := 'Часть строки' + #9 + 'Вторая часть строки';
  { прервать скрипт если файл по стандартному пути не существует }
  if not FileExists('MyTextFile.txt', '') then
    Exit;

  { открыть файл для записи }
  TextFileOpen('MyTextFile.txt', '', fomRewrite, fcpUTF8);

  { записать в файл строку "aText" }
  TextFileWriteLn(aText);

  { закрыть файл }
  TextFileClose;

end.

Где #9 - обозначение знака табуляции.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 07 Декабря 2021, 13:25:58
Какая-то справка по подобным символам существует?)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 07 Декабря 2021, 14:55:15
Какая-то справка по подобным символам существует?)
Да, таблица ASCII
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 08 Декабря 2021, 12:41:33
Помогите с преобразованием типов, запутался.
В ячейке таблицы есть запись в формате 'чч:мм:сс'. Хочу дернуть это значение, преобразовать в секунды и дальше уже делать с этим значением разную математику.
Преобразование из Table1.Columns[0].Cells[0].Text в секунды это? Различные варианты StrTo* испробовал, все что-то не то.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 08 Декабря 2021, 20:02:19
Здравствуйте.

Например, можно использовать методы для работы с датой/временем, которые описаны здесь (https://simple-scada.com/help/script/datetime.html). Есть функции для извлечения часов/минут/секунд из значения TDateTime:
Код: (delphi)
var
  aTime: TDateTime;
begin
  aTime := StrToTime(Table1.Columns[0].Cells[0].Text);
  MyVar.Value :=  HourOf(aTime) * 3600 + MinuteOf(aTime) * 60 + SecondOf(aTime);
end.

Но если, как Вы писали ранее в этой теме (https://simple-scada.com/forum/index.php?topic=1301.0) значение в секундах изначально содержится в какой-то переменной, то используйте в расчетах эту переменную.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 08 Декабря 2021, 23:58:44
      Здравствуйте.

Преобразование из Table1.Columns[0].Cells[0].Text в секунды это? Различные варианты StrTo* испробовал, все что-то не то.
Можно так:
Код: (delphi)
 MyVar.Value := SecondsBetween(StrToTime(Table1.GetCell(0, 0).Text), 0));
Функция StrToTime возвращает, для корректного значения параметра, дробную часть Double числа. См. вложение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 15 Декабря 2021, 07:25:28
Фильтр скользящее среднее для булевых сигналов работает? Хочу фильтровать сигнал на случай пропадания связи не более 1 минуты.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Декабря 2021, 10:21:05
Здравствуйте.

Фильтры для переменной будут корректно работать только с аналоговыми значениями.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 15 Декабря 2021, 11:55:52
Подскажите решение. Хочу игнорировать FALSE в течение минуты, если FALSE держится больше минуты, то принимаю это значение FALSE.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 15 Декабря 2021, 12:03:20
Хочу игнорировать FALSE в течение минуты
Таймер.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 15 Декабря 2021, 16:23:51
Здравствуйте.
Хочу игнорировать FALSE в течение минуты, если FALSE держится больше минуты, то принимаю это значение FALSE.

Подобные задачи правильнее и проще решить на контроллере, а не на скаде. Но можно решить эту задачу с помощью скады. Например, можно:
1. Создать новую внутреннюю переменную типа Integer для отсчета секунд, например с именем vrTimer;
2. Создать скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)" и добавить в него Boolean переменную как это описано по ссылке (https://simple-scada.com/help/script/changemulvar.html). Т.е. скрипт будет выполняться при каждом её изменении. В скрипте присваивать в переменную vrTimer значение 60:
Код: (delphi)
begin
  if (Variable.AsBool = False) and (IsFirstChange = False) then
    vrTimer.Value := 60;
end.
3. Создать скрипт с типом события "Прошла секунда (https://simple-scada.com/help/script/second-passed.html)" со следующим кодом:
Код: (delphi)
begin
  if vrTimer.AsInt > 0 then
  begin
    // отсчитываем секунды
    vrTimer.Value := vrTimer.AsInt - 1;
    if vrTimer.AsInt = 0 then
    begin
      // Код размещенный здесь будет выполняться
      // Если boolean переменная = False в течение 60 секунд
    end;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 20 Декабря 2021, 17:08:48
Добрый день, сегодня поставил последнюю версию 2.5.5.14 и понеслось, суть проблемы в том что ранее стояла 2.5.5.0 и проблем не было,  и так связка опс сервер овен + симпле скада + модуль овен аналоговый выход м110......6у,  теперь как только запускаю скаду и начинаю задавать переменную , обмен с модулем падает и  опс выдает , что модуль (устройство вернуло ошибку) пробовал откатится до 2.5.5.0  ,  не помогло , опс так же обновил- не помогло, пол дня пытался понять, что и как ,  и получается, с остановленным сервером  скады, все ок, можно задавать усттройству значение, как только запускаю скаду- , связь падает в бэд, убрал задание с помощью скрипта, повесил на  филд , задает  значение модулю , но  1 раз в 5 попыток ,  пробовал через скрипт задавать переменной  фиксированное значение ---  значение всегда бэд. Буду пробовать откатывать систему, другого выхода не вижу, понимаю  проблема в  передачи  данных от скады до устройства , т..е. скада задает такой значение, на какое ругается устройство .
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Декабря 2021, 18:23:02
Здравствуйте.

Скада, касаемо работы с OPC-серверами (независимо от её версии) может только:
1. Получать данные от OPC-сервера. Для этого скада после подключения подписывается на изменения группы переменных и просит OPС-сервер передавать изменения в скаду с заданной частотой;
2. Записывать данные в переменные. Для этого скада посылает запросы к OPC-серверу с "просьбой" выполнить запись определённого значения в заданную переменную. Попытки записи выполняются только в том случае если Вы меняете значение переменных через компоненты (Поле, Кнопка, Уровень, Календарь и т.д.), либо через скрипты.

Цитировать
запускаю скаду и начинаю задавать переменную , обмен с модулем падает и  опс выдает , что модуль (устройство вернуло ошибку)
Скада никак не может самостоятельно повлиять на ошибки устройства. См. описание выше, скада подписывается на теги (с заданной частотой), которые Вы добавили в проект, а также выполняет запись так, как сделано в проекте. Например, если OPC-сервер (или конечное устройство) выдаёт ошибку из-за того, что скада подписалась на слишком большое количество переменных, то со стороны скады можно только уменьшить количество переменных в проекте. Если OPC-сервер (или конечное устройство) выдаёт ошибку из-за попытки записи в какую-то переменную, или из-за слишком большого количества операций записи, то со стороны скады можно только убрать запись в переменные через скрипты или объекты мнемосхемы, изменив проект.

Цитировать
пробовал откатится до 2.5.5.0, не помогло
Так и должно быть, т.к. версия скады явно не связана с описанной ситуацией. Не поможет даже откат до первой версии скады, т.к. все базовые функции не менялись с первой версии. И последняя версия скады читает и записывает данные также, как первая, в соответствии со спецификацией OPC.

Цитировать
с остановленным сервером  скады, все ок, можно задавать устройству значение, как только запускаю скаду- , связь падает в бэд, убрал задание с помощью скрипта, повесил на  филд , задает  значение модулю , но  1 раз в 5 попыток
Здесь только три варианта: первый - значение изменяемой переменной перезаписывается в скриптах проекта; второй - оно перезаписывается на ПЛК. Например, Вы записываете значение 5 и оно сразу перезаписывается другим значением (например 0) из скрипта скады или в программе ПЛК. Третий вариант: OPC-сервер не записывает значение из-за какой-то существенной проблемы (с устройством, состоянием сети и т.п.). В этом случае он обычно возвращает ошибку в журнал сервера скады (https://simple-scada.com/help/manual/server-journal.html), либо в свой собственный лог.
Первый вариант очень легко проверить: создайте новый проект без скриптов, добавьте в него переменную, которая записывается раз в пять попыток. Запустите созданный проект и проверьте запись. Если в новом проекте все записи выполняются корректно, значит в старом проекте переменная перезаписывается через скрипты и нужно исправлять код скриптов.

Цитировать
т..е. скада задает такой значение, на какое ругается устройство.
Все значения задаются либо пользователем проекта, через управляющие компоненты, либо через скрипты. Других вариантов записи значений во внешние переменные нет. Если устройство ругается на какие-то значения, то либо удалите из проекта скрипты в которых выполняется попытка записи некорректных значений, либо удалите объекты мнемосхемы, через которые пользователь вводит некорректные значения. Или измените их так, чтобы пользователь не мог ввести некорректные значения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 21 Декабря 2021, 11:29:10
Считаю все  вышесказанное , правильно , но, судите  сами :
1)до обновления все работало , после упало
2) далее , если создать новый проект  и оставить 1 устройство все работает, 
3)но в моём проекте , где все было хорошо , после обновы не работает, проект соответственно  в начале создавался не в этой версии, а существенно раньше (в этом думаю и проблема)
4)повторюсь даже если с  поля задавать , то задает  1 раз с 5-ти попыток , остальное показывает, что  переменная не доступна (!), после подтверждения  кнопкой ентер, явно даже  видна проблема, при задании без скриптов, напрямую в тэг.
5) далее, установил на ноут, где ногда не было новой версии , версию 2.5.5.0 , и  подкинул проект , без изменений  с рабочей станции , и о чудо , все снова заработало ,

Теперь просьба разработчикам , как мне  вернуть рабочее состояние на рабочей станции, и не надо говорить , что по линии обмена  с опс сервером , ничего не изменилось, это неправда, изменения  явно есть !!!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Декабря 2021, 12:42:31
К сожалению мы не знаем как можно ещё дополнить предыдущий ответ по данному вопросу. Как можно изменить работу с OPC-серверами не нарушая спецификации OPC также непонятно. Если Вы не доверяете нашим ответам, то можно предложить следующие варианты:
1. Оставаться на версии 2.5.5.0 и не устанавливать будущие обновления;
2. Сделать снимки трафика через Wireshark (или подобное ПО) и самостоятельно убедиться что в работе скады по OPC в новой версии (в плане записи и чтения данных) ничего не изменилось.
Можем также проверить проект на наших ПК с тестовыми устройствами, а также проверить правильность скриптов, если Вы вышлите текущую версию проекта. Также можем проверить логи сервера скады из папки "Logs\", возможно в них есть что-то полезное.

Цитировать
2) далее , если создать новый проект  и оставить 1 устройство все работает,
3)но в моём проекте , где все было хорошо , после обновы не работает
Очень похоже на то, что причина проблемы именно в рабочем проекте (например в скриптах), ведь новый проект работает. Другой вариант: проблема связана с OPC-сервером и возможно зависит от количества используемых тегов (или частоты опроса и т.п.). Вы уверены, что с OPC-сервером или компонентами OPC Core Components всё в порядке?

Цитировать
5) далее, установил на ноут, где ногда не было новой версии , версию 2.5.5.0 , и  подкинул проект , без изменений  с рабочей станции , и о чудо , все снова заработало ,
Это просто неполный тест и основанные на нём выводы. Может быть проект также работал бы, если установить на ноутбук последнюю версию? Если проверять варианты и выполнять сравнения, то нужно проверять оба варианта, а не один. Также нужно отталкиваться от ошибки которую выдаёт устройство, или OPC-сервер. Что это за ошибка, о чем она говорит, в каких случаях она выдаётся согласно документации OPC-сервера (или устройства). Тогда можно было бы понять как её избежать и что вообще нужно проверять.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 21 Декабря 2021, 14:54:47
Все понятно, но  помогайте мне найти выход, и так, вы оказались правы, на ноуте и новая версия заработала, тем самым еще более загнав меня в тупик,  на рабочей станции ,опс компоненты установлены( и переустановлены), ошибка опс (на рабочей станции)гласит, ( ошибка 3 , устройство  вернуло ошибку, недопустимое значение в запросе) , что не так может быть в проекте, если на ноуте он заработал  с разными версиями программы, на  рабочей станции на опс сервере пробовал отключать половину устройств, даже скажу больше, отключал все , кроме нужного, это про предположение про переполнение. Единственное заметил, что на ноуте, стоит просто куча  опс компонентов, разных версий, от другого софта. И еще хотелось бы понять, почему проблема именно с одним типом модулей , и подскажи, а как то можно увидеть обмен, скада -опс.  В логах, нет ничего интересного.


Решил вопрос,  оказался скрипт, действительно ,  и банально ,  устройство ждало от скады инт16, а  скада давала  скорее всего , со знаком после запятой, хотя, в настройках тэга , стоял чисто 0, в итоге поставил округление ,и все нормально , но знаете , что   обидно , больше всего и  эта проблема вашей скады ,  что с начала все  работает (пусть скрипт с багом) , скрипт, а потом, после например обновления, перестает , или как в моем случае, на ноуте работает, а на рабочей станции нет, и не понятно куда бежать , ведь работало все, без ошибок.....
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 21 Декабря 2021, 21:41:45
Это уже привычная для нас ситуация, когда после обновления скады на почту тех. поддержки и форум в течение примерно 2 недель приходят разные сообщения от пользователей о том, что после обновления скада всё сломала, даже то, что её не касается. Такими темпами скоро выяснится, что обновление скады изменило погоду.

Цитировать
вы оказались правы, на ноуте и новая версия заработала
Не удивительно, ведь проблема не касается версии скады. Поэтому на рабочем ПК откат на предыдущую версию ничего не изменил, ведь обе версии работают одинаково. И на ноутбуке обе версии работают тоже потому, что проблема не касается обновления. Вы можете переустанавливать их до бесконечности и они всегда будут работать одинаково.

Цитировать
Единственное заметил, что на ноуте, стоит просто куча  опс компонентов, разных версий, от другого софта.
В разнице, судя по всему и заключается проблема. На одном ПК у Вас всё установлено и работает правильно. На другом чего-то не хватает, либо установлено неправильно. Например, можно установить на один ПК 32-битные компоненты OPC Core, на другой 64-битные. И оба ПК уже будут работать по-разному. Причем всё будет вроде бы работать, но с чудесами, как Вы примерно и описываете. Подобных примеров может быть много. Чтобы решить проблему нужно найти, чем рабочий ПК отличается от нерабочего и на проблемном ПК установить всё так, как на правильно работающем. Если разобраться не получается, то проще всего установить чистую ОС и все компоненты.

Цитировать
а  скада давала  скорее всего , со знаком после запятой, хотя, в настройках тэга , стоял чисто 0
Скада может что-то давать со знаком после запятой, только если Вы будете записывать в переменную вещественное число (или переменную), например vrA.Value := 0.01. Других вариантов нет и от версии скады не зависит.

Цитировать
больше всего и  эта проблема вашей скады, что с начала все  работает (пусть скрипт с багом) , скрипт, а потом, после например обновления, перестает
Как мы уже неоднократно писали - все версии скады выполняют присвоения абсолютно одинаково и сделать как-то по-другому нельзя, т.к. есть стандарт. Мы не меняли процесс присвоения начиная с первой версии и не будем его менять в будущих версиях, это невозможно  сделать не нарушая работу. Верить нам не нужно, см. сообщение выше, возьмите любое ПО для снимка сетевого трафика и сверьте данные которые посылают к OPC-серверу разные версии скады.
Однако рекомендуем присмотреться к другим SCADA-системам и не устанавливать будущие обновления скады, потому что после очередного обновления и не такое покажется.

Цитировать
или как в моем случае, на ноуте работает, а на рабочей станции нет, и не понятно куда бежать
Скада не знает, установлена она на ноутбук, или на рабочую станцию, или ещё на какой-то ПК. Это программа, которая на всех ПК делает одно и то же и посылает одинаковые запросы. Вы уже сами в этом убедились, но сделали прямо противоположные выводы. Почему OPC-сервер на одном ПК передаёт значение устройству правильно, а на другом с ошибкой (если это вообще так) - нужно спросить у разработчиков OPC-сервера, потому что скада в двух случаях посылает OPC-серверу один и тот же запрос. Или может быть дело вовсе не в ПК и его ПО, а в том, что "неправильное" присвоение выполняется по условию и это условие срабатывает только на рабочем ПК. Но и это от версии скады не зависит.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: gis от 22 Декабря 2021, 11:43:38
Добрый день, подскажите как сделать универсальный скрипт для объекта Календарь, чтобы запускать таймер для, отображаемой в нем, переменной DateTime, по булевой перенной (её я обозначаю как доп. переменную для объекта). Неясно как связать их внутри универсального скрипта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 23 Декабря 2021, 11:30:47
Здравствуйте.
подскажите как сделать универсальный скрипт для объекта Календарь, чтобы запускать таймер для, отображаемой в нем, переменной DateTime, по булевой перенной (её я обозначаю как доп. переменную для объекта).
Например, на событие OnDataChangeEx, написать такой скрипт:
Код: (delphi)
var
  aVar: TM_Variable;
begin
  if Sender is TM_Calendar then
    with Sender as TM_Calendar do
      begin
        aVar := Variable;
        if VariableEx.AsBool then  // в зависимости от доп. переменной календаря
          TimerStart(aVar, 0)      // запускаем таймер по основной переменной календаря
        else
          TimerReset(aVar);        // и останавливаем таймер по основной переменной календаря
      end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: fp от 16 Марта 2022, 08:39:59
Добрый день! Подскажите, пож-та, возможно ли получение данных с помощью SQL запросов от другой бд? Т.е. не от той, к которой настроено подключение...
Вероятнее всего нельзя, но тогда возможно ли выполнить SQL запрос на переключение к другой бд - "use ...;" перед выполнением запроса и обратное переключение после выполнения запроса? Не вызовет ли это ошибки при архивации, если автоматически запрос на сохранение попадет в момент переключения на другую бд?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 16 Марта 2022, 09:51:00
Добрый день! Подскажите, пож-та, возможно ли получение данных с помощью SQL запросов от другой бд? Т.е. не от той, к которой настроено подключение...
А почему нет? Если у пользователя есть права на другую БД, проблем быть не должно.
Что-то такое точно работать будет:
Код
select name from db1.components a where a.ID in (select id from db2.bunkers);
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Марта 2022, 10:00:36
Подскажите, пож-та, возможно ли получение данных с помощью SQL запросов от другой бд? Т.е. не от той, к которой настроено подключение...
USE лучше не использовать, вместо этого укажите имя БД в запросе перед именем таблицы, как описал выше Victor_P..
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: fp от 16 Марта 2022, 12:48:02
Отлично, спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ART63 от 16 Марта 2022, 13:52:39
Цитировать
USE лучше не использовать, вместо этого укажите имя БД в запросе перед именем таблицы, как описал выше Victor_P..

Правильно я понимаю, что это будет работать только при условии, что обе БД на одном сервере расположены?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Victor_P. от 16 Марта 2022, 15:00:45
Правильно я понимаю, что это будет работать только при условии, что обе БД на одном сервере расположены?
По идее можно прилинковать и другой сервер к используемому.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: mihanikus45rus от 25 Марта 2022, 11:10:24
Добрый день. Из за чего может возникать такая ошибка - "Telegram. EC: 400. SendTelegram error: HTTP/1.1 400 Bad Request, ChatID: 892141957". Добавил нового пользователя в список получателей(восьмого по счёту), и только ему не доходят сообщения.

Дополнительно - при добавлениии пользователя(нажимает старт в боте), в настройках скады ему присваивается 10 значный ID. Тестовое сообщение приходит. После сохраняю настройки, захожу заново - ID 9 значный. Сообщения не приходят. В самом телеграмме ID как первый раз присвоено было. Версия скады - 2.5.15.0
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Марта 2022, 15:05:07
Здравствуйте.
Нашли ошибку при сохранении настроек, было лишнее ограничение по величине значений ChatID. Сделаем исправление в ближайшее время.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: mihanikus45rus от 25 Марта 2022, 15:24:16
Спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ACHE от 27 Марта 2022, 15:34:49
Здравствуйте.
Скажите пожалуйста, можно ли отправлять созданный автоматически отчет на почту в формате XLS, а не в PDF?
Пока работает такой скрипт (каждый день формируется отчет, сохраняется в ексель на сервер, отправляется на почту пдф):
Код: (delphi)
var
  aReport: TM_Report;
  aMail: TM_Mail;
begin
    if HourOf(Now) <> 15 then Exit;
   
DateEndAuto.Value := RecodeTime(Now, 14, 5, 0, 0);

  aReport := ReportBuild('Gagarina_sutki');
  aReport.UseOnePageHeaderAndFooter := 1;
  aReport.ExportPageBreaks := 1;
  aReport.Save(SS_SERVER_NAME, 'Отчет Гагарина за ' + DateTimeToFileName(Now, ''), 'C:\Отчеты Асино\Гагарина\', rfExcel2007);
  aMail := SendMail('Simple-Scada', 'Ежедневный отчет по энергоресурсам Гагарина', 'Отчет создан автоматически.');
  aMail.AttachReport(aReport, 'Отчет Гагарина за ' + DateTimeToFileName(Now, ''));

end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 28 Марта 2022, 11:22:39
Здравствуйте.
 
Используя AttachReport можно отправить отчет только в формате PDF. Если требуется обязательно отправлять в письме отчет в Excel, то нужно в скрипте сохранить его в Excel, дождаться построения и сохранения отчета и только после этого отправлять его. Для этого, в Вашем случае можно формировать и сохранять отчет как указано в скрипте в 15:00, а производить отправку, к примеру через 5 минут, в 15:05, когда отчет точно будет сформирован и сохранен. Прикрепить к письму файл отчета можно при помощи команды AttachFile - пример скрипта можно посмотреть по ссылке (https://simple-scada.com/help/script/index.html?sendmail.html#ex2).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ACHE от 28 Марта 2022, 14:50:31
Прикрепить к письму файл отчета можно при помощи команды AttachFile[/url].

В имени файла используется "+ DateTimeToFileName(Now, '')", так же в конце имени отчёта в скобках проставляется уникальный номер. Как с этим быть?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 28 Марта 2022, 15:20:23
Можно создать внутреннюю переменную с типом данных String и записывать в нее имя файла при формировании отчета. Например:
Код: (delphi)
var
  aReport: TM_Report;
  aMail: TM_Mail;
begin
  if HourOf(Now) <> 15 then Exit;

  vrFileName.Value := 'Отчет Гагарина за ' + DateTimeToFileName(Now, '');

  DateEndAuto.Value := RecodeTime(Now, 14, 5, 0, 0);
  aReport := ReportBuild('Gagarina_sutki');
  aReport.UseOnePageHeaderAndFooter := 1;
  aReport.ExportPageBreaks := 1;
  aReport.Save(SS_SERVER_NAME, vrFileName.AsStr, 'C:\Отчеты Асино\Гагарина\', rfExcel2007);
end.
, где vrFileName - это внутренняя переменная String. Затем эту переменную можно использовать при отправке e-mail.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ACHE от 28 Марта 2022, 19:13:26
где vrFileName - это внутренняя переменная String. Затем эту переменную можно использовать при отправке e-mail.

Тыкните носом до конца уже пожалуйста)) всяко пытался приложить файл, никак не получается.
Делал так:
Код: (delphi)
aReport.Save(SS_SERVER_NAME, FileNameReport.AsStr, 'C:\Отчеты Асино\Гагарина\', rfExcel2007); //работает, читаю переменную FileNameReport, имя пишется правильно, файл сохраняется
aMail := SendMail('Simple-Scada', 'Отчет по энергоресурсам Гагарина', 'Отчет во вложении', Email.Value);
aMail.AttachFile('C:\Отчеты Асино\Гагарина\'+FileNameReport.Value); //письмо приходит пустое

Для теста разделял скрипты, один формирует, второй отправляет по нажатию кнопки. Кириллические символы в пути к файлу и в имени могут влиять?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 29 Марта 2022, 10:48:01
К имени прикрепляемого файла нужно добавить расширение ".xlsx". Также следует учитывать, что нужно использовать явное приведение значения переменной к нужному типу. Например, в Вашем случае использовать приведение в строку (свойство AsStr):
Код: (delphi)
aMail.AttachFile(' C:\Отчеты Асино\Гагарина\ ' + FileNameReport.AsStr + '.xlsx');

Чтобы все работало корректно, нужно производить отправку e-mail только после сохранения файла отчета. Если вызвать сохранение отчета в Excel и отправку файла отчета на e-mail в одном скрипте, то скрипт выполнится мгновенно, на момент отправки файла отчет не успеет сохраниться и отправлять будет нечего. Поэтому можно формировать и сохранять отчет как указано у Вас в скрипте в 15:00, а производить отправку, к примеру через 5 минут, в 15:05, когда отчет точно будет сформирован и сохранен. Создайте отдельный секундный скрипт для отправки отчета, например:
Код: (delphi)
var
  aMail: TM_Mail;
begin
  if (HourOf(Now) = 15) and (MinuteOf(Now) = 5) then   // если сейчас 15:05
    if FileNameReport.AsStr <> '' then 
    begin
      FileNameReport.Value := '';
      aMail := SendMail('Simple-Scada', 'Ежедневный отчет по энергоресурсам Гагарина', 'Отчет создан автоматически.');
      aMail.AttachFile(' C:\Отчеты Асино\Гагарина\ ' + FileNameReport.AsStr + '.xlsx');
    end;
end.
Чтобы отправка выполнилась однократно, можно использовать переменную FileNameReport и после отправки сбрасывать ее.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: fp от 06 Апреля 2022, 08:43:03
Добрый день!
Подскажите, пожалуйста, возможно ли при открытии (переход через скрипт) страницы с трендом или страницы трендов установить начальную точку для отображения трендов на этой странице и интервал?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 06 Апреля 2022, 10:36:32
Здравствуйте. Такой возможности нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Raa от 09 Апреля 2022, 10:09:25
Здравствуйте. Такой возможности нет.
Очень зря.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Avtovazov от 30 Мая 2022, 09:03:24
Добрый день
Помогите пожалуйста со скриптом. Задача следующая мне нужно сделать так, чтоб выполнилась математическая функция например вычитание одной переменной из другой, но условием которое разрешит делать это вычитание должно быть, чтоб одна переменная имела статус TRUE, а другая переменная должна изменить свое состояние и вернуться в изначальное (т.е. стать true потом false, симитировать импульс кнопки без фиксации) и только после этого выполнится вычитание?
Ниже скрипт который мне нужен, только немогу понять как сделать так, чтоб только после того как К2 станет true  затем false происходило вычисление

Код: (delphi)
begin
if (k1.AsBool = true) and (k2.AsBool = true) then
vrC.Value := vrA.AsSingle -  vrB.AsSingle
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Виктор К от 30 Мая 2022, 09:58:16
Цитировать
В скриптах с типом "Изменились переменные" можно использовать функции IsFirstChange, PrevAsBool, PrevAsInt, PrevAsFloat, PrevAsStr.
Используйте функцию PrevAsBool (https://simple-scada.com/help/script/prevasbool.html)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Avtovazov от 30 Мая 2022, 12:15:56
А как это записать правильно в моем скрипте, мне нужно чтоб переменная К2 поменяла состояние и вернула изначальное?
Код: (delphi)
begin
if (k1.AsBool = true) and (k2.AsBool = true) then
vrC.Value := vrA.AsSingle -  vrB.AsSingle
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Виктор К от 30 Мая 2022, 13:14:27
Скрипт изменились переменные на переменную к2. Если предыдущее значение к2=истина, а новое ложь и к1=истина, то выполняем действие.
Код: (delphi)
begin
  if ((k1.AsBool) and (PrevAsBool) and (k2.AsBool=false)) then
     vrC.Value := vrA.AsSingle -  vrB.AsSingle;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Avtovazov от 30 Мая 2022, 13:19:03
Огромное спасибо, это потрясающе!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 30 Мая 2022, 13:32:30
Только, наверное, там где (PrevAsBool), должно быть (k2.PrevAsBool) ?
Или и так будет правильно работать?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Виктор К от 30 Мая 2022, 13:42:45
Нет, функция применяется к переменной вызвавшей событие.

https://simple-scada.com/help/script/changed-the-variables.html
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 30 Мая 2022, 14:00:50
Спасибо, наконец понял для себя как с этой функцией правильно работать, буду применять. 
А еще уточнение, как это будет работать, если в списке "Изменилась переменная" будет несколько переменных, а не одна?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Виктор К от 30 Мая 2022, 14:17:22
При вызове "Изменилась переменная" в моменте времени меняется только одна переменная, соответственно на неё и будет вызов скрипта. Если в списке скрипта будет 10 переменных, они все "одновременно" поменяются, скрипт будет вызываться для каждой переменной, т.е. 10 раз.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 30 Мая 2022, 14:27:59
То есть гарантировать правильное выполнение функции PrevAs, если переменных в списке "Изменилась переменная" будет несколько, нельзя, в таком случае лучше создавать такие конструкции в разных скриптах, в которых переменная будет единственной?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 30 Мая 2022, 15:12:48
Работает как описал выше Виктор К. Скрипт с типом "Изменились переменные" выполняется при изменении любой переменной из списка. Допустим в списке есть две переменные: vrA и vrB и они изменились. Тогда скрипт будет выполнен два раза. Первый раз для vrA и PrevAs вернёт предыдущее значение переменной vrA. Второй раз для переменной vrB и PrevAs вернёт предыдущее значение переменной vrB. Узнать по изменению какой именно переменной сейчас выполнился скрипт, можно через параметр Varaible. В него помещается та переменная которая вызвала выполнение скрипта. Именно её предыдущее значение возвращает PrevAs.
Код: (delphi)
begin
  if Variable = vrA then  // если изменилась переменная vrA (а не какая-то другая переменная из списка!)
    if PrevAsInt = 1 then // и её предыдущее значение равно 1, то
    begin
      // делаем какие-то действия
    end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vpimonov от 10 Июня 2022, 08:06:04
SimpleScada 2.5.7.0
Задача: найти экземпляры шаблонов.
Есть: TM_List для хранения списка объектов и GetObjectByName, но нет списка имен...
Вопрос1: как получить список вообще всех объектов проекта? Что-то типа function EnumerateObjects() : TM_List;
Вопрос2: на что ориентироваться у объекта для определения принадлежгости к шаблону? В редакторе у экземпляров шаблонов тип TM_TemplateObj, но в скрипте этот тип не доступен (Undeclared identifier "TM_TemplateObj")

Или вообще есть другое решение задачи?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 10 Июня 2022, 17:34:12
Здравствуйте.

Получить список всех объектов проекта нельзя. Опишите максимально подробно, какую именно задачу Вы хотите решить, возможно мы сможем предложить какое-либо решение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vpimonov от 14 Июня 2022, 13:26:22
Получил в наследство проект. Навожу порядок в шаблонах, ищу неиспользуемые и удаляю. Похожие привожу к одному "знаменателю". Переименовываю.

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

Сейчас вышел из ситуации так: в шаблон вставляю здоровенный желтый прямоугольник и просматриваю все окна и страницы с визуальным поиском этого маркера. И так для каждого шаблона.
Проект не большой пару десятков страниц, дюжина окон, десятка три шаблонов.
Пятьдесят кругов по проекту, пара листов А4 и инвентаризация готова. Обычно я такие вещи делаю скриптами и в данном случае хотельсь чего-то подобного.

Эта задача решена, но если есть способ проще, то хочется его узнать.

Следующая задача такая:
На странице (TM_Page) все экземпляры различных шаблонов должны иметь одно определенное значение подстановки "система". Т.е. у шаблона1, шаблона2 и шаблона 3 есть подстановка "система", все экземпляры этих шаблонов должны иметь одинаковое значение.
Как убедиься, что это условие выполнено? Кроме мануального перебора и визуального контроля?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Июня 2022, 10:15:22
Здравствуйте.

В будущих обновлениях постараемся добавить возможность просмотра списка ссылок шаблона на его экземпляры, по аналогии с имеющейся сейчас возможностью просмотра ссылок на переменные и скрипты.

Цитировать
На странице (TM_Page) все экземпляры различных шаблонов должны иметь одно определенное значение подстановки "система". Т.е. у шаблона1, шаблона2 и шаблона 3 есть подстановка "система", все экземпляры этих шаблонов должны иметь одинаковое значение. Как убедиься, что это условие выполнено? Кроме мануального перебора и визуального контроля?
1. Можно создать по одному экземпляру шаблона, задать у них нужное значение подстановки "система" и затем копировать эти экземпляры. В скопированном экземпляре значение подстановки будет сохраняться.
2. Можно использовать вложенные шаблоны, если такой вариант подойдет. При использовании вложенных шаблонов, подстановки с одинаковым именем объединяются. Например: имеется пустой шаблон "A", а также шаблон "B", "C" и "D" с подстановкой "Система". Если в шаблон "A" добавить шаблоны "B", "C" и "D", то у шаблона "A" будет одна подстановка "Система", значение которой будет передано трём шаблонам "B", "C" и "D". Подробное описание работы "Шаблон + шаблонное окно"(что аналогично работе "шаблон + шаблон") можно посмотреть по ссылке (https://simple-scada.com/help/manual/templandtemplwnd.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: vpimonov от 16 Июня 2022, 08:36:17
Цитировать
Можно создать по одному экземпляру шаблона, задать у них нужное значение подстановки "система" и затем копировать эти экземпляры.
Да, так и сделано. Система1 содержит, например, 20 клапанов (шаблоны). Т.е. систему целиком уже шаблоном не сделать. Теперь я копирую мнемосхему системы и вставляю на вторую страницу клапаны на первой назывались система1_к1...система1_к20. После вставки я получаю переменные система1_к21..система1_к40 (по хорошему нужно переименовывать объекты) и подстановки названиеСистемы=система1. Т.е. у всех клапанов второй системы мне вручную нужно поменять подстановку. Можно выделить все и поменть один раз, но если на мнемосхеме несколько различных шаблонов и расположены они вперемежку можно что-то и пропустить. Усугубляется это тем, что для разных шаблонов разный набор подстановок и где-то кроме кода системы нужно название системы. Это я о том, что накосячить есть где, а проверять ручным перебором.

Мне кажется полезной возможность экспортировать текстовое представление всех объектов в текстовый файл... Собственно это я и пытался сделать.

Вложенными шаблонами и шаблонными окнами пользуюсь, удобно, спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Виктор К от 16 Июня 2022, 09:12:10
Добрый день. Столкнулся с ошибкой в логах сервера: Ошибка в скрипте ... в строке ... "Variant does not reference an automation object".
Скрипт компилировался без ошибок, но естественно не работал так как задумано.
Причина: некорректное обращение к значению переменной.
Код
Text2.Text:=var01.Value.AsStr; 
нужно было так:
Код
Text2.Text:=var01.AsStr; 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Июня 2022, 10:12:29
Здравствуйте.

Всё верно, свойство переменной "var01.Value" имеет тип данных Variant, через который можно обращаться к свойствам OLE-объектов (https://ru.wikipedia.org/wiki/Object_Linking_and_Embedding). Поэтому "var01.Value.AsStr" будет рассматриваться компилятором как попытка обращения к свойству "AsStr" OLE-объекта и на этапе компиляции ошибок выдано не будет. Затем, во время запуска скрипта, обнаружится, что свойство Value не является OLE-объектом и будет выдана соответствующая ошибка: Variant-переменная не ссылается на объект автоматизации.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: DJ от 24 Августа 2022, 10:46:12
Добрый день. Можете расписать как работает этот скрипт? Весь проект почти сделан вот на таких скриптах. Именно интересует вот эта часть - ...AsInt and 128) Shr 7) + 1
Код: (delphi)
begin
  // ЦВ НЕИСП АВАР  НСУХ  СУХ  НПИТ  ПИТ  МП
  // 1    0     0    0     0    0     0    0

  TM_Image(Sender).Frame := ((TM_Object(Sender).AsInt and 128) Shr 7) + 1
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pavel.sheva от 24 Августа 2022, 12:26:36
Присвоить свойству кадр, значение вызвавшего объекта в (целочисленном формате с конвертацией в 1-о байтовый формат числа со сдвигом его в право на 7) + 1, Вроде бы так, если я не ошибаюсь.

А разве можно в Simple-Picture создать анимацию на 128 кадров? ;D :P, я как-то пытался, больше 30 не вмещается(
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alex29 от 25 Августа 2022, 16:33:58
Добрый день. Можете расписать как работает этот скрипт?
меняется картинка в зависимости от состояния 7-го бита. Можно было проще и понятнее сделать...

А разве можно в Simple-Picture создать анимацию на 128 кадров? ;D :P, я как-то пытался, больше 30 не вмещается(
при чем тут 128 кадров? Это логическая операция - and 128 - выделяем только 7-й бит. ИМХО  по извращенски код написан )
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pavel.sheva от 26 Августа 2022, 14:05:19
Цитировать
при чем тут 128 кадров? Это логическая операция - and 128 - выделяем только 7-й бит. ИМХО  по извращенски код написан )
Ну это как посмотреть) младшим или старшим битом вперед), просто если вы говорите о выделение 7 бита, то понятное дело в 10-тичной это будет 64 в случае если там стоит 1, 64+1, 65 кадр, или я что-то не так понимаю
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: alex29 от 26 Августа 2022, 15:21:36
если 7-й бит == 0 , то TM_Image(Sender).Frame = 0+1  первый кадр
если 1, TM_Image(Sender).Frame = 1+1 второй кадр.
по моему так
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pavel.sheva от 31 Августа 2022, 11:32:46
Код: (delphi)
begin
  // ЦВ НЕИСП АВАР  НСУХ  СУХ  НПИТ  ПИТ  МП
  // 1    0     0    0     0    0     0    0
 
  TM_Image(Sender).Frame := ((TM_Object(Sender).AsInt and 128) Shr 7) + 1
end.
жЕсткая строчка кода, но вроде понял что вы имеете ввиду, а да я "Децл", при shr я обращаюсь к 1 биту, а не ко всему байту...
 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Дмитрий_021 от 12 Сентября 2022, 03:58:53
Добрый день, только разбираюсь с вашим продуктом. Как написать простой скрипт, к кнопке привязана Переменная (Внутренний тэг - str - содержащей имя страницы). При нажатии на кнопку нужно переходить на эту страницу.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 12 Сентября 2022, 13:45:29
Добрый день.

Код: (delphi)
var
  aPage : TM_Page;
begin
  With Sender As TM_Button do
    begin
      aPage := GetPageByName(Variable.Asstr);
      aPage.GoToPageClient(GetClientName);
    end;
end.

Но может просто не создавайте переменную, а присвойте свойству Тэг кнопки номер страницы, например 2. Тогда

Код: (delphi)
var
  aPage : TM_Page;
begin
  With Sender As TM_Button do
    begin
      aPage := GetPageByName('Page'+IntToStr(Tag));
      aPage.GoToPageClient(GetClientName);
    end;
end.

Таким образом перейдете на нужную страницу не создавая лишних переменных
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 12 Сентября 2022, 15:15:08
Здравствуйте.
Как написать простой скрипт, к кнопке привязана Переменная (Внутренний тэг - str - содержащей имя страницы). При нажатии на кнопку нужно переходить на эту страницу.
Если у кнопки в свойстве "Переменная" указана переменная, то при нажатии на кнопку будет изменяться значение этой переменной в соответствии с установленными значениями в свойстве "Состояния". Поэтому описанную Вами задачу таким способом решить не получится, так как при клике на кнопку переменная с именем страницы, перед выполнением скрипта, будет перезаписана.

В данном случае переменную с именем страницы можно указать в свойство "Доп.переменная" и на событие "OnClick" кнопки написать скрипт:
Код: (delphi)
var
  aPage: TM_Page;
  aButton: TM_Button;
begin
  if Sender is TM_Button then   // проверяем, что Sender это кнопка
  begin
    aButton := Sender as TM_Button;
    // ищем страницу с именем из доп.переменной
    aPage := GetPageByName(aButton.VariableEx.AsStr);
    if aPage <> nil then                      // если страница существует,
      aPage.GoToPageClient(GetClientName);    // то перейти на нее
  end;
end
Также в руководстве по ссылке (https://simple-scada.com/help/script/buttons-instead-pages.html) можно найти пример создания "Кнопок вместо панели страниц".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Дмитрий_021 от 13 Сентября 2022, 12:54:47
Спасибо, помогло. а есть ли функция, позволяющая получить текущую страницу? ( Условно аналог GetPageByName, но возвращающая страницу с которой был вызван скрипт )
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Сентября 2022, 10:45:27
Для этого можно использовать функцию GetOwner (https://simple-scada.com/help/script/getowner.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 19 Сентября 2022, 06:36:19
Вопрос про подтверждение событий. При подтверждении события оператором (нажатие галочки), хочу вызывать всплывающее окно, которое бы добавляло комментарий к событию.
Существует метод OnClick на стандартную клавишу подтверждения события? Можно добавлять комментарий?

При подтверждении оператором сообщения, хочу отображать всплывающее окно со списком, выбранная информация в котором отображалась бы в соответствующем сообщении в колонке "Подтвердил". Это реально?
Хочу чтобы в этом столбце отображалась информация о причине возникновения сообщения. Эти причины будут перечислены во всплывающем окне.

Можно ли изменять текст сообщения после его возникновения в списке сообщений?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 19 Сентября 2022, 17:53:05
Здравствуйте.

Цитировать
Существует метод OnClick на стандартную клавишу подтверждения события?
Создать скрипт для штатной кнопки подтверждения сообщений нельзя. При необходимости, можно скрыть штатную панель сообщений (https://simple-scada.com/help/manual/edit-zone.html) и создать свою(для этого лучше всего использовать шаблон (https://simple-scada.com/help/manual/template.html)). Вместо панели сообщений можно использовать компонент "Список сообщений (https://simple-scada.com/help/manual/message-viewer.html)". Смену пользователя можно реализовать через кнопку и скрипт по событию OnClick используя процедуру ChangeUser (https://simple-scada.com/help/script/changeuser.html). Переход в меню сообщений можно реализовать используя скрипты для навигации (https://simple-scada.com/help/script/navigation.html). Для подтверждения сообщений можно использовать кнопку и процедуру ConfirmMessage (https://simple-scada.com/help/script/confirmmessage.html). В этом случае, можно будет написать необходимый скрипт по событию OnClick своей кнопки подтверждения.

Цитировать
> Можно добавлять комментарий?
> выбранная информация отображалась бы в соответствующем сообщении в колонке "Подтвердил". Это реально?
> Можно ли изменять текст сообщения после его возникновения в списке сообщений?
Таких возможностей нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Дмитрий_021 от 20 Сентября 2022, 13:36:28
Использую в проекте следующие конструкции из универсальных скриптов и процедур, размещенных в  глобальных модулях. Нужно ли в этом случаи что-то использовать, чтобы не допустить утечки памяти?
Код: (delphi)
//Универсальное событие 
var
  aObject: TM_Object;
begin
  if Sender is TM_Object then
  begin
    aObject := Sender as TM_Object;
    if aObject.variable.AsBool then
       begin
         alarmMode(aObject);
       end
    else
      begin
        sleepMode(aObject);
      end;
  end;
end.                   

Код: (delphi)
//Глобальный модуль
interface
  procedure sleepMode(out AResult: TM_Object);
implementation
  procedure sleepMode(out AResult: TM_Object);
  begin
    if AResult is TM_Text then
      with AResult as TM_Text do
        AResult.FontColor := RGB(146,146,146);
   if AResult is TM_Image then
   .....
  end;
end.       
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 20 Сентября 2022, 22:15:42
Здравствуйте.

Т.к. в коде Вы не создаёте новые объекты, а только работаете с уже существующими, то и очищать ничего не требуется. Все объекты, которые создала скада (например: объекты мнемосхем, окна, переменные, сообщения, тренды и т.п.) скада удалит автоматически, исключая утечки памяти.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 21 Сентября 2022, 14:25:57
Здравствуйте.
При необходимости, можно скрыть штатную панель сообщений (https://simple-scada.com/help/manual/edit-zone.html) и создать свою(для этого лучше всего использовать шаблон (https://simple-scada.com/help/manual/template.html)). Вместо панели сообщений можно использовать компонент "Список сообщений (https://simple-scada.com/help/manual/message-viewer.html)".

Заметил следующее. На форму вывел объект "Список сообщений". Выглядит он так:
(https://i.ibb.co/RpL3w9W/1.png)
В третьей строке, столбец "Подтвердил" пуст.
Перехожу в окно "Сообщения". Там, в "Неподтвержденных", те же самые сообщения выглядят так:
(https://i.ibb.co/QfrmzSG/2.png)
Тут же, в столбце "Подтвердил", в третьей строке информация есть.
Все нормализуется, когда приходит новое событие.
Это я накосячил?)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: asutpfoma от 22 Сентября 2022, 08:14:37
В дополнение к сообщению выше. Также заметил случай, когда после перехода с формы на окно авторизации и обратно, объект "Список сообщений пустой", причем оба (у меня их 2 созданные группы). После еще одного перехода туда обратно, все отображается.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Сентября 2022, 12:53:38
Здравствуйте.

asutpfoma, Вы используете версию Simple-Scada 2.6.3.0 или более старую? Если старую, то обновитесь до актуальной версии 2.6.3.0. Если после обновления проблема будет повторяться, то пришлите нам на support@simple-scada.com для проверки текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Дмитрий_021 от 28 Сентября 2022, 13:25:52
Добрый день.
Не могу понять, как здесь реализована работа с массивами. Например, функция Length() должна работать как со строками, так и с массивами согласно спецификации языка.
https://delphisources.ru/pages/faq/faq_delphi_basics/Length.php.html (ftp://delphisources.ru/pages/faq/faq_delphi_basics/Length.php.html)
Но компилятор пишет несовместимые типы, а в справке скада-системы "Возвращает количество символов строки" и не слова о длине массива. Или тут в комиляторе вообще обрезана работа с массивами или как это делается? 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 28 Сентября 2022, 16:38:37
Здравствуйте.

Функция Length работает для динамических массивов.
Для определения границ статических массивов используйте функции High и Low:
Код: (delphi)
var
  I: Integer;
  aArray: array[1..17] of integer;
begin
  // это просто пример, здесь можно обойтись без Low и High,
  // т.к. размер статического массива известен
  for I := Low(aArray) to High(aArray) do
  begin
    // ...
  end;
end.

Если Вы хотите пройти по элементам внешней переменной (читаемой с OPC-сервера), то нужно использовать следующий код:
Код: (delphi)
var
  I: Integer;
begin
  // проходим в цикле по каждому элементу массива
  for I := Variable.LowBound to Variable.HighBound do
    Text1.Text := Text1.Text + ', ' + Variable.ValuesStr[I];
end.

Если разобраться не получится, то пришлите на support@simple-scada.com пример проекта, или предоставьте полный код скрипта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Дмитрий_021 от 03 Октября 2022, 03:35:45
Добрый день.
На данный момент с массивами не стал заморачиваться. Использую строку для булевских значений.
Не могу вызвать функцию, объявленную в одном юните в другом.

Код
unit uIsCorrectLevel;

interface
  function isCorrctLevel(sensorArray: String): Boolean;
implementation
  function isCorrctLevel(sensorArray: String): Boolean;
  ...
  end.         

Данную функцию нужно использовать в глобальной процедуре
Код
unit mLevel;
interface
  uses
    uIsCorrectLevel;
  procedure mLevel(Lvl: TM_Level; sensor: TM_Variable);
implementation
  procedure mLevel(Lvl: TM_Level; sensor: TM_Variable);
  var
    str: String;
  begin
    if isCorrctLevel(TM_Variable.AsStr ) then Lvl.FlashColor := clNone else Lvl.FlashColor := clRed;
  end;
end.                               
Компилятор выдает ошибку Property  "AsStr" inaccessible.
ПС У нас лицензия с расширенной тех поддержкой, но не нашел куда ее к аккаунту привязать.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 04 Октября 2022, 18:11:06
Здравствуйте.

В условии "if isCorrctLevel(TM_Variable.AsStr) then" нужно указать переменную, значение которой Вы хотите использовать, а не просто тип TM_Variable. Судя по Вашему коду, необходимо указать переменную sensor: "if isCorrctLevel(sensor.AsStr) then".

Также, если Вы вызываете в глобальном модуле функцию из другого глобального модуля, то для этого нужно подключить глобальный модуль через uses в секции implementation:
Код: (delphi)
interface
  procedure mLevel(Lvl: TM_Level; sensor: TM_Variable);

implementation
  uses
    uIsCorrectLevel;

  procedure mLevel(Lvl: TM_Level; sensor: TM_Variable);
  var
    str: String;
  begin
    if isCorrctLevel(sensor.AsStr ) then Lvl.FlashColor := clNone else Lvl.FlashColor := clRed;
  end;
end. 

Если разобраться не получится, то пришлите нам для проверки на support@simple-scada.com текущую версию проекта и укажите, какой скрипт нужно проверить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: уйбуй Копыто от 06 Октября 2022, 11:37:52
Здравствуйте!
Наша компания планирует вплотную переключиться на Вашу скада, посему я сейчас занимаюсь ее изучением.
Вы пользуетесь определенной удобной конвенцией именования переменных. Можно ли с ней ознакомиться, чтобы все наши разработчики ее придерживались без разночтений?
Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 07 Октября 2022, 13:30:58
Здравствуйте.

В этом разделе (https://simple-scada.com/help/script/script-recomend.html) можно ознакомиться с рекомендациями по именованию объектов. Также, там описан используемый в Simple-Scada принцип именования стандартных перечисляемых типов и констант. Подобный метод можно использовать и при именовании переменных.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ACHE от 24 Октября 2022, 18:50:59
Здравствуйте. Создали такой скрипт для проверки связи с подключенными приборами учета:
Код: (delphi)
procedure CheckMerk(Link230: TM_Variable; Kotelnaya: string);
//проверка связи с Меркурий
begin
  if Link230.AsInt = 0 then
  begin
    vrTimer_Gagarina.Value := vrTimer_Gagarina.Value + 1;
      if vrTimer_Gagarina.AsInt = 600 then
        begin
          AddMessage(Now, mkAlarm, Kotelnaya, TRUE, TRUE);
          SendTelegram(Kotelnaya);
        end
  end
    else
      vrTimer_Gagarina.Value := 0;
end;

//Проверка связи с СПТ
procedure CheckSPT(variable: TM_Variable; Kotelnaya: string);

begin
    if variable.IsGoodQuality = False then
      begin
        vrTimer2_Gagarina.Value := vrTimer2_Gagarina.Value + 1;
          if vrTimer2_Gagarina.AsInt = 600 then
            begin
              SendTelegram(Kotelnaya);
              AddMessage(Now, mkAlarm, Kotelnaya, TRUE, TRUE);
            end
      end
          else
            vrTimer2_Gagarina.Value := 0;
end;

//Проверка связи с СПГ
procedure CheckSPG(variable2: TM_Variable; Kotelnaya: string);

begin
  if variable2.IsGoodQuality = False then
    begin
      vrTimer3_Gagarina.Value := vrTimer3_Gagarina.Value + 1;
        if vrTimer3_Gagarina.AsInt = 600 then
          begin
            SendTelegram(Kotelnaya);
            AddMessage(Now, mkAlarm, Kotelnaya, TRUE, TRUE);
          end
    end
        else
          vrTimer3_Gagarina.Value := 0;
end;

//Проверка связи с ПЛК
procedure CheckPLC(variable3: TM_Variable; Kotelnaya: string; picture: TM_Variable);

begin
  if variable3.IsGoodQuality = False then
    begin
      vrTimer4_Gagarina.Value := vrTimer4_Gagarina.Value + 1;
        if vrTimer4_Gagarina.AsInt = 600 then
          begin
            SendTelegram(Kotelnaya);
            AddMessage(Now, mkAlarm, Kotelnaya, TRUE, TRUE);
            picture.Value := True;
          end
    end
        else
          begin
            vrTimer4_Gagarina.Value := 0;
            picture.Value := False;
          end
end;

begin
//проверка меркурий
  CheckMerk(Link_230_Gagarina, 'Гагарина: Нет связи с электросчетчиком');
  ....
  CheckMerk(Link230_VES, 'ВЭС: Нет связи с электросчетчиком');
  CheckMerk(Link230_PMK, 'ПМК-16: Нет связи с электросчетчиком');
//проверка спт
  CheckSPT(_171_Qo_g_, 'Гагарина: Нет связи с тепловычислителем');
  CheckSPT(Q_Podacha_TS_171, 'Дружба: Нет связи с тепловычислителем');
 ...
  CheckSPT(Q_PodachaTS, 'ХДСУ: Нет связи с тепловычислителем');
//проверка спг
  CheckSPG(spg_Q1, 'Гагарина: Нет связи с корректором газа');
  CheckSPG(Q1_2, 'Дружба: Нет связи с корректором газа');
...
  CheckSPG(Q1_11, 'ПУ-24: Нет связи с корректором газа');
//проверка плк
  CheckPLC(Tnv_4, 'Гагарина: Нет связи с ПЛК', LinkPLC_Gagarina);
  CheckPLC(Tnv_6, 'Нефтебаза: Нет связи с ПЛК', LinkPLC_Neftebaza);
 ...
  CheckPLC(Tnv_15, 'ПУ-24: Нет связи с ПЛК', LinkPLC_PU24);

end.

До того, как код был оптимизирован, без процедур (и с меньшим количеством оборудования) все работало. На каждую группу приборов был отдельный скрипт, в каждом скрипте на каждый прибор повторялся код для проверки.
При использовании процедур приходит сообщение только из последней строки "CheckPLC(Tnv_15, 'ПУ-24: Нет связи с ПЛК', LinkPLC_PU24)", несмотря на то, что связь на самом деле есть. А с оборудованием, с которым связи нет, сообщение не приходит. Подскажите пожалуйста, что делаем неправильно?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Timothy Clement от 25 Октября 2022, 08:50:08
До того, как код был оптимизирован, без процедур (и с меньшим количеством оборудования) все работало. На каждую группу приборов был отдельный скрипт, в каждом скрипте на каждый прибор повторялся код для проверки.
При использовании процедур приходит сообщение только из последней строки "CheckPLC(Tnv_15, 'ПУ-24: Нет связи с ПЛК', LinkPLC_PU24)", несмотря на то, что связь на самом деле есть. А с оборудованием, с которым связи нет, сообщение не приходит. Подскажите пожалуйста, что делаем неправильно?
Добрый день, подскажите а как работало раньше и сейчас в плане организации вызова? Был отдельный скрипт "По-изменению" для каждой переменной, а теперь вызываются по времени процедуры?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Октября 2022, 10:47:45
Здравствуйте.

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

Если требуется отслеживать каждое устройство отдельно, то нужно добавить отдельные переменные-таймеры для каждого устройства, тогда всё будет работать корректно. Например, для устройства Link_230_Gagarina создать переменную Link_230_Gagarina_Timer, для Link230_VES создать переменную Link230_VES_Timer и т.д. Пример кода:
Код: (delphi)
procedure CheckMerk(aVar, aTimer: TM_Variable; aAlarm: string; aPicture: TM_Variable);
begin
  if aVar.IsGoodQuality = False then
    begin
      aTimer.Value := aTimer.Value + 1;
      if aTimer.AsInt = 600 then
        begin
          SendTelegram(aAlarm);
          AddMessage(Now, mkAlarm, aAlarm, TRUE, TRUE);
          aPicture.Value := True;
        end;
    end else
      begin
        aTimer.Value := 0;
        aPicture.Value := False;
      end;
end;
 
begin
  CheckMerk(Link_230_Gagarina, Link_230_Gagarina_Timer, 'Гагарина: Нет связи с электросчетчиком');
  CheckMerk(Link230_VES, Link230_VES_Timer, 'ВЭС: Нет связи с электросчетчиком');
  CheckMerk(Link230_PMK, Link230_PMK_Timer, 'ПМК-16: Нет связи с электросчетчиком');
  // ...
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ACHE от 25 Октября 2022, 16:51:09
Добрый день, подскажите а как работало раньше и сейчас в плане организации вызова? Был отдельный скрипт "По-изменению" для каждой переменной, а теперь вызываются по времени процедуры?

Здравствуйте.
Раньше был такой скрипт.
Однако по мере добавления устройств (их порядка 70 шт.) было решено что как-то надо это дело оптимизировать :)
Код
  // проверка связи с СПГ742 Гагарина
  {if spg_Q1.IsGoodQuality = False then
  begin
  vrTimer3_Gagarina.Value := vrTimer3_Gagarina.Value + 1;
    if vrTimer3_Gagarina.AsInt = 600 then
    begin
      SendTelegram('Гагарина: Нет связи с корректором газа СПГ742!');
      AddMessage(Now, mkAlarm, 'Гагарина: Нет связи с корректором газа СПГ742!', TRUE, TRUE);
    end
  end
    else
      vrTimer3_Gagarina.Value := 0;}

  // проверка связи с ПЛК Гагарина
  {if Tps_4.IsGoodQuality = False then
  begin
  vrTimer4_Gagarina.Value := vrTimer4_Gagarina.Value + 1;
    if vrTimer4_Gagarina.AsInt = 600 then
      begin
      SendTelegram('Гагарина: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'Гагарина: Нет связи с ПЛК', TRUE, TRUE);
      LinkPLC_Gagarina.Value := True;
      end
    end
  else
  begin
      vrTimer4_Gagarina.Value := 0;
      LinkPLC_Gagarina.Value := False;
  end;}

                                                            //Дружба
  //Проверка связи с счетчиком Меркурий  Дружба
  {if Link_230_Druzhba.AsInt = 0 then
  begin
    vrTimer_Druzhba.Value := vrTimer_Druzhba.Value + 1;
    if vrTimer_Druzhba.AsInt = 600 then
    begin
      AddMessage(Now, mkAlarm, 'Дружба: Нет связи с электросчетчиком (NPort 5130)!', TRUE, TRUE);
      SendTelegram('Дружба: Нет связи с электросчетчиком (NPort 5130)!');
      end
    end
  else
    vrTimer_Druzhba.Value := 0;}

  // проверка связи с СПГ742 Дружба
  {if Q1_2.IsGoodQuality = False then
  begin
  vrTimer3_Druzhba.Value := vrTimer3_Druzhba.Value + 1;
    if vrTimer3_Druzhba.AsInt = 600 then
    begin
      SendTelegram('Дружба: Нет связи с корректором газа СПГ742!');
      AddMessage(Now, mkAlarm, 'Дружба: Нет связи с корректором газа СПГ742!', TRUE, TRUE);
    end
  end
    else
      vrTimer3_Druzhba.Value := 0;}

  // проверка связи с СПТ963 Дружба
  {if SostoyanieSPT.IsGoodQuality = False then
  begin
  vrTimer4_Druzhba.Value := vrTimer4_Druzhba.Value + 1;
    if vrTimer4_Druzhba.AsInt = 600 then
    begin
      SendTelegram('Дружба: Нет связи с тепловычислителем СПТ963!');
      AddMessage(Now, mkAlarm, 'Дружба: Нет связи с тепловычислителем СПТ963!', TRUE, TRUE);
    end
  end
    else
      vrTimer4_Druzhba.Value := 0;}

    // проверка связи с ПЛК Дружба
  {if Tnv_7.IsGoodQuality = False then
  begin
  vrTimer2_Druzhba.Value := vrTimer2_Druzhba.Value + 1;
    if vrTimer2_Druzhba.AsInt = 600 then
    begin
      SendTelegram('Дружба: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'Дружба: Нет связи с ПЛК', TRUE, TRUE);
    end
  end
  else
  begin
      vrTimer2_Druzhba.Value := 0;
      LinkPLC_Druzhba.Value := False;
  end;
                                                            //Нефтебаза
                                                 
    // проверка связи с ПЛК Нефтебаза
  if Tps_6.IsGoodQuality = False then
  begin
  vrTimer_Neftebaza.Value := vrTimer_Neftebaza.Value + 1;
    if vrTimer_Neftebaza.AsInt = 600 then
      begin
      SendTelegram('Нефтебаза: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'Нефтебаза: Нет связи с ПЛК', TRUE, TRUE);
      end
  end
  else
  begin
      vrTimer_Neftebaza.Value := 0;
      LinkPLC_Neftebaza.Value := False;
  end;
                                                            //Центральная

    // проверка связи с ПЛК Центральная
  if Tnv_8.IsGoodQuality = False then
  begin
  vrTimer_Centr.Value := vrTimer_Centr.Value + 1;
    if vrTimer_Centr.AsInt = 600 then
    begin
      SendTelegram('Центральная: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'Центральная: Нет связи с ПЛК', TRUE, TRUE);
      LinkPLC_Centr.Value := True;
    end
  end
  else
  begin
      vrTimer_Centr.Value := 0;
      LinkPLC_Centr.Value := False;
  end;

   // проверка связи с СПТ963 Центральная
  {if NS_SPT_Centralnaya.IsGoodQuality = False then
  begin
  vrTimer_Centr2.Value := vrTimer_Centr2.Value + 1;
    if vrTimer_Centr2.AsInt = 600 then
    begin
      SendTelegram('Центральная: Нет связи с тепловычислителем СПТ963!');
      AddMessage(Now, mkAlarm, 'Центральная: Нет связи с тепловычислителем СПТ963!', TRUE, TRUE);
    end
  end
    else
      vrTimer_Centr2.Value := 0;}

  // проверка связи с СПГ742 Центральная
  {if Q1_4.IsGoodQuality = False then
  begin
  vrTimer_Centr3.Value := vrTimer_Centr3.Value + 1;
    if vrTimer_Centr3.AsInt = 600 then
    begin
      SendTelegram('Центральная: Нет связи с корректором газа СПГ742!');
      AddMessage(Now, mkAlarm, 'Центральная: Нет связи с корректором газа СПГ742!', TRUE, TRUE);
    end
  end
    else
      vrTimer_Centr3.Value := 0;}

  //Проверка связи с счетчиком Меркурий Центральная
  {if Link_230_Centr.AsInt = 0 then
  begin
    vrTimer_Centr4.Value := vrTimer_Centr4.Value + 1;
    if vrTimer_Centr4.AsInt = 600 then
    begin
      AddMessage(Now, mkAlarm, 'Центральная: Нет связи с электросчетчиком (NPort 5130)!', TRUE, TRUE);
      SendTelegram('Центральная: Нет связи с электросчетчиком (NPort 5130)!');
      end
    end
  else
    vrTimer_Centr4.Value := 0;}

                                                      //ПМК-16

    // проверка связи с ПЛК ПМК-16
  {if Tnv_9.IsGoodQuality = False then
  begin
  vrTimer_PMK1.Value := vrTimer_PMK1.Value + 1;
    if vrTimer_PMK1.AsInt = 600 then
    begin
      SendTelegram('ПМК-16: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'ПМК-16: Нет связи с ПЛК', TRUE, TRUE);
      vrTimer_PMK1.Value := True;
    end
  end
  else
  begin
      vrTimer_PMK1.Value := 0;
      LinkPLC_PMK16.Value := False;
  end;}


//ХДСУ

    // проверка связи с ПЛК ХДСУ
  {if Tnv_3.IsGoodQuality = False then
  begin
  vrTimer_XDSU1.Value := vrTimer_XDSU1.Value + 1;
    if vrTimer_XDSU1.AsInt = 600 then
    begin
      SendTelegram('ХДСУ: Нет связи с ПЛК');
      AddMessage(Now, mkAlarm, 'ХДСУ: Нет связи с ПЛК', TRUE, TRUE);
      vrTimer_XDSU1.Value := True;
    end
  end
  else
  begin
      vrTimer_XDSU1.Value := 0;
      LinkPLC_XDSU.Value := False;
  end;}


  //Иконка связи Центральная
  //if Tnv_8.IsGoodQuality = False then
  //Image1453.Visible := True
  //else
  //Image1453.Visible := False

//end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ACHE от 25 Октября 2022, 16:54:26
Здравствуйте.

Если требуется отслеживать каждое устройство отдельно, то нужно добавить отдельные переменные-таймеры для каждого устройства, тогда всё будет работать корректно. Например, для устройства Link_230_Gagarina создать переменную Link_230_Gagarina_Timer, для Link230_VES создать переменную Link230_VES_Timer и т.д. Пример кода:

Все работает как часы! Спасибо! Была мысль, что с таймерами что-то не так, но не додумал, что на каждое устройство нужно отдельную переменную
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Дмитрий_021 от 10 Ноября 2022, 09:30:30
Здраствуйте.
Как реализовать следующий функционал - имеется расходомер, где нарастающим итогом идет отсчет сырья, прошедшего через него. Есть кнопка - Закрыть смену, которая будет закрывать текущую смену и открывать следующую смену.  Нужно фиксировать в таблицу расход за каждую смену, а так же показания расходомера на момент открытия и закрытия смены.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 11 Ноября 2022, 22:48:54
Здравствуйте.

Если это требуется для создания отчетов, то проще всего будет использовать систему отчетов (https://simple-scada.com/help/report/per-rep.html). Если смены фиксированные, к примеру с 8 до 20 и с 20 до 8, то можно использовать периодический отчет (https://simple-scada.com/help/report/per-rep.html) с интервалом 12 часов и типом обработки "разница" (https://simple-scada.com/help/report/periodicsourcework.html) для получения расхода за смену.

Если требуется постоянно отображать таблицу на мнемосхеме в скаде, то можно создать в БД свою таблицу и при нажатии кнопки "Закрыть смену" записывать в таблицу требуемые данные. Полученную таблицу БД затем можно вывести в компонент "Таблица" скады. Пример создания и использования своей таблицы в БД можно найти по ссылке (https://simple-scada.com/help/script/dbreciepes.html). Данный способ будет гораздо сложнее в реализации, чем использование системы отчетов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: kvlad1972 от 18 Ноября 2022, 12:16:43
Здравствуйте.
Подскажите как сделать динамическую загрузку предварительно отрисованной по координатам GPS графической карты в окно ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 18 Ноября 2022, 21:40:31
Здравствуйте.

Такой возможности нет. Изображения (https://simple-scada.com/help/manual/picture.html) используемые в проекте загружаются единожды при запуске клиента.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Дмитрий_021 от 23 Ноября 2022, 10:37:22
Здравствуйте, как реализовать следующий момент - у нас 1 сервер и 2 АРМ с клиентами. 1 АРМ на заводе и должен иметь доступ ко всему проекту, а 2 АРМ на котельной и должен иметь доступ только к 1 экрану (доступ к архиву сообщений разделять не нужно).   
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 23 Ноября 2022, 15:15:15
Здравствуйте.

Для этого нужно использовать систему прав пользователей (https://simple-scada.com/help/manual/editor-users.html), которая позволяет настроить права доступа и видимость необходимой информации для каждого пользователя. Создайте двух пользователей и для каждого настройте видимость только нужных ему страниц (https://simple-scada.com/help/manual/editor-users.html)(Область прав -> Страницы видимость). На АРМ авторизуйтесь под нужным пользователем - в проекте будут видны только страницы, настроенные для этого пользователя. При необходимости, на АРМ можно настроить автовход под нужным пользователем - см. опции Логин/Пароль (https://simple-scada.com/help/manual/settings-simple-client.html?anchor=servset) в параметрах подключения к серверу.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: porhalo от 12 Декабря 2022, 18:04:49
После обновления с версии 2.3.4.0 на версию 2.5.13.0
возникла ошибка компиляции в одном скрипте, а именно в этом
Код: (delphi)
procedure system_sql_answer(DataSet: TM_Dataset);
var
ButtonDest: TM_Button;
VarDest: TM_Variable;
begin

if (DataSet.Sender is TM_Button)
then
begin

  if DataSet.Tag=10
  then
    begin                   
    ButtonDest:=GetButtonByName(DataSet.Sender.Name);
    ButtonDest.States[0].Caption:=DataSet[0].AsStr;
    end;

end;
end.
ошибка в строке
Код: (delphi)
ButtonDest:=GetButtonByName(DataSet.Sender.Name);

проект делали не мы, здесь очевидно какие-то манипуляции с названием кнопок делаются.
если просто закомментировать эту строчку ButtonDest:=GetButtonByName(DataSet.Sender.Name);, то проект компилируется.
Вопрос : как этот скрипт исправить по правильному, чтобы функционал не потерялся? или где копать
не может быть ошибка из-за того что на тестовой машине бд не скопирована
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 13 Декабря 2022, 11:28:36
Здравствуйте.

Как видно из кода скрипта, требуемая кнопка передаётся в скрипт в параметре DataSet. В этом случае не требуется искать ее через GetButtonByName.

Замените строку:
Код: (delphi)
ButtonDest:=GetButtonByName(DataSet.Sender.Name);
на:
Код: (delphi)
ButtonDest := DataSet.Sender as TM_Button; 

При возникновении других ошибок компиляции, пришлите нам для проверки на support@simple-scada.com текущую версию проекта из директории "..\Simple-Scada 2\Projects\" и укажите, какой скрипт нужно проверить. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 15 Декабря 2022, 14:47:57
Здравствуйте, покажите пожалуста пример скрипта (Если такой есть) сценарий: нажимаем кнопку на основном экране - открывается страница_на этой странице нажимаем другую кнопку - возврощаемся на основной экран. Спасибо
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: дрю от 15 Декабря 2022, 15:11:21
Разобрался самостоятельно из руководства
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pro_100_russ от 07 Февраля 2023, 09:49:28
Добрый день.
Есть счетчик готовой продукции, значения которой вывел в скаду. Написал простой код для вычета готовой продукции за прошедший месяц. Проблема в том, что когда наступил 01.01.2023 год, у меня перестал работать код.
Как я выяснил, когда вычитается 1 месяц от 01.01.2023, то получается 01.12.2023!
Код заработал 01.02.2023 и отнимает 1 месяц правильно.

Код: (delphi)
var
  mDate,nDate: TDateTime;
begin
  mDate := RecodeDateTime(Now, YearOf(Now), MonthOf(IncMonth(Now, -1)), 1, 0, 0, 0, 0);
  ArchiveValueByTime(Schetchik_gotovoy_produktsii, proizvedeno_za_proshedshiy_mesyats_Begin, mDate);
  nDate:= RecodeDateTime(Now, YearOf(Now), MonthOf(Now), 1 , 0, 0, 0, 0);
  nDate := incDay(nDate, 1);
 
  ArchiveValueByTime(Schetchik_gotovoy_produktsii, proizvedeno_za_proshedshiy_mesyats_End, nDate);

  if (proizvedeno_za_proshedshiy_mesyats_Begin.AsInt = 0 ) OR
     (proizvedeno_za_proshedshiy_mesyats_End.AsInt = 0) then
    proizvedeno_za_proshedshiy_mesyats_Result.Value := 0
  else
    proizvedeno_za_proshedshiy_mesyats_Result.Value := (proizvedeno_za_proshedshiy_mesyats_End.AsInt - proizvedeno_za_proshedshiy_mesyats_Begin.AsInt);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 07 Февраля 2023, 10:23:07
Здравствуйте.

Цитировать
mDate := RecodeDateTime(Now, YearOf(Now), MonthOf(IncMonth(Now, -1)), 1, 0, 0, 0, 0);
В этом коде Вы не вычитаете месяц. Вы берёте текущую дату/время и меняете в ней год на текущий (т.е. оставляете его без изменений), месяц на предыдущий, день на 1, а время на 00:00:00.
Вот код который вычитает месяц правильно:
Код: (delphi)
mDate := IncMonth(Now, -1);  // вычитаем месяц из текущей даты
mDate := RecodeDateTime(mDate, YearOf(mDate), MonthOf(mDate), 1, 0, 0, 0, 0);  // меняем день на 1 и обнуляем время
// теперь можно использовать mDate
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pro_100_russ от 07 Февраля 2023, 10:43:57
Спасибо большое! ;D

Цитировать
Вот код который вычитает месяц правильно:
Код: (delphi)
mDate := IncMonth(Now, -1);  // вычитаем месяц из текущей даты
mDate := RecodeDateTime(mDate, YearOf(mDate), MonthOf(mDate), 1, 0, 0, 0, 0);  // меняем день на 1 и обнуляем время
// теперь можно использовать mDate
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: yukiaire от 13 Февраля 2023, 17:03:28
Здравствуйте, хочу создать свой класс, компилятор ругается на объявление функции. Подскажите по синтаксису, как правильно нужно написать
Код: (delphi)
interface
 type
Tester = class
public
//function Proverka(a, b, c: Integer): Integer; //функция для проверки зависания, исполнять только в секундном скрипте!
constructor Create;

 end;

implementation
constructor Tester.Create();
  begin
  end;

function Proverka(a, b, c: Integer): Integer;
var
flag : Boolean;
m, resA, resB  : Integer;
begin
if abs(a - b) > c then
  flag := True
else
  begin
  flag := False;
  m := 0;
  end;
  if flag then
  begin
   if m < 5 then
    begin
      if time60s.AsBool then
      begin
       resA:= abs(a - resA) + resA;
       resB:= abs(b - resB) + resB;
       m := m + 1;
       time60s.Value := False;
      end;  //end if time60
    end;  //end while
    if (m >= 5) and (resA = 0) and (resB = 0) then
       result := 3
       else if (m >= 5) and (resA = 0) then
       result := 1
       else if (m >= 5) and (resB = 0) then
       result := 2
       else result := 0;
   end;  // end if flag
 end; // end function
end.
   

Upd: разобралась сама, дело было в том, что далее функцию надо было написать, как Tester.Proverka...                 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TamaTama от 14 Февраля 2023, 10:29:08
Здравствуйте. абсолютный новичек в вашем софте и в программировании тоже. Помогите создать универсальный скрипт для статус бара, в котором по битам переменной (аж 13 штук) изменять текстовое поле по разным признакам: текст, цвет текста, фон текста и/или мигание фона. Все это для создания шаблонного окна управления двигателем. (включен, отключен, не включился, не отключился, отключается, включается, авария, ремонт и т.д.) Полистал тему листов 30, соединенные скрипты мне не попались и вообще не понимаю возможно ли одним скриптом собрать изменение нескольких признаков. В мануале примеров не попалось.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Февраля 2023, 15:46:33
Здравствуйте.

Если двигатель всегда находится в каком-то одном состояний(в переменной одновременно может быть активен только один бит), то вместо проверки битов можно использовать текущее значение переменной. Объект "Текст" нужно связать с требуемой переменной и по событию OnDataChange объекта (https://simple-scada.com/help/script/creatscript.html) создать универсальный скрипт, например:
Код: (delphi)
procedure ChangeText(aText: string; AFontColor, AColor, aFlashColor: Cardinal);
begin
  (Sender as TM_Text).Text := aText;              // текст
  (Sender as TM_Text).FontColor := AFontColor;    // цвет текста
  (Sender as TM_Text).Color := AColor;            // цвет фона
  (Sender as TM_Text).FlashColor := aFlashColor;  // цвет мигания
end;

begin
  if not (Sender is TM_Text) then Exit;  // если скрипт вызван не объектом Текст, то прерываем выполнение
  case (Sender as TM_Text).AsInt of      // если значение переменной равно:
    1     : ChangeText('Включен', clBlack, clForestGreen, clNone);         // активен бит 0
    2     : ChangeText('Отключен', clBlack, clDarkSalmon, clNone);         // активен бит 1
    4     : ChangeText('Авария', clBlack, clFireBrick, clRed);             // активен бит 2
    8     : ChangeText('Состояние 4', clBlack, clForestGreen, clNone);     // активен бит 3
    16    : ChangeText('Состояние 5', clBlack, clForestGreen, clNone);     // и т.д.
    32    : ChangeText('Состояние 6', clBlack, clForestGreen, clNone);
    64    : ChangeText('Состояние 7', clBlack, clForestGreen, clNone);
    128   : ChangeText('Состояние 8', clBlack, clForestGreen, clNone);
    256   : ChangeText('Состояние 9', clBlack, clForestGreen, clNone);
    512   : ChangeText('Состояние 10', clBlack, clForestGreen, clNone);
    1024  : ChangeText('Состояние 11', clBlack, clForestGreen, clNone);
    2048  : ChangeText('Состояние 12', clBlack, clForestGreen, clNone);
    4096  : ChangeText('Состояние 13', clBlack, clForestGreen, clNone);
    8192  : ChangeText('Состояние 14', clBlack, clForestGreen, clNone);
    16384 : ChangeText('Состояние 15', clBlack, clForestGreen, clNone);
    32768 : ChangeText('Состояние 16', clBlack, clForestGreen, clNone);
  else
    ChangeText('Не определено', clBlack, clGray, clNone);
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TamaTama от 15 Февраля 2023, 07:55:33
спасибо, все получилось. купили ваш полный пакет, будем обучаться.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AlexejKa38 от 15 Февраля 2023, 10:10:39
Добрый день.

В выходные дни на компьютере с работающей Simple-Scada произошел сбой и он завис. Из-за этого три дня не работала архивация данных. Теперь необходимо как-то вручную внести данные в архив. Есть процедура чтения архивного значения переменной, а вот процедуры записи в архив нет.  Хотел записать значения в архив с помощью SQL запросов, но прочитал на форуме, что записывать в базу данных скады нельзя. Как тогда можно изменить архивные значения переменной?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 15 Февраля 2023, 16:29:47
Здравствуйте.

К сожалению, возможности ручного добавления данных в архив нет.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 17 Февраля 2023, 16:41:48
Доброго!

В руководстве по скриптам на сайте https://simple-scada.com/help/script/playusersound.html (https://simple-scada.com/help/script/playusersound.html) для процедуры PlayUserSound указан допустимый звуковой пользовательский файл в формате ".ogg", а в справке по F1 из редактора скриптов указана возможность использовать также файл в формате ".wav"
".wav" у меня запустить не получилось. Значит он пока не поддерживается?

И второй вопрос, по поводу проигрыша нескольких пользовательских файлов подряд.
Нужно проигрывать шаблонную конструкцию:
Первый файл: "Котел №%....%"
Второй файл: "Причина аварии"

Я ведь могу сделать так?
Скрипт по изменению переменной. Изменилась одна из шести переменных номера аварии:
Тогда проигрываю файл "boiler_alarm_%....%.ogg", меняю внутреннюю переменную bool_ogg1:=True, которая означает начало проигрывания "звук.файла 1"
Код: (delphi)
PlayUserSound('Name', Variable.Name+'.ogg',False);
bool_ogg1:=True;
num_alarm:=Variable.Value;
В секундном скрипте делаю задержку для гарантированного окончания проигрыша "звук.файла 1"  в 3 секунды и запускаю второй файл "Причина аварии"
Код: (delphi)
var
ii: Integer;
begin
if bool_ogg1= true then ii:=ii+1;
if ii>2 then
begin
PlayUserSound('Name', IntToStr(num_alarm)+'.ogg',False);
ii:=0;
bool_ogg1:=False;
end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 17 Февраля 2023, 17:19:46
Здравствуйте.

Цитировать
".wav" у меня запустить не получилось. Значит он пока не поддерживается?
Wav устарел и больше не поддерживается, поэтому нужно использовать более компактный и производительный .ogg. При необходимости можно конвертировать wav-файл в ogg, например через этот онлайн конвертер (https://convertio.co/ru/wav-ogg/). В следующем обновлении файлы руководства в CHM будут обновлены, информация о Wav будет удалена.

Цитировать
Я ведь могу сделать так? Скрипт по изменению переменной. Изменилась одна из шести переменных номера аварии. Тогда проигрываю файл "boiler_alarm_%....%.ogg", меняю внутреннюю переменную bool_ogg1:=True, которая означает начало проигрывания "звук.файла 1"
Да, Вы можете попробовать реализовать проигрывание таким образом, только вместо локальных переменных скрипта "bool_ogg1" и "ii" Вам нужно использовать внутренние переменные созданные через редактор (https://simple-scada.com/help/manual/editor.html). Пояснения по использованию локальных переменных в скриптах см. по ссылке (https://simple-scada.com/help/script/compilerchange.html)(Изменение 1).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: v.melnikov от 02 Марта 2023, 11:45:42
Коллегии может уже кого всплывала такая проблема с парсингом JSON?
Сразу скажу что синтаксис Paskal мною подзабыт, вполне возможно что решение банальное и очевидное.

прилетает к примеру такой ответ(специально зарезал до двух массиивов):
Код
{
    "2a52cc7d-c35e-46a0-97e2-22cfbf5749e0": {
        "_LastCoords": null,
        "_LastData": "2023-02-28T10:25:01Z",
        "ID": "2a52cc7d-c35e-46a0-97e2-22cfbf5749e0",
        "Name": "ОМ1",
        "LastPosition": {
            "Lat": 0.0,
            "Lng": 0.0
        },
        "DT": "2023-02-28T10:25:01Z",
        "State": 0,
        "Speed": -1.0,
        "Course": -1.0,
        "Address": "–",
        "Final": {
            "CosF1_ME1": 0.99,
            "Freq1_ME1": 49.99,
            "I1_L1_ME1": 12.656,
            "I1_L2_ME1": 28.432000000000002,
            "I1_L3_ME1": 18.032,
            "Inst_ActivePower1_ME1": 15.518399999942631,
            "Inst_ReactivePower1_ME1": 0.0,
            "U1_L1_ME1": 237.94,
            "U1_L2_ME1": 233.03,
            "U1_L3_ME1": 233.76
        },
        "LastCoords": null,
        "LastData": "2023-02-28T10:25:01"
    },
    "38acaaba-bd6b-4216-b49e-78100fb44390": {
        "_LastCoords": null,
        "_LastData": "2023-02-28T10:25:01Z",
        "ID": "38acaaba-bd6b-4216-b49e-78100fb44390",
        "Name": "ОМ2",
        "LastPosition": {
            "Lat": 0.0,
            "Lng": 0.0
        },
        "DT": "2023-02-28T10:25:01Z",
        "State": 0,
        "Speed": -1.0,
        "Course": -1.0,
        "Address": "–",
        "Final": {
            "CosF1_ME1": 0.99,
            "Freq1_ME1": 49.99,
            "I1_L1_ME1": 12.656,
            "I1_L2_ME1": 28.432000000000002,
            "I1_L3_ME1": 18.032,
            "Inst_ActivePower1_ME1": 15.518399999942631,
            "Inst_ReactivePower1_ME1": 0.0,
            "U1_L1_ME1": 237.94,
            "U1_L2_ME1": 233.03,
            "U1_L3_ME1": 233.76
        },
        "LastCoords": null,
        "LastData": "2023-02-28T10:25:01"
    }
}
Тут имеются два основных массива "2a52cc7d-c35e-46a0-97e2-22cfbf5749e0" и "38acaaba-bd6b-4216-b49e-78100fb44390", так API обзывает массивы по ID устройства. Из каждого из них нужны параметры из массивов "Final".
понимаю что для каждого извлечения из них должно быть что такое:
Код: (delphi)
aValues1 := Response['2a52cc7d-c35e-46a0-97e2-22cfbf5749e0']['Final'];
aValues2 := Response['2a52cc7d-c35e-46a0-97e2-22cfbf5749e0']['Final'];
а дальше просто уже разбор данных по принципу:
Код: (delphi)
    U_L1_ME1.Value := aValues1['U1_L1_ME1'].AsFloat;
    U_L2_ME1.Value := aValues1['U1_L2_ME1'].AsFloat;
    U_L3_ME1.Value := aValues1['U1_L3_ME1'].AsFloat;
С одиночным разбором мне всё понятно.
Не могу понять как сделать последовательную обработку  каждого корневого массива в одном скрипте, уж очень не хочется слать запросы на каждое устройство отдельно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 02 Марта 2023, 16:00:40
Здравствуйте.

Ниже пример скрипта. Если разобраться не получится, то пришлите для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\".
Код: (delphi)
var
  I: Integer;
  aNumVar: string;
  aDevice, aValues: TM_JSONNode;
  aVarL1, aVarL2, aVarL3: TM_Variable;
begin
  if Response.Tag = 2 then
  begin
    for I := 0 to Response.Count - 1 do
    begin
      aNumVar := IntToStr(I + 1);    // номер устройства для поиска переменных
      aDevice := Response.Nodes[I];  // извлекаем очередное устройство
      aValues := aDevice['Final'];   // получаем массив значений 'Final' из устройства

      // ищем переменные, в которые нужно записать значения из массива
      // переменные должны иметь однотипные имена, например Dev1_U1_L1_ME1, Dev1_U1_L2_ME1,
      // Dev2_U1_L1_ME1, Dev2_U1_L2_ME1 и т.д.
      aVarL1 := GetVariableByName('Dev' + aNumVar + '_U1_L1_ME1');
      aVarL2 := GetVariableByName('Dev' + aNumVar + '_U1_L2_ME1');
      aVarL3 := GetVariableByName('Dev' + aNumVar + '_U1_L3_ME1');

      // если переменные существуют
      if (aVarL1 <> nil) and (aVarL2 <> nil) and (aVarL3 <> nil) then
      begin
        // записываем в переменные нужные значения из массива 'Final'
        aVarL1.Value := aValues['U1_L1_ME1'].AsFloat;
        aVarL2.Value := aValues['U1_L2_ME1'].AsFloat;
        aVarL3.Value := aValues['U1_L3_ME1'].AsFloat;
      end;
    end;
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Daniil от 09 Марта 2023, 14:57:59
Здравствуйте!
Только начинаю этот нелегкий путь, посему прошу строго не судить. Задача состоит в выводе определенного текста в поле текущего состояния оборудования, исходя из пришедшего значения переменной integer. Реализован шаблон устройства и шаблонное окно. При вызове следующего скрипта по триггеру OnInit не работает. Также не работает при триггере OnInit в окне. А вот в окне же на OnShow уже прекрасно отрабатывает. Не подскажите в чем может быть проблема? Заранее спасибо.
Код: (delphi)
var
 ACStateField: TM_Field;
 varVariableACStateField: TM_Variable;
begin
  ACStateField := GetTemplateObject('txtAirCoolerWTEN1State') as TM_Field;
  if(ACStateField <> nil) then begin
    //Log_Add(ACStateField.Name);

    varVariableACStateField:= GetVariableByID(ACStateField.VariableID);
    if(varVariableACStateField <> nil) then begin
      { Log_Add(varVariableACStateField.Name); }
      Log_Add(varVariableACStateField.Name + ' - ' + IntToStr(varVariableACStateField.AsInt));

      case varVariableACStateField.AsInt of                  // если значение переменной связанной с полем равно:
         0: ACStateField.Text:= 'Отключено';  // изменить цвет рамки на зеленый          // состояние В работе.
         1: ACStateField.Text:= 'Отказ';    // изменить цвет рамки на красный          // состояние Неисправность
         2: ACStateField.Text:= 'Ожидание';   // изменить цвет рамки на серый            // состояние Выкл.
         3: ACStateField.Text:= 'Охлаждение';  // изменить цвет рамки на зеленый          // состояние В работе.
         4: ACStateField.Text:= 'Подготовка к оттайке';    // изменить цвет рамки на красный          // состояние Неисправность
         5: ACStateField.Text:= 'Оттайка';   // изменить цвет рамки на серый            // состояние Выкл.
         6: ACStateField.Text:= 'Задержка охлаждения';  // изменить цвет рамки на зеленый          // состояние В работе.
         7: ACStateField.Text:= 'Задержка вентиляции';    // изменить цвет рамки на красный          // состояние Неисправность
       else
         ACStateField.Text:= 'Неизвестное';
       end;
     end;

  end;

  //Log_Add(ACStateField.Text);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 09 Марта 2023, 22:30:36
Здравствуйте.

Цитировать
Задача состоит в выводе определенного текста в поле текущего состояния оборудования, исходя из пришедшего значения переменной integer.
Для данной задачи не требуется использовать события OnInit или OnShow. Пример нужного скрипта можно найти в руководстве по ссылке (https://simple-scada.com/help/script/changetext.html)(пример №4). Далее, опишем подробнее. Если Вам требуется отображать текст, то для этого нужно использовать компонент "Текст (https://simple-scada.com/help/manual/text.html)". В свойстве "Переменная" объекта "Текст" укажите переменную, по которой должно отображаться состояние оборудования. Затем перейдите в редактор скриптов (https://simple-scada.com/help/script/index.html) и создайте новый скрипт с типом "Универсальный" (https://simple-scada.com/help/script/event-types.html) и следующим кодом:
Код: (delphi)
 begin
  if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
      case AsInt of           // если значение переменной связанной с текстом равно:
        0 : Text := 'Отключено';
        1 : Text := 'Отказ';
        2 : Text := 'Ожидание';
        3 : Text := 'Охлаждение';
        4 : Text := 'Подготовка к оттайке';
        5 : Text := 'Оттайка';
        6 : Text := 'Задержка охлаждения';
        7 : Text := 'Задержка вентиляции';
      end;
end.
После этого назначьте скрипт на событие OnDataChange объекта (https://simple-scada.com/help/script/creatscript.html) "Текст". Данный скрипт универсальный (https://simple-scada.com/help/script/script-types.html), поэтому его можно назначить для всех объектов "Текст", в которых нужно отображать состояние оборудования. Для этого создайте требуемое количество объектов "Текст", назначьте им нужные переменные и в событии OnDataChange выберите созданный ранее скрипт.

Если разобраться не получится, то пришлите для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\" и укажите, какой скрипт нужно проверить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Daniil от 10 Марта 2023, 07:48:12
Кажется Вы не совсем поняли задачу. Такой скрипт, как представили Вы у меня естественно написан по изменению переменной. НО! При первом открытии скады и, до изменения привязанной переменной, мне не хочется видеть гордую 1 в поле где должно быть написано "Отказ". Для этого мне надо проинициализировать шаблон. И вот триггер OnInit не работает как должен (ну или я что-то не понял правильно, и прошу Вас помочь). А вот OnShow отрабатывает прекрасно (с тем же текстом скрипта).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: teplocom от 10 Марта 2023, 08:33:33
Я бы вашу задачу решил добавлением внутренней Integer-переменной  Init_sec
В секундном скрипте прописал бы: Init_sec.Value:=Init_sec.Value+1;
А для поля в шаблоне назначил бы ваш скрипт по изменению этой дополнительной переменной: Init_sec
Может не оптимально по производительности, но будет отрабатывать раз в секунду, что бы не случилось)))
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Daniil от 10 Марта 2023, 09:26:40
Безусловно так решить задачу можно, но как Вы верно подметили это абсолютно не оптимально. Костыльно слегонца) Да и хотелось бы чтобы заявленные функции, все-таки отрабатывали. Может я действительно что-то упускаю... Кстати при переключении вкладок - тоже слетает текст на integer привязанной переменной, так что вероятно костыль становится единственно возможным решением, но все-таки ждем официального ответа (или oninit() отрабатывает каждый раз при создании окна - тогда все будет работать как положено).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Марта 2023, 10:13:18
не хочется видеть гордую 1 в поле
Если Вы привязали компонент "Поле" (https://simple-scada.com/help/manual/field.html) к переменной, то поле будет автоматически выводить значение привязанной переменной, например "1". Вы можете сколько угодно переопределять значение в поле, заменяя его текстом, но оно всегда будет возвращаться к оригинальному значению переменной. Скрипты здесь ни при чем, все они выполняются в точности как описаны, но на вышеописанное поведение не влияют. Как мы писали ранее, для решения задачи не нужны скрипты OnInit и OnShow, смотрите наш предыдущий ответ и используйте для отображения текста компонент "Текст" (https://simple-scada.com/help/manual/text.html), который именно для этого и предназначен, как видно из названия.
Если разобраться не получится, то пришлите для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\" для проверки.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Daniil от 10 Марта 2023, 10:31:13
С привязкой переменных и их отображением допустим понятно, однако Вы так и не ответили почему не отрабатывает данный конкретный скрипт с переопределением по триггеру инициализация? А то пока ответ в духе, так не задумывалось - делай по -другому. Да и не очень понятно, почему она будет возвращаться - если по инициализации скрипт отработает (а пока нет), а дальше по изменению переменной тоже (уже отрабатывает). Еще какие-то скрытые скрипты будут это значение возвращать? Не поясните? И кстати у Вас же написано в мануале при любой возможности использовать поле вместо текста, не я это придумал...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 10 Марта 2023, 11:02:34
Цитировать
А то пока ответ в духе, так не задумывалось - делай по -другому.
Вы можете делать как угодно, в том числе так, как не задумывалось, результат будет зависеть от того, что Вы напишете. Мы просто отвечаем как нужно решить задачу о которой Вы спрашиваете. Корректное готовое решение, без лишних скриптов, было описано в нашем первом ответе. Компонент поле выводит значение привязанной к нему переменной, в этом его смысл и причина по которой вместо текста Вы видите число. Скрипты к этому отношения не имеют.

Цитировать
Вы так и не ответили почему не отрабатывает данный конкретный скрипт
Как писали в предыдущем ответе, все скрипты отрабатывают и выполнятся как описаны. Скрипт OnInit выполняется также, как и OnShow, только в разное время. OnInit в момент запуска проекта, а OnShow в момент когда Вы открываете окно. Поэтому OnInit назначает текстовое значение в поле, затем переменная инициализируется и поле автоматически берёт числовое значение переменной. А OnShow заменяет значение на текст после инициализации переменной и вы успеваете увидеть в поле текст, который затем всё равно изменится на значение переменной. Не обязательно знать это, чтобы решить описанную Вами задачу.

Цитировать
Еще какие-то скрытые скрипты будут это значение возвращать?
В скаде не используются скрытые скрипты. Если Вы имеете в виду работу компонентов, то они все работают по-разному. Кнопка автоматически меняет своё состояние в зависимости от значения привязанной переменной, заслонка меняет цвет, поле отображает значение привязанной переменной и так далее. Ничего "скрытого" в этом нет.

Цитировать
И кстати у Вас же написано в мануале при любой возможности использовать поле вместо текста, не я это придумал...
Верно, прочтите внимательно в руководстве, для вывода значения переменной нужно использовать поле, без использования скриптов. Для вывода текста нужно использовать компонент Текст, для вывода изображений компонент "Изображение" и т.д.

Рассмотрите использование других SCADA-систем, возможно Вам лучше подойдут системы в которых компоненты работают по-другому.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TamaTama от 17 Марта 2023, 10:02:12
Здравствуйте, возникла нетривиальная задача и я не могу, ввиду технической неграмотности, ее решить.
Объект парк емкостей с насосами, клапанами и возможностью загрузки/разгрузки с блокировкой соответствующих клапанов, из одной общей трубы в емкости и из емкостей в другую общую трубу. Нарисовал шаблон выбора загрузки/разгрузки емкости. Управление работает. Встал вопрос текстовых статусов. Так как реализовано ФГУ, то мне нужно вытащить статусы "Работа ФГУ" и "Окончание ФГУ" каждая своим BOOL сигналом. И с учетом что у загрузки и у разгрузки свои теги получаем 4 сигнала. Далее у каждой емкости в блокировке ФГУ есть состояния клапанов других емкостей по битам у загрузки 14 битов у разгрузки 12 битов и соответственно у каждой в битах свой набор клапанов. Сообщения из битов скриптом, как я понимаю, в поле "текст" придется сделать под каждую емкость своё. Тогда по идее нужно уходить от шаблонов и под каждую емкость создать окно управления. Если не прав то поправьте, каким функционалом это возможно сделать. и вопрос как в одном тексте писать статусы 4 тегов, и возможно ли это вообще. Или сделать 2 текстовых поля в одном статусы по битам из скрипта с клапанами, а другой на 4 тега. или сделать 4 текста один на одном каждый со своим тегом и как ты выключать остальные, когда висит первый? Надеюсь хоть что нибудь понятно)
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 20 Марта 2023, 06:10:58
   Здравствуйте.
... Тогда по идее нужно уходить от шаблонов и под каждую емкость создать окно управления...
Шаблон можно использовать для вывода списка произвольных сообщений. Во вложении на первой странице примеры двух шаблонов вывода списка.
Один шаблон используется для вывода списка активных сообщений, соответствующие биты которых установлены в 1 (например, "Авария насоса").
Второй шаблон по значению бита выводит один из двух вариантов сообщения ("Клапан закрыт" - "Клапан открыт").

Для Вашего примера необходимо определить правила отображения, которые можно сформулировать только по исходной информации:
- структура регистров (существенно например, если состояние клапанов не бинарное, а 2-х и более битовое. Т.е. открыт-промежуточное/открывается/закрывается-закрыт-авария и только одно не блокирует ФГУ);
- логика ФГУ (возможные состояния 4-х битового поля статусов ФГУ, порядок перехода по состояниям по действиям оператора и автоматическим изменениям состояния всего объекта);
- что необходимо отображать (общая мнемосхема, страница для каждой емкости, окна. Минимально-достаточное количество информации для оператора).

На второй странице примера еще один шаблон в предположении что:
- состояние своих клапанов блокировки запрещает возможность пуска своей операции (делает невидимой кнопку пуска операции);
- просмотр списка состояния по требованию оператора (нажатие кнопки) и раздельно для операций Загрузки и Разгрузки;
- состояние клапана - 1 бит;
- отображаются только аварийные состояния клапанов.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 20 Марта 2023, 10:39:18
Здравствуйте.

Цитировать
мне нужно вытащить статусы "Работа ФГУ" и "Окончание ФГУ" каждая своим BOOL сигналом. И с учетом что у загрузки и у разгрузки свои теги получаем 4 сигнала. Далее у каждой емкости в блокировке ФГУ есть состояния клапанов других емкостей по битам у загрузки 14 битов у разгрузки 12 битов и соответственно у каждой в битах свой набор клапанов.
Проще всего будет добавить необходимые проверки на контроллере и свести указанные биты в одну переменную статуса, значения которой будут соответствовать статусам, например: 1 - Статус 1, 2 - Статус 2 и т.д. Далее, полученную переменную можно использовать в скада-системе. Если по каким-то причинам на контроллере это сделать невозможно, то можно попробовать реализовать это через скрипты (https://simple-scada.com/help/script/index.html), проверяя состояния требуемых битов и формируя общую переменную статуса.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 23 Марта 2023, 18:34:11
     Здравствуйте.
... у каждой емкости в блокировке ФГУ есть состояния клапанов других емкостей по битам у загрузки 14 битов у разгрузки 12 битов и соответственно у каждой в битах свой набор клапанов.
  Шаблон позволяет выводить список сообщений по значению поля непосредственно в переменных, без сведения полей в одну переменную. Сообщения собраны в группы. Управление группами предусматривает вывод одной группы или запрет вывода. Пустые сообщения не выводятся.
  Подстановка сообщения включает имя переменной, маску поля (в т.ч. и для несмежных битов поля), номер группы и набор сообщений, разделенных символом /. Шаблон не требует заполнения всех подстановок для сообщений, просмотр ведется в пределах максимального числа сообщений по подставленным переменным.
  Предполагается, что непустое сообщение указывает на блокировку и наличие хотя бы одного такого сообщения в группе устанавливает флаг блокировки группы.
Пример во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TamaTama от 14 Апреля 2023, 10:35:58
Всем здравия! Очередной вопрос. Как переделать скрипт для работы от доппеременной Ex. На основной переменной значение давления, а на доп статусы границ. и не работает адекватно.

Код: (delphi)
procedure ChangeField(AFontColor, AColor, aFlashColor: Cardinal);
begin

  (Sender as TM_Field).FontColor := AFontColor;    // цвет текста
  (Sender as TM_Field).Color := AColor;            // цвет фона
  (Sender as TM_Field).FlashColor := aFlashColor;  // цвет мигания
end;

begin
  if not (Sender is TM_Field) then Exit;  // если скрипт вызван не объектом Поле, то прерываем выполнение
  case (Sender as TM_Field).AsInt of      // если значение переменной равно:
    0    : ChangeField(clGreen, ($BAFFFF), clNone);        // активен бит 0 Норма
    1    : ChangeField(clBlack, clDarkSalmon, clNone);         // активен бит 1 Выход за предупредительную. Квитировано
    2    : ChangeField(clBlack, clForestGreen, clDarkSalmon);  // активен бит 2 Выход за предупредительную снизу
    3    : ChangeField(clBlack, clForestGreen, clDarkSalmon);  // активен бит 3 Выход за предупредительную сверху
    4    : ChangeField(clGreen, clFireBrick, clGreen);          // Выход за аварийную. Квитировано
    5    : ChangeField(clBlack, clYellow, clFireBrick);        // Выход за аварийную снизу
    6    : ChangeField(clBlack, clYellow, clFireBrick);        // Выход за аварийную сверху

  else
    ChangeField(clBlack, clGray, clNone);
  end;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 14 Апреля 2023, 10:54:04
Здравствуйте.

Для обращения к доп. переменной используйте свойство "VariableEx (https://simple-scada.com/help/script/variableex.html)", например:
Код: (delphi)
case (Sender as TM_Field).VariableEx.AsInt of

При этом, для работы с доп. переменной скрипт должен быть назначен на событие OnDataChangeEx.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TamaTama от 16 Апреля 2023, 16:29:50
Я так и делал, только точку забыл, потому и не компилилось. Спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: lipvasko от 25 Апреля 2023, 16:04:31
 Добрый день, можно с помощью скады  отправлять и получать OLE  запросы по типу таких
Описание методов для OLE-подключения
Имя сервера для программного доступа к методам и свойствам: Controller.ScAuto
В стандартной поставке программа экспортирует следующие методы:
GetWeight(AdrTerm,ChannelN) - получить значение веса БРУТТО;
GetWeightNetto(AdrTerm,ChannelN) - получить значение веса НЕТТО;
SetNull(AdrTerm,ChannelN) - обнулить показания терминала(установка нуля)
GetStatus(AdrTerm,ChannelN) - получить текущий статус (возвращает -5002 когда вес стабилен
В случае возникновения нестандартных ситуаций, методы могут возвращать следующие
значения:
1. -5000 и -5001 - «Терминал не обнаружен» и «С терминалом нет связи» соответственно.
Справедливо для всех методов;
2. -5002 - «Команда выполнена» для всех методов, «Вес стабилен» для метода GetStatus;
3. -5003 - «Выход за границы диапазона» для метода GetCount, «Вес не стабилен» для метода
GetStatus;
4. -5005 - ошибочный вызов метода
и как это будет выглядеть ,пример скрипта , если можно.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 25 Апреля 2023, 17:21:25
Здравствуйте.

Да, это возможно. Вот пример скрипта на событие OnClick кнопки:
Код: (delphi)
var
  aController: Variant;
  aTerminalN: Integer;
  aTerminalAddress: Integer;
  aChannelNumber: Integer;
begin
  aController:= CreateOleObject("Controller.ScAuto");  // создаем OLE-объект
  aChannelNumber := 1;    // здесь нужно указать реальный номер канала
  aTerminalN := 1;        // здесь нужно указать реальный номер терминала
  aTerminalAddress := aController.GetTerminalAddress(aChannelNumber, aTerminalN);  // получаем адрес терминала
  Text1.Text := aController.GetStatus(aTerminalAddress, aChannelNumber);  // вызываем метод GetStatus и выводим результат в компонент Text1
end.
Но учтите, что для работы с OLE-объектами может потребоваться запуск сервера скады от имени администратора. Также различные сбои в работе OLE-объектов могут отразиться на работе сервера скады и приостановить выполнение других скриптов пока выполняются методы OLE-объекта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ACHE от 17 Мая 2023, 12:35:24
Здравствуйте.
С ОРС сервера берем переменную типа IntegerArray. Массив содержит коды нештатных ситуаций прибора в виде "00, 01, 02, 03, 04, ...,29". Каждое число означает какую-то ошибку. Как в массиве найти определенное число в независимости от его положения?
Нужно при наличии в массиве чисел, например, 00, 06, 08, 23 как одновременно так и по отдельности выдать аварийное сообщение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 18 Мая 2023, 21:30:31
Здравствуйте.

Доступные свойства для работы с внешней переменной-массивом и пример скрипта прохода по элементам массива можно посмотреть в этом сообщении (https://simple-scada.com/forum/index.php?topic=597.msg5408#msg5408). Можно создать скрипт с типом события (https://simple-scada.com/help/script/event-types.html) "Изменились переменные" и в список скрипта добавить переменную-массив (как это описано в инструкции (https://simple-scada.com/help/script/changemulvar.html)). После этого скрипт будет вызываться каждый раз, когда переменная-массив изменилась. Далее можно проходить по элементам массива, выполнять проверку на соответствие нужным значениям(00, 06, 08, 23) и при совпадении выводить сообщения с помощью процедур AddMessage (https://simple-scada.com/help/script/addmessage.html) или AddMessageToGroup (https://simple-scada.com/help/script/addmessagetogroup.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: deldemo от 23 Июля 2023, 10:50:33
Здравствуйте!!! Уважаемые! нежна помощь. Необходимо поворачивать объект по  свойству angle с изменяемой скоростью вращения и углом и с анимацией поворота, то есть от угла 0 до угла 90 объект должен пройти все градусы за определенное время. С углом проблем нет. А вот со скоростью есть,  ни как не пойму как реализовать. Скрипт будет выполнятся по изменению переменной.   
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 25 Июля 2023, 10:03:09
Здравствуйте.

Выполнять изменение угла объекта можно по изменению переменной (https://simple-scada.com/help/script/object-events.html) или в скрипте "Прошла секунда (https://simple-scada.com/help/script/second-passed.html)". При этом скорость изменения угла будет зависеть от частоты выполнения скрипта. Например, можно при каждом изменении переменной или каждую секунду поворачивать объект на заданное число градусов. Но мы не рекомендуем использовать подобные анимации поворота, лучше по изменению переменной сразу поворачивать объект на требуемый угол, без анимации поворота.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreyA от 01 Августа 2023, 10:44:49
Здравствуйте!
Задача: необходимо, чтобы при клике на исполнительный механизм открывалось однотипное окно  и у объектов окна переменные подменялись на соответствующие переменные исполнительного механизма. Для этого использовал функцию "GetVariableByName".
По примеру сделал универсальный скрипт, использовал свойство "Тег", как номер механизма но возник вопрос - у меня в проекте есть объекты которые имеют индекс с нижним подчеркиванием (например Конвейер Р26_6) и свойство объекта Тэг я не могу использовать так как там есть поддержка только Int переменных.
В шаблонном окне вывел с помощью объекта Текст и Подстановка1 текстовую переменную(вложение Text1).
Как можно обратиться к объекту Текст в шаблонном окне с помощью функции GetTemplateObject?
Я так понимаю что первый скрипт должен сработать при инициализации окна (открытии) когда в переменной будет номер объекта(конвейер), а затем  второй скрипт по нажатию кнопки соберет строку для поиска переменной.
Спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 01 Августа 2023, 16:57:33
Здравствуйте.

Цитировать
у меня в проекте есть объекты которые имеют индекс с нижним подчеркиванием
Опишите максимально подробно, какую именно задачу Вы пытаетесь решить? Может быть требуется менять цвет этих объектов, другие свойства или что-то еще? Проще всего будет, если Вы пришлете на support@simple-scada.com для проверки текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\", подробно опишите задачу и укажите шаблон/объект/скрипт который нужно проверить. После проверки проекта мы укажем наиболее простой способ решения задачи.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: samum от 09 Августа 2023, 14:55:07
Здравствуйте. Недавно начал изучать Вашу систему и возникли вопросы по внешнему виду кнопок, а именно:
имеется несколько страниц (Страница1, Страница2 и Страница3) на каждой из которых есть свои кнопки (например, btn_But1, btn_But2 и btn_But3 соответственно). Допустим, с Страница1 по нажатии кнопки btn_Start запускается основная программа на ПЛК (через ОРС-сервер), переменная Star_process меняется на True. Пока выполняется основная программа (Star_process = True), требуется чтобы эти три кнопки  стали неактивные, а по завершении или отмене программы (Star_process = False) стали опять активны.
Для этого этим трём кнопкам привязал в доп. переменную переменную btn_Start и прописал в универсальный скрипт изменения свойств Enabled/Color/Alpha. По нажатию кнопки btn_Start кнопки становятся неактивны и малоразличимы (что и требуется). Однако, если перейти на любую другую страницу и вернуться на Страница1, внешний вид кнопки btn_But1 изменится на что-то промежуточное между активно/неактивно. Тоже произойдёт и с другими кнопками, если вернуться на Страница2 или Страница3.
Подскажите, как по значению переменной (Bool или Word неважно) сделать неактивной кнопки на разных страницах (внешний вид примерно как в Windows) и чтобы они не менялись при переходе на другие страницы или окна ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 09 Августа 2023, 15:08:28
Здравствуйте.

Пришлите для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\" и укажите кнопки/скрипт, которые нужно проверить.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: samum от 10 Августа 2023, 16:36:21
Здравствуйте. Да проект пока простой, ничего необычного. Изучая форум попробовал прописывать конкретно States[0] и вроде всё заработало ... Т.е. AButton.Alpha := 50; работает криво, а AButton.States[0].Alpha := 50; работает как надо... пока тестирую дальше
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 10 Августа 2023, 21:13:17
Здравствуйте.

Все верно. Кнопка состоит из множества состояний(см. свойство кнопки "Состояние" (https://simple-scada.com/help/manual/button.html)), в каждом состоянии она может иметь разный цвет/прозрачность. При изменении цвета или прозрачности кнопки через скрипты, нужно менять цвет/прозрачность в требуемом состоянии (https://simple-scada.com/help/script/btnstates.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreyA от 15 Августа 2023, 15:01:38
Здравствуйте!
В проекте есть большое количество моторов и необходимо вести учет времени наработки.
Для выбора мотора сделал объект список ComboBox и промежуточную переменную vrListInt для записи индекса мотора при выборе - 1,2,3 и т.д.
В скрипте По изменению переменной сделал привязку значения этой переменной к текстовой переменной vrListText
Код: (delphi)
begin
  if vrListInt.AsInt = 1 then
    begin
      vrListText.Value := "Отчет_Мотор_1";
    end;
...
end.

Возможно ли значение текстовой переменной использовать при формировании отчета путем подстановки ее значения ?
Код: (delphi)
var
  aReport: TM_Report;
begin
  aReport := ReportBuild(vrListText.AsStr);// построить отчёт
  aReport.View(GetClientName);         // открыть для просмотра
end. 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 15 Августа 2023, 16:25:03
Здравствуйте.

Возможно ли значение текстовой переменной использовать при формировании отчета путем подстановки ее значения ?
Да, возможно. Но, если имя отчета отличается только индексом (1,2,3 и тд), то можно обойтись без дополнительной строковой переменной и использовать следующий код для кнопки формирования отчета:
Код: (delphi)
var
  aReport: TM_Report;
begin
  aReport := ReportBuild('Отчет_Мотор_' + vrListInt.AsStr);
  aReport.View(GetClientName);
end.
Также для построения однотипных отчетов можно использовать способ, описанный по ссылке (https://simple-scada.com/help/report/dyn-rep.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreyA от 16 Августа 2023, 13:16:03
Благодарю за оперативный ответ!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: satch от 29 Августа 2023, 08:27:07
Добрый день,
насколько я понял из документации и тестов что нельзя вызвать внешние dll командами LoadLibrary, так как отсутствует dynlibs (object pascal)
Как возможно подключить внешние dll для формул (требование метрологии)?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Daniil от 29 Августа 2023, 10:39:07
Здравствуйте!
Возник такой вопрос (простите если дубль, ибо беглый поиск по форуму не дал мне ответа), а возможно ли с помощью скрипта менять шкалы переменной. Имеются в виду уже забитые шкалы в интерфейсе переменные.
Заранее спасибо.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 29 Августа 2023, 12:22:34
Здравствуйте.

Цитировать
насколько я понял из документации и тестов что нельзя вызвать внешние dll командами LoadLibrary, так как отсутствует dynlibs (object pascal)
Как возможно подключить внешние dll для формул (требование метрологии)?
Возможности подключать внешние dll нет.

Цитировать
Возник такой вопрос (простите если дубль, ибо беглый поиск по форуму не дал мне ответа), а возможно ли с помощью скрипта менять шкалы переменной. Имеются в виду уже забитые шкалы в интерфейсе переменные.
Шкала переменной задается через редактор и с помощью скриптов изменить ее не получится. Через скрипты можно получить только минимум/максимум шкалы переменной(свойства Minimum (https://simple-scada.com/help/script/varminimum.html) и Maximum (https://simple-scada.com/help/script/varmaximum.html)), но изменить их нельзя.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Albert007 от 20 Октября 2023, 13:16:45
Всем привет! Создал в РЕДАКТОРЕ четырех пользователей:
1) Оператор1 ФИО
2) Оператор2 ФИО
3) Оператор3 ФИО
4) Оператор4 ФИО
Подскажите пожалуйста можно ли из КЛИЕНТА менять имена пользователей, в частности ФИО, ввиду текучки операторов?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 22 Октября 2023, 22:31:49
Здравствуйте.
Сейчас редактировать пользователей можно только через редактор.

Цитировать
Подскажите пожалуйста можно ли из КЛИЕНТА менять имена пользователей, в частности ФИО, ввиду текучки операторов?
Это одна из приоритетных задач, такая возможность обязательно будет добавлена в одно из будущих обновлений.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TamaTama от 16 Ноября 2023, 10:51:42
Всем здравия, я с очередной порцией вопросов.
1) На картинке баковое хозяйство. В процессе написание ФГУ по работе с емкостями и насосами и защитами. Выбор емкости для работы сделан кнопкой с фиксацией над емкостью. При нажатии улетает 1 в переменную. Окрашивание цветом и емкости и кнопки сделано. Хотелось бы сделать при выборе любой другой емкости, чтобы сбрасывался выбор предыдущей емкости. Ибо сейчас их можно все разом выбрать. Как это реализовать скриптом пока не понимаю.
2) Увидел что можно окрашивать маршруты трубами по переменной, но пока не понимаю как сделать с таким количеством пересекающихся маршрутов. Использовать функцию отображения и для каждого маршрута отдельно нарисовать трубу? или как то по другому можно? И как решить вопрос с выходом нужного слоя поверх остальных?
 
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Сергей-К от 16 Ноября 2023, 18:00:17
Добрый день!
В БД есть таблица, в которую через определённый промежуток времени поступают данные о кол-ве всего собранных коробок с контроллера. Подскажите, можно ли в объекте «Таблица» заполнять только первые две колонки по запросу из БД а в третьей колонке вычислять сколько коробок собрано за промежуток времени (т.е нужно от кол-ва во второй строке отнять кол-во в первой строке, от кол-ва в третьей строке отнять кол-во во второй строке и т.д.)?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple-Scada от 16 Ноября 2023, 18:34:48
Здравствуйте.

Хотелось бы сделать при выборе любой другой емкости, чтобы сбрасывался выбор предыдущей емкости. Ибо сейчас их можно все разом выбрать. Как это реализовать скриптом пока не понимаю.
Сбрасывать значение переменных других емкостей и включать выбранную.

для каждого маршрута отдельно нарисовать трубу? И как решить вопрос с выходом нужного слоя поверх остальных?
Конечно, делать участки трубопровода (которые нужно окрасить) отдельным объектом и менять цвет конкретного объекта в зависимости от переменной. Слой можно менять через свойство "Слой".

Подскажите, можно ли в объекте «Таблица» заполнять только первые две колонки по запросу из БД а в третьей колонке вычислять сколько коробок собрано за промежуток времени (т.е нужно от кол-ва во второй строке отнять кол-во в первой строке, от кол-ва в третьей строке отнять кол-во во второй строке и т.д.)?
Не нужно переносить функции СУБД на скаду, тогда теряется сам смысл СУБД. Сделайте запрос который сразу сформирует готовый результат, чтобы дополнительно ничего не высчитывать в скаде, например:
Код: (sql)
SELECT 
  my_table.id,
  my_table.value,
  LEAD(my_table.value, 1) OVER win - my_table.value AS "Разница"
FROM my_table
WINDOW win AS (ORDER BY my_table.id)
Другие примеры можно найти в интернете.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Сергей-К от 17 Ноября 2023, 04:28:01
Большое спасибо за ответ
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TamaTama от 17 Ноября 2023, 11:23:02
Сбрасывать значение переменных других емкостей и включать выбранную.
Слой можно менять через свойство "Слой".
А можно пример как по кнопке с фиксацией button1 сбросить button2 и button3? Универсальным скриптом тут не получится как я понимаю.

Слой то понятно можно менять, а как из пирога в 6 слоев сделать так, чтобы именно определенный слой вышел поверх остальных? Или сделать статичный общий вид и вызывать через visible нужный маршрут нужным цветом?

Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 18 Ноября 2023, 00:53:29
   Здравствуйте.
Всем здравия, я с очередной порцией вопросов...
1. Для выбора только одной или не более чем одной емкости можно использовать так называемую "радиокнопку" - зависимый набор с одной или не более чем одной нажатой кнопкой.
  Кнопки объединены одной переменной в регистр кнопок, каждой кнопке соответствует один бит. Окрашивание цветом емкости с сопутствующими объектами осуществляется скриптом по изменению регистра кнопок для соответствующего бита.
  Почти подходящим для реализации радиокнопки является объект "Кнопка", за исключение того, что новые значения = 0 и 1, в отличии от прочих, работают только с битом (в примере достаточно записать в регистр кнопок число, отличное от степеней 2 и посмотреть на смену емкостей). Обходимо (см. пример), но в рабочем проекте можно применять только после консультации с разработчиками Simple-Scada.
  Второй вариант - шаблон (или россыпью) из двух объектов "Текст" и двух универсальных скриптов.
2. Вытащить "наверх" объект можно присвоив слою заведомо большОе значение. Номера слоев переупорядочиваются,  а номер слоя объекта станет наибольшим среди номеров слоев. Группа объектов упорядочивается по принципу "последний сверху". На странице 2 пример управления слоями. Изменения номеров всех слоёв для 5-ти обэектов можно посмотреть на странице 3.

  Для реального проекта необходимо четко представлять всю схему изменения цветов и слоёв. Например, выбор емкости вытаскивает наверх все объекты, связанные с этой емкостью, а цвет меняется в зависимости от состояния сопутствующих объектов (выходные участки трубопроводов клапанов и насосов - в примере левая ёмкость).


                           Добавлено 20.11.2023.
"Вторая фигура марлезонского балету" - случай большого количества кнопок или добавление к существующему проекту, в котором нет возможности использовать предыдущие варианты радиокнопки.
1 вариант: используется контроль за изменением состояния "кнопочных" переменных, к проекту добавляется один скрипт.
2 вариант: нажатие на кнопку записывает имя её переменной в общую для всех кнопок переменную, по изменению которой происходит сброс всех кнопок, кроме нажатой.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 20 Ноября 2023, 10:48:11
Здравствуйте.

Цитировать
А можно пример как по кнопке с фиксацией button1 сбросить button2 и button3? Универсальным скриптом тут не получится как я понимаю.
Можно использовать универсальный скрипт для группы кнопок. Например, кнопка Button1 связана с переменной vrA1, Button2 – с vrA2 и Button3 – с vrA3. Переменные имеют тип "Boolean". Тогда можно создать новый скрипт (https://simple-scada.com/help/script/via-script-editor.html) с типом "Универсальный скрипт (https://simple-scada.com/help/script/universal-event.html)" и назначить его на событие OnClick требуемых кнопок:
Код: (delphi)
 begin
  if Sender is TM_Object then   // проверяем, что Sender это объект
    with Sender as TM_Object do // приводим Sender к типу "TM_Object"
    begin
      if Variable = vrA1 then   // если переменная связанная с кнопкой это vrA1, то ..
      begin
        vrA2.Value := 0;        // сбрасываем другие кнопки
        vrA3.Value := 0;
      end else
      if Variable = vrA2 then
      begin
        vrA1.Value := 0;
        vrA3.Value := 0;
      end else
      if Variable = vrA3 then
      begin
        vrA1.Value := 0;
        vrA2.Value := 0;
      end;
    end;
end.
Теперь при нажатии кнопки, в переменную связанную с кнопкой запишется значение 1, а в остальные переменные кнопок запишется значение 0.


Цитировать
Слой то понятно можно менять, а как из пирога в 6 слоев сделать так, чтобы именно определенный слой вышел поверх остальных? Или сделать статичный общий вид и вызывать через visible нужный маршрут нужным цветом?
Самым простым способом будет отдельными объектами "Трубопровод (https://simple-scada.com/help/manual/pipeline.html)" отрисовать маршруты и менять их цвет (https://simple-scada.com/help/script/colorchange.html) в зависимости от значения связанной с ними переменой. Если пересечение участков маршрута достаточно сложное и обычным изменением цвета не обойтись, то можно отрисовать несколько маршрутов и менять их видимость с помощью свойства "Visible (https://simple-scada.com/help/script/visible.html)".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: TamaTama от 20 Ноября 2023, 13:16:49
Спасибо, завтра попробую. Вариант с видимостью я наверно и буду реализовывать. А сброс скриптик исправлю свой, я не так построил.
И большое спасибо товарищу  pan2000, его примеры разберу для обучения.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: yukiaire от 29 Ноября 2023, 16:37:01
Здравствуйте! Я хочу заполнять таблицу подменными переменными, как в примере вашего руководства, но таблица открывается в шаблонном окне. Надо, чтобы при открытии окна выполнялся скрипт и таблица заполнялась архивными данными. Хотела написать подстановку имен переменных путем указания шаблонного номера в теге таблицы, но скрипт упорно отказывается компилироваться пока таблица расположена в шаблонном окне.
Код: (delphi)
var
g : Integer;
t_var : TM_Variable;
begin
  g := Table1.Tag;
  t_var.Value := GetVariableByName('rate_hour' + IntToStr(g));
  ArchiveValueByTime(t_var, t_rate1, Now - 60);
  ArchiveValueByTime(t_var, t_rate2, Now - 120);
end.

Upd я так понимаю, что данная проблема возникает потому что фактически до запуска проекта объектов в шаблонном окне не существует, то есть необходимо в скрипте сначала проверять таблицу на существование. Подскажите, каким образом это сделать? Есть примеры с проверкой существования переменной, в данном случае необходимо проверять объект

Все получилось, использовала функцию GetTemplateObject
Код: (delphi)
var
  g : Integer;
  t_var : TM_Variable;
  aTable : TM_Table;
begin
  aTable := GetTemplateObject('Table1') as TM_Table;
  g := aTable.Tag;
  t_var := GetVariableByName('rate_hour' + IntToStr(g));
  ArchiveValueByTime(t_var, t_rate1, Now - 60);
  ArchiveValueByTime(t_var, t_rate2, Now - 120);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ZWolol от 21 Декабря 2023, 11:40:37
Если я правильно понял, то Value у Объекта это значение Основной переменной, с которой связан объект ?

И, если это переменная OPC, то её качество можно проверить по Variable.IsGoodQuality ?
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 21 Декабря 2023, 12:10:31
Здравствуйте.

Value (https://simple-scada.com/help/script/varvalue.html) может быть значением любой переменной(внутренней, внешней, основной, дополнительной), в зависимости от того, как данное свойство используется в скрипте. Например:
Код: (delphi)
Field1.Value := 10;            // записать значение в основную переменную связанную с объектом
Field1.VariableEx.Value := 10; // записать значение в доп. переменную связанную с объектом
MyVar.Value := 10;             // записать значение в переменную MyVar
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ZWolol от 22 Декабря 2023, 04:46:44
Спасибо, понял что для Объекта Value := 10; и Variable.Value := 10; одинаковы.
А если Объекту не назначена основная переменная, то можно ли присваивать Value значение?

Если локальной переменной присвоить значение OPC переменной:
aVariable := vrOPCVariable;
if aVariable.IsGoodQuality then ... - Эта проверка сработает?

И сохранится ли признак качества при присвоении этой переменной значения:
aVariable.Value := SetBit(aVariable.Value,0,True);
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 22 Декабря 2023, 11:33:35
Здравствуйте.

Цитировать
А если Объекту не назначена основная переменная, то можно ли присваивать Value значение?
Если объект не будет связан с переменной, то записывать значение будет некуда и при попытке записи возникнет ошибка "Обращение к несуществующему объекту" (https://simple-scada.com/help/script/debugscripts.html?anchor=acviol).

Цитировать
Если локальной переменной присвоить значение OPC переменной:
aVariable := vrOPCVariable;
if aVariable.IsGoodQuality then ...
Эта проверка сработает?
Да, сработает. В данном случае локальная переменная aVariable будет хранить ссылку на переменную vrOPCVariable, поэтому работа с aVariable будет аналогична работе с переменной vrOPCVariable.


Цитировать
И сохранится ли признак качества при присвоении этой переменной значения:
aVariable.Value := SetBit(aVariable.Value,0,True);
Как мы указали выше, в переменной aVariable будет храниться ссылка на внешнюю переменную vrOPCVariable, поэтому у переменной aVariable будет то качество, которое имеет переменная vrOPCVariable на момент выполнения скрипта.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ZWolol от 26 Декабря 2023, 07:14:52
Мы работаем с самопальным DA OPCServer (2008г), который берет данные из базы MS SQL.
Ни каких проблем с MasterScada не было на Win7.
Сейчас установили его на Win10 и с MS3.12 проблем нет, а вот у SimpleScada нет данных.
Причем нет данных и у других клиентов OPC (подключаются, но значения 0 bad).
Исходников OPCServer нет, писать новый - нет удовольствия.
Как определить в чем проблема?

P.S.
Похоже в нем защита (работа только с MS), другого объяснения я не вижу...
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 26 Декабря 2023, 13:56:26
Здравствуйте.

Цитировать
Мы работаем с самопальным DA OPCServer (2008г), который берет данные из базы MS SQL. Ни каких проблем с MasterScada не было на Win7. Сейчас установили его на Win10 и с MS3.12 проблем нет, а вот у SimpleScada нет данных.
Simple-Scada представляет собой OPC-клиент и работает в соответствии со спецификациями OPC-DA (https://opcfoundation.org/developer-tools/specifications-classic/data-access/)/ OPC-UA. В этих спецификациях описаны правила обмена сообщениями с OPC-серверами, размер сообщений в байтах, ограничения и т.д., независимо от OPC-сервера. Т.е., для работы с любыми OPC-серверами и контроллерами в Simple-Scada используется один и тот же код. Поэтому, со всеми OPC-серверами и контроллерами Simple-Scada работает совершенно одинаково, передает те же самые запросы, в соответствии со стандартами OPC. Если OPC-сервер соответствует спецификации OPC (https://opcfoundation.org/developer-tools/specifications-classic/data-access/), то проблем в работе с ним не будет.

Цитировать
Причем нет данных и у других клиентов OPC (подключаются, но значения 0 bad).
Это говорит о том, что в работе данного OPC-сервера явно имеются проблемы. Возможно он работает корректно только при подключении с одного OPC-клиента (можно это протестировать), либо имеются какие-то другие ограничения и проблемы. Точную причину может определить только разработчик данного OPC-сервера.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: AndreyA от 07 Января 2024, 12:14:47
Здравствуйте!
Каким образом в скрипте можно обратиться к параметру "Подстановка" в объекте TM_Template_Window?
Необходимо считывать "имя подстановки"  и при совпадении открывать необходимое окно.
Спасибо!
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 08 Января 2024, 22:30:09
Здравствуйте.

Использовать подстановки в скриптах нельзя. Принцип работы с шаблонными окнами описан по этой (https://simple-scada.com/help/manual/templatewindow.html) и этой (https://simple-scada.com/help/manual/templandtemplwnd.html) ссылкам. Работа с шаблонами в скриптах рассмотрена по ссылке (https://simple-scada.com/help/script/scriptstempl.html). При необходимости, Вы можете прислать на support@simple-scada.com текущую версию проекта и максимально подробно описать задачу - возможно мы сможем предложить решение.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: yukiaire от 17 Января 2024, 13:25:26
Здравствуйте! У меня вопрос, почему функция GetVariableByName не работает в глобальном модуле в части initialization? При создании проекта мне нужно заполнять список однотипными переменными, у которых по сути только отличаются номера, не хочется заполнять их напрямую, а перебором по получении имени не получается.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 18 Января 2024, 13:32:32
Здравствуйте.

В секции initialization глобального модуля нельзя использовать функции поиска (https://simple-scada.com/help/script/search-functions.html), т.к. на момент инициализации список, по которому осуществляется поиск, еще не сформирован. Можно перенести код из секции initialization в отдельный скрипт по событию "Запуск проекта (https://simple-scada.com/help/script/launch-project.html)".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ACHE от 22 Февраля 2024, 10:02:19
Здравствуйте. Есть возможность вычислить в скрипте, какая страница открыта на клиенте?
В проекте сделана замена штатного интерфейса кнопками и все на шаблонах. Хочется менять границу кнопки открытой подстраницы.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 23 Февраля 2024, 16:12:45
   Здравствуйте.
Есть возможность вычислить в скрипте, какая страница открыта на клиенте?
Такая возможность есть. Парные события "Пользователь перешел на эту страницу" и "Пользователь покинул эту страницу" позволяют контролировать пару страница - клиент (у которого по определению только ОДИН пользователь).
Собственно, необходимые действия можно выполнить в этих скриптах или отложить до скрипта, который понимает клиента (работает GetClietName) или варианта с одним клиентом (тому всё равно). Отельная неприятность от анонимных (без имени) десктоп-клиентов, неразличимых по определению (хотя у каждого клиента уникальный ID).
А зачем это всё нужно?
В проекте сделана замена штатного интерфейса кнопками и все на шаблонах. Хочется менять границу кнопки открытой подстраницы.
При замене штатной системы навигации страниц на каждой странице присутствуют уникальные кнопки навигации, либо как набор отдельных кнопок, либо в составе шаблона. В первом случае кнопку выбранной страницы можно изменить на этапе редактирования проекта, во втором - при инициализации шаблона.
 Пример слежения за клиентами-страницами и инициализации шаблона кнопок во вложении.

   Добавлено 25.02.2024
При инициализации шаблонов можно построить массив ссылок на активную кнопку страниц, что позволит изменять отображение кнопки из скриптов. Поиском по имени/ID клиента в парах "клиент-индекс открытой страницы" определяется индекс страницы, а по нему ссылку на объект-кнопку.
Однако следует помнить, что изменения видны у всех клиентов, перешедших на эту страницу.
Наличие таблицы клиентов позволяет передавать текстовые сообщения от клиента к клиенту.
См. "Граница_кнопки_3".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Pendalf от 04 Марта 2024, 16:58:20
Что-то похожее мы делали в своём проекте. Надо было подсвечивать кнопку, которая была в шапке экранной формы. Кнопка была индикатором выбранной экранной формы.
Верхняя панель представляла из себя шаблон с кнопками. Подсвечивались кнопки скриптом при инициализации. На шаблоне в одной из кнопок просто задавалось число в скрытой подсказке либо в поле Tag. Кнопки были пронумерованы в приставке к названию. При инициализации этот TAG считывался и подсвечивал соответствующую кнопку. Работает отлично. Из минусов только то, что надо пройтись по всем экранным формам, где используется этот шаблон и "ручками" вбить номер кнопки, которая должна подсвечиваться.

Других более удобных и быстрых вариантов не придумали. Встроенная навигация от Simple-SCADA не устроила принципиально.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 11 Марта 2024, 06:28:35
   Здравствуйте.

... Из минусов только то, что надо пройтись по всем экранным формам, где используется этот шаблон и "ручками" вбить номер кнопки, которая должна подсвечиваться.
  Определить, что кнопка должна подсвечиваться, можно по совпадению владельца и страницы перехода. В шаблоне редактируются ссылки на страницы и заголовки кнопок.
  А "ленивым" можно не заморачиваться связкой кнопок и страниц, достаточно считать, что порядок расположения кнопок соответствует порядку экранных форм (страниц/подстраниц). В шаблоне редактируются только заголовки кнопок.
  Пример во вложении.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Agro_1 от 27 Марта 2024, 14:55:54
Добрый день! Есть переменная со шкалой 0-254 и у нее включено масштабирование в 0-100%. Частный случай - переменная может принимать значение 255.
Можно ли как-то узнать, что переменная что эта переменная вне диапазона? Шкалу не могу изменить, так как к ней многое привязано.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 28 Марта 2024, 12:37:45
Здравствуйте.

Можно выполнять проверку превышения оригинального значения переменной (например, используя свойство "OriginalAsInt (https://simple-scada.com/help/script/varoriginalasint.html)") над максимумом шкалы (https://simple-scada.com/help/script/varmaximum.html) переменной и выдавать соответствующее сообщение. Пример универсального  (https://simple-scada.com/help/script/script-types.html)скрипта на событие "OnDataChange (https://simple-scada.com/help/script/general-events.html)" объекта, с которым связана переменная:
Код: (delphi)
begin
  if Sender is TM_Object then   // проверяем, что Sender это объект
    with Sender as TM_Object do // приводим Sender к типу "TM_Object"
      if Variable.OriginalAsInt > Maximum then
        AddMessage(Now, mkAlarm, 'Значение переменной "' + Variable.Name +
        '" вышло за пределы диапазона допустимых значений: ' + AsStr, True, False);
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Agro_1 от 28 Марта 2024, 12:46:58
Спасибо большое! Попробую
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: ZWolol от 08 Апреля 2024, 07:55:44
Задана группа сообщений "Двери скважин", ID=1
Как нажав кнопку можно проквитировать все сообщения этой группы?

Все эти сообщения привязаны к битам переменных, которые сбрасываются при квитировании сообщений.
Если я сбрасываю этот бит, то появляется дата завершения, но сообщение остается не подтвержденным.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 08 Апреля 2024, 11:43:25
Здравствуйте.

Цитировать
Как нажав кнопку можно проквитировать все сообщения этой группы?
Подтвердить сообщения определенной группы, возможности нет. Можно подтвердить либо последнее неподтвержденное сообщение (процедура "ConfirmMessage (https://simple-scada.com/help/script/confirmmessage.html)"), либо все неподтвержденные сообщения (процедура "ConfirmAllMessages (https://simple-scada.com/help/script/confirmallmessages.html)").

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

Если требуется видеть только активные сообщения проекта, то нужно просматривать группу "Активные сообщения (https://simple-scada.com/help/manual/client-message-view.html#:~:text=%E2%80%A2-,%D0%90%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F,-%2D%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B2%D1%81%D0%B5%D1%85%20%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D1%85)". При необходимости, активные сообщения можно вывести в компонент "Список сообщений (https://simple-scada.com/help/manual/message-viewer.html)" (в свойстве "Группа" указать "Активные сообщения"). При сбросе бита сообщения, оно будет удаляться из группы "Активные сообщения".
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: surgutking от 10 Апреля 2024, 16:03:47
Есть необходимость управлять цветом фигуры по изменению основной и дополнительной переменной. По основной переменной вызывается скрипт меняющий прозрачность фигуры, и это работает: 1-фигура окрашена в цвет, 0-фигура прозрачна. По дополнительной переменной предполагалось включать или отключать мигание цветом: 1-фигура мигает заданным цветом, 0-фигура не мигает. Совместно эти два события корректно не обрабатываются, при нулевом значении дополнительной переменной фигура мигает если значение основной переменной 1.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 10 Апреля 2024, 20:45:50
Здравствуйте.

Для работы с дополнительной переменной необходимо использовать свойство переменной VariableEx (https://simple-scada.com/help/script/variableex.html). Также, Вы можете ознакомиться с этим разделом руководства (https://simple-scada.com/help/script/debugscripts.html) - в нем рассмотрены частые ошибки при работе со скриптами, в том числе и ошибки в скриптах по событию OnDataChangeEx (https://simple-scada.com/help/script/debugscripts.html?anchor=errdatachangeex).

Если таких объектов будет несколько, то писать отдельные скрипты для каждого объекта не требуется. Можно написать один универсальный (https://simple-scada.com/help/script/script-types.html) скрипт и использовать его для всех объектов. Судя по описанию, Ваши переменные имеют тип данных Boolean? Для обращения к значению переменной рекомендуется использовать явное приведение значения переменной (https://simple-scada.com/help/script/nonvert-values.html) к нужному типу. Например, при сравнении с True/False нужно брать значение переменной, переведенное в тип Boolean (свойство AsBool (https://simple-scada.com/help/script/varasbool.html)).

Пример универсального скрипта на событие OnDataChange (https://simple-scada.com/help/script/general-events.html):
Код: (delphi)
begin
  if Sender is TM_Shape then     // проверяем, что Sender это фигура
     with Sender as TM_Shape do  // приводим Sender к типу "TM_Shape"
       if AsBool then            // если значение основной переменной связанной с фигурой равно True/1
         Alpha := 255            // изменить прозрачность фигуры на 255
       else                      // иначе
         Alpha := 0              // изменить прозрачность фигуры на 0
end.

Пример универсального скрипта на событие OnDataChangeEx (https://simple-scada.com/help/script/general-events.html):
Код: (delphi)
begin
  if Sender is TM_Shape then      // проверяем, что Sender это фигура
     with Sender as TM_Shape do   // приводим Sender к типу "TM_Shape"
       if  VariableEx.AsBool then // если значение доп.переменной связанной с фигурой равно True/1
         FlashColor := clRed      // включить мигание объекта красным цветом
       else                       // иначе
         FlashColor := clNone;    // отключить мигание объекта
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: avtzarenko от 18 Апреля 2024, 13:22:34
Добрый день.
Просьба подсказать как организовать подсчет выпуска продукции в минуту.
С контролера  передаются накопительные данные 0~25000, требуется получить какое количество произведено в минуту с выводом на форму для просмотра и построения трендов.

Написал скрипт, но не понимаю, как организовать: выпуск продукции в мин= выпуск продукции текущий - выпуск продукции минуту назад (например текущий - 1200, минуту назад - 1150, т.е выпуск в минуту равен 50 шт)

Код: (delphi)
var
  Speedbotle_temp: integer;

begin
  if Dicount2.Value = 0 then
    Speedbotle_min.Value := 0
  else
    Speedbotle_min.Value := Dicount2.Value - Speedbotle_temp;
  Speedbotle_temp := Dicount2.Value
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple Scada от 18 Апреля 2024, 17:46:19
Здравствуйте.

В данном случае использовать локальную переменную (https://simple-scada.com/help/script/var-types.html) скрипта нельзя – подробнее см. по ссылке (https://simple-scada.com/help/script/compilerchange.html) (Изменение 1). В Вашем случае, для хранения значения количества продукции за предыдущую минуту нужно использовать внутреннюю переменную (https://simple-scada.com/help/script/var-types.html). Также, чтобы избежать ошибок, в правой части скрипта, при выполнении математических операций с переменными нужно использовать значение переменной приведенное к нужному типу (https://simple-scada.com/help/script/nonvert-values.html). Пример исправленного скрипта для события "Начало минуты (https://simple-scada.com/help/script/minute-passed.html)" или "Таймер (https://simple-scada.com/help/script/second-passed.html)" с интервалом в 60 секунд:

Код: (delphi)
begin
  if Dicount2.AsInt  = 0 then
    Speedbotle_min.Value := 0
  else
    Speedbotle_min.Value := Dicount2.AsInt - Speedbotle_temp.AsInt;
  Speedbotle_temp.Value := Dicount2.AsInt;
end.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Lisov_R от 24 Апреля 2024, 04:08:28
Добрый день!
Начал только знакомиться с данной SCADA системой. У меня задача вроди бы простая, но прочитав мануал (не исключено что нужное упустил) тривиального решения не нашел. Есть большое количество однотипных агрегатов у которых 8 переменных по которым определяется аварийное и рабочее состояние. Задача заключается в создании шаблона который менял цвет в зависимости от 5 переменных, в шаблонном окне по нажатию кнопки сбрасывались 4 булевские переменные, остальное (пуск/стоп, отображение отдельных параметров) интуитивно понятно. Переменные берутся с OPC-UA на ПЛК.  Я так понимаю что в скриптах нельзя использовать подстановку? Использовать скрипт по изменению переменной из списка тоже не имеет смысл, это уже не будет шаблоном. Создавать класс для агрегата и инициализировать туда все переменные из сервера тоже не вижу смысла когда их более 600. И как создать скрипт чтобы он постоянно выполнялся, не каждую секунду, минуту, час, а постоянно в цикле программы.
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: Simple_Scada от 24 Апреля 2024, 16:35:43
Здравствуйте.

Работа с шаблонами описана по ссылке (https://simple-scada.com/help/manual/template.html). Работа с шаблонами из скриптов по ссылке (https://simple-scada.com/help/script/scriptstempl.html). 

Если требуется менять цвет объекта по значениям пяти переменных, то проще всего будет создать на контроллере переменную общей аварии и использовать в скада-системе одну переменную вместо пяти. Если из этих переменных формируется состояние агрегата (например: работа, разгон, торможение, авария, предупреждение), то на контроллере следует использовать одну целочисленную переменную, каждое значение которой будет соответствовать требуемому состоянию. Тогда можно будет применить универсальный скрипт (https://simple-scada.com/help/script/script-types.html). Примеры универсальных скриптов можно найти по ссылке (https://simple-scada.com/help/script/colorchange.html).

Если на ПЛК возможности свести множество переменных в общую аварию (или состояние) нет, то нужно будет свести требуемые переменные в одну в скада-системе. Для этого нужно использовать скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)". При однотипном наименовании переменных можно создать универсальный скрипт. Вы можете написать нам на почту support@simple-scada.com, вышлем пример такого скрипта.

Цитировать
И как создать скрипт чтобы он постоянно выполнялся, не каждую секунду, минуту, час, а постоянно в цикле программы.
Такой скрипт создать нельзя. Скрипт можно создать только по одному из доступных событий (https://simple-scada.com/help/script/event-types.html).
Название: Re: Вопросы по скриптам в Simple-Scada 2
Отправлено: pan2000 от 24 Апреля 2024, 22:36:33
  Здравствуйте.

...Есть большое количество однотипных агрегатов у которых 8 переменных по которым определяется аварийное и рабочее состояние. Задача заключается в создании шаблона который менял цвет в зависимости от 5 переменных, в шаблонном окне по нажатию кнопки сбрасывались 4 булевские переменные, ...
Как правильно заметили разработчики Simple-Scada, то что можно следует загонять в ПЛК. Однако, если такой возможности нет, а количество агрегатов большое, то можно использовать шаблоны.
При проектировании шаблона следует стремиться к минимуму подстановок, количеству и объёму скриптов. Собственно подстановки шаблона сводятся к подстановкам в объекты этого шаблона.
Минимальный набор подстановок объекта включает основную и дополнительную переменную (имена переменных), свойства Tag (целое число) и Hint (строка). По изменению переменных возможен вызов соответствующих скриптов.
Для минимизации подстановок переменных следует использовать для каждого агрегата однотипные наборы имен, включающие поле номера агрегата, тогда единственной подстановкой будет только номер агрегата.
Пример построения шаблона с тремя отображаемыми отдельными параметрами и некоторой групповой логикой от 5-ти булевых переменных (упрощенная модель координатного стола: пуск/стоп, выход за границы, координаты):
- для отображения параметров используются три объекта "Поле" с подстановкой основной переменной, скрипт не требуется;
- три из 5-ти булевых переменных используют подстановку в дополнительные переменные объектов "Поле", а две оставшиеся подстановку в переменные объекта "Текст". Т.е. шаблон содержит четыре объекта с однотипными именами TempObj_<i=1..4>.
Булевы переменные по изменению (основной и дополнительной) собираются в вектор скриптом:
Код: (delphi)
var i, j: integer;
begin
  j := SetBit(0, 0, GetTemplateObject('TempObj_1').AsBool);   // младший бит вкл./выкл.
  for i := 1 to 4 do
    with GetTemplateObject('TempObj_' + IntToStr(i)) do
      j := SetBit(j, i, VariableEx.AsBool);              // собрать весь вектор
// интерпретация вектора - по таблице, case - оператором или набором условных операторов
end.
 
Во вложении пример для 4-х моделей агрегатов, которые связаны через встроенный OPC UA сервер собственно с шаблонами.