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

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

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

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


Сообщения - pan2000

Страницы: 1 [2] 3 4 ... 16
16
Ваши вопросы / Re: Работа с таблицами
« : 15 Февраля 2026, 23:45:48 »
      Здравствуйте.

Вопросы по таблице:
1. Источник исходных данных таблицы: БД, файл, без БД и файла - единственная таблица редактируется на странице.
2. изменения продолжительности после команды старт: да, нет. (корректировка оператором)
3. Интервалы/продолжительности в пределах 24 часов или более.
3. Восстановление таблицы после останова проекта: да (БД/файл), нет.
4. При восстановлении таблицы последний интервал может превысить заданную продолжительность. Действия: просто перейти к следующему, прекратить выполнение, запросить у оператора (к следующему, прекратить выполнение).
5. Сохранять результаты работы (фискальный архив): да (БД/файл), нет.
6. Непротиворечивое по сравнению с картинкой описание столбцов.

Во вложении пример для таблицы редактируемой на странице в секундах (для быстроты). Редактируемый столбец "ПРОДОЛЖИТЕЛЬНОСТЬ".

17
Ваши вопросы / Re: Расписание. Schedule
« : 14 Февраля 2026, 11:50:08 »
    Здравствуйте.

 Да, могу, но мне нужны подробности. Лучше типа ТЗ, или Ваше представление как всё это должно выглядеть.  :)

Добавлено 16.02.2026:
Пример 24-часового слайдера с разрешением 1 сек, довольно громоздкая штука. Весь диапазон разбит на 10-минутные интервалы с графическим представлением. Можно метить каждую секунду.
Метки могут хранятся в БД минимально парами - <временная метка>-<информация о событии>. Событие будет отображатся штрихом над секундной линейкой слайдера.

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

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

