Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

Виктор К

Добрый день. Столкнулся с ошибкой в логах сервера: Ошибка в скрипте ... в строке ... "Variant does not reference an automation object".
Скрипт компилировался без ошибок, но естественно не работал так как задумано.
Причина: некорректное обращение к значению переменной.
Код: pascal
Text2.Text:=var01.Value.AsStr; 
нужно было так:
Код: pascal
Text2.Text:=var01.AsStr; 

Simple-Scada

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

Всё верно, свойство переменной "var01.Value" имеет тип данных Variant, через который можно обращаться к свойствам OLE-объектов. Поэтому "var01.Value.AsStr" будет рассматриваться компилятором как попытка обращения к свойству "AsStr" OLE-объекта и на этапе компиляции ошибок выдано не будет. Затем, во время запуска скрипта, обнаружится, что свойство Value не является OLE-объектом и будет выдана соответствующая ошибка: Variant-переменная не ссылается на объект автоматизации.

DJ

#1382
Добрый день. Можете расписать как работает этот скрипт? Весь проект почти сделан вот на таких скриптах. Именно интересует вот эта часть - ...AsInt and 128) Shr 7) + 1
Код: pascal
begin
  // ЦВ НЕИСП АВАР  НСУХ  СУХ  НПИТ  ПИТ  МП
  // 1    0     0    0     0    0     0    0

  TM_Image(Sender).Frame := ((TM_Object(Sender).AsInt and 128) Shr 7) + 1
end.

pavel.sheva

#1383
Присвоить свойству кадр, значение вызвавшего объекта в (целочисленном формате с конвертацией в 1-о байтовый формат числа со сдвигом его в право на 7) + 1, Вроде бы так, если я не ошибаюсь.

А разве можно в Simple-Picture создать анимацию на 128 кадров? ;D :P, я как-то пытался, больше 30 не вмещается(

alex29

#1384
Цитата: DJ от 24 августа 2022, 10:46:12Добрый день. Можете расписать как работает этот скрипт?
меняется картинка в зависимости от состояния 7-го бита. Можно было проще и понятнее сделать...

Цитата: pavel.sheva от 24 августа 2022, 12:26:36А разве можно в Simple-Picture создать анимацию на 128 кадров? ;D :P, я как-то пытался, больше 30 не вмещается(
при чем тут 128 кадров? Это логическая операция - and 128 - выделяем только 7-й бит. ИМХО  по извращенски код написан )

pavel.sheva

#1385
Цитироватьпри чем тут 128 кадров? Это логическая операция - and 128 - выделяем только 7-й бит. ИМХО  по извращенски код написан )
Ну это как посмотреть) младшим или старшим битом вперед), просто если вы говорите о выделение 7 бита, то понятное дело в 10-тичной это будет 64 в случае если там стоит 1, 64+1, 65 кадр, или я что-то не так понимаю

alex29

#1386
если 7-й бит == 0 , то TM_Image(Sender).Frame = 0+1  первый кадр
если 1, TM_Image(Sender).Frame = 1+1 второй кадр.
по моему так

pavel.sheva

#1387
Код: pascal
begin
  // ЦВ НЕИСП АВАР  НСУХ  СУХ  НПИТ  ПИТ  МП
  // 1    0     0    0     0    0     0    0
 
  TM_Image(Sender).Frame := ((TM_Object(Sender).AsInt and 128) Shr 7) + 1
end.
жЕсткая строчка кода, но вроде понял что вы имеете ввиду, а да я "Децл", при shr я обращаюсь к 1 биту, а не ко всему байту...
 

Дмитрий_021

Добрый день, только разбираюсь с вашим продуктом. Как написать простой скрипт, к кнопке привязана Переменная (Внутренний тэг - str - содержащей имя страницы). При нажатии на кнопку нужно переходить на эту страницу.

Timothy Clement

#1389
Добрый день.

Код: pascal
var
  aPage : TM_Page;
begin
  With Sender As TM_Button do
    begin
      aPage := GetPageByName(Variable.Asstr);
      aPage.GoToPageClient(GetClientName);
    end;
end.

Но может просто не создавайте переменную, а присвойте свойству Тэг кнопки номер страницы, например 2. Тогда

Код: pascal
var
  aPage : TM_Page;
begin
  With Sender As TM_Button do
    begin
      aPage := GetPageByName('Page'+IntToStr(Tag));
      aPage.GoToPageClient(GetClientName);
    end;
end.

Таким образом перейдете на нужную страницу не создавая лишних переменных

Simple Scada

#1390
Здравствуйте.
Цитата: Дмитрий_021 от 12 сентября 2022, 03:58:53Как написать простой скрипт, к кнопке привязана Переменная (Внутренний тэг - str - содержащей имя страницы). При нажатии на кнопку нужно переходить на эту страницу.
Если у кнопки в свойстве "Переменная" указана переменная, то при нажатии на кнопку будет изменяться значение этой переменной в соответствии с установленными значениями в свойстве "Состояния". Поэтому описанную Вами задачу таким способом решить не получится, так как при клике на кнопку переменная с именем страницы, перед выполнением скрипта, будет перезаписана.

В данном случае переменную с именем страницы можно указать в свойство "Доп.переменная" и на событие "OnClick" кнопки написать скрипт:
Код: pascal
var
  aPage: TM_Page;
  aButton: TM_Button;
begin
  if Sender is TM_Button then   // проверяем, что Sender это кнопка
  begin
    aButton := Sender as TM_Button;
    // ищем страницу с именем из доп.переменной
    aPage := GetPageByName(aButton.VariableEx.AsStr);
    if aPage <> nil then                      // если страница существует,
      aPage.GoToPageClient(GetClientName);    // то перейти на нее
  end;
end
Также в руководстве по ссылке можно найти пример создания "Кнопок вместо панели страниц".

Дмитрий_021

Спасибо, помогло. а есть ли функция, позволяющая получить текущую страницу? ( Условно аналог GetPageByName, но возвращающая страницу с которой был вызван скрипт )

Simple_Scada

Для этого можно использовать функцию GetOwner.

asutpfoma

#1393
Вопрос про подтверждение событий. При подтверждении события оператором (нажатие галочки), хочу вызывать всплывающее окно, которое бы добавляло комментарий к событию.
Существует метод OnClick на стандартную клавишу подтверждения события? Можно добавлять комментарий?

При подтверждении оператором сообщения, хочу отображать всплывающее окно со списком, выбранная информация в котором отображалась бы в соответствующем сообщении в колонке "Подтвердил". Это реально?
Хочу чтобы в этом столбце отображалась информация о причине возникновения сообщения. Эти причины будут перечислены во всплывающем окне.

Можно ли изменять текст сообщения после его возникновения в списке сообщений?

Simple_Scada

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

ЦитироватьСуществует метод OnClick на стандартную клавишу подтверждения события?
Создать скрипт для штатной кнопки подтверждения сообщений нельзя. При необходимости, можно скрыть штатную панель сообщений и создать свою(для этого лучше всего использовать шаблон). Вместо панели сообщений можно использовать компонент "Список сообщений". Смену пользователя можно реализовать через кнопку и скрипт по событию OnClick используя процедуру ChangeUser. Переход в меню сообщений можно реализовать используя скрипты для навигации. Для подтверждения сообщений можно использовать кнопку и процедуру ConfirmMessage. В этом случае, можно будет написать необходимый скрипт по событию OnClick своей кнопки подтверждения.

Цитировать> Можно добавлять комментарий?
> выбранная информация отображалась бы в соответствующем сообщении в колонке "Подтвердил". Это реально?
> Можно ли изменять текст сообщения после его возникновения в списке сообщений?
Таких возможностей нет.