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

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

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

ARV

  • Пользователь
  • **
  • Сообщений: 53
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1560 : 10 Сентября 2024, 13:21:45 »
Спасибо за ответ.
Очередной вопрос: попробовал описать константу типа массив строк - не компилируется.
Код
const cStrArr : array[0..2] of string = ('Строка 1', 'Строка 2', 'Строка 3');
Такой тип констант не поддерживается?
Обнаружил, что можно создать виртуальную переменную типа String Array, но в справке ссылок на такое не нашел - что это и как с ними работать?

Еще одна проблемка:
В заголовках разных шаблонных окон я вывожу описание переменной по одному и тому же принципу: скриптом нахожу шаблонный объект, из него беру переменную, а из неё - описание. Но получается, что скрипты во всех окнах одинаковы до имени шаблонного объекта! Но из-за того, что все шаблонные объекты должны иметь уникальные имена, у меня получается 100500 скриптов под копирку, но с разными именами объектов... Существует ли способ обойтись единственным универсальным скриптом?
Если не раз говорили, что до создания окна по шаблону шаблонные объекты не существуют, почему в разных шаблонах объекты должны иметь разные имена? Если бы можно было во всех окнах иметь объект TM_Text с именем 'hiddenText', то можно было бы обойтись единственным скриптом - по-настоящему универсальным!
« Изменён: 19 Сентября 2024, 10:02:49 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3066
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1561 : 11 Сентября 2024, 09:52:27 »
Цитировать
Такой тип констант не поддерживается?
Код: (delphi)
const
  cStrArr: array[0..2] of string = ('Строка 1', 'Строка 2', 'Строка 3');
begin
  Text1.Text := cStrArr[0];
end.

Пример объявления в глобальном модуле:
Код: (delphi)
interface

const
  cStrArr: array[0..2] of string = ('Строка 1', 'Строка 2', 'Строка 3');

implementation

end.
Если планируется использовать большое количество строковых констант, то можно использовать класс TM_StringList.

Цитировать
Обнаружил, что можно создать виртуальную переменную типа String Array, но в справке ссылок на такое не нашел - что это и как с ними работать?
Типы данных Array которые видны в окне добавления переменной могут использоваться только для внешних тегов и только на чтение (подробнее см. в этой теме). Т.е. с их помощью можно в скаду получать значения из переменных-массивов с OPC-сервера.

Цитировать
Если не раз говорили, что до создания окна по шаблону шаблонные объекты не существуют, почему в разных шаблонах объекты должны иметь разные имена?
С одинаковыми именами объекты не получится отличить в списке инспектора объектов, а также не получится нормально использовать просмотр ссылок. В ближайшем обновлении добавим окнам свойство "Переменная", чтобы можно было использовать подстановку var_desc без скриптов.
« Изменён: 12 Сентября 2024, 15:15:40 от Simple-Scada »

iww70

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1562 : 12 Сентября 2024, 07:28:40 »
Добрый день!
Вот столкнулся с проблемой в скриптах (prof 2.6.10).
Как работает процедура в цикле
Суть такая в процедуре читаю в цикле регистры, в каждой итерации прочитанные регистры передаю в процедуру для парсинга и сохранения в бд. и не выходит грубо говоря переменная переписывается ни так как должна т.е.
1 итерация
          aVar1:=Reg_11_1;
          aVar2:=Reg_12_1;
          aVar3:=Reg_13_1;
          aVar4:=Reg_14_1;
          aVar5:=Reg_15_1;
          aVar6:=Reg_1_1;

2 итерация
          aVar1:=Reg_16_1;
          aVar2:=Reg_17_1;
          aVar3:=Reg_18_1;
          aVar4:=Reg_19_1;
          aVar5:=Reg_20_1;
          aVar6:=Reg_1_1;

Но по факту получаю процедуре парсинг получаю что 1 итерация прошла успешно а начиная со второй я теряю 4
2 итерация
          aVar1:=Reg_12_1;
          aVar2:=Reg_13_1;
          aVar3:=Reg_14_1;
          aVar4:=Reg_15_1;
          aVar5:=Reg_16_1;
          aVar6:=Reg_1_1;
3 итерация
          aVar1:=Reg_13_1;
          aVar2:=Reg_14_1;
          aVar3:=Reg_15_1;
          aVar4:=Reg_16_1;
          aVar5:=Reg_17_1;
          aVar6:=Reg_1_1;
