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

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

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

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


Сообщения - MaxHari

Страницы: [1] 2 3
1
Здравствуйте!

Работаю со сборным проектом, который затем приходится резать на части для разных объектов. Каждый раз с новой версией приходится удалять вручную переменные для каждого объекта.

Могли бы вы добавить функцию удаления групп переменных по горячей клавише? Либо функцию выбора множества групп переменных при помощи Shift+?

2
В целом хорошее решение, когда не нужен звук на компьютере. Как я понимаю, таким образом управляется звук в операционной системе.

В нашем случае скада-система установлена на отдельном сервере и служит только для визуализации происходящего.

3
Здравствуйте!

Есть ли возможность полностью (не разово) управлять звуком при превышении граничных значений?

Нажали кнопку (вкл звук) - сообщения приходят со звуком, ещё раз нажали (откл звук) - соообщения без звука.

4
Нашли наконец баг в проекте - у переменных вообще не были установлены границы в свойствах, в результате записывалась только верхняя аварийная граница, а предупредительная оставалась на значение "10".

5
Возникла проблема при установки верхней предупредительной границы на 2-х (возможно и более, пока не обнаружено) переменных.
В процедуру SetTagsSPs передаётся индекс объекта системы, по этому индексу в цикле определяются необходимые переменные spTag, значения mConstTag и тип spType границы, и данные передаются в SetSPToTag. Там уже идёт изменение граничного значения. На скрине видно, что значения на вход SetSPToTag поступают одни, а значение предупредительной границы не меняется - остаётся "10". С остальными переменными всё работает идеально.

Подскажите, пожалуйста, в чём может быть загвоздка?
Код: (delphi)
  procedure SetSPToTag(spTag: TM_Variable; spValue: double; spType: byte);
  begin
    DebugSP('[SetSPtoTag] spValue = ' + FloatToStr(spValue));
    case spType of
      1: begin
           spTag.HighWarning := spValue;
           DebugSP('[SetSPtoTag] ' + spTag.Name + ' SP1 set: ' + FloatToStr(spTag.HighWarning));
         end;
      2: begin
           spTag.HighAlarm := spValue;
           DebugSP('[SetSPtoTag] ' + spTag.Name + ' SP2 set: ' + FloatToStr(spTag.HighAlarm));
         end;
    end;
  end;

  procedure SetTagsSPs(objIndex: byte);
  var
    spTag, mConstTag: TM_Variable;
    spNum, spType: byte;
    objectId, mConstNumStr: string;
  begin
    DebugSP('[SetTagsSPs] in: objIndex = ' + IntToStr(objIndex));
    objectId := GetObjectIdByIndex(objIndex);
    for spNum := 1 to MCONST_SP_COUNT do
    begin
      spTag := GetVariableByName(objectId + '_' + mConstSPTag[spNum]);
      if Assigned(spTag) then
      begin
        spType := 2;
        repeat
          mConstTag := GetVariableByName(objectId + '_MCONST_' + intToStr(mConstSPNum[spType, spNum]));
          if Assigned(mConstTag) then
          begin
            DebugSP('[SetTagsSPs] ' + mConstTag.Name + ' = ' + mConstTag.AsStr);
            SetSPToTag(spTag, mConstTag.AsFloat, spType);
          end;
          Dec(spType);
        until spType = 0;
      end;
    end;
  end;

6
Спасибо за подробное описание.

В части работы скриптов очень помогло, проект на старте стал меньше зависать при отсутствии opc-сервера.

С параллельными процессами у меня основные сложности возникли как раз при работе со скриптами OnDataChange на ComboBox'ах, которые заполнялись динамическими данными. В системе используются шаблоны, которые подставляются в комбобоксы, всего 3х10 штук (10 строк по 3 комбобокса). Пробовал сразу построчно с одной процедуры заполнять - скада не успевала уловить изменения, заполнить новые, и вытоге процесс не двигался. Пришлось перенести работу в пошаговое заполнение каждого последующего из предыдущего в OnDataChange. Позже, возможно, буду ещё дорабатывать - скорее всего отсюда и вылазять косяки с подвисанием очередей и перегрузкой системы, как вы описали.

7
Если ли возможность где-то почитать про параллельные процессы в Скаде? Например, изменение переменной, смена пользователя, открытие файла и т.п.? Были ситуации, когда приходилост методом "тыка" решать различные задачи. Сейчас очередь скриптов часто переполняется, хочется разобраться, что может вызывать причину.

Также в скаде есть события "Запуск проекта" и "Полностью запущен". Можно ли где-то более подробно, чем в руководстве, почитать о том, какие процессы происходят на этих этапах. Страницы разрабатываемого проекта заполняются динамически полностью при старте, и проект слегка "подвисает". Хотелось бы разобраться, что куда распределить в проекте, поскольку он выдаёт разные результаты при заполнении объектов и инициализации тегов из скриптом с указанными выше событиями.

8
Ваши вопросы / Re: Смена пользователя
« : 21 Января 2020, 09:49:02 »
Цитировать
ChangeUser всегда с возможностью закрытия. Отображение окна авторизации без возможности закрытия выполняется через Logout. Но он для вашей задачи не подойдёт, т.к. выполняет полный выход (с закрытием окон).
Попробовал Logout на demo 2.3.6.4 - появляется "стартовый" тёмный экран авторизации, без возможности отмены клавишей 'Esc'. При авторизации проект продолжает работать с того же места. В целом - подходит, если нет каких-либо существенных отличий от ChangeUser, кроме затемнения экрана.

