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

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

deldemo

#300
Добрый день AllReal.
А Вы заданные шкалы прикрепили к переменным?
Сначала нужно создать шкалу с тем диапазоном который Вам нужен.



Затем прикрепить вновь созданную шкалу к нужнаму тегу.

Simple_Scada

#301
Здравствуйте, AllReal!

Проблема может быть в:
  • неправильно выбранной шкале переменной. Вы перезапускали проект на сервере после изменения шкалы переменной?
  • неправильном использовании масштабирования или сдвига запятой.
  • перезаписи переменной из скриптов.
Если не разберетесь пришлите проект на support@simple-scada.com с указанием проблемной переменной.

AllReal

может быть проблема, в шкале? у меня не выбрана единица измерения, если да, то что выбрать? диапазон от -70000 до 70000

Simple_Scada

Нет, дело не в единице измерения. Пришлите проект на support@simple-scada.com с указанием проблемной переменной.

AllReal


igorigor07

#305
Добрый день!

Подскажите, как можно менять положение окна (x и y) из скрипта? Если это свойство "read only", то вопрос почему? Можно дать возможность его все-таки задавать для создания универсальных окон, появляющихся в нужном месте при нажатии мышкой на объекте?

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

Simple-Scada

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

ЦитироватьПодскажите, как можно менять положение окна (x и y) из скрипта? Если это свойство "read only", то вопрос почему?
В будущих обновлениях откроем данные свойства для записи.

LIM_IA

#307
Здравствуйте!

Ситуация следующая - есть некое командное слово, в нем, по нажатию кнопки, должны менять два бита. Пишу следующий код:
Код: pascal
1 begin
2  if BUT_bit2_3.Value
3   then
4    begin
5     CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,true) ;
6     CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,true) ;
7    end
8  else
9    begin
10   CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,False) ;
11   CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,False) ;
12  end
13 end.

При запуске клиента принципиально игнорируются строки 5 и 10.
Переменная BUT_bit2_3 - локальная и связана с кнопкой
Переменная CMD_RUN - подтягивается с OPC сервера и является командным словом.

Подскажите почему не отрабатывает составной оператор "begin...end"?

godygadu

Цитата: LIM_IA от 17 мая 2017, 07:22:53Здравствуйте!

Ситуация следующая - есть некое командное слово, в нем, по нажатию кнопки, должны менять два бита. Пишу следующий код:
Код: pascal
1 begin
2  if BUT_bit2_3.Value
3   then
4    begin
5     CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,true) ;
6     CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,true) ;
7    end
8  else
9    begin
10   CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,False) ;
11   CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,False) ;
12  end
13 end.

При запуске клиента принципиально игнорируются строки 5 и 10.
Переменная BUT_bit2_3 - локальная и связана с кнопкой
Переменная CMD_RUN - подтягивается с OPC сервера и является командным словом.

Подскажите почему не отрабатывает составной оператор "begin...end"?

Проверьте синтаксис.

LIM_IA

godygadu, добрый день!

Синтаксис верный, потому что компилятор ошибок не выдаёт. Если вы копируете код то копируйте без нумерации строк(я их написал для наглядности описания), то есть код выглядит так:
Код: pascal
 begin
  if BUT_bit2_3.Value
   then
    begin
     CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,true) ;
     CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,true) ;
    end
  else
   begin
   CMD_RUN.Value:=SetBit(CMD_RUN.Value,2,False) ;
   CMD_RUN.Value:=SetBit(CMD_RUN.Value,3,False) ;
  end
end.

Simple-Scada

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

Переменная CMD_RUN приходит с OPC-сервера. Соответственно и смена значения происходит через OPC-сервер. Поэтому, когда Вы пишите "CMD_RUN.Value := SetBit(CMD_RUN.Value,2,true);" на OPC-сервер отправляется "запрос" на присвоение переменной нового значения и реальное изменение значения произойдет с мелкой задержкой. Поэтому можно в начале скрипта получить значение CMD_RUN в локальную переменную скрипта и в скрипте работать с ней. А в конце скрипта выполнить запрос на присвоение. Такой способ также сократит количество запросов к OPC-серверу.

Правильный код будет таким:
Код: pascal
var
  aValue: Integer;
begin
  aValue := CMD_RUN.AsInt;

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

  CMD_RUN.Value := aValue;
end.

В будущем постараемся сделать так, чтобы все операции с внешними переменными в ходе скрипта делались в оперативной памяти и выполнялось одно присвоение после выполнения скрипта.

LIM_IA

Спасибо, идею понял, заработало!

теперь усложнил код:
Код: pascal
var
  aValue: Integer;
begin
  aValue := CMD_RUN.AsInt;

  if
   BUT_bit1_2.Value
   then
    begin
      aValue := SetBit(aValue, 1, true);
      aValue := SetBit(aValue, 2, true);
      Button11.Enabled:=true;
      image2.Color:=RGB(255,0,0);
      Button11.Color:=RGB(255,0,0);
    end
  else
   begin
     aValue := SetBit(aValue, 1, False);
     aValue := SetBit(aValue, 2, False);
     Button11.Enabled:=false;
     image2.Color:=RGB(0,100,0) ;
     Button11.Color:=RGB(0,100,0) ;
  end ;

       CMD_RUN.Value :=   aValue;
end.

Почему не меняется цвет кнопки  Button11.Color ? причем цвет картинки image2.Color меняется нормально

Teodor

А вы попробуйте поменять цвет кнопки в нужном состоянии (нажата/отпущена).

Button11.States[0].Color:=RGB(0,100,0) ;
Button11.States[1].Color:=RGB(0,100,100) ;
 

LIM_IA

Teodor, здравствуйте!

Идея немного в другом, есть две кнопки Button10 и Button11. Когда НЕнажата Button10 блокируется  Button11, и я хочу что б это сопровождалось цветом. То есть когда Button11 заблокирована что б она была красной, а когда разблокирована зеленой(цвет образно, можно любой другой)

deldemo

#314
Здравствуйте. Как ранее уже сказал Teodor необходимо указать в каком состоянии кнопки будет изменятся ее цвет.
Код: pascal
var
  aValue: Integer;
begin
  aValue := CMD_RUN.AsInt;

  if BUT_bit1_2.Value then
    begin
      aValue := SetBit(aValue, 1, true);
      aValue := SetBit(aValue, 2, true);
      Button11.Enabled:=true;
      image2.Color:=RGB(255,0,0);
      Button11.States[0].Color:=RGB(255,0,0);
    end
  else
   begin
     aValue := SetBit(aValue, 1, False);
     aValue := SetBit(aValue, 2, False);
     Button11.Enabled:=false;
     image2.Color:=RGB(0,100,0) ;
     Button11.States[0].Color:=RGB(0,100,0) ;
  end ;

   CMD_RUN.Value :=   aValue;
end.