Нет необходимости в дублировании значения кнопки в свойство "Тег":
Код: (delphi)
    if AsInt = States[0].Value then  // если значение переменной кнопки равно значению,
      Color := {Tag //} clGreen      //   указанному в свойстве "Значение"(т.е именно она и нажата последней), то изменить цвет кнопки на зеленый
    else                             //   иначе
      Color := $6D6D6D;     //  не совсем понятно что делает SetInitialColor с кнопкой;               //   восстановить исходный цвет кнопки
Что касается исходного цвета кнопки, то оператор SetInitialColor более универсален, чем явное присвоение цвета (но не для кнопки).
Если есть необходимость в различном цвете нажатой кнопки, то для задания цвета можно использовать свойство "Тег".

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

Относительно возможности масштабирования/перемещения большой карты с объектами:
- операторы не смогут работать с картой в привычном режиме - захватил мышкой и потащил, если что не так видно, то колёсико покрутил;
- большое количество объектов не масштабируемых корректно/в принципе, в т.ч. и трубопроводы. А в WEB-клиенте и того больше, включая текст и значение поля, т.е. WEB-клиенты практически не поддерживаются;
- сложность редактирования для больших карт, выходящих за пределы разрешенной области редактирования (при крупном масштабе около 4000х2300, в примере изображение карты 10000х10000), определяемой как откат изображения назад при попытке сдвинуть его за границу этой области. Для редактирования дальних областей выбор всех объектов со сдвигом в нужную сторону, причем одно ошибочное действие может развалить всю картинку;
- значительная трудоёмкость проектирования, например изображение трубопровода, которое состоит из последовательности изображений трубы, уголка и тройника (для реализма ещё и фланец со сдвоенным фланцем). Правда есть и положительная сторона - можно прокладывать под любыми углами. Аналогично линии, резервуары, клапаны и т.д.;

Для перемещения карты можно использовать пару ползунков-уровней или четыре узкие кнопки по сторонам экрана. Для масштабирования - две кнопки уменьшения и увеличения масштаба.
Можно сократить количество перемещений посредством предустановленного списка объектов для быстрого перехода. Объект выбирается по названию/описанию и позиционируется по центру экрана в масштабе 1.00. К быстрому переходу можно добавить/удалить ограниченное число меток-объектов (вид "кольцо", в редакторе всегда можно добавить простым копированием). Выбор метки из списка осуществляется по её комментарию, заданному перед постановкой метки.
Пример во вложении, текстуры проекта в папке "Карта_с_объектами_на_главной_странице", расположенной в папке "User files" проекта. Предварительно папку целиком необходимо скопировать/перенести в папку "Pictures"

21
Ваши вопросы / Re: Элемент Флажок
« : 18 Ноября 2025, 13:51:01 »
   Здравствуйте.

 Можно построить вектор состояния действий, в котором каждый бит соответствует одному действию и биты упорядочены справа-налево в порядке следования действий.
Пока порядок не нарушен, у каждого бита = 0 все "левые" соседи будут равны 0, что проверяется обычным сравнение целых чисел - значением вектора и 2 в степени номер бита + 1.
Скрипт изменилась основная переменная объекта "Флажок":
Код: (delphi)
begin
  with Sender as TM_CheckBox do
    if (not Checked) and (AsInt >= Setbit(0, BitNumber + 1, true)) then // флажок не установлен, но есть "левые" установленные биты
       Text1.Text := Text1.Text + Caption + '  пропущен' + #10;
end.
Уменьшить количество вызовов предыдущего скрипта на одно нажатие флажка (по числу флажков) можно до одного скрипта по изменению переменной (с потерей простого доступа к свойствам флажка):
Код: (delphi)
begin
 var i: integer;
    b: boolean;
begin
  with Sender as TM_Text do
  begin
    Text := '';
    i := 0;
    b := AsInt <> 0;
    while b and (i < 31) do
    begin
      b := AsInt >= Setbit(0, i + 1, true); // признак наличия "левых"
      if (not GetBit(AsInt, i)) and b then  // флажок не установлен, но есть "левые" установленные биты
        Text := Text + 'пропущен этап ' + IntToStr(i + 1) + #10;
      i := i + 1;
    end;
  end;
end.
Пример во вложении.

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

... но если авария уже была и появилась новая, то значение переменной не изменилось и скрипт открытия окна не выполнится пока мы не сбросим все аварии...
Возможны два варианта:
- использовать для скрипта открытия окна изменение переменной "Счетчик ошибок";
- повторно открывать окно при попытке закрыть окно с ошибками (подобно австралийцу, который пытается выбросить старый бумеранг).

В примере два варианта:
- вызов скрипта открытия окна по счетчику ошибок;
- вызов скрипта непосредственно по битам ошибок (для случая когда все ошибки доступны в окне).
Окно закрывается после сброса всех ошибок.
Второй вариант предпочтительней для случая большого количества окон (особенно шаблонных), т.к. скрипт "Изменились переменные" будет либо включать длинные списки переменных с какой-то логикой выборки переменных для конкретного окна, либо много-много отдельных скриптов.

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

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

Для многокадрового изображения возможные варианты: изменение свойства FlashColor по номеру кадра или управлением дополнительными кадрами по номеру и таймеру.
См. пример из вложения. Перед первым вызвом редактора необходимо скопировать файл индикатора из "User Files" проекта в "Pictures" сервера.
Более изощренный способ - стопка из трёх изображений: одно статическое для устойчивых состояний заслонки (открыта, закрыта, промежуточное) и два с анимацией и/или миганием для переходных состояний (открывается, закрывается).

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

Для цветового индикатора подходит объект "фигура", цвето-текстового "Кнопка" или пара "Фигура" - "Текст".
Собственно сам способ реализации индикатора зависит от количества переменных определяющих состояние индикатора: менее трех - объект с изменяемыми свойствами, более - стопка объектов с управлением видимостью.
В примере три варианта индикатора:
- простая последовательность [0-4];
- пара регистров "Управление" и "Состояние" с битовыми полями;
- четыре отдельных булевых переменных, индикатор - шаблон.

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

Добрый день. Вопрос в следующем:
Хочу реализовать выбор режима работы по расписанию или по кнопке. Думаю реализовать с помощью метода OnActive.
При наличии ручного режима для управления ОРС-переменной хорошо подходит кнопка с двумя состояниями. Кнопку можно настроить либо на запись двух значений, либо на изменение одиночного бита.
А расписание уже просто управляет этой кнопкой, недоступной/невидимой.  В примере с двумя кнопками - "РУЧНОЕ-АВТОМАТ" и "ВЫКЛ.-ВКЛ." приведены два вида шаблонного окна - кнопки в окне или кнопки на странице.
Правила функционирования кнопок:
- кнопка "ВЫКЛ.-ВКЛ." непосредственно управляет ОРС-переменной, либо пара значений, либо одиночный бит. Для каждой пары шаблонное окно уникально, для одиночных бит достаточно одного шаблонного окна (для кнопок в окне +1 подстановка "номер бита");
- кнопка "РУЧНОЕ-АВТОМАТ" управляет видимостью или доступностью кнопки "ВЫКЛ.-ВКЛ." (для кнопок на странице может быть индикатором состояния ОРС-переменной);
- В состоянии "АВТОМАТ" расписание управляет кнопкой "ВЫКЛ.-ВКЛ." по значению основной переменной, к которой (по ID и имени проекта) собственно и привязана таблица интервалов этого расписания. В случае двух режимов использовать событий OnActivate и OnDeacnivate нецелесообразно, т.к. для правильного изменения значения ОРС-переменной при переключении режимов нужно знать текущее состояние расписания (внутри/вне интервала) и, следовательно придется его восстанавливать по событиям (что собственно и есть значение основной переменной).

Особенности варианта с кнопками на странице (поскольку приходится связывать реальные и виртуальные объекты, а очень желательно обойтись без уникальных скриптов для каждого), причем достаточно всего одного шаблонного окна:
- создать кнопку управления режимами "РУЧНОЕ-АВТОМАТ" с основной переменной и без событий;
- создать кнопку управления ОРС-переменной "ВЫКЛ.-ВКЛ." с соответствующим управлением ОРС-переменной и без событий;
- в подстановке шаблонного окна "кнопка_режима</>кнопка_переменной" записать имена кнопок через знак "наклонная черта";
- в подстановке шаблонного окна "переменная_расписания" указать уникальную переменную.
Связи (цепочка ссылок на объекты) устанавливаются при инициализации конкретного экземпляра шаблонного окна.

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

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

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

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

28
   Здравствуйте.
...записывает себе в базу данных очень маленькие значения переменных. ... Приходится удалять их вручную...
Т.е. речь идет от отбрасывании заведомо недопустимых значений.

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

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

Для начала нужно убедиться, что от ОРС-сервера не поступают ошибочные данные. Индикация наличия ошибочных - скрипт "Изменились переменные":
Код: (delphi)
// ОТЛОВ МИНИМАЛЬНЫХ ЗНАЧЕНИЙ
begin
  with Variable do
// выбор минимального порога
//    if (Value <= LowAlarm) and (not IsFirstChange) then  // индивидуальный
    if (Value <= 5) and (not IsFirstChange) then       // общий

      AddMessage(Now, mkAlarm, Name + '=' + AsStr, True, True);
end.
При наличии ошибок желательно их ликвидировать как явление.
И как последнее средство - введение фильтра минимальных значений перед архивированием. Т.е. переменная разделяется на входную (не архивируемую), по изменению которой происходит контроль величины и выходную (архивируемую), перезаписываемую из входной при прохождении контроля.
При условии, что имена входной и выходной переменной отличаются только суффиксом у выходной переменной - скрипт по событию "Изменились переменные":
Код: (delphi)
// ФИЛЬТР МИНИМАЛЬНЫХ ЗНАЧЕНИЙ
begin
  with Variable do
// выбор минимального порога
//    if (Value > LowAlarm) and (not IsFirstChange) then
    if (Value > 5) and (not IsFirstChange) then

      GetVariableByName(Name + '_out').Value := Value;
end.
См. пример.

30
Ваши вопросы / Re: Вопрос по рассписанию.
« : 29 Апреля 2025, 02:20:35 »
   Здравствуйте.

  Поскольку нет аппаратного условия сброса управляющих сигналов, то остается формировать длительности управляющих сигналов сервером Simple-Scada.
Скрипт по событию "Текущее время вошло в установленный интервал объекта "Расписание"":
Код: (delphi)
begin
  SCI_Pusk.Value := true;
  RunDelay(3000, 1);
end.
Скрипт по событию "Текущее время вышло из установленного интервала объекта "Расписание"":
Код: (delphi)
begin
  SCI_Stop.Value := true;
  RunDelay(3000, 2);
end.
Скрипт по событию "Выполнена задержка":
Код: (delphi)
begin
  case DelayEventData.Tag of
  1: SCI_Pusk.Value := false;
  2: SCI_Stop.Value := false;
  end;
end.
Пример во вложении.

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