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

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

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

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #480 : 26 Сентября 2017, 13:19:48 »
Дата, которую Вы видите - верна, т.к. ArchiveTimeOn возвращает результат в переменную типа DateTime. Нулевой значение в этом формате соответствует дате-времени "30.12.1899 00:00:00" (т.е. отсчет у него ведётся от 30.12.1899) и его можно привести к совершенно любому формату простейшими операциями. Просто напишите в каком формате Вы хотите видеть время наработки и мы напишем Вам как его вывести.

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #481 : 26 Сентября 2017, 13:27:17 »
Дата, которую Вы видите - верна, т.к. ArchiveTimeOn возвращает результат в переменную типа DateTime. Нулевой значение в этом формате соответствует дате-времени "30.12.1899 00:00:00" (т.е. отсчет у него ведётся от 30.12.1899) и его можно привести к совершенно любому формату простейшими операциями. Просто напишите в каком формате Вы хотите видеть время наработки и мы напишем Вам как его вывести.

дд.мм.гггг чч.мм

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #482 : 26 Сентября 2017, 13:50:01 »
Добавьте в проект объект Текст. Свяжите его в переменной "Time_resultat" и на событие OnDataChange поставьте такой скрипт:

Код
var
  aText: TM_Text;
  aDay, aMonth, aYear: string;

  function myFormat(AVal: Integer; aSymbols: Byte): string;
  begin
    Result := IntToStr(AVal);
    while Length(Result) < aSymbols do
      Result := '0' + Result;
  end;
begin
  if not (Sender is TM_Text) then Exit;
  aText := TM_Text(Sender);

  SetTimeFormat('hh:mm');
  if YearOf(aText.AsDateTime) < 2016 then
  begin
    aDay := myFormat(DaysBetween(aText.AsDateTime, 0), 2) + '.';
    aMonth := myFormat(MonthsBetween(aText.AsDateTime, 0), 2) + '.';
    aYear := myFormat(YearsBetween(aText.AsDateTime, 0), 4) + ' ';
    aText.Text := aDay + aMonth + aYear + TimeToStr(aText.AsDateTime);
  end else
    aText.Text := '00.00.0000 00:00';
end.

Это универсальный скрипт, который учитывает все преобразования в заданном формате и подходит для любых объектов Текст.

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #483 : 26 Сентября 2017, 14:17:25 »
Спасибо, завтра попробую.

Egor_Egor

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #484 : 10 Октября 2017, 14:32:33 »
Добрый день!
Подскажите, пожалуйста, как реализовать (если это возможно) следующую задачку:
есть 2 переменные word_1 и word_2 типа word, и изображение.
как сделать чтобы при переходе 5го бита переменной word_2 в TRUE картинка окрашивалась в зеленый, при FALSE в серый; при переходе 6го бита переменной word_2 в TRUE картинка окрашивалась в красный, при FALSE в серый.
а при пеходе 5го бита переменной word_1 в TRUE картинка мигала зеленым цветом, при FALSE не мигала; при переходе 6го бита переменной word_1 в TRUE картинка мигала красным цветом, при FALSE не мигала.
и надо ли присваивать переменным какую-либо шкалу?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #485 : 10 Октября 2017, 14:51:10 »
Здравствуйте.

Создайте изображение и в качестве основной переменной изображения выберите переменную word_1, а в качестве дополнительной word_2. Затем нужно перейти в меню скриптов и создать новый скрипт с типом события "Универсальный" и следующим кодом:

Код
begin
  if not (Sender is TM_Object) then Exit;

  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
    begin
      { проверяем 5 и 6 биты доп. переменной }
      if GetBit(VariableEx.AsInt, 6) then
        Color := clCrimson   // красный цвет
      else
        if GetBit(VariableEx.AsInt, 5) then
          Color := clLightGreen  // зелёный цвет
        else
          Color := clNone;  // обычный цвет

      { проверяем 5 и 6 биты основной переменной }
      if GetBit(Variable.AsInt, 6) then
        FlashColor := clCrimson  // мигание красным
      else
        if GetBit(Variable.AsInt, 5) then
          FlashColor := clLightGreen  // мигание зелёным
        else
          FlashColor := clNone;  // без мигания
    end;
end.

Теперь остается этот скрипт назначить изображению на события OnDataChange и OnDataChangeEx. Данный скрипт универсальный и подойдет любым другим изображениям, которые должны работать по тому же принципу.

Смотрите другие примеры скриптов в руководстве по скриптам.

Цитировать
и надо ли присваивать переменным какую-либо шкалу?
не обязательно, т.к. шкала используется только для записи значений в переменную и для отображения.
« Изменён: 10 Октября 2017, 14:55:27 от Simple-Scada »

Egor_Egor

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #486 : 10 Октября 2017, 15:01:31 »
Спасибо за развернутый оперативный ответ, всё работает)

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #487 : 23 Октября 2017, 15:48:26 »
Интересно, что условие представленное в таком виде не работает

Код
if (in1.Value and in2.Value) > 1 then
       out.Value := 10
 else  out.Value := 0;   

А работает следующее

