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

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

Simple_Scada

Да, масштабирование через настройку переменной подходит только для внешних переменных. В скриптах для этих целей нужно использовать функцию Scaling.

pan2000

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

Цитата: teplocom от 31 октября 2021, 04:41:18...Наверное, более элегантно мою задачу не решить  ???
Разобрать переменную на поля можно посредством пользовательского типа данных - записи:
Код: pascal
type TwoSmallint = record  SmallintLo, SmallintHi: Smallint; end;
var
  temp: TwoSmallint;
begin
    Longword(@temp)^ := LongWord(dwInput.AsInt);  // копирование "байт в байт" в переменную temp
    smiHi.Value := temp.SmallintHi;               // разбор данных по структуре записи
    smiLo.Value := temp.SmallintLo;
end.
Пример во вложении.

teplocom

#1307
Спасибо, красиво получилось!

vigorts

Здравствуйте! Подскажите пожалуйста.
В скрипте "изменились переменные"  есть битовая переменная, по изменению отправляется сообщение в телеграмм.
Как распаковать на булевые, что бы по их изменению отправлялись сообщения.
От программирования далёк, только начал вникать. Хорошо бы пример. Спасибо!

vigorts

#1309
Разобрался.

Botsmall

Добрый день. Вопрос немного похож на предыдущий в этой ветке.
Как с помощью внешней переменной типа Integer изменять свойство видимости Alpha типа Byte (С учетом масштабирования).
Не могу разобраться, как привести все к одному типу данных в пределах одного скрипта.

Simple_Scada

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

В каком диапазоне меняется переменная Integer? Если в том же, что и прозрачность 0-255, то можно записывать значение переменной напрямую в свойство Alpha. Если переменная Integer меняется в другом диапазоне, то можно использовать функцию Scaling, задав в ней диапазон в котором изменяется переменная Integer в качестве исходной шкалы и 0-255 в качестве целевой шкалы. В примере ниже переменная Integer изменяется в диапазоне 0-1000, используется скрипт по событию OnDataChange и переменная привязана к основной переменной объекта.
Код: pascal
begin
  if Sender is TM_Object then
    with Sender as TM_Object do
      Alpha := Trunc(Scaling(1000,0,255,0, Variable.AsInt));
end.
Это универсальный скрипт, его можно использовать для других подобных объектов, назначив на событие OnDataChange.

teplocom

#1312
Приветствую.
Вопрос такой: Есть ли возможность написать скрипт перехода на страницу "Активных сообщений", подобно переходу:
Код: pascal
begin
  GoToMessagesAll; // переход в меню сообщений на всех клиентах                           
end.

И еще такое заметил (ни на что не влияет в принципе):
Такое не компилируется. При сохранении проекта выдает ошибку компиляции скриптов - не совпадение типов Integer и VOID в строке 3:
Код: pascal
begin
Text1.Text:=IntToStr(SysGet(SYS_UNCONFIRMED_COUNT)); //кол-во неподтвержденных сообщений
Text2.Text:=IntToStr(SysGet(SYS_ACTIVE_COUNT));  //кол-во активных сообщений
end.

А вот так все компилируется и работает:
Код: pascal
begin
Text1.Text:=IntToStr(SysGet(0)); // или SYS_UNCONFIRMED_COUNT  в аргументе, не важно
Text2.Text:=IntToStr(SysGet(1)); // допускает только const=1. SYS_ACTIVE_COUNT - ошибка при сохранении проекта
end.

Simple-Scada

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

Сейчас нельзя перейти в группу "Активные" используя скрипты. В ближайшее обновление добавим такую возможность.

ЦитироватьИ еще такое заметил (ни на что не влияет в принципе):
Такое не компилируется. При сохранении проекта выдает ошибку компиляции скриптов - не совпадение типов Integer и VOID в строке 3:
У нас корректно компилируются и работают обе версии. Видимо причина в чем-то другом. Может быть в проекте есть объект (или процедура/функция) с именем как у константы SYS_ACTIVE_COUNT. Просьба выслать на support@simple-scada.com текущую версию проекта в которой воспроизводится проблема, тогда мы сможем указать точную причину из-за которой код не компилируется.

teplocom

Цитата: Simple-Scada от 21 ноября 2021, 20:20:44У нас корректно компилируются и работают обе версии. Видимо причина в чем-то другом. Может быть в проекте есть объект (или процедура/функция) с именем как у константы SYS_ACTIVE_COUNT.
Все верно, название скрипта было: SYS_ACTIVE_COUNT
 :-[

indevr

#1315
Здравствуйте.
Необходим помощь со скриптом, который возвращает значение вчерашнюю дату при открытии проекта.
Использовал из примера скрипт :
Код: pascal
var
  aDate: TDateTime;
begin
  aDate:= Tomorrow;
end.
значение в поле показывает текущую дату.

Simple Scada

#1316
Здравствуйте.
Цитата: indevr от 26 ноября 2021, 14:40:20Необходим помощь со скриптом, который возвращает значение вчерашнюю дату при открытии проекта.

Можно сделать без использования скриптов. Для этого нужно использовать внутреннюю переменную созданную через редактор переменных с типом данных "DateTime" и указать в "Начальное значение" "Yesterday"(Возвращает предыдущий день). Затем привязать эту переменную к необходимому полю. См. скриншот во вложении.

Или использовать скрипт на событие "Запуск проекта". Если "Поле" связано с переменной типа "DateTime", то скрипт будет такой:
Код: pascal
begin
  vrDate.Value := Yesterday;
end.
Где " vrDate" это переменная созданная через редактор переменных с типом данных "DateTime".

Если нужно вывести дату без использования переменной, то можно использовать скрипт на событие "Запуск проекта":
Код: pascal
begin
  Field1.Text := DateToStr(Yesterday);
end.
Где Field1 это поле в которое необходимо вывести дату.

Но, для вывода даты/времени удобнее всего использовать компонент "Календарь", у него можно задать необходимый формат отображения даты/времени, а также при необходимости настроить внешний вид аналогичный компоненту "Поле".

indevr

Большое спасибо, получилось. :)

Rindzin

Добрый день.
Как добавить в редакторе скриптов в меню "Вставить код" свой код?

Simple_Scada

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

Свой код в данное меню добавить нельзя и добавление такой возможности не планируется.