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

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

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

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


Сообщения - pan2000

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

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

2
  Здравствуйте.

 Один из вариантов реализации задачи:
- измерение интервала времени по разности значений даты-времени на концах интервала;
- условием записи в таблицу является превышение на 1 градус порогового значения, которое увеличивается на 1 градус после записи в таблицу;
- запись в таблицу осуществляется по индексу, который увеличивается на 1 после каждой записи.
Пример с моделью линейно возрастающей температурой во вложении.

 Это только пример. Модель специально выбрана так, что значения температуры вещественные числа, причем разность с пороговым (целочисленным) значением возрастает.
Реальный проект определяется (тех)заданием и, возможно, придётся интерполировать временной интервал или использовать базу данных.

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

Переменная Work_and_alarm состоит из набора отдельных битов, логическая функция GetBit возвращает значение отдельно бита из переменной по его номеру.
Всё множество скриптов проекта можно заменить на один универсальный, параметром которого будет свойство Tag объекта, которое должно быть номером бита конкретного объекта.
Далее выбрать все объекты, к которым применяется скрипт, и связать его с событием OnDataChange. А вот свойство Tag прийдется править для каждой группы (в проекте по два объекта) индивидуально.
Код: (delphi)
begin
  if Sender is TM_Object then         // проверяем, что Sender это объект
    with Sender as TM_Object do       // приводим Sender к типу "TM_Object"
      Visible := GetBit(AsInt, Tag);  // показать/скрыть объект
end.

Проект с исправлениями во вложении.

4
   Здравствуйте.
Есть возможность вычислить в скрипте, какая страница открыта на клиенте?
Такая возможность есть. Парные события "Пользователь перешел на эту страницу" и "Пользователь покинул эту страницу" позволяют контролировать пару страница - клиент (у которого по определению только ОДИН пользователь).
Собственно, необходимые действия можно выполнить в этих скриптах или отложить до скрипта, который понимает клиента (работает GetClietName) или варианта с одним клиентом (тому всё равно). Отельная неприятность от анонимных (без имени) десктоп-клиентов, неразличимых по определению (хотя у каждого клиента уникальный ID).
А зачем это всё нужно?
В проекте сделана замена штатного интерфейса кнопками и все на шаблонах. Хочется менять границу кнопки открытой подстраницы.
При замене штатной системы навигации страниц на каждой странице присутствуют уникальные кнопки навигации, либо как набор отдельных кнопок, либо в составе шаблона. В первом случае кнопку выбранной страницы можно изменить на этапе редактирования проекта, во втором - при инициализации шаблона.
 Пример слежения за клиентами-страницами и инициализации шаблона кнопок во вложении.

   Добавлено 25.02.2024
При инициализации шаблонов можно построить массив ссылок на активную кнопку страниц, что позволит изменять отображение кнопки из скриптов. Поиском по имени/ID клиента в парах "клиент-индекс открытой страницы" определяется индекс страницы, а по нему ссылку на объект-кнопку.
Однако следует помнить, что изменения видны у всех клиентов, перешедших на эту страницу.
Наличие таблицы клиентов позволяет передавать текстовые сообщения от клиента к клиенту.
См. "Граница_кнопки_3".

5
Ваши вопросы / Re: Рисование линий
« : 22 Февраля 2024, 15:40:28 »
  Здравствуйте.

1. Для создания изменяемого изображения можно манипулировать только уже созданными объектами, как-то перемещение, масштабирование, видимость в экранной области (либо собственно свойство Visible, либо перемещение вне экрана), вращения для ограниченного набора объектов.
См. пример "Манипуляции_с_объектом".
2. Рисование линий из скриптов, с ограниченным на этапе редактирования проекта максимальным числом линий, можно построить на основе объекта "Прямоугольник" единичной ширины.
Аналогичным образом можно рисовать и статические наклонные линии в редакторе, но это дело крайне неблагодарное по части "сшивки" линий (хотя можно нарисовать по координатам при запуске проекта).
Пример "Рисование_линий" - процедура построения линии по начальным и конечным координатам.

