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)
Спасибо за информацию! Такого теста мы еще не проводили.
Название: 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