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

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

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - teplocom

Страницы: [1] 2 3
1
https://simple-scada.com/help/manual/extvarbits.html
А для OPC-UA данный способ разбития на битовые переменные работает? Пробовал, не получалось.

2
Необходимо визуально по картинке бункера понимать, что с ним происходит в данный момент. Это три состояния: наполнение, опорожнение, бездействие.
Приветствую!
А что есть из переменных от нижнего уровня? Масса бункера или уровень?
Или у Вас прям состояния приходят от некоего ПЛК: наполнение, опорожнение, бездействие.
Стрелки, как мне кажется, норм вариант. Я бы добавил у стрелки (Элемент "Линия" из стандартной палитры, изменить окончание линии на "стрелка") свойство "Цвет мигания" (например черный/серый, чтобы привлечь внимание, если это необходимо) и управлял через скрипты Visible := True/False
То есть в состоянии "бездействие" обе стрелки Visible :=False.

3
Хмм.. А если я для переменной А (где не нужен звук) укажу только Верхняя/нижняя граница предупреждения в Настройки для сообщений о нарушении границ А также укажу в поле: Сообщение для нарушения границ: не выдавать сообщения.
В этом случае для переменной А у меня останется только индикация поля (желтым по-моему) при выходе значений за предупредительные границы без выдачи любых сообщений?

4
Код: (delphi)
var
  aTemp, aZad: TM_Variable;
begin
  // выполняем скрипт только для столбца с уставками и проверяем, что ячейки связаны с переменными
  if (Cell.Col = 2) and (Cell.Variable <> nil) and (Cell.VariableEx <> nil) then
  begin
    aTemp := Cell.VariableEx;             // переменная температуры
    aZad := Cell.Variable;                // переменная задания

    aTemp.HighAlarm := aZad.AsFloat + 3;  // верхняя авар. граница = задание + 3
    aTemp.LowAlarm := aZad.AsFloat - 3;   // нижняя авар. граница = задание - 3
  end;
end.

Элегантно, у себя попробую такое сделать. Спасибо.

Подскажите, раз уж в тему:
Если у переменной включены аварийные границы, то де-факто будет и звуковое оповещение и сообщения при нарушении границ переменных в строке активных аварий в журнале.
Есть ли возможность не выдавать звуковое сообщение пользуясь стандартными средствами для определенных переменных (не всех) при их "выходах" за аварийные границы, чтобы например для переменной А формировались только активные аварии в журнале без звука, а для переменной В и звуковое оповещение и активные аварии в журнале.

5
да)) есть такой минус, сортирую при добавлении новых объектов вручную.
Начинал проект, когда еще не было шаблонных объектов, сейчас бы через них сделал такую "таблицу" (строки в виде ш.объектов).

6
Да, делал таблицей, а "поверх" нее в столбце "Адрес теплоузла" слой "Текст" с названием объекта

7
День добрый.
1.Создайте общую обзорную страницу с параметрами всех объектов. (скрин 1)
2. Создайте окно с мнемосхемой каждого объекта (можно через шаблоны) (скрин 2)
3. Названия объекта - это поле "Текст", у этого поля укажите в свойствах ссылку-переход на окно объекта (скрин 1 - в моем случае это Suvorova_25)

8
Помогло удаление "задвоившихся" переменных в конфигурации орс-сервера -> ... Кто создавал ошибку, скада или орс, я так и не понял.
Скада создавать и редактировать конфигурацию орс-сервера еще не научилась  ;D

9
Цитата: Обновление SIMPLE-SCADA 2.6.8.0
добавлены текстуры с анимацией кругового и арочного индикатора. Примеры реализации индикаторов добавлены в Demo-проект (страница Компоненты - Радиальный индикатор);
круговой и арочный индикатор - огонь!
спасибо за добавление функционала по визуализации, будем использовать.

10
Добрый день!