6
Ваши вопросы / Re: Векторная Диаграмма
« : 03 Февраля 2024, 11:53:16 »
   Здравствуйте.
  Наклонные линии можно строить из объектов имеющих возможность поворота, таких как "Фигура" и "Изображение". Некоторую сложность представляет перерасчет координат, причем вращается объект относительно центра, при этом его координаты (X, Y) не изменяются.
  При небольшой ширине объекта будет отображаться линия. Во вложении пример векторной диаграммы с использованием всех трех вращаемых объектов.
  При уменьшении размера диаграммы её информативность будет снижаться. В примере есть режим "Лупа", который масштабирует величины напряжений и кратно увеличивает углы отклонения от 120, 240 градусов.
  К сожалению, "Изображение" не подходит для WEB-клиента, объект позиционируется отличным от обычного клиента способом.

7
Ваши вопросы / Re: Отслеживание клиентов
« : 24 Января 2024, 17:40:29 »
 "Большой_брат" - проект контроля за клиентами и пользователями других проектов сервера. Контроль осуществляется на основе единой таблицы пользователей по событиям проектов. Отслеживаемые проекты должны быть подключены к базе данных и иметь возможность записи/изменения в таблицу пользователей по событиям "Авторизация пользователя", "Пользователь перешел на страницу", "Пользователь покинул страницу", "Остановка проекта".
Соответствующие скрипты должны быть включены или изменены в отслеживаемых проектах.
По данным из этой таблицы можно получить обобщенную информацию, как-то текущее состояние пользователей и клиентов, учет времени пользователей и т.д.
В примере проект контроля (состояние активных пользователей, статистика по времени пользователей и проектам/проекту) и тестовый проект с авторизацией и без. Для тестирования можно размножить тестовые проекты.


          Добавлено 3.02.2024

  Окончательная версия проекта, без отслеживания переходов по страницам, что позволяет уменьшить размер таблицы users.
Добавленные события контролируемого проекта:
- "Полностью запущен" - получение имени проекта в переменную ProjectName;
- "Остановка проекта" - перевод в неактивное состояние всех записей клиентов-пользователей этого проекта;
- "Авторизация пользователя" (проект с авторизацией) или "Клиент подключен" (без авторизации) - перевод в неактивное состояние всех записей этого клиента и создание активной записи этого пользователя;
- "Пользователь перешел на эту страницу" - перевод в активное состояние самой поздней записи этого клиента;
- "Пользователь покинул эту страницу" - перевод всех в неактивное состояние всех активных записей этого клиента.
Обоснования:
- в промежутках между сменой пользователя или проекта, клиент однозначно идентифицирует пользователя и проект;
- при смене проекта обязательно меняется клиент;
- перевод записи в неактивное состояние выполняется для всех пользователей, связанных с данным клиентом;
- перевод только одной записи в активное состояние совместно с предыдущим пунктом гарантирует наличие единственного пользователя данного клиента (устраняет возможный сбой: наличие записей о нескольких активных пользователях данного клиента, правда в случае такого сбоя время завершения работы пользователя будет некорректным);
- контроль переходов по страницам исключительно для контроля отключения клиента. По крайней мере в текущей (2.6.10.0) версии Simple-Scada, при отключении клиента возникает событие "Пользователь покинул эту страницу".
В качестве имени неавторизованного пользователя используется имя обычного клиента или идентификатор WEB-клиента.
Во вложении проект контроля и тестовые клиенты для проектов с авторизацией и без.


8
Ваши вопросы / Re: Отслеживание клиентов
« : 18 Января 2024, 05:57:20 »
    Здравствуйте.

  Список клиентов по подстраницам можно получить отслеживая входы/выходы на подстраницы.
  Пример во вложении. Пример только для иллюстрации алгоритма. В качестве списка клиентов используется строковая переменная.
  Конкретный код и используемые объекты определяются количеством подстраниц и клиентов, удобным видом расположения информации. В частности, в качестве списков клиентов и средства отображения могут использоваться таблица/таблицы.
  Отслеживать имеет смысл только обычных клиентов, да и то при условии уникальных имен. WEB-клиенты в качестве имени используют 32-разрядный идентификатор, изменяющийся после перезапуска клиента.

9
    Здравствуйте.

Для остановленного проекта при закрытии WEB-страницы или клиента Simple-Scada не выдается сообщение об отключении клиента, но на вкладке сервера "Клиенты" состояние отображается правильно.

10
Ваши вопросы / Re: Проекты и клиенты
« : 29 Декабря 2023, 14:54:19 »
   Здравствуйте.

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

В некоторых случаях алгоритм не работает, например: администратор приостановил проект, авторизованный web-пользователь выругался и закрыл страницу, запись в системной таблице о выходе данного клиента отсутствует, удалить его невозможно и он продолжает жить в таблице до перезагрузки проекта.

11
   Здравствуйте.

  Сортировка больших объёмов данных в скрипте требует большой затраты времени, что крайне не понравится серверу Simple-Scada. Процесс сортировки определяется алгоритмом и способом сравнения данных. Простые алгоритмы сортировки доступны в сети. Для таблицы данные представлены текстом, возможны следующие варианты сравнения данных:
- собственно сравнение текста для текстовых значений;
- для чисел - перевод текста в числовое значение с последующим сравнением;
- для чисел - выравнивание текстового представления "левыми" нулями по десятичной точке с последующим сравнением.

Во вложении пример сортировки перемешиванием (работа с индексами для сокращения количества обменов между ячейками таблицы) для тестовой таблицы из 8192 ячеек (для некоторых способов сравнения и 2000 много!), заполняемых убывающей последовательностью или случайной целочисленной или случайной вещественной.
Пример позволяет оценить время выполнения сортировки по количеству сортируемых данных и одному из трех способов сравнения. Фрагмент экрана показывает затраты времени на сортировку различными способами сравнения.

P.S. В общем случае (не зная задачи) можно предположительно облегчить жизнь серверу следующими вариантами:
- сортировка при поступлении очередного значения;
- разделение процесса сортировки на последовательное выполнение серии скриптов, сервер вздохнёт свободнее, но общее время сортировки возрастет по сравнению с односкриптовым вариантом;
- несколько таблиц (возможно неотображаемых) для разных диапазонов значений, по значению определяется нужная таблица, сортировка по каждой отдельной с последующим объединением таблиц.

P.P.S Для сравнения добавлена классическая сортировка перемешиванием с перемещением содержимого ячеек. На фрагменте экрана приведены времена сортировок по уже отсортированной таблице. Для классики первая сортировка "против шерсти" убывающей последовательности требует вдвое большего времени по сравнению с уже отсортированной последовательностью.
Впрочем в примере это видно нагляднее.

12
Ошибки / Ошибка деактивации проекта
« : 05 Декабря 2023, 06:26:47 »
После изменения свойства объекта UserData на допустимое, исключая NIL, в версиях старше 2.6.3.3 деактивация проекта завершается с ошибкой.
Тест во вложении.

13
   Здравствуйте.
Всем здравия, я с очередной порцией вопросов...
1. Для выбора только одной или не более чем одной емкости можно использовать так называемую "радиокнопку" - зависимый набор с одной или не более чем одной нажатой кнопкой.
  Кнопки объединены одной переменной в регистр кнопок, каждой кнопке соответствует один бит. Окрашивание цветом емкости с сопутствующими объектами осуществляется скриптом по изменению регистра кнопок для соответствующего бита.
  Почти подходящим для реализации радиокнопки является объект "Кнопка", за исключение того, что новые значения = 0 и 1, в отличии от прочих, работают только с битом (в примере достаточно записать в регистр кнопок число, отличное от степеней 2 и посмотреть на смену емкостей). Обходимо (см. пример), но в рабочем проекте можно применять только после консультации с разработчиками Simple-Scada.
  Второй вариант - шаблон (или россыпью) из двух объектов "Текст" и двух универсальных скриптов.
2. Вытащить "наверх" объект можно присвоив слою заведомо большОе значение. Номера слоев переупорядочиваются,  а номер слоя объекта станет наибольшим среди номеров слоев. Группа объектов упорядочивается по принципу "последний сверху". На странице 2 пример управления слоями. Изменения номеров всех слоёв для 5-ти обэектов можно посмотреть на странице 3.

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


                           Добавлено 20.11.2023.
"Вторая фигура марлезонского балету" - случай большого количества кнопок или добавление к существующему проекту, в котором нет возможности использовать предыдущие варианты радиокнопки.
1 вариант: используется контроль за изменением состояния "кнопочных" переменных, к проекту добавляется один скрипт.
2 вариант: нажатие на кнопку записывает имя её переменной в общую для всех кнопок переменную, по изменению которой происходит сброс всех кнопок, кроме нажатой.

14
    Здравствуйте.

  Возможная ошибка - дисбаланс между операторами begin и end. Получить диагностику можно при предварительной компиляции кода по нажатию Shift + F9.
  Но начинать надо с алгоритма. Судя по строке скрипта:
Код: (delphi)
 if Field1.AsInt > Field2.AsInt and Field3.AsInt and Field4.AsInt then Field1.Color := 4;
в предположении что подразумевалось сравнение переменной поля Field1 на превышение над переменными прочих полей:
Код: (delphi)
 if (Field1.AsInt > Field2.AsInt) and (Field1.AsInt > Field3.AsInt) and (Field1.AsInt > Field4.AsInt) then 
  Field1.Color := clRed;
с последующими сравнениями на превышение двух, одной переменных и меньше всех переменных.
  Скрипт раскрашивает объект и для каждого объекта необходим свой экземпляр. Кроме того цвет не корректируется для остальных объектов.
  Для вызова скрипта раскраски в прочих объектах можно использовать скрипт, вызываемый по аналогичному событию - либо пара событий по изменению основной и совпадающей с ней дополнительной переменной, либо для объекта "Поле" по вводу и изменению основной переменной.
  Универсальный скрипт раскраски реализован как подсчет числа превышений значения основной переменной объекта по ВСЕМУ набору переменных:
Код: (delphi)
Procedure Field_OnDataChange(Sender: TM_Control);
var i,j: integer;
begin
  with Sender as TM_Object do begin
    j := 0;                          // счётчик превышений
    for i := 1 to 4 do
      if AsInt > GetObjectByName('Field' + IntToStr(i)).Variable.AsInt then
        j := j + 1;           // встретилась переменная, имеющая значение большее чем у основной

    case j of                 // перевод числа превышений в цвет объекта
    0: Color := clGreen;
    1: Color := clYellow;
    2: Color := clFuchsia;
    3: Color := clRed;
    end;
// здесь может быть код для ещё каких-либо действий с объектом, например вывод значения в поле Text
  end;
end.
Скрипт вызова скрипта раскраски во всех прочих объектах/ во всех объектах:
Код: (delphi)
Procedure Field_OnDataExChange(Sender: TM_Control);
var i: integer;
begin
  with Sender as TM_Object do
    for i := 1 to 4 do
      GetObjectByName('Field' + IntToStr(i)).OnDataChangeEvent;                     // скрипт раскраски у объекта с изменившейся переменной вызывается дважды
//      if Tag <> i then GetObjectByName('Field' + IntToStr(i)).OnDataChangeEvent;  // скрипт вызывается один раз, но приходится идентифицировать объект свойством Tag
end.
Пример во вложении.

P.S. Вопрос раскраски объектов с одинаковыми значениями переменных остался открытым.

15
        Здравствуйте.

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

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