Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Вопросы по скриптам в Simple-Scada 2  (Прочитано 208694 раз)

SAES-CV

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #30 : 02 Марта 2016, 13:07:28 »
Доброго времени суток!
На проекте "Монитор работы вентиляционного оборудования" хочется привязать мото-часы к (фактическую наработку) оборудованию. То-есть при нажатии на кнопку вкл. таймер начнёт отсчёт, при остановке - остановится, при следующем нажатии - продолжит с того-же времени... Контроллеры все виртуальные.
Посоветуйте пожалуйста откуда плясать... буду признателен.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 876
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #31 : 03 Марта 2016, 22:29:12 »
Здравствуйте!

Во вложении пример проекта с решением Вашей задачи. Распакуйте его в папку "Simple-Scada 2\Projects" , затем запустите его через Client и посмотрите как он работает. Затем перейдите в редактор и посмотрите скрипты для кнопок и для события OnSecondTimer (также в скриптах используются 2 внутренние переменные). Результат (наработку мото-часов) Вы можете записывать в какой-нибудь тэг OPC-сервера или сохранять в файл(подробнее см. в руководстве по скриптам - раздел "Работа с файлами").
« Изменён: 03 Марта 2016, 22:31:41 от Simple_Scada »

SAES-CV

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #32 : 04 Марта 2016, 13:03:34 »
Спасибо большое, буду пробовать. потом отпишусь  :)

a_sergeevich

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #33 : 04 Марта 2016, 15:44:04 »
У меня есть кнопка на которой висит сброс счетчика, как сделать, чтобы при нажатии на неё выскакивал запрос пароля ?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2706
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #34 : 04 Марта 2016, 23:47:08 »
a_sergeevich для этого мы должны добавить в скрипты функцию для появления специальной формы с паролем. Возможно добавим её в одном и следующих обновлений.

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

Mishail

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #35 : 09 Марта 2016, 07:29:42 »
Здравствуйте!
Немного  опишу ситуацию. Есть регистр(переменная) формата int, который хранит индекс некоего события(в примере причина пуска). Есть объект Text1 (для примера), который должен в зависимости от регистра выводить разный текст. Это реализовано и прекрасно работает в виде:
Код
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)
« Изменён: 09 Марта 2016, 07:42:42 от Mishail »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 876
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #36 : 09 Марта 2016, 08:22:58 »
Конечно возможно! Забыли описать это в руководстве - исправим. Через Sender можно обращаться только к общим свойствам объектов. Для обращения к остальным свойствам необходимо привести объект к нужному типу. Для этого нужно использовать конструкцию "Sender as ...". А чтобы убедиться, что объект действительно имеет нужный нам тип - добавляется проверка "Sender is ...", т.е. в вашем случае код будет выглядеть так:
Код: (delphi)
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.
Когда таких условий у Вас много правильнее и удобнее для восприятия писать так:
Код: (delphi)
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)
Спасибо за информацию! Такого теста мы еще не проводили.
« Изменён: 26 Мая 2018, 10:24:22 от Simple-Scada »

Mishail

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #37 : 09 Марта 2016, 09:50:26 »
Благодарю за оперативный ответ  :)

deldemo

  • Старожил
  • ****
  • Сообщений: 303
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #38 : 09 Марта 2016, 11:25:32 »
Здравствуйте.! Уважаемые помогаете пожалуйста с написанием скрипта.
Опишу ситуацию.
Есть кнопка с фиксацией к которой прикреплена переменная типа bool. Естественно эта кнопка меняет цвет в зависимости от состояния выше указанной переменной. Так вот хотелось бы еще чтобы менялся текст на этой кнопке только в зависимости от состояния другой переменной.
Всю голову сломал но что то до меня не доходит как это реализовать.

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #39 : 09 Марта 2016, 12:25:29 »
1. Создаете поле, у меня это Field2.
2. Прикрепляете к этому полю переменную, от состояния которой у вас будет меняться текст на кнопке. У меня это вирт. переменная со шкалой от 0 до 1 - bVar_2
3. Создаете скрипт к этому полю OnDataChange.
Код: (delphi)
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 меняете на вашу кнопку
« Изменён: 26 Мая 2018, 10:24:55 от Simple-Scada »

deldemo

  • Старожил
  • ****
  • Сообщений: 303
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #40 : 09 Марта 2016, 12:31:40 »
1. Создаете поле, у меня это Field2.
2. Прикрепляете к этому полю переменную, от состояния которой у вас будет меняться текст на кнопке. У меня это вирт. переменная со шка............

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

a_sergeevich

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #41 : 09 Марта 2016, 15:45:36 »
Помогите со скриптом.
Есть несколько скриптов для подсчёта наработки:

Код: (delphi)
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.
Второй выводит в текст занчение наработки:
Код: (delphi)
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 ответа.
« Изменён: 26 Мая 2018, 10:25:22 от Simple-Scada »

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #42 : 09 Марта 2016, 17:07:38 »
Я взял ваш пример работы с таймером и дополнил его.

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

На входе
Код: (delphi)
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.
И все работает.
« Изменён: 26 Мая 2018, 10:25:49 от Simple-Scada »

a_sergeevich

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #43 : 10 Марта 2016, 08:05:20 »
Спасибо за наводку, нашёл свою ошибку, я забыл в скрипте при входе добавить Time.Value  := IncSecond (Now, -Interval.ValueAsInt) ; теперь всё заработало.

deldemo

  • Старожил
  • ****
  • Сообщений: 303
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #44 : 16 Марта 2016, 08:28:04 »
Здравствуйте ! Подскажите пожалуйста возможно ли с помощью скриптов вызывать внешние программы?  Ну например калькулятор.