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

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

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

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


Сообщения - quarian

Страницы: [1]
1
Добрый день.
Обновился с версии 2.4.0.11 на 2.5.1.0 и заметил, что в web-клиенте на панели оператора ОВЕН ВП110 перестали отображаться многие компоненты. Фото панели с демо-проектом в приложении. В клиентах и десктопных браузерах всё отображается корректно.
Хотелось бы понять, существует ли у этой проблемы решение. Или будет ли исправление в будущих версиях simple-scada? Если проблема конкретно в ВП110, то можете ли посоветовать другие web-панели?  Есть ли возможность скачать архивную версию, в которой с данной панелью всё отображалось корректно?

2
Здравствуйте.
Спасибо за простое и изящное решение :). Взял его как основу.
Вы помогли мне выбраться из своей собственной зацикленности) Попытка отказаться от выполнения скриптов по времени, действительно, привела меня в тупик.

3
Здравствуйте. Спасибо за быстрый ответ.
Попробую более подробно описать задачу.

Переменные один и два, это, на самом деле, переменные OPC-сервера, связанные с одним дискретным входом модуля ввода (первая отвечает за состояние этого входа, а вторая за встроенный в модуль ввода счётчик). Один вход модуля ввода контролирует состояние одного устройства. Как я уже говорил, состояний у устройства три: в первом состоянии (99 процентов времени) логический ноль; второе состояние это авария, когда на входе появляется единица и горит до тех пор, пока обслуживающий персонал не предпримет некоторые физические действия; третье же состояние, когда на входе 0 и 1 сменяют друг друга с периодом в 1 секунду, говорит о неисправности самого устройства, его измерительной схемы.
Задача состоит только в том, чтобы различать состояния этих устройств (контроль связи будет осуществляться при помощи другого механизма). Задержка с распознаванием третьего состояния не сильно важна (до 5-10 секунд норм).
Устройств будет достаточно большое количество (около 1000), и 99 процентов времени они будут находится в первом состоянии, поэтому выполнения скриптов по времени я стараюсь избегать.
Использование второй переменной (счётчика модуля ввода) обусловлено моим страхом того, что изменение состояния первой может в какой-то момент синхронизироваться с частотой опроса и в этом случае скада будет считать, что устройство в первом или втором состоянии, в то время как оно уже минуту в третьем. При этом не хочется жёстко фиксировать время опроса, потому что для меня непонятно как поведёт себя OPC и скада при увеличении количества устройств и чем придётся пожертвовать для нормальной работы.

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

Ещё раз спасибо за помощь.

4
Здравствуйте. Нужен совет.
Есть две переменных, связанных с одним устройством. Первая переменная дискретная, может принимать значения 0 или 1. Вторая переменная является счётчиком для первой типа LongWord. Есть три состояния устройства:
    1-первая переменная = 0, устройство в норме;
    2-первая переменная = 1, счётчик увеличился на 1, устройство в аварии;
    3 - первая переменная мигает, раз в секунду изменяя своё значение (0,1,0,1,0...), вторая переменная соответственно инкрементируется на 1 каждую секунду.
Задача состоит в том, чтобы разделить эти состояния и вывести соответствующее предупреждение.
С первыми двумя состояниями вопросов не возникает. Третье состояние я решил определять с помощью скорости изменения второй переменной - счётчика. Если изменяется быстрее, какого-то значения, то считаем, что третье состояние наступило. (Возможно, Вы можете предложить лучший способ).
Написал универсальный скрипт в шаблоне для фигуры, символизирующей устройство.
Код: (delphi)
var
  timeOfPreviousValue: TDateTime; //хранит время
  speedOfChanging: Double; //скорость изменения переменной (производная по времени)
  s: String; //сообщение о неисправности
begin
  if Sender is TM_Shape then
    with Sender as TM_Shape do
      speedOfChanging := 0.0;
      timeOfPreviousValue := IncSecond(Now, -interval.value); //interval - глобальная переменная времени задержки
      ArchiveValueByTime(TM_Shape(Sender).VariableEx, previousValue, timeOfPreviousValue); //запрос из архива значения, полученного на interval времени раньше
      Text2.Text := IntToStr(TM_Shape(Sender).VariableEx.AsInt64); //для отладки
      Text3.Text := IntToStr(previousValue.AsInt64); //для отладки
      if previousValue.Value <> 0 then //проверка на тот случай, когда в архиве недостаточно данных
      begin
        if (TM_Shape(Sender).VariableEx.AsInt64 - previousValue.AsInt64) > 0 then //проверка на ноль
          speedOfChanging := (TM_Shape(Sender).VariableEx.AsInt64 - previousValue.AsInt64)/interval.Value; //вычисление скорости изменения второй переменной
          Text4.Text := FloatToStr(speedOfChanging); //для отладки
        if speedOfChanging > 0.5 then //условие, при котором наступает третье состояние
          begin
            s := "Неисправность УКМ" + UTF8ToString(Sender.Hint);
            AddMessage(Now, mkAlarm, s,  true, true);
          end;
      end;
end.
Возникли следующие вопросы.
1. При попытке обращения к локальной переменной типа TM_Variable, в которую я передал результат функции ArchiveByTime в логе сервера появилась ошибка access violation. Поэтому создал глобальную переменную previousValue. Правильно ли я понимаю, что нет способа возвращать значение в локальную переменную? Не хотелось бы создавать отдельную переменную для каждого устройства.
2. Если создавать отдельную переменную для каждого устройства, то для работы в универсальном скрипте нужно будет использовать поиск по имени, а в имя протаскивать подстановку какого-нибудь поля? (hint, name).

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