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

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

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

titanicnwa

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1185 : 19 Апреля 2021, 09:03:37 »
Вопросы по классу TM_Window.
1. Изменение свойств объекта TM_Window.H и TM_Window.W работают только при смене страницы/подстраницы. Так и задумывалось?
2. Окно автоматически закрывается при смене страницы/подстраницы. Каким образом его можно оставить?
3. Компоненты в окне, которые размещены за пределами окна все равно отрисовываются.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3195
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1186 : 19 Апреля 2021, 09:55:27 »
1. Изменение свойств объекта TM_Window.H и TM_Window.W работают только при смене страницы/подстраницы. Так и задумывалось?
Честно говоря, мы не предполагали что кто-то будет менять размеры окон во время работы проекта и разрабатывали окна как статические объекты постоянного размера. А свойства W, H автоматически наследовались компилятором из базового класса TM_Control. В будущем возможно сделаем их доступными только для чтения.

2. Окно автоматически закрывается при смене страницы/подстраницы. Каким образом его можно оставить?
Это невозможно.

3. Компоненты в окне, которые размещены за пределами окна все равно отрисовываются.
Да, поэтому в редакторе объекты не удастся переместить за пределы окна перетягиванием, или через инспектор объектов. Предполагается, что все объекты будут находиться в окне.

Видимо Вы пытаетесь сделать из окна какой-то динамический компонент со скрытой частью, которая отображается по требованию пользователя. Окна совсем для этого не предназначены.
« Изменён: 21 Апреля 2021, 13:12:01 от Simple-Scada »

strs

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1187 : 22 Апреля 2021, 13:09:44 »
Здравствуйте!

Подскажите пожалуйста, можно ли в процессе работы, из скрипта менять текстуру изображения? На код "image679.TextureName := 'onsm';" компилятор ругается, что свойство только для чтения.

Если нельзя, посоветуйте, как можно реализовать графическую кнопку-переключатель, чтобы при нажатии на нее изменялась некая переменная и изменялся внешний вид кнопки?  (как во вложении)

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1188 : 22 Апреля 2021, 14:36:24 »
strs, можно ж сделать анимашку и переключать кадры.

strs

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1189 : 22 Апреля 2021, 16:28:52 »
Да уж, способ( Но пробую хотя бы так, но не получается. Создал анимацию из двух кадров, присвоил текстуру этому изображению, написал скрипт
Код
begin
    if Sender is TM_Image then
      with Sender as TM_Image do
        if Frame = 1 then
          Frame := 2
        else
          Frame := 1;
  end
Скорость анимации сделал равной 0, скрипт этот повесил на событие OnClick для изображения - и ничего не работает. Причем даже в переменную не получается считать текущий кадр

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1190 : 23 Апреля 2021, 15:05:51 »
Все работает.
К огоньку (Пламя2) прицепил приведенный код и все нормально переключается.

strs

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1191 : 23 Апреля 2021, 16:38:45 »
Все работает.
К огоньку (Пламя2) прицепил приведенный код и все нормально переключается.
Прикольно. Заменил текстуру на огонек - заработало. Вернул свою текстуру - работает. Что было - не понятно.

Спасибо!

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1192 : 26 Апреля 2021, 12:19:02 »
Здравствуйте. Прошу помощи, пожалуйста.
Как избавится от запроса в каждом цикле? (Предполагаю, что нужно загнать в массив, но не понимаю как это сделать)

Код: (delphi)
var
  aNumStr: integer; // номер строки при чтении файла
{ выгружаем коды во временную таблицу в БД }
procedure InsertDmCod;
var
  aQuery: string;
begin
  aQuery := 'INSERT INTO DmExplorer.dbo.TMP_DeFileRead (DFR_DmCod, DFR_TimeStamp) '+
            'VALUES (' +QuotedStr(vrUploadStr.AsStr)+', '+SQLServerDateTime(Now, dttMillisecond)+  ')';
  RunSQL(aQuery, nil, 3);
end;

{ выгружаем серийный номер выгрузки в таблицу БД   }
procedure InsertSN;
var
  aQuery: string;
begin
  aQuery := 'INSERT INTO DmExplorer.dbo.CFG_DeArhiveTask (DAT_SN, DAT_TimeStamp) '+
            'VALUES (' +QuotedStr(vrUploadStr.AsStr)+', '+SQLServerDateTime(Now, dttMillisecond)+  ')';
  RunSQL(aQuery, nil, 5);
end;

{ выгружаем задание на печать в БД }
procedure InsertTaskPrint;
var
  aQuery: string;
begin
  aQuery := 'UPDATE DmExplorer.dbo.CFG_DeArhiveTask '+
            'SET DAT_TaskPrint = ' +vrUploadStr.AsStr+
            'WHERE DAT_TaskID = SELECT TOP(1) DAT_ID FROM DmExplorer.dbo.CFG_DeArhiveTask ORDER BY DAT_ID DESC';
  RunSQL(aQuery, nil, 6);
end;

{ выгружаем задание на печать в БД }
procedure InsertTotalCod;
var
  aQuery: string;
begin
  aQuery := 'UPDATE DmExplorer.dbo.TMP_DeTaskInfo '+
            'SET DTI_TotalCod = ' +vrUploadStr.AsStr+
            'WHERE DTI_TaskID = SELECT TOP(1) DAT_ID FROM DmExplorer.dbo.CFG_DeArhiveTask ORDER BY DAT_ID DESC';
   RunSQL(aQuery, nil, 7);
end;

{ вспомогательная процедура для обработки отдельной строки }
  procedure ProcStr(const AStr: string);
  var
    I: Integer;
    aBuf: string;
    aQuery: string;
    { эта подпроцедура вызывается каждый раз когда из строки было извлечено
      значение отделённое ";" }
    procedure OnDone;
    begin
      if aBuf = '' then Exit;                     // игнорируем пустые значения
        vrUploadStr.Value := aBuf;                // записываем данные из буфера
      if aNumStr = vrNumStrSN.AsInt then          // записываем в БД сирийный номер выгрузки
        InsertSN;
      if aNumStr = vrNumStrPrintTask.AsInt then   // записываем в БД задание на печать
        InsertTaskPrint;
      if aNumStr = vrNumStrTotalCod.AsInt then    // записываем в БД общее количество кодов в файле
        InsertTotalCod;
      if aNumStr > vrFirstStrDM.AsInt then        // если номер строки больше чем уставка -> записываем DM коды в TMP_DeFileRead
        InsertDmCod;                              // записываем в БД}
      aBuf := '';                                 // затем обнуляем буферную строку
    end;
  begin
    aBuf := '';
    for I := 1 to Length(AStr) do       // проходим по каждому символу строки в цикле
      if aStr[I] <> 'CR+LF' then        // если текущий символ не "CR+LF", то
      begin
        if aStr[I] <> ' ' then          // игнорируем пробелы
          aBuf := aBuf + AStr[I]        // добавляем символ в буферную строку
      end else                          // если дошли до ";", то
        OnDone;                         // работаем с полученным значением

    OnDone;                             // вызываем завершающую процедуру напоследок
  end;         
{ Очищаем таблицу }
procedure CleanTableBD;
var
  aQuery: string;
begin
  aQuery := 'truncate table DmExplorer.dbo.TMP_DeFileRead'; //Очищаем таблицу

  { Отправляем запрос на выполнение с тегом = 1 }
  RunSQL(aQuery, nil, 4);
end;

{PRG************************************************************************************************************************}
begin
  imgLoad1.Visible := true;
  // открываем текстовый файл для чтения
  if TextFileOpen('MyCSV.csv', 'D:\Home\Simple-Scada 2 (time-demo)\Projects\DmExplorer\User files\', fomReset, fcpDefault) then
  begin
    CleanTableBD;                                      // очищаем временную таблицу в БД перед загрузкой DM кодов из файла
    aNumStr := 0;                                      // сбрасываем счетчик пропуска служебных строк
    while not TextFileEOF do                           // цикл с проходом по каждой строке текстового файла
      begin
        aNumStr := aNumStr + 1;                            // счетчик строк
        ProcStr(TextFileReadLn);
      end;
    TextFileClose;                                     // закрываем файл
    imgLoad1.Visible := false;
  end;
end.
« Изменён: 26 Апреля 2021, 22:23:41 от Simple-Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 216
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1193 : 26 Апреля 2021, 20:54:15 »
Как избавится от запроса в каждом цикле?
Вариант с накоплением запросов в списке с их последующим выполнением после заполнения списка:
1. создание списка в глобальном модуле:
Код: (delphi)
interface

var
  myList: TM_StringList;          // объявляем список с именем myList

implementation

initialization                    // во время запуска проекта
  myList := TM_StringList.Create; // создаём список

finalization                // во время выключения проекта
  FreeAndNil(myList);       // !!! обязательно удаляем список

end.
2. Собственно запись в список во всех процедурах:
Код: (delphi)
procedure InsertDmCod;
begin
  myList.Add('INSERT INTO DmExplorer.dbo.TMP_DeFileRead (DFR_DmCod, DFR_TimeStamp) '+
             'VALUES (' +QuotedStr(vrUploadStr.AsStr)+', '+SQLServerDateTime(Now, dttMillisecond)+  ')');
end;
3. Запуск цикла по списку:
Код: (delphi)
{PRG************************************************************************************************************************}
begin
  imgLoad1.Visible := true;
  . . .
    MyList.Clear;                // очистить список
    while not TextFileEOF do                           // цикл с проходом по каждой строке текстового файла
      begin
        . . .
      end;
    TextFileClose;                                     // закрываем файл

    MyLisyIndex.Value := 0;                              // индекс текущего элемента списка
    if MyList.Count > 0 then RunSQL(MyList[0], nil, 4)   // запуск цикла по непустому списку
    else imgLoad1.Visible := false;
  end;
end.
4. Цикл по списку (скрипт "Выполнен SQL-запрос"):
Код: (delphi)
begin
  if DataSet.Tag = 4 then begin
    MyLisyIndex.Value := MyLisyIndex.AsInt + 1;      // индекс текущего элемента списка = параметр цикла
    if MyList.Count > MyLisyIndex.AsInt then RunSQL(MyList[MyLisyIndex.AsInt], nil, 4)
    else imgLoad1.Visible := false;
  end;
end.

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1194 : 26 Апреля 2021, 21:31:07 »
Спасибо!!!!  :)

дрю

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1195 : 29 Апреля 2021, 15:29:37 »
Добрый день! Только приступил к работе с этой симпатичной рограммой и сразу столкнулся с вопросом который ни как не могу уложить в голове в виду его простоты . Мне необходимо показывать и скрывать 4 элимента(крышка люка) которые будут символизировать текущее положение реальной двери роторной печи. Каждой картинке я из ПЛК отправляю бит_1 крышка видна, 0 скрыта. создал скрипт под первую кртинку:

Код: (delphi)
if Image6. AsBool = True then   // если значение переменной изображения = 1, то
    Image6. Visible := True   // показать изображение
  else                       // иначе
    Image6.  Visible := False; // скрыть изображение
end.

Создал скрипт под 2 картинку:

Код: (delphi)
begin
    if Image7. AsBool = True then   // если значение переменной изображения = 1, то
    Image7. Visible := True   // показать изображение
  else                       // иначе
    Image7.  Visible := False; // скрыть изображение
end.
Всё логично. Переменные у каждой картинке свои.  Каждой картинке присвоил свои скрипт. Подключаюсь к клиенту и в результате FOLSE любой из двух переменных ,,гасит,, синхронно две картинки. (Первая переменная =0  - картинки погасли,=1 появились. Вторая переменная =0  -картинки погасли,=1появились). Ничего не понял, ято не такю :-\
« Изменён: 29 Апреля 2021, 16:12:41 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1363
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1196 : 29 Апреля 2021, 16:50:24 »
Здравствуйте.

Для описанной задачи, гораздо проще будет объединить все изображения в одно и разделить его на кадры как это описано по ссылке. Затем можно будет написать один универсальный скрипт для смены кадров изображения по необходимым условиям. По приведенным скриптам: они должны работать, если не работают, значит Вы в чем-то допустили ошибку, например связали изображения с одной и той же переменной и т.д. Если разобраться не получится, пришлите нам для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\Имя_проекта" и укажите, какой скрипт нужно проверить.

дрю

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1197 : 30 Апреля 2021, 10:17:00 »
Спасибо за оперативный ответ. Нашёл причину-неправильно настроен бал ОПС сервер, прилетал только первая пнременная , остальные оставались в False. Кстати а есть инструменты проверить реальное состояние внешних переменных непосредсвенно в СКАДЕ?(демоверсия по времени) :)

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1363
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1198 : 30 Апреля 2021, 10:27:45 »
В редакторе просмотреть текущее значение переменной нельзя. Разместите на мнемосхеме компонент Поле, свяжите его с требуемой переменной, сохраните и запустите проект. В поле будет отображаться текущее значение переменной.

nikolai_mikhailov

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1199 : 03 Мая 2021, 15:56:00 »
Не могу никак разобраться с воспроизведением аудио. А именно со скриптом PlayUserSound.
В описании написано "Воспроизводит пользовательский звуковой файл (в формате ".ogg" или ".wav") из папки "Simple-Scada\Sounds\" на заданном клиенте."
Я написал, к примеру, такой скрипт:

begin
  PlayUserSound(GetClientName, '2.ogg', FALSE);
end.

Если я переименую "UserSound.ogg" (который идет с демо-проектом) в '2.ogg', то всё работает. Если же я использую свой собственный файл с таким названием (или любым другим, то при запуске скрипта ничего не происходит, в ответ тишина)