Код
if (in1.Value > 1) and (in2.Value > 1) then
       out.Value := 10
 else  out.Value := 0;   

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #488 : 23 Октября 2017, 16:06:23 »
AutoCY, все правильно, а что именно Вы хотите сравнить? Это два разных условия. В первом случае для двух чисел выполняется логическое умножение и полученный результат сравнивается с единицей. Во втором случае два значения сравниваются с единицей и условие выполняется если оба больше 1. Вам скорее всего нужен второй способ.
« Изменён: 23 Октября 2017, 16:07:22 от Simple-Scada »

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #489 : 24 Октября 2017, 07:52:51 »
AutoCY, все правильно, а что именно Вы хотите сравнить? Это два разных условия. В первом случае для двух чисел выполняется логическое умножение и полученный результат сравнивается с единицей. Во втором случае два значения сравниваются с единицей и условие выполняется если оба больше 1. Вам скорее всего нужен второй способ.

Ага, теперь понятно. В первом случае, хотя я подавал на in1 и на in2 значения больше, чем единица, но конструкция работала, как булевое сравнение, которое возвращает или 0 или 1. Я правильно понял Вас?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #490 : 24 Октября 2017, 14:30:43 »
AutoCY, для полного понимания можно рассмотреть пример когда in1 = 3, а in2 = 6. Тогда операция "in1.Value and in2.Value" выполнится как логическое умножение:

Код
0011  // число 3 в двоичном виде
0110  // число 6 в двоичном виде
=
0010  // результат. Равен 2.

И число 2 будет участвовать в сравнении: "if 2 > 1 then". Так работает первый вариант.

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #491 : 26 Октября 2017, 13:35:04 »
День добрый!

Еще вопрос по выборке наработки оборудования. Процедура ArchiveTimeOn делает выборку по заданному времени, суммируя время. Это я сделал в проекте. Но пользователи теперь хотят с помощью интервала времени увидеть во сколько оборудование начало работать, когда закончило и еще при этом некоторые технологические параметры (среднее арифметическое). Я думал воспользоваться ArchiveCountOff и ArchiveCountOff для определения начала и конца отрезков включения оборудования. Если бы это касалось нескольких дней, то и ладно, а так придется плодить много переменных. Может есть какое-то готовое решение?

Спасибо.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #492 : 26 Октября 2017, 14:12:13 »
Здравствуйте.

Цитировать
Это я сделал в проекте. Но пользователи теперь хотят с помощью интервала времени увидеть во сколько оборудование начало работать, когда закончило и еще при этом некоторые технологические параметры (среднее арифметическое).
Обычно именно эти задачи решают тренды. Оператор переходит в меню просмотра трендов, задаёт интересующий его интервал времени и видит когда оборудование начало/закончило работать, а при наведении мыши на легенду тренда видит мин., макс., и среднее по тренду за просматриваемый интервал времени. Архивные процедуры не подходят для решения такой задачи, т.к. они работают с данными на всём интервале, а в Вашем случае требуется взять весь интервал заданный пользователем, найти на нём другие "подинтервалы" (например когда оборудование было включено) и для каждого "подинтервала" выполнить действие (например получить время начала/конца работы). Т.е. результат может быть не один, а несколько (для каждого "подинтервала").

Можно включить архивацию у переменной "Пуск/Стоп" оборудования, тогда можно скадой по запросу пользователя делать выборку из БД за любые интервалы времени и выводить результат в таблицу на мнемосхеме. Т.е. получится таблица с перечислением моментов пуска/остановки оборудования за заданный оператором интервал. Но такой способ не позволяет вывести доп. данные (например средн. арифметическое).
« Изменён: 26 Октября 2017, 14:13:14 от Simple-Scada »

oleger

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #493 : 26 Октября 2017, 14:37:50 »
Приветствую.
Начинающий, прошу не пинать :-)
Хочу получить СМС и отобразить его текст в сообщении.
USB-модем E173, сообщения из скады отправляются.
Нужно по таймеру вызывать процедуру GetSMS или скада сама опрашивает модем ?
Спасибо.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #494 : 26 Октября 2017, 17:10:17 »
Хочу получить СМС и отобразить его текст в сообщении.
Нужно по таймеру вызывать процедуру GetSMS или скада сама опрашивает модем ?
Здравствуйте. Да, Вы всё поняли правильно. Достаточно создать внутреннюю переменную с типом Integer и именем например vrTimerSMS. Далее создается новый скрипт с типом события "Прошла секунда" и следующим кодом:
Код: (delphi)
const 
  INTERVAL = 60;  // интервал таймера 60 сек.
begin
  vrTimerSMS.Value := vrTimerSMS.Value + 1;
  if vrTimerSMS.AsInt >= 60 then
  begin
    GetSMS(TRUE, FALSE);   // запрос на чтение и удаление SMS сообщений из памяти SIM-карты
    vrTimerSMS.Value := 0;
  end;
end.

Не рекомендуем читать SMS чаще чем каждые 5 секунд, т.к. модем отвечает не моментально. Теперь создаём новый скрипт с типом события "Получено SMS-сообщение" для обработки полученных SMS-сообщений. Допустим в проекте есть объект Text1 в который мы хотим выводить сообщения (каждое сообщение с новой строки). Тогда код будет таким:
Код: (delphi)
begin
  Text1.Text := Text1.Text + smsTime + ' | ' + smsPhone + ' | ' + smsMsg + Chr(10);
end.
, где Chr(10) - символ переноса строки.
« Изменён: 03 Апреля 2019, 13:02:46 от Simple-Scada »