Задачу получилось наконец задачу через вторую, read-only таблицу и управление её видимостью. Работает как на ChangeUser, так и на Logout.

9
Ваши вопросы / Re: Смена пользователя
« : 19 Января 2020, 18:39:04 »
Цитировать
Вы сделали собственную систему авторизации для окна? Выполняете скрипт с процедурой ChangeUser при открытии окна? Если да, то через скрипты будет проблематично сделать отдельную надежную авторизацию для окна, т.к. скада не сможет узнать что за компьютер сел другой пользователь.

Собственную систему авторизации не делали, стараемся действовать в рамках возможностей скады. При открытии окна используется стандартный ChangeUser. Есть ли возможность отключить кнопку 'Esc' при вызове ChangeUser (либо в проекте в целом)? Тогда бы вопрос сам собой решился.

10
Ваши вопросы / Re: Смена пользователя
« : 18 Января 2020, 07:07:36 »
Проблемка с пользователями всё-таки возникла) Попробую описать подробнее.

Есть окно с таблицей, которое открывается по кнопке. По нажатии на кнопку необходимо открыть окно авторизации для повторной проверки пользователя. Если авторизуется администратор, он имеет право редактировать таблицу в окне, если оператор - таблица только для чтения. Проблема возникает, когда залогинен администратор, он отходит от ПК, и в этот момент подходит оператор, нажимает кнопку - появляется окно авторизации, и оператор нажимает Esc. То есть смены пользоваетеля не происходит, и оператор имеет полный доступ к таблице. Помогите, пожалуйста, разобраться с задачей.

11
Тут речь идёт о проекте с большим количеством однотипных вкладок, объекты на которых формируются и заполняются по индексам. Это было сделано, чтобы в случае изменений в интерфейсе просто копировать начальную вкладку. Много размышляли, остановились на этом, очень удобно.
Для каждого клиента существуют свои окна с индексированными кнопками и подобными объектами. Это тоже сократило количество окон и работы + при внесении каких-либо изменений в начальное окно, остальные окна просто копируются.

В этом случае кнопка становится красной для определённого клиента, потому что она находится в определённом окне...

Предложенная функция не архиважная - решение нашлось.  Но было бы хорошо иметь её на подобные случаи.

12
Здравствуйте!

Хотелось бы иметь в скаде функцию GetActiveClientsNames, которая бы возвращала массив имён активных клиентов.

Для чего это может понадобиться?
Клиенты в проекте имеют порядковые индексы. По изменению значений клиентских флагов выполняются различные события с интерфейсом, к примеру смена видимости активной кнопки... Изменение значений переменной выполняется на сервере, имя клиента получить нет возможности. Поэтому приходится в цикле перебирать всех клиентов и выполнять положенные изменения.
Более верно - делать это только для активных клиентов.

Один из выходов - уйти от флажков и перейти к порядковым переменным для каждого клиента (что не всегда удобно).
Второй вариант - сделать переменную, которая бы включала флаг активного клиента один раз по событию, которое совершает клиент, например - первый переход на страницу. Отследить в этом случае, какие клиенты активны, если они выходят из системы - невозможно. Будет просто - максимальный номер заходивших клиентов.
И третий вариант - предложенная функция GetActiveClientsNames, которая бы в паре с GetClientsCount хорошо бы выполняля свою роль.

Добавлено.
Включение / отключение активного клиентского флага по событию (например, клиент находится в заданном окне, где меняются параметры объектов, которые формируются на основе комплексной оценки) - одно из хороших решений. Тогда цикл уменьшается к выполнению действию только для активных флагов (клиентов).

13
Ваши вопросы / Re: TM_Table
« : 07 Января 2020, 18:03:32 »
Спасибо, сам бы никогда не догадался)

Возможно ли как-то убирать фокус с выбранной строки таблицы (делать что-то по типу RowIndex := -1)?

14
Ваши вопросы / Re: TM_Table
« : 06 Января 2020, 18:22:06 »
Здравствуйте!
Вроде уже задавал вопрос, не смог найти..

У таблиц есть событие OnCellDatachange. Можно ли как-то по этому событию понять в какой ячейке поменялась переменная и сделать что-то с соседней ячейкой (например, в столбце aCol + 1)?

15
Ваши вопросы / Re: Работа с файлами
« : 23 Декабря 2019, 00:34:56 »
Цитировать
Вы открываете файл через TextFileOpen? Если да, то у неё есть два отдельных параметра, первый - имя файла, второй - путь к файлу, см. руководство. Возможно Вы передаёте всё одним параметром? Если да, то это неправильно. Пример:
Код: (delphi)
TextFileOpen(objectId + '_mconst.ini', 'D:\', fomReset, fcpUTF8);

Да, так и есть. Исправил, всё заработало :-)
С ошибками будем что-то делать по мере освобождения от сверх срочных задач. Система стабильно работает, но в логи они почему-то сыпятся, нужно вникать.
Cпасибо за помощь.

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