4 итерация
          aVar1:=Reg_14_1;
          aVar2:=Reg_15_1;
          aVar3:=Reg_16_1;
          aVar4:=Reg_17_1;
          aVar5:=Reg_18_1;
          aVar6:=Reg_1_1;

Код: (delphi)
      BB_str_1.Value:='';
      //Чтения всех регистров и формирование строки
      ii:=1;
      for i:=11 to 1257 do
        begin

          aVar1:=GetVariableByName('Reg_'+IntToStr(i)+'_'+IntToStr(k));
          aVar2:=GetVariableByName('Reg_'+IntToStr(i+1)+'_'+IntToStr(k));
          aVar3:=GetVariableByName('Reg_'+IntToStr(i+2)+'_'+IntToStr(k));
          aVar4:=GetVariableByName('Reg_'+IntToStr(i+3)+'_'+IntToStr(k));
          aVar5:=GetVariableByName('Reg_'+IntToStr(i+4)+'_'+IntToStr(k));
          aVar6:=GetVariableByName('Reg_1_'+IntToStr(k));

          Parsing(aVar6,aVar1,aVar4,aVar5,aVar2,aVar3,BB_str_1,ii);
          ii:=ii+1;
          i:=i+5;
          end;
« Изменён: 12 Сентября 2024, 08:54:06 от iww70 »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1247
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1563 : 12 Сентября 2024, 11:22:55 »
Здравствуйте.

Счетчик цикла For в каждой итерации увеличивается на единицу. Изменить его внутри цикла нельзя. Вам нужно использовать цикл While:
Код: (delphi)
      BB_str_1.Value:='';
      //Чтения всех регистров и формирование строки
      ii := 1;
      i := 11;
      while i <= 1257 do
        begin
 
          aVar1:=GetVariableByName('Reg_'+IntToStr(i)+'_'+IntToStr(k));
          aVar2:=GetVariableByName('Reg_'+IntToStr(i+1)+'_'+IntToStr(k));
          aVar3:=GetVariableByName('Reg_'+IntToStr(i+2)+'_'+IntToStr(k));
          aVar4:=GetVariableByName('Reg_'+IntToStr(i+3)+'_'+IntToStr(k));
          aVar5:=GetVariableByName('Reg_'+IntToStr(i+4)+'_'+IntToStr(k));
          aVar6:=GetVariableByName('Reg_1_'+IntToStr(k));
 
          Parsing(aVar6,aVar1,aVar4,aVar5,aVar2,aVar3,BB_str_1,ii);
          ii := ii+1;
          i := i+5;
        end;

ARV

  • Пользователь
  • **
  • Сообщений: 53
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1564 : 12 Сентября 2024, 14:30:55 »
Значение внутренней (т.е. не со OPC-сервера получаемой, а просто добавленной в редакторе) переменной уникально на каждом клиенте или, как с окнами, одно для всех клиентов?

Код: (delphi)
const
  cStrArr: array[0..2] of string = ('Строка 1', 'Строка 2', 'Строка 3');
begin
  Text1.Text := cStrArr[0];
end.
Обнаружил баг в редакторе, связанный с вышепроцитированным вопросом-ответом: если описать константу типа массив строк, то почти всегда первая попытка компиляции дает ошибку, из-за чего я вопрос и задал. Но стоит только отредактировать размер массива, компиляция проходит. Причем играет роль сам факт редактирования, а не новое значение. Т.е. можно написать [2..5], получить ошибку при компиляции, отредактировать на [2..6], а затем снова на [2..5] - и вуаля! - работает!
« Изменён: 12 Сентября 2024, 16:01:30 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3066
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1565 : 12 Сентября 2024, 15:56:04 »
Цитировать
Значение внутренней (т.е. не со OPC-сервера получаемой, а просто добавленной в редакторе) переменной уникально на каждом клиенте или, как с окнами, одно для всех клиентов?
Конечно нет, иначе их невозможно было бы использовать. Все переменные (включая локальные), хранятся и меняются на сервере. Клиенты просто подключаются к серверу и отображают текущее состояние проекта и всех его переменных/сообщений и т.п. с сервера.

