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

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

SAES-CV

Доброго времени суток!
На проекте "Монитор работы вентиляционного оборудования" хочется привязать мото-часы к (фактическую наработку) оборудованию. То-есть при нажатии на кнопку вкл. таймер начнёт отсчёт, при остановке - остановится, при следующем нажатии - продолжит с того-же времени... Контроллеры все виртуальные.
Посоветуйте пожалуйста откуда плясать... буду признателен.

Simple_Scada

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

Во вложении пример проекта с решением Вашей задачи. Распакуйте его в папку "Simple-Scada 2\Projects" , затем запустите его через Client и посмотрите как он работает. Затем перейдите в редактор и посмотрите скрипты для кнопок и для события OnSecondTimer (также в скриптах используются 2 внутренние переменные). Результат (наработку мото-часов) Вы можете записывать в какой-нибудь тэг OPC-сервера или сохранять в файл(подробнее см. в руководстве по скриптам - раздел "Работа с файлами").

SAES-CV

Спасибо большое, буду пробовать. потом отпишусь  :)

a_sergeevich

У меня есть кнопка на которой висит сброс счетчика, как сделать, чтобы при нажатии на неё выскакивал запрос пароля ?

Simple-Scada

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

Есть также и другой вариант. Вы можете создать новое окно и разместить в нём поле для ввода пароля и кнопки "Ок" и "Отмена". На нажатию "Ок" выполнять скрипт, который будет сравнивать текст из поля с паролем и если они совпадают, то сбрасывать счетчик. Минус будет в том, что в момент ввода пароля он будет виден в поле, т.е. символы при вводе не будут заменены звездочками "*" как это обычно бывает.

Mishail

#35
Здравствуйте!
Немного  опишу ситуацию. Есть регистр(переменная) формата int, который хранит индекс некоего события(в примере причина пуска). Есть объект Text1 (для примера), который должен в зависимости от регистра выводить разный текст. Это реализовано и прекрасно работает в виде:
Код: pascal
begin
 case Text1.Value  of
  1:Text1.Text := 'Местн.Пуск';
  2:Text1.Text := 'Вынос.Пульт';
  3:Text1.Text := 'Автозапуск';
  4:Text1.Text := 'Диспетчер';
  0:Text1.Text := 'Работает';
  end;
end.
   

И таких объектов может быть несколько. Захотелось реализовать  "универсальный скрипт", но оказалось что объект Sender не знает никаких Text, Возможно ли это реализовать? Заранее спасибо.
P.S. Клиент и Редактор прекрасно работает под Wine в Linux (Ubuntu 14.04)

Simple_Scada

#36
Конечно возможно! Забыли описать это в руководстве - исправим. Через Sender можно обращаться только к общим свойствам объектов. Для обращения к остальным свойствам необходимо привести объект к нужному типу. Для этого нужно использовать конструкцию "Sender as ...". А чтобы убедиться, что объект действительно имеет нужный нам тип - добавляется проверка "Sender is ...", т.е. в вашем случае код будет выглядеть так:
Код: pascal
begin
  if Sender is TM_Text then 
    case TM_Text(Sender).ValueAsInt of 
      1:(Sender as TM_Text).Text := 'Местн.Пуск';
      2:(Sender as TM_Text).Text := 'Вынос.Пульт';
      3:(Sender as TM_Text).Text := 'Автозапуск';
      4:(Sender as TM_Text).Text := 'Диспетчер';
      0:(Sender as TM_Text).Text := 'Работает';
    end;
end.
Когда таких условий у Вас много правильнее и удобнее для восприятия писать так:
Код: pascal
begin
  if Sender is TM_Text then
    with Sender as TM_Text do             
      case ValueAsInt of 
        1:Text := 'Местн.Пуск';
        2:Text := 'Вынос.Пульт';
        3:Text := 'Автозапуск';
        4:Text := 'Диспетчер';
        0:Text := 'Работает';
      end;
end.

ЦитироватьКлиент и Редактор прекрасно работает под Wine в Linux (Ubuntu 14.04)
Спасибо за информацию! Такого теста мы еще не проводили.
UPD: в обновление 2.6.7.0 добавлена поддержка Linux. Подробные инструкции см. по этой ссылке.

Mishail

Благодарю за оперативный ответ  :)

deldemo

