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

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

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

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


Сообщения - pan2000

Страницы: [1] 2 3 ... 15
1
Ваши вопросы / Re: Видимость для шаблонов
« : 25 Февраля 2026, 14:13:52 »
 Здравствуйте.

Цитировать
Вариант предложенный pan200 вполне рабочий. Только есть один недостаток.
Во устранении недостатка.
Для управления видимостью отдельных объектов шаблона (в количестве до 32) достаточно одного дополнительного тэга целого типа. Скрипт разрешения видимости последовательно переносит биты тэга в свойства видимости объектов, а скрипт запрещения собирает свойства видимости объектов в тег, с последующим переводом объектов в невидимое состояние.
При инициализации шаблона свойство видимости объектов устанавливается по подстановке %начальная_конфигурация%, а объекты из %список_объектов% получают ссылку на начальный объект шаблона для управления/контроля из "внешнего" мира.

Управление видимостью по Alpha, как второй канал управления видимостью, вполне даже подходит для одно-Alpha-ых объектов.


2
Ваши вопросы / Re: Работа с таблицами
« : 24 Февраля 2026, 08:15:37 »
   Здравствуйте.

Цитировать
изменения продолжительности после команды старт: да так как техпроцесс меняется
Изменение объективно, т.е. оператор корректирует именно процесс, или субъективно - просто таблица единственная и при смене продукции приходится её корректировать или оператору надоело?
Изменение продолжительности только в новом рецепте и только технологом. Единственная возможность изменения у оператора - это завершить этап или процесс. Можно ещё добавить возможность приостановить таймер, но зачем? В здравом уме он этой возможностью не воспользуется.
Цитировать
максимальная продолжительность 1го процесса 2ч, но производство работает и в ночную смену,
вопрос индикации и задания продолжительности - стандартная ограничена 24 часами. Таймер работает как разность системных времен и не реагирует на смену суток.
Цитировать
на данный момент реализация следующая ... мы знаем затраченное время. Не знаю как вам ответить.
Вопрос только о необходимости восстанавливать состояние проекта при перезапуске проекта/сервера. Как часто может перезапускаться проект или сервер? Возможен ли перезапуск во время цикла? Без восстановления, после перезапуска проект вернется в начальное состояние. Цикл будет потерян. В данной версии проекта отсутствует.
Цитировать
Сохранять результаты работы (фискальный архив): да
Фискальный архив ведется в БД. Он практически повторяет содержимое таблицы, дополненное названием рецепта, именем и действиями ["противоправными"] оператора. На странице технолога можно посмотреть таблицу досрочно завершенных этапов.

По этим условиям макет/эскиз/черновой вариант/и т.д. (явных ляпов нет, заниматься улучшением/оптимизацией/полным контролем пока смысла нет) проекта на две персоны - оператора и технолога:
- оператор нажимает кнопки и не может менять что-либо в рецепте, но может ускорить процесс - перейти к следующему этапу или завершить;
- технолог готовит рецепты [приготовления блюд] и не нажимает кнопок, но видит ускоренные процессы.
В проекте две таблицы БД - рецептов и накопительная выполнения этапов.
Управление: у оператора - три кнопки (старт, перейти к следующему этапу, завершить процесс. У технолога редактирование рецепта (уникальное имя, последовательное заполнение таблицы с контролем непустого поля этапа и допустимого формата времени, редактирование уже заполненных строк, при успешном контроле можно записать рецепт) и просмотр таблицы ускоренных [оператором] процессов.

Возможно более одного оператора-клиента? Несколько будут "толкаться локтями"(например, перейти к следующему этапу), причем за всё ответит первый оператор - его имя уже навечно внесено в БД после нажатия кнопки "СТАРТ".

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

Переменные буль-булевы:
vrConveyor - состояние транспортёра;
vrSensor - состояние датчика;
vrAlarm - аварийный сигнал.
vrTimer - целое, таймер срабатывания.
Скрипт выдачи аварийного сигнала (таймер 1 секунда):
Код: (delphi)
begin
// счёт при срабатывании датчика и движении транспортера, иначе сброс таймера
    if vrConveyor.AsBool and vrSensor.AsBool then vrTimer.inc(1, 0, 10) else vrTimer.Value := 0; 
    vrAlarm.Value := vrTimer.AsInt = 10;    // условие аварии
end.
Пример во вложении.

4
       Здравствуйте.
иконка не является шаблоном
На опережение, в случае требования двух окон - информационного и редактирования, т.к одностороннюю ссылку между объектами разных шаблонов можно организовать только через обычный объект, имеющий свойство UserData.
Ссылки на объекты шаблонов можно хранить и в глобальном скрипте, но там свои сложности из-за неопределенного порядка выполнения скриптов инициализации.

Цитировать
У меня к таблице ещё состояние иконок привязано
Очередной пример с индикацией состояния мест хранения, тут уж иконка обязательно должна быть обычным объектом.

Цитировать
А подскажите в SimpleScada инициализация этих шаблонных окон ведь происходит на этапе компиляции/старта сервера?
Точно ответить могут лишь авторы Simple-Scada, но полагаю, что создание на этапе компиляции, а инициализация при запуске проекта. Ссылки - сила! Жаль что ссылочное свойство UserData есть не у всех объектов и его не видно в инспекторе.

Цитировать
...как обычно реализуют многострочный ввод/отображение текстовой информации
Можно попробовать "Пишущую машинку" из вложения. Это просто основа, к которой можно добавить редактирование,  и т.д.

5
   Здравствуйте.
Да я вроде довольно подробно изложил.
Можно считать что основа проекта "революционная тройка": иконка, информационное окно и окно редактирования. Всех их объединяет уникальный параметр "местоположение".
Пример проекта при следующих условиях: окна совмещены, иконка не является шаблоном и информация о предмете укладывается в одну строку таблицы. Можно достаточно просто работать с этой тройкой одиночными запросами к БД и нет необходимости в таблице. Да и в переменных.
При инициализации шаблонного окна устанавливается цепочка ссылок на управляющие и информационные объекты окна. При открывании окна выполняется запрос к БД на обновление данных в окне.
В окне есть три управляющих кнопки: "НОВЫЙ", "ЗАПИСЬ" и "УДАЛИТЬ". Поля данных доступны для редактирования.

6
Ваши вопросы / Re: Работа с таблицами
« : 15 Февраля 2026, 23:45:48 »
      Здравствуйте.

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

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

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

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

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

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

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

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

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

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

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

11
Ваши вопросы / 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.
Пример во вложении.

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

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

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

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

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

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

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

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

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

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

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

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