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

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

Автор Тема: Вывод текста по значению переменной.  (Прочитано 1676 раз)

ZloiVadik

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Привет.
Необходимо выводить множество текстовой информации в одном поле по значению переменной.
Раскрывающийся список в принципе с этим справляется, но мешает место клика для раскрытия списка, да и не нужно список раскрывать с экрана. Есть такой инструмент?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #1 : 06 Июня 2022, 10:36:23 »
Здравствуйте.

Для этого нужно использовать компонент "Текст" и скрипт по событию OnDataChange(изменилось значение переменной связанной с объектом). См. пример №4 по ссылке.

ZloiVadik

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #2 : 08 Июня 2022, 10:22:54 »
Спасибо за ответ но пока не получается.
У меня переменная с типом Byte, так как необходимо передать числа от 0 до 70. А в скрипте как понял нельзя работать с байтами?
Переделывать переменные на int? Много их  :-\

ZloiVadik

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #3 : 08 Июня 2022, 10:42:41 »
Переделал, с контроллера передаю тип sint. В скада тип shortInt. В скрипте ASInt.
Работает. Но так корректно?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #4 : 08 Июня 2022, 12:13:45 »
Цитировать
У меня переменная с типом Byte, так как необходимо передать числа от 0 до 70. А в скрипте как понял нельзя работать с байтами? Переделывать переменные на int? Много их
Тип Byte - это положительные целые числа от 0 до 255. Для работы со значением переменной в скриптах необходимо использовать соответствующие свойства переменной. Т.к. Byte - это целые числа, то в скрипте можно использовать свойство переменной .AsInt. Изменять тип данных у переменной не требуется.

Цитировать
Переделал, с контроллера передаю тип sint. В скада тип shortInt. В скрипте ASInt. Работает. Но так корректно?
Не нужно наугад менять типы данных переменных. Как мы указали выше, все будет работать и с типом Byte. Чтобы не возникало никаких проблем, на контроллере, OPC-сервере и в скада-системе должны использоваться одинаковые(или аналогичные) типы данных. При импорте перемеренных с OPC-сервера, редактор автоматически установит нужный тип данных переменной, в соответствии с ее типом на OPC-сервере. Если Вы не знаете, какой тип установить переменной или какой тип используется на OPC-сервере, то импортируйте переменную с OPC-сервера. Тогда редактор автоматически установит нужный тип данных переменной.

ZloiVadik

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #5 : 15 Июня 2022, 17:56:49 »
AsInt у меня с Byte не захотел работать... В принципе работает как выше описал  :-\

Подскажите ещё. Значение переменной за счёт скрипта выводит соответствующий текст, всё отлично работает. Но вот хотелось бы, что при определённом значении, к примеру 0, менялся цвет фона текста. Это возможно? Это нужно что бы при обрыве сигнала не нужно было вчитываться в текст "обрыв сигнала", а сразу было понятно где проблема, так как объектов много...
« Изменён: 15 Июня 2022, 18:02:44 от ZloiVadik »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 153
    • Просмотр профиля
    • Simple-Scada
Re: Вывод текста по значению переменной.
« Ответ #6 : 15 Июня 2022, 18:55:09 »
Здравствуйте.

хотелось бы, что при определённом значении, к примеру 0, менялся цвет фона текста. Это возможно?
Чтобы изменить цвет фона у компонента "Текст" нужно использовать свойство "Color". Но у компонента "Текст" свойство "Прозрачность фона" по умолчанию установлено в 0 (полностью прозрачный), измените данное свойство, например на 255, тогда смена цвета будет видна. Также прозрачность можно менять в скрипте, для этого нужно использовать свойство "Alpha". Если нужно менять цвет текста, то используйте свойство "FontColor". Например:
Код: (delphi)
begin
  if Sender is TM_Object then     // проверяем, что Sender это объект
    with Sender as TM_Object do   // приводим Sender к типу "TM_Object"
      if AsInt = 1 then           // если значение переменной объекта равно 1, то
      begin
        Color := clRed;           // изменить цвет объекта на красный
        FontColor := clGreen;     // изменить цвет шрифта
        Alpha := 255;             // изменить прозрачность
      end
      else // иначе
      begin
        Color := clGray;         // изменить цвет объекта на серый
        FontColor := clBlack;    // изменить цвет шрифта
        Alpha := 0;              // изменить прозрачность
      end;
end.

