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

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

Simple-Scada

deldemo, да, будет в ближайшем обновлении.

a_sergeevich

Подскажите, правильно ли я использую следующие функции.
Есть три переменных типа word : den, chas, minuta.

den := DayOfTheWeek ( Date ); получаю из даты день недели значение от 1 до 7.
chas := HourOf ( Now ); получаю часы из текущего времени.
minuta := MinuteOf ( Now ); получаю минуты из текущего времени.

Хочу сделать скрипт для работы котла по таймеру, типа с понедельника по пятницу котёл работает с 6:00 до 9:00 и с 16:00 до 18:00. Время включения и выключения можно будет задавать произвольно в полях ввода.
Скрипт этот хочу вставить в скрипт OnSecondTimer.
Как думаете в правильном направлении двигаюсь ? Может у вас есть готовый пример реализации такого таймера ?

Simple-Scada

#47
Т.к. у вас работа котла контролируется по часам, то Вы можете сделать проверку в OnHourTimer (брать текущий час и в сравнении проверять наступил ли нужный час), чтобы не выполнять скрипт каждую секунду. Но и в OneSecondTimer всё будет работать. Но, Вы хотите вынести команды управления котлом в скаду, т.е. по сути скада будет управлять котлом. Это неправильно, скада не должна отвечать за управление оборудованием и описанные вами проверки должны выполняться на контроллере, который и должен выполнять пуск и останов котла. Если управление берет на себя скада, то что будет если временно выйдет из строя компьютер, или произойдет сбой в ОС, или самой скада-системе? Процесс нарушится, даже если контроллер будет в это время работать.

a_sergeevich

 В плк у меня уже есть блок работы по температурному графику, в скаде будет кнопка переключения работы котла с темп.графика на работу по таймеру и в режиме по таймеру скада будет управлять выходом плк, который используется и при работе по графику. Если слетит скада или комп, котёл просто переключится на работу по графику и всё.

deldemo

#49
Добрый день уважаемые форумчане и хозяева этой великолепной программы "Simple-Scada 2".

Подскажите пожалуйста в правильном направлении я мыслю или есть другой вариант решения этой задачи.
Задача:
   Есть переменные типа DWORD, в них хоронятся состояния 225 кнопок управления двигателями (ну типа АВТО, РУЧНОЙ включен. РУЧНОЙ выключен,) мне нужно забрать эту информацию и отоброзить в SCADA.
Как видно из кода ниже, я использовал виртуальную переменную.
Может быть есть возможность на прямую работать с битом переменной  ? 

Код: pascal
begin
bool1.Value := GetBit(dword.Value,0); // Забираем нужный bit из "dword" в виртуальную переменную "bool1".
  case bool1.ValueAsInt of // Дальше работаем с виртуальной переменной "bool1".
    0:Button1.States[0].Color  := RGB(60,70,80);
    1:Button1.States[0].Color  := RGB(0,95,88);
  end;
  case bool1.ValueAsInt of
    0:Button1.States[0].BorderColor := RGB(60,70,80);
    1:Button1.States[0].BorderColor := RGB(0,95,88);
  end;

bool2.Value := GetBit(dword.Value,1);
  case bool2.ValueAsInt of
    0:Button2.States[0].Color  := RGB(60,70,80);
    1:Button2.States[0].Color  := RGB(0,95,88);
  end;
  case bool2.ValueAsInt of
    0:Button2.States[0].BorderColor := RGB(60,70,80);
    1:Button2.States[0].BorderColor := RGB(0,95,88);
  end;

  // и тд. и тп.
end.

Simple-Scada

#50
Да, есть такая возможность. Можно изменить код вот так, не используя виртуальные переменные:
Код: pascal
begin
  // если нулевой бит равен 1
  if GetBit(dword.Value, 0) then
  begin
    Button1.States[0].Color  := RGB(0,95,88);
    Button1.States[0].BorderColor := RGB(0,95,88);
  end else
    // если нулевой бит равен 0
    begin
       Button1.States[0].Color  := RGB(60,70,80);
       Button1.States[0].BorderColor := RGB(60,70,80);
    end;

  // если первый бит равен 1
  if GetBit(dword.Value, 1) then 
  begin
    Button1.States[0].Color  := RGB(0,95,88);
    Button1.States[0].BorderColor := RGB(0,95,88);
  end else 
    // если первый бит равен 0
    begin
      Button1.States[0].Color  := RGB(60,70,80);
      Button1.States[0].BorderColor := RGB(60,70,80);
    end;
end.
Может быть мы бы могли посоветовать решение ещё лучше, но нужно подробнее понять задачу. Опишите подробно, как должна работать кнопка и как она должна менять свои состояния? Вы точно хотите менять состояние кнопки в зависимости от разных битов? Т.е. сначала в коде вы проверяете нулевой бит, потом проверяете первый бит. Так и должно быть?

deldemo

#51
Извините но я в скрипте выше допустил ошибку. там кнопки разные. сей час исправил.
ЦитироватьМожет быть мы бы могли посоветовать решение ещё лучше, но нужно подробнее понять задачу. Опишите подробно, как должна работать кнопка и как она должна менять свои состояния? Вы точно хотите менять состояние кнопки в зависимости от разных битов? Т.е. сначала в коде вы проверяете нулевой бит, потом проверяете первый бит. Так и должно быть?
Сама кнопка(без фиксации) в SCADA работает c bool переменной PLC.(т.е. включает АВТО режим узла/агрегата с помощью переменной btnAUTO, ручной режим работы с помощью btnMANUAL) а вот состояние этого узла/агрегата(что он действительно переключился в тот или иной режим работы) приходит из PLC другой переменной типа DWORD. У каждого состояня того или иного узла/агригата свой bit той самой DWORD.
Мне бы хотелось что бы кнопка в SCADA ,которая отвечает за переключение режима ,меняла свой цвет при смене бита отвечающего за ее состояние. 

В принципе скрипт который Вы написали мне очень даже подходит. Спасибо огромное за помощь.
P.S
Так как я не очень силен в паскале (Точнее совсем не силен) объясните дурачку пожалуйста(если не сложно) от куда берется состояние бита , ведь в условии только только бит с которым нужно работать. 
Все понял сдесь как в ST он при вызове априори TRUE а далее ELSE делает свое дело.

Simple-Scada

#52
Да, исходя из всего вышеописанного Вы должны использовать скрипт, который мы предложили. Т.к. кнопки должны работать с одной переменной, а менять свой вид (цвет и цвет рамки) должны в зависимости от значения бита другой переменной - то здесь можно предложить только это решение.

Цитироватьот куда берется состояние бита , ведь в условии только только бит с которым нужно работать
Если подробно, то GetBit - это функция, которая берет нужный бит из целого числа и возвращает его значение как тип Boolean. Т.е. если этот бит равен 1, то она вернёт True, если этот бит равен 0 то она вернёт False. Это позволяет писать так:

Код: pascal
if GetBit(dword.Value, 0) then
  ...
else
  ...

, а это одно и то же, что и:
Код: pascal
if GetBit(dword.Value, 0) = True then
  ...
else
  ...

Т.к. GetBit возвращает Boolean, а не какой-то другой тип, то мы может использовать сокращенное сравнение, как в первом варианте.

А ещё можно писать так:

Код: pascal
if not GetBit(dword.Value, 0) then
  ...
else
  ...

, это одно и то же, что и:
Код: pascal
if GetBit(dword.Value, 0) = False then
  ...
else
  ...

deldemo

Спасибо большое за пояснение.!!!!!

deldemo

#54
Вечер добрый. Работая со скриптом обнаружил проблему, что поле ввода через которое запускается скрипт OnDataChange (тот самый который вы мне посоветовали) не может принять максимальное значение переменной DWORD (или longWORD) так как максимальную ШКАЛУ можно сделать только от -2147483648 до 2147483647,
 а вот от 0 до 4294967295 (в принципе те же 32 бита) нельзя.

Провел сегодня опыт :
Создал 32 кнопки каждой кнопке присвоил свой бит одной переменной типа longWord.
Создал поле , прикрепил к этому полю  longWord.
При присвоении 31 биту (или кнопке) TRUE значение отображается в поле нормально ,
а вот 32 бит уводит значение поля в -1. что есть не очень хорошо.
Будьте добры добавьте Шкалу от 0 до 4294967295



Simple-Scada


int2246

Здравствуйте. Интересует вот такой вопрос. Можно ли с помощью скриптов вписать в фигуру допустим  прямоугольник отображения программы допустим браузера  или программы отображения изображений с камеры?  И чтобы она отобразилась в этом прямоугольники со свойствами как на весь экран? Если это возможно то хотелось бы удивить пример скрипта.

Simple-Scada

#57
Нет, такой возможности нет. Если Вам, к примеру, нужно вывести изображение с камеры и постоянно видеть его, то придется делать это сторонней программой и выводить на второй монитор. Или делать всё с одним монитором, но в этом случае придется постоянно сворачивать скаду, чтобы посмотреть камеру.

int2246

#58
Это само самой разумеется, просто хотелось наблюдать из скады  за происходящим.  А на всею страницу сделать нельзя?

Simple-Scada

Нет, в данном случае Вы по сути хотите вставить в окно скады другое приложение. Это не получится из-за особенностей отрисовки скады. Добавить такую возможность - можно, но это может привести к появлению недостатков связанных со скоростью и стабильностью работы и добавит в скаду несколько уязвимостей.