Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: ZloiVadik от 04 Июня 2022, 13:56:18

Название: Вывод текста по значению переменной.
Отправлено: ZloiVadik от 04 Июня 2022, 13:56:18
Привет.
Необходимо выводить множество текстовой информации в одном поле по значению переменной.
Раскрывающийся список в принципе с этим справляется, но мешает место клика для раскрытия списка, да и не нужно список раскрывать с экрана. Есть такой инструмент?
Название: Re: Вывод текста по значению переменной.
Отправлено: Simple_Scada от 06 Июня 2022, 10:36:23
Здравствуйте.

Для этого нужно использовать компонент "Текст (https://simple-scada.com/help/manual/text.html)" и скрипт по событию OnDataChange(изменилось значение переменной связанной с объектом). См. пример №4 по ссылке (https://simple-scada.com/help/script/changetext.html).
Название: Re: Вывод текста по значению переменной.
Отправлено: ZloiVadik от 08 Июня 2022, 10:22:54
Спасибо за ответ но пока не получается.
У меня переменная с типом Byte, так как необходимо передать числа от 0 до 70. А в скрипте как понял нельзя работать с байтами?
Переделывать переменные на int? Много их  :-\
Название: Re: Вывод текста по значению переменной.
Отправлено: ZloiVadik от 08 Июня 2022, 10:42:41
Переделал, с контроллера передаю тип sint. В скада тип shortInt. В скрипте ASInt.
Работает. Но так корректно?
Название: Re: Вывод текста по значению переменной.
Отправлено: Simple_Scada от 08 Июня 2022, 12:13:45
Цитировать
У меня переменная с типом Byte, так как необходимо передать числа от 0 до 70. А в скрипте как понял нельзя работать с байтами? Переделывать переменные на int? Много их
Тип Byte - это положительные целые числа от 0 до 255. Для работы со значением переменной в скриптах необходимо использовать соответствующие свойства переменной (https://simple-scada.com/help/script/nonvert-values.html). Т.к. Byte - это целые числа, то в скрипте можно использовать свойство переменной .AsInt (https://simple-scada.com/help/script/varasint.html). Изменять тип данных у переменной не требуется.

Цитировать
Переделал, с контроллера передаю тип sint. В скада тип shortInt. В скрипте ASInt. Работает. Но так корректно?
Не нужно наугад менять типы данных переменных. Как мы указали выше, все будет работать и с типом Byte. Чтобы не возникало никаких проблем, на контроллере, OPC-сервере и в скада-системе должны использоваться одинаковые(или аналогичные) типы данных. При импорте перемеренных с OPC-сервера (https://simple-scada.com/help/manual/variable-import-opc.html), редактор автоматически установит нужный тип данных переменной, в соответствии с ее типом на OPC-сервере. Если Вы не знаете, какой тип установить переменной или какой тип используется на OPC-сервере, то импортируйте переменную с OPC-сервера. Тогда редактор автоматически установит нужный тип данных переменной.
Название: Re: Вывод текста по значению переменной.
Отправлено: ZloiVadik от 15 Июня 2022, 17:56:49
AsInt у меня с Byte не захотел работать... В принципе работает как выше описал  :-\

Подскажите ещё. Значение переменной за счёт скрипта выводит соответствующий текст, всё отлично работает. Но вот хотелось бы, что при определённом значении, к примеру 0, менялся цвет фона текста. Это возможно? Это нужно что бы при обрыве сигнала не нужно было вчитываться в текст "обрыв сигнала", а сразу было понятно где проблема, так как объектов много...
Название: Re: Вывод текста по значению переменной.
Отправлено: Simple Scada от 15 Июня 2022, 18:55:09
Здравствуйте.

хотелось бы, что при определённом значении, к примеру 0, менялся цвет фона текста. Это возможно?
Чтобы изменить цвет фона у компонента "Текст (https://simple-scada.com/help/manual/text.html)" нужно использовать свойство "Color (https://simple-scada.com/help/script/color.html)". Но у компонента "Текст" свойство "Прозрачность фона" по умолчанию установлено в 0 (полностью прозрачный), измените данное свойство, например на 255, тогда смена цвета будет видна. Также прозрачность можно менять в скрипте, для этого нужно использовать свойство "Alpha (https://simple-scada.com/help/script/alpha.html)". Если нужно менять цвет текста, то используйте свойство "FontColor (https://simple-scada.com/help/script/fontcolor.html)". Например:
Код: (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.
Название: Re: Вывод текста по значению переменной.
Отправлено: ZloiVadik от 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.
Название: Re: Вывод текста по значению переменной.
Отправлено: Simple Scada от 15 Июня 2022, 20:33:59
Цитировать
Сделал второй скрипт и доп переменную, работает. Переменная основная и доп ведь одна и та же.
Не нужно указывать одну и туже переменную в качестве основной и дополнительной и писать два разных скрипта. В этом нет никакого смысла. Все необходимые условия можно описать в одном скрипте - см. пример ниже.

Или можно этот скрипт вставить в прошлый скрипт выбора текста?
Просто взять и вставить один скрипт в другой нельзя. Мы привели пример скрипта, как использовать описанные выше свойства объекта. Рекомендуем ознакомиться с руководством по скриптам (https://simple-scada.com/help/script/index.html), а также с разделами "Рекомендации по работе со скриптами (https://simple-scada.com/help/script/script-recomend.html)" и "Отладка скриптов (https://simple-scada.com/help/script/debugscripts.html)". Примеры наиболее часто используемых скриптов можно посмотреть по ссылке (https://simple-scada.com/help/script/sample-scripts.html).

Пример скрипта:
Код: (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.
Название: Re: Вывод текста по значению переменной.
Отправлено: ZloiVadik от 16 Июня 2022, 09:56:39
 В условиях производства приходится быть универсалом, поэтому рассчитываем на Вашу помощь ;D
Ваш последний скрипт очень трудоёмкий при большом количестве вариантов. К тому же, цвет фона менять только при значении переменной 0, а при всех остальных - неизменно общий. Но если нет варианта проще то ок.
 
Название: Re: Вывод текста по значению переменной.
Отправлено: pan2000 от 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.
Название: Re: Вывод текста по значению переменной.
Отправлено: ZloiVadik от 16 Июня 2022, 17:59:25
Да Вы чего издеваетесь надо мной ;D
Скрипт под 80 вариантов текста уже написан и его перелопачивать  :-\
Ну т.е. два верхних скрипта не возможно последовательно прописать?
Так то с доп переменной работает хоть и не корректное программирование...
Название: Re: Вывод текста по значению переменной.
Отправлено: pan2000 от 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 способ: вызов скрипта из скрипта. Только для объектов с запрещенным доступом и только для примера.

Примеры редактирования скриптов во вложении.
Название: Re: Вывод текста по значению переменной.
Отправлено: Simple-Scada от 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.
Получается универсальный скрипт для любых компонентов Текст в проекте.

Цитировать
Так то с доп переменной работает хоть и не корректное программирование...
Скрипты описанные выше не обращаются к свойству "Доп. переменная", поэтому доп. переменная для данных скриптов не нужна и её можно убрать.
Название: Re: Вывод текста по значению переменной.
Отправлено: ZloiVadik от 20 Июня 2022, 09:07:09
Ребята привет.
По скрипту Админа цвет работал, а выбор текста нет. Сделал по первому варианту pan200, отлично работает.
Спасибо!