Мне нужно сетевую переменную Data_net перевести в двоичное число, чтобы в будущем извлекать биты.
Код: (delphi)
var
Data_net: word;
begin
  Data_net := ?????;
 
Мой вопрос состоит в том, что почему без строчки  Data_net := 24576 все ломается?
Мне кажется вы наблюдаете эффект из: Изменение 1
И, как вам написал производитель, при работе с внешней переменной этого эффекта наблюдаться не будет.

11
Я бы вашу задачу решил добавлением внутренней Integer-переменной  Init_sec
В секундном скрипте прописал бы: Init_sec.Value:=Init_sec.Value+1;
А для поля в шаблоне назначил бы ваш скрипт по изменению этой дополнительной переменной: Init_sec
Может не оптимально по производительности, но будет отрабатывать раз в секунду, что бы не случилось)))

12
Доброго!

В руководстве по скриптам на сайте https://simple-scada.com/help/script/playusersound.html для процедуры PlayUserSound указан допустимый звуковой пользовательский файл в формате ".ogg", а в справке по F1 из редактора скриптов указана возможность использовать также файл в формате ".wav"
".wav" у меня запустить не получилось. Значит он пока не поддерживается?

И второй вопрос, по поводу проигрыша нескольких пользовательских файлов подряд.
Нужно проигрывать шаблонную конструкцию:
Первый файл: "Котел №%....%"
Второй файл: "Причина аварии"

Я ведь могу сделать так?
Скрипт по изменению переменной. Изменилась одна из шести переменных номера аварии:
Тогда проигрываю файл "boiler_alarm_%....%.ogg", меняю внутреннюю переменную bool_ogg1:=True, которая означает начало проигрывания "звук.файла 1"
Код: (delphi)
PlayUserSound('Name', Variable.Name+'.ogg',False);
bool_ogg1:=True;
num_alarm:=Variable.Value;
В секундном скрипте делаю задержку для гарантированного окончания проигрыша "звук.файла 1"  в 3 секунды и запускаю второй файл "Причина аварии"
Код: (delphi)
var
ii: Integer;
begin
if bool_ogg1= true then ii:=ii+1;
if ii>2 then
begin
PlayUserSound('Name', IntToStr(num_alarm)+'.ogg',False);
ii:=0;
bool_ogg1:=False;
end;
end.

13
Может будет кому-то полезно
Написал дополнение примера с руководства по скриптам: Работа с архивом. Время наработки оборудования

, для отображения времени наработки оборудования в днях, которое позволяет отображать в текстовом поле правильное склонение слова ДЕНЬ (дней, дня):

Код: (delphi)
var
  aText: TM_Text;
  aDay, aDayWord: string;
  aModDay10,aModDay100,aBetwDay: Integer;

    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) < 2022 then
        begin
          aBetwDay := DaysBetween(aText.AsDateTime, 0);
          aDay := myFormat(aBetwDay, 3);
          aModDay10 := aBetwDay Mod 10;
          aModDay100 := aBetwDay Mod 100;
        if (aModDay100>10) AND (aModDay100<15) then aDayWord:='дней'
        else
        case {DaysBetween(aText.AsDateTime, 0)} aModDay10 of
        0,5..9: aDayWord:='дней';
        1: aDayWord:='день';
        2..4: aDayWord:='дня';
        else aDayWord:='ошибка'
        end;
    aText.Text := aDay+' '+aDayWord+' '+ TimeToStr(aText.AsDateTime);
  end else
    aText.Text := 'подождите расчет';
end.

14
Формат у ячеек при этом можно не выбирать и оставить "Стандарт". Если разобраться не получится, то вышлите текущую версию проекта и укажите отчет, мы опишем пример для Вашего отчета.
Великолепно! Как после такого ответа могло не получиться))

Результат во вложении.

Всем спасибо! Работаем)

15
Единственный вариант, который нашел, что убирает секунды и миллисекунды для TimeSpan это "Формат - > Время - > HH:mm"
Но вместе с ними убираются и дни =)

Страницы: [1] 2 3