Здравствуйте.! Уважаемые помогаете пожалуйста с написанием скрипта.
Опишу ситуацию.
Есть кнопка с фиксацией к которой прикреплена переменная типа bool. Естественно эта кнопка меняет цвет в зависимости от состояния выше указанной переменной. Так вот хотелось бы еще чтобы менялся текст на этой кнопке только в зависимости от состояния другой переменной.
Всю голову сломал но что то до меня не доходит как это реализовать.

TeNQ

#39
1. Создаете поле, у меня это Field2.
2. Прикрепляете к этому полю переменную, от состояния которой у вас будет меняться текст на кнопке. У меня это вирт. переменная со шкалой от 0 до 1 - bVar_2
3. Создаете скрипт к этому полю OnDataChange.
Код: pascal
begin
  if Field2.Value = 0 then
    // Кнопка не нажата и зафиксирована, значение bVal_2 = 0
    Button1.States[0].Caption := 'Надпись 1'
  else
    // Кнопка не нажата и зафиксирована, значение bVal_2 = 1
    Button1.States[0].Caption := 'Надпись 2';

  if Field2.Value = 0 then
    // Кнопка нажата и зафиксирована, значение bVal_2 = 0
    Button1.States[1].Caption := 'Надпись 3'
  else
    // Кнопка нажата и зафиксирована, значение bVal_2 = 1
    Button1.States[1].Caption := 'Надпись 4';
end.
где Button1 меняете на вашу кнопку

deldemo

Цитата: TeNQ от 09 марта 2016, 12:25:291. Создаете поле, у меня это Field2.
2. Прикрепляете к этому полю переменную, от состояния которой у вас будет меняться текст на кнопке. У меня это вирт. переменная со шка............

Огромное спасибо за помощь !!!!!!!!!!!!

a_sergeevich

#41
Помогите со скриптом.
Есть несколько скриптов для подсчёта наработки:

Код: pascal
procedure Narabotka_OnDataChange(Sender:Tm_Control);
begin
   if kot_v_rab.ValueAsInt = 1 then
      Time.Value :=  IncSecond(Now, -Interval.ValueAsInt);
 
   if kot_v_rab.ValueAsInt = 0 then
      Interval.Value := SecondsBetween(Now, Time.Value);
end.
Второй выводит в текст занчение наработки:
Код: pascal
procedure OnSecondTimer;
begin
   if kot_v_rab.ValueAsInt = 1 then
     Narabotka.Text := IntToStr(DaysBetween(Now, Time.Value)) + ' дней '+ TimeToStr(Now-Time.Value);
end.
Всё это нормально работает, но до тех пор пока не выйдешь из клиента, после выхода и входа всё начинает считать сначала т.е предыдущие показания не сохраняются.
Поэтому решил при выходе сохранять показания в файл, а при входе из файла их выдёргивать и продолжать счёт. Для этого думаю использовать OnInitialization и OnExit, но никак не соображу как сделать сохранение и считывание правильно. Пытался сохранять в файл значение переменной Interval.ValueAsInt при выходе и считывать значение в неё из файла при входе, но ничего не получается, счет начинается с нуля или с каких-то нереальных цифр типа 7345 дней 20:45:12.
Чувствую, что делаю что-то не так, а что, понять не могу. Поэтому помогите, пожалуйста.
П.С за основу был взят ваш пример счетчика наработки из 31 ответа.

TeNQ

#42
Я взял ваш пример работы с таймером и дополнил его.

На выходе
Код: pascal
procedure OnExit;
begin
  //Сохраняю интервал
  If FileOpen ('Init.msf') then
      FileWriteInt64 (Interval.ValueAsInt)
end.

На входе
Код: pascal
procedure OnInitialization;
{ Скрипт исполняющийся при запуске программы}
begin
  // Загружаю интервал
  If FileOpen ('Init.msf') then
      Interval .Value  := FileReadInt64;
  // Смещаю текущее время на интервал времени наработки в секундах в переменной Time
  Time.Value  := IncSecond (Now, -Interval.ValueAsInt) ;
  // Использую смещенное значение для вычисления времени наработки и отображаю время наработки    
  Text1.Text := IntToStr(DaysBetween(Now, Time.Value ))  + ' дней ' + TimeToStr (Now-Time.Value);
end.
И все работает.

a_sergeevich

Спасибо за наводку, нашёл свою ошибку, я забыл в скрипте при входе добавить Time.Value  := IncSecond (Now, -Interval.ValueAsInt) ; теперь всё заработало.

deldemo

Здравствуйте ! Подскажите пожалуйста возможно ли с помощью скриптов вызывать внешние программы?  Ну например калькулятор.