Цитировать
если описать константу типа массив строк, то почти всегда первая попытка компиляции дает ошибку, из-за чего я вопрос и задал. Но стоит только отредактировать размер массива, компиляция проходит.
Не получилось воспроизвести, сколько бы раз не меняли размер. Какую именно ошибку выдаёт компилятор (просьба в будущем сразу писать текст ошибки, чтобы не пришлось угадывать)? Можете записать видео с экрана как у вас воспроизводится?
« Изменён: 12 Сентября 2024, 16:03:49 от Simple-Scada »

ARV

  • Пользователь
  • **
  • Сообщений: 53
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1566 : 12 Сентября 2024, 16:11:39 »
Ну а локальные для клиента, уникальные, переменные существуют вообще? Т.е. для скриптов локальные переменные существуют, а внутри клиента локальные?

Не получилось воспроизвести, сколько бы раз не меняли размер. Какую именно ошибку выдаёт компилятор (просьба в будущем сразу писать текст ошибки, чтобы не пришлось угадывать)? Можете записать видео с экрана как у вас воспроизводится?
Видео в облаке. На последних секундах я нажал F9.

Уточнение: ошибка компиляции возникает сразу после открытия редактора скрипта, т.е. Alt-S, F9 - ошибка. Тут же жмешь F9 - ошибки нет, редактировать не обязательно.
« Изменён: 12 Сентября 2024, 20:16:09 от Simple_Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3066
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1567 : 13 Сентября 2024, 16:35:14 »
Цитировать
Видео в облаке. На последних секундах я нажал F9. Уточнение: ошибка компиляции возникает сразу после открытия редактора скрипта, т.е. Alt-S, F9 - ошибка. Тут же жмешь F9 - ошибки нет, редактировать не обязательно.
Видимо есть какая-то связь с другими скриптами проекта. Никак не воспроизводится ошибка. У Вас версия 2.6.14.0? Можете выслать пример проекта с ошибкой на support@simple-scada.com?

Цитировать
Ну а локальные для клиента, уникальные, переменные существуют вообще? Т.е. для скриптов локальные переменные существуют, а внутри клиента локальные?
См. ответ по ссылке.

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1568 : 23 Сентября 2024, 19:33:57 »
Здравствуйте. С помощью какой функции можно очистить данные с таблицы не изменяя количество строк в таблице ? Грубо говоря просто очистить значения в ячейках таблицы.

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 202
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1569 : 24 Сентября 2024, 09:22:09 »
Здравствуйте.

Если таблица заполняется текстовой информацией без связи ячеек с переменными, например с помощью SQL-запроса как в примере, то можно использовать следующий код скрипта:
Код: (delphi)
var
   iRow, iCol: Integer;
   aCell: TM_TableCell;
begin
  for iCol := 0 to Table1.ColumnsCount - 1 do  // проходим по всем столбцам таблицы Table1
    for iRow := 0 to Table1.RowCount - 1 do    // проходим по всем строкам текущего столбца
    begin
      aCell := Table1.GetCell(iCol, iRow);     // получаем ячейку на пересечении текущего столбца и строки
      aCell.Text := '';                        // очищаем найденную ячейку
    end;
end.

ARV

  • Пользователь
  • **
  • Сообщений: 53
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1570 : 24 Сентября 2024, 09:36:31 »
В дополнение к предыдущему ответу: да если и ячейки связываются с переменными, ничто не запретит эту связь тоже очистить:
Код
aCell.Variable := NIL;
Аналогичным способом и установить связь можно "по кнопочке"...

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1571 : 24 Сентября 2024, 12:48:19 »
Не работает функция RunDelay и нет Выполнена задержка в скриптах. Данная функция была удалена ?

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 202
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1572 : 24 Сентября 2024, 13:54:20 »
Функция "RunDelay" и тип события "Выполнена задержка" появились начиная с версии 2.6.14.0 от 29.08.2024. Скорее всего, Вы используете более старую версию Simple-Scada.

ARV

  • Пользователь
  • **
  • Сообщений: 53
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1573 : 26 Сентября 2024, 08:47:35 »
Что опять не так в скрипте?

Просто добавил этот модуль в демо-проект, идущий в комплекте с Simple-Scada.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3066
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1574 : 26 Сентября 2024, 09:10:22 »
Цитировать
Что опять не так в скрипте? Просто добавил этот модуль в демо-проект, идущий в комплекте с Simple-Scada.
У Вас точно есть 20-летний опыт в Object Pascal? Вы динамический массив объявили и указываете в нём строковые константы не выделив под них память.