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

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

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

dmitrii.zakharin@nurzhana

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1005 : 30 Декабря 2019, 11:33:14 »
Добрый день. Уважаемые помогите пожалуйста.
Как сделать чтоб при нажатии на кнопку с фиксацией изменился определенный бит сетевой переменной ?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1006 : 05 Января 2020, 16:18:41 »
Здравствуйте. У кнопки есть свойство "Бит" которое отвечает за то какой бит переменной будет меняться при нажатии на кнопку. Просто введите номер бита который нужно менять в это свойство (биты нумеруются с нуля). И не забудьте привязать саму кнопку к переменной в которой нужно менять бит.

Олег Печёнов

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1007 : 05 Января 2020, 16:42:14 »
Добрый день, прошу помощи.

каким образом менять макс и мин у шкалы тренда?
т.е. каким образом сделать автоматическое маштабирование тренда в зависимости от переменной?

Благодарю.

dmitrii.zakharin@nurzhana

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1008 : 06 Января 2020, 09:22:36 »
Здравствуйте. У кнопки есть свойство "Бит" которое отвечает за то какой бит переменной будет меняться при нажатии на кнопку. Просто введите номер бита который нужно менять в это свойство (биты нумеруются с нуля). И не забудьте привязать саму кнопку к переменной в которой нужно менять бит.

Спасибо все оказывается намного проще чем я делал
Код: (delphi)
var
  aValue: Integer;
begin
  aValue := lampa.AsInt;

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

end.     
« Изменён: 07 Января 2020, 12:12:43 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1009 : 07 Января 2020, 12:19:55 »
каким образом менять макс и мин у шкалы тренда?
т.е. каким образом сделать автоматическое маштабирование тренда в зависимости от переменной?
Тренд берёт шкалу из переменной. Откройте окно редактирования переменной и назначьте ей ту шкалу в которой "плавает" значение переменной. Если Вы хотите расположить тренд в каком-то произвольном месте, то включите у тренда свойство "задать положение" и через свойства "от" и "до" настройте положение тренда. Описание всех этих свойств доступно в руководстве по ссылке.
« Изменён: 07 Января 2020, 14:28:16 от Simple_Scada »

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1010 : 21 Января 2020, 10:30:37 »
Если ли возможность где-то почитать про параллельные процессы в Скаде? Например, изменение переменной, смена пользователя, открытие файла и т.п.? Были ситуации, когда приходилост методом "тыка" решать различные задачи. Сейчас очередь скриптов часто переполняется, хочется разобраться, что может вызывать причину.

Также в скаде есть события "Запуск проекта" и "Полностью запущен". Можно ли где-то более подробно, чем в руководстве, почитать о том, какие процессы происходят на этих этапах. Страницы разрабатываемого проекта заполняются динамически полностью при старте, и проект слегка "подвисает". Хотелось бы разобраться, что куда распределить в проекте, поскольку он выдаёт разные результаты при заполнении объектов и инициализации тегов из скриптом с указанными выше событиями.
« Изменён: 21 Января 2020, 10:31:56 от MaxHari »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1011 : 22 Января 2020, 09:24:23 »
Цитировать
Если ли возможность где-то почитать про параллельные процессы в Скаде?
Параллельно выполняются только тяжелые операции или операции, которые могут занять время, такие как вычисление архивных значений, отправка e-mail или telegram-сообщений, построение отчетов. Работают следующим образом: Вы вызываете построение отчета в скрипте, но скада не строит его в тот же момент, вместо этого отчет начинает строиться в отдельном потоке, а код скриптов продолжает выполняться дальше. Вся эта информация никак не касается очереди скриптов и её переполнения и её можно не знать.

Цитировать
Сейчас очередь скриптов часто переполняется
Здесь всё очень просто. Все скрипты в скаде добавляются в очередь скриптов в том порядке в котором они были вызваны и выполняются последовательно друг за другом. Никакой параллельности у самих скриптов нет (два скрипта никогда не будут выполняться одновременно), т.к. это привело бы к хаотичности и нестабильной работе. Чтобы очередь скриптов переполнилась, нужно сделать в скриптах грубые ошибки, например зациклить скрипты на самих себя, чтобы очередь росла бесконечно. Или добавить в какой-то скрипт бесконечный цикл, чтобы он никогда не выполнился и соответственно не дал выполниться другим скриптам. Пример зацикленных друг на друга скриптов:
Код: (delphi)
// скрипт по изменению переменной vrA
procedure vrA_OnDataChange(Sender: TM_Control);
begin
  vrB.Value := Random(100);  // меняем значение переменной vrB
end.

// скрипт по изменению переменной vrB
procedure vrB_OnDataChange(Sender: TM_Control);
begin
  vrA.Value := Random(100);  // меняем значение переменной vrA
end.
В таких (и о других подобных) ситуациях скада будет выдавать отдельное сообщение в журнал о переполнении очереди скриптов.

Цитировать
Также в скаде есть события "Запуск проекта" и "Полностью запущен".
Скрипты с типом события "Запуск проекта" выполняются один раз - при запуске проекта на сервере.
Скрипты с типом события "Полностью запущен" после запуска проекта ждут пока будет выполнено подключение ко всем OPC-серверам и выполняются после подключения, либо когда выйдет лимит времени на подключение.
« Изменён: 22 Января 2020, 09:26:22 от Simple-Scada »

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1012 : 28 Января 2020, 14:39:48 »
Спасибо за подробное описание.

В части работы скриптов очень помогло, проект на старте стал меньше зависать при отсутствии opc-сервера.

С параллельными процессами у меня основные сложности возникли как раз при работе со скриптами OnDataChange на ComboBox'ах, которые заполнялись динамическими данными. В системе используются шаблоны, которые подставляются в комбобоксы, всего 3х10 штук (10 строк по 3 комбобокса). Пробовал сразу построчно с одной процедуры заполнять - скада не успевала уловить изменения, заполнить новые, и вытоге процесс не двигался. Пришлось перенести работу в пошаговое заполнение каждого последующего из предыдущего в OnDataChange. Позже, возможно, буду ещё дорабатывать - скорее всего отсюда и вылазять косяки с подвисанием очередей и перегрузкой системы, как вы описали.

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1013 : 28 Января 2020, 14:57:55 »
Возникла проблема при установки верхней предупредительной границы на 2-х (возможно и более, пока не обнаружено) переменных.
В процедуру SetTagsSPs передаётся индекс объекта системы, по этому индексу в цикле определяются необходимые переменные spTag, значения mConstTag и тип spType границы, и данные передаются в SetSPToTag. Там уже идёт изменение граничного значения. На скрине видно, что значения на вход SetSPToTag поступают одни, а значение предупредительной границы не меняется - остаётся "10". С остальными переменными всё работает идеально.

Подскажите, пожалуйста, в чём может быть загвоздка?
Код: (delphi)
  procedure SetSPToTag(spTag: TM_Variable; spValue: double; spType: byte);
  begin
    DebugSP('[SetSPtoTag] spValue = ' + FloatToStr(spValue));
    case spType of
      1: begin
           spTag.HighWarning := spValue;
           DebugSP('[SetSPtoTag] ' + spTag.Name + ' SP1 set: ' + FloatToStr(spTag.HighWarning));
         end;
      2: begin
           spTag.HighAlarm := spValue;
           DebugSP('[SetSPtoTag] ' + spTag.Name + ' SP2 set: ' + FloatToStr(spTag.HighAlarm));
         end;
    end;
  end;

  procedure SetTagsSPs(objIndex: byte);
  var
    spTag, mConstTag: TM_Variable;
    spNum, spType: byte;
    objectId, mConstNumStr: string;
  begin
    DebugSP('[SetTagsSPs] in: objIndex = ' + IntToStr(objIndex));
    objectId := GetObjectIdByIndex(objIndex);
    for spNum := 1 to MCONST_SP_COUNT do
    begin
      spTag := GetVariableByName(objectId + '_' + mConstSPTag[spNum]);
      if Assigned(spTag) then
      begin
        spType := 2;
        repeat
          mConstTag := GetVariableByName(objectId + '_MCONST_' + intToStr(mConstSPNum[spType, spNum]));
          if Assigned(mConstTag) then
          begin
            DebugSP('[SetTagsSPs] ' + mConstTag.Name + ' = ' + mConstTag.AsStr);
            SetSPToTag(spTag, mConstTag.AsFloat, spType);
          end;
          Dec(spType);
        until spType = 0;
      end;
    end;
  end;
« Изменён: 28 Января 2020, 15:50:36 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1014 : 28 Января 2020, 16:46:21 »
Сейчас, при изменении граничных значений выполняется проверка на их пересечение и скада не разрешает границам пересечься. Допустим есть переменная у которой верхняя аварийная граница равна 100, а нижняя предупредительная равна 50. Тогда верхнее предупредительное значение можно будет задать только в диапазоне от 50 до 100. И если выполнить присвоение "myVar.HighWarning := 40", то скада увидит что значение 40 пересекает НП границу, которая равна 50 и вместо 40 присвоит 50, чтобы исключить пересечение. Это безусловно неудобно и осталось от старых версий. В ближайшем обновлении отключим проверку на пересечение границ.

MaxHari

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1015 : 28 Января 2020, 23:58:06 »
Нашли наконец баг в проекте - у переменных вообще не были установлены границы в свойствах, в результате записывалась только верхняя аварийная граница, а предупредительная оставалась на значение "10".

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1016 : 31 Января 2020, 08:13:25 »
Добрый день , как сделать допись в файл , именно допись со свободной строки , а не  перезапись файла

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1017 : 31 Января 2020, 10:29:59 »
Здравствуйте.

Доступные методы для работы с файлами можно найти в разделе руководства "Работа с файлами". Если речь идет о текстовом файле, то для его открытия нужно использовать функцию TextFileOpen. Обратите внимание на параметр AOpenMode, который определяет метод открытия файла. Если необходимо при открытии переместить курсор в конец файла, то в параметре AOpenMode нужно указать fomAppend, пример ниже. Также, подобный вопрос обсуждался в данной теме.
Код: (delphi)
begin
  { открываем текстовый файл MyTextFile.txt из папки "\Simple-Scada\Projects\Папка_проекта\User files\"
    для добавления записи в конец файла }
  if TextFileOpen('MyTextFile.txt', '', fomAppend, fcpUTF8) then
  begin
    TextFileWriteLn(MyVar.AsStr);  // записываем значение переменной "MyVar" в конец файла
    TextFileClose;  // закрываем файл
  end;
end.

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1018 : 13 Февраля 2020, 16:19:53 »
Подскажите , а можно как то скриптами  контролировать , есть ли связь с опс сервером? и второе , если опс отвалился , что происходит с переменной? остается последнее значение , насколько понял , а можно обнулять, если нет связи?
« Изменён: 13 Февраля 2020, 16:23:56 от lipvasko »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1019 : 13 Февраля 2020, 22:29:02 »
Здравствуйте.
Уточните, какой OPC-сервер используется DA или UA? Сервер удаленный или локальный?