ZloiVadik

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #7 : 15 Июня 2022, 19:37:39 »
Сделал второй скрипт и доп переменную, работает. Или можно этот скрипт вставить в прошлый скрипт выбора текста? Переменная основная и доп ведь одна и та же. Сходу не вышло, ругается на отсутствие End, но куда вставить не разобрался.
Ну т.е. вставить в этот
Код: (delphi)
begin
  if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"           
      case AsInt of
        0 : Text := 'Местн.Пуск';
        1 : Text := 'Вынос.Пульт';
        2 : Text := 'Автозапуск';
        3 : Text := 'Диспетчер';
        4 : Text := 'Работает';
      end;
end.
« Изменён: 15 Июня 2022, 20:18:50 от Simple Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 153
    • Просмотр профиля
    • Simple-Scada
Re: Вывод текста по значению переменной.
« Ответ #8 : 15 Июня 2022, 20:33:59 »
Цитировать
Сделал второй скрипт и доп переменную, работает. Переменная основная и доп ведь одна и та же.
Не нужно указывать одну и туже переменную в качестве основной и дополнительной и писать два разных скрипта. В этом нет никакого смысла. Все необходимые условия можно описать в одном скрипте - см. пример ниже.

Или можно этот скрипт вставить в прошлый скрипт выбора текста?
Просто взять и вставить один скрипт в другой нельзя. Мы привели пример скрипта, как использовать описанные выше свойства объекта. Рекомендуем ознакомиться с руководством по скриптам, а также с разделами "Рекомендации по работе со скриптами" и "Отладка скриптов". Примеры наиболее часто используемых скриптов можно посмотреть по ссылке.

Пример скрипта:
Код: (delphi)
begin
  if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
      case AsInt of
        0:
          begin
            Text := 'Местн.Пуск';
            FontColor := clYellow;  // изменить цвет шрифта
            Color := clRed;         // изменить цвет фона
            Alpha := 255;           // изменить прозрачность
          end;
        1:
          begin
            Text := 'Вынос.Пульт';
            FontColor := clBlack;   // изменить цвет шрифта
            Color := clNone;        // изменить цвет фона
            Alpha := 0;             // изменить прозрачность
          end;
        2:
          begin
            Text := 'Автозапуск';
            FontColor := clBlack;  // изменить цвет шрифта
            Color := clNone;       // изменить цвет фона
            Alpha := 0;            // изменить прозрачность
          end;
        3:
          begin
            Text := 'Диспетчер';
            FontColor := clBlack;  // изменить цвет шрифта
            Color := clNone;       // изменить цвет фона
            Alpha := 0;            // изменить прозрачность
          end;
        4:
          begin
            Text := 'Работает';
            FontColor := clBlack;  // изменить цвет шрифта
            Color := clNone;       // изменить цвет фона
            Alpha := 0;            // изменить прозрачность
          end;
      end;
end.
« Изменён: 15 Июня 2022, 21:41:59 от Simple_Scada »

ZloiVadik

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #9 : 16 Июня 2022, 09:56:39 »
 В условиях производства приходится быть универсалом, поэтому рассчитываем на Вашу помощь ;D
Ваш последний скрипт очень трудоёмкий при большом количестве вариантов. К тому же, цвет фона менять только при значении переменной 0, а при всех остальных - неизменно общий. Но если нет варианта проще то ок.
 
« Изменён: 16 Июня 2022, 10:19:28 от ZloiVadik »

pan2000

  • Постоялец
  • ***
  • Сообщений: 170
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #10 : 16 Июня 2022, 17:28:07 »
   Здравствуйте.

 Наборы данных, выбираемые по непрерывному значению индекса, можно перенести из программного кода в область данных.
Код: (delphi)
type Properties = record
  Text: string[32];
  FontColor : cardinal;
  Color: cardinal;
 end;

const StatusList: array[0..4] of Properties = (
    ('Местн.Пуск',  clGray, clBlack),
    ('Вынос.Пульт', clRed,  clGreen),
    ('Автозапуск',  clGray, clBlack),
    ('Диспетчер',   clGray, clBlack),
    ('Работает',    clGray, clBlack));

begin
  if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
      if (0 <= AsInt) and (AsInt <= high(StatusList)) then begin  // проверка индекса на допустимость
        Text := StatusList[AsInt].Text;
        FontColor := StatusList[AsInt].FontColor; // изменить цвет шрифта
        Color := StatusList[AsInt].Color;         // изменить цвет фона
      end;
end.

ZloiVadik

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #11 : 16 Июня 2022, 17:59:25 »
Да Вы чего издеваетесь надо мной ;D
Скрипт под 80 вариантов текста уже написан и его перелопачивать  :-\
Ну т.е. два верхних скрипта не возможно последовательно прописать?
Так то с доп переменной работает хоть и не корректное программирование...

pan2000

  • Постоялец
  • ***
  • Сообщений: 170
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #12 : 16 Июня 2022, 21:29:01 »
   Латание существующих скриптов (в порядке убывания сложности редактирования и возрастания нежелательности применения :o):

1 способ: редактирование скрипта. Сначала следует оператор изменения свойства Text (фактически скрипт с оператором case), далее операторы изменения свойств Color и FontColor.
Код: (delphi)
// Редактируем большой скрипт. Добавленные операторы изображены заглавными буквами.
begin
  if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
    BEGIN
      case AsInt of
        0 : Text := 'Местн.Пуск';
        1 : Text := 'Вынос.Пульт';
        2 : Text := 'Автозапуск';
        3 : Text := 'Диспетчер';
        4 : Text := 'Работает';
        ELSE EXIT;     // запрет изменения цветов при выходе основной переменной из допустимых пределов
      end;

// вставить фрагмент из маленького скрипта
      if AsInt = 1 then           // если значение переменной объекта равно 1, то
      begin
        Color := clRed;           // изменить цвет объекта на красный
        FontColor := clGreen;     // изменить цвет шрифта
//        Alpha := 255;             // изменить прозрачность
      end
      else // иначе
      begin
        Color := clGray;         // изменить цвет объекта на серый
        FontColor := clBlack;    // изменить цвет шрифта
//        Alpha := 0;              // изменить прозрачность до 0 = оператор Color := clGray не имеет особого смысла
      end;
// конец фрагмента маленького скрипта
    END;
end.

2 способ: разнесение скриптов по основной и доп. переменным. Скрипт изменения цветов должен работать с доп. переменной.
Код: (delphi)
begin
  if Sender is TM_Object then     // проверяем, что Sender это объект
    with Sender as TM_Object do   // приводим Sender к типу "TM_Object"
      if VariableEx.AsInt = 1 then           // если значение переменной объекта равно 1, то
      begin
        Color := clRed;           // изменить цвет объекта на красный
        FontColor := clGreen;     // изменить цвет шрифта
 //       Alpha := 255;             // изменить прозрачность
      end
      else // иначе
      begin
        Color := clGray;         // изменить цвет объекта на серый
        FontColor := clBlack;    // изменить цвет шрифта
 //       Alpha := 0;              // изменить прозрачность
      end;
end.
Однако скрипт не контролирует выход доп. переменной за допустимые пределы, т.е. изменение цветов происходит всегда.

3 способ: вызов скрипта из скрипта. Только для объектов с запрещенным доступом и только для примера.

Примеры редактирования скриптов во вложении.
« Изменён: 17 Июня 2022, 04:06:41 от pan2000 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вывод текста по значению переменной.
« Ответ #13 : 16 Июня 2022, 22:32:43 »
Цитировать
Ну т.е. два верхних скрипта не возможно последовательно прописать?
Вот так выглядят два скрипта описанные в одном:
Код: (delphi)
var
  aText: TM_Text;
begin
  if not (Sender is TM_Text) then Exit;   
  aText := Sender as TM_Text;

  // смена текста в зависимости от значения переменной
  case aText.AsInt of
    0 : aText.Text := 'Местн.Пуск';
    1 : aText.Text := 'Вынос.Пульт';
    2 : aText.Text := 'Автозапуск';
    3 : aText.Text := 'Диспетчер';
    4 : aText.Text := 'Работает';
  end;

  // смена цвета
  if aText.AsInt = 1 then
  begin
    aText.Color := clRed;          // изменить цвет объекта на красный
    aText.FontColor := clGreen;    // изменить цвет шрифта
    aText.Alpha := 255;            // изменить прозрачность
  end else
    begin
      aText.Color := clGray;       // изменить цвет объекта на серый
      aText.FontColor := clBlack;  // изменить цвет шрифта
      aText.Alpha := 0;            // изменить прозрачность
    end;
end.
Получается универсальный скрипт для любых компонентов Текст в проекте.

Цитировать
Так то с доп переменной работает хоть и не корректное программирование...
Скрипты описанные выше не обращаются к свойству "Доп. переменная", поэтому доп. переменная для данных скриптов не нужна и её можно убрать.

ZloiVadik

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вывод текста по значению переменной.
« Ответ #14 : 20 Июня 2022, 09:07:09 »
Ребята привет.
По скрипту Админа цвет работал, а выбор текста нет. Сделал по первому варианту pan200, отлично работает.
Спасибо!