Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: maratus от 08 Апреля 2025, 11:43:20

Название: Работа с таблицами
Отправлено: maratus от 08 Апреля 2025, 11:43:20
Здравствуйте! Создаю небольшой проект для мониторинга за тележками. Мониторинг включает основные функции: считывание меток тележки, запись данных метки в таблицу БД (PostgreSQL), вывод из таблицы БД в форму для визуального контроля для рабочих (в виде таблицы), слежение временем нахождения в помещении. С первой и второй задачей более менее разобрался, данные тележек пишутся в БД, выводить в таблицу с помощью RunSQL тоже получается. Нужна помочь в реализации слежения за временем тележки, по истечении которого, строка в таблице должна подмигивать и закрашиваться в зеленый цвет. А также, если попытались удалить тележку из помещения раньше времени - строка должна закрашиваться в красный цвет.
И есть ли возможность заполнения таблицы из БД полностью на всю форму без прокручивания (на картинке). В таблице количество строк равно 40. (http://)
Название: Re: Работа с таблицами
Отправлено: ZWolol от 08 Апреля 2025, 18:37:51
> заполнения таблицы из БД полностью
RunSQL для таблицы заполнит 40 строк по 4 колонки (в соответствии с полученными данными из запроса).

Тебе будет проще сделать две таблицы: 40х4 (не видимую, как буфер для приема) и 20х8 рабочую на экране.
Задай ячейкам таблицы связь с переменными.
В первую (невидимую) таблицу считай данные, они присвоятся указанным переменным.
А во второй таблице эти же переменные укажи в другом порядке (с учетом 20 строк).

Ну а потом уж работай с таблицей с помощью TM_TableCell...
Название: Re: Работа с таблицами
Отправлено: Simple_Scada от 09 Апреля 2025, 17:23:49
Здравствуйте.

Цитировать
Нужна помочь в реализации слежения за временем тележки, по истечении которого, строка в таблице должна подмигивать и закрашиваться в зеленый цвет. А также, если попытались удалить тележку из помещения раньше времени - строка должна закрашиваться в красный цвет.
Доступные методы для работы с таблицей можно найти по ссылке (https://simple-scada.com/help/script/tmtable.html). Примеры изменения цвета ячейки/строки/столбца можно найти по ссылке (https://simple-scada.com/help/script/changing-color-cell.html). Вы можете попробовать решить описанную задачу используя возможности скриптов (https://simple-scada.com/help/manual/index.html), но подобные решения будут громоздкими и ненадежными. При перезапусках ПК или проекта все расчеты времени будут сбиваться.

Цитировать
И есть ли возможность заполнения таблицы из БД полностью на всю форму без прокручивания (на картинке). В таблице количество строк равно 40.
Ползунок прокрутки не появится пока строки умещаются в доступный размер таблицы. Если строк больше, чем может уместиться в таблице, то отобразится скролл. При необходимости, увеличьте размер таблицы на мнемосхеме, либо уменьшите высоту строк таблицы - см. свойство "Высота строки". Способ предложенный ZWolol, рекомендуем не использовать.
Название: Re: Работа с таблицами
Отправлено: pan2000 от 09 Апреля 2025, 20:44:07
   Здравствуйте.

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

Таблица содержит все последние завершенные (в том числе удачные) и все текущие переезды тележек. Можно исключить из таблицы удачно завершенные переезды, однако гарантировано увеличить количество меток (при условии что в помещении одновременно не более 40 тележек) не получится, т.к. в таблице могут присутствовать красные строки для тележек вне помещения.
При новом заезде тележки информация о предыдущем заезде удаляется из таблицы посредством смены знака у идентификатора тележки, что позволяет сохранять предысторию.
При запуске проекта и по событиям "Заезд тележки №№", "Выезд тележки №№", "Удаление из таблицы тележки №№" происходит заполнение таблицы из БД с раскладкой данных из набора данных DataSet.
Вычисление текущего времени нахождения в помещении  тележек и "раскраска" нижней таблицы осуществляются по таймеру 1 сек.

P.S. Для уменьшения скрипта раскладки данных используется более сложная форма запроса, при желании можно свести запрос к минимальному и усложнить обработку в скрипте (это по поводу смены БД).
Пример только для иллюстрации: задание интервала контроля ограничено 23:59:59, длительность нахождения в помещении ограничена ~ 800 часами, нет контроля общего числа тележек в помещении.
При условии не более 40 тележек в помещении, было бы правильно отображать в таблице состояния присутствующих в помещении тележек, а преждевременный выезд тележек перенести в отдельную таблицу.
Название: Re: Работа с таблицами
Отправлено: ZWolol от 10 Апреля 2025, 05:50:53
> Способ предложенный ZWolol, рекомендуем не использовать.
Ну что ж так категорично?

Увеличить размер таблицы и уменьшить высоту строки можно, если позволяет размер экрана и читабельность текста.
Получится узкая длинная таблица с пустой остальной частью экрана.
В таких случаях разворачивают монитор вертикально для увеличения количества строк.

Можно сделать на экране две таблицы по 20 строк и каждая будет читать свои данные из базы.
А я предложил буферную таблицу которая позволит считать и разложить данные по ячейкам без скрипта.

> При перезапусках ПК или проекта все расчеты времени будут сбиваться.
А что им сделается в SQL таблице?
Разве что будет долгим перезапуск и просрочат время сушки.
Ну тогда нужно делать на контроллере с панелью.

> считывание меток тележки, запись данных метки в таблицу БД
Я это воспринял как автоматическое с датчика, а если заносится ручками, то смотрите пример @pan2000.
Название: Re: Работа с таблицами
Отправлено: pan2000 от 10 Апреля 2025, 12:27:28
   Здравствуйте.
Я это воспринял как автоматическое с датчика, а если заносится ручками, то смотрите пример @pan2000.
Наличие раздельных переменных для меток заезда и выезда не обязательно указывает на "ручки" :-\, равно как и ввод значения метки в поле. Достаточно изменить события на "Изменилась основная переменная" и это будет вариант для помещения с раздельным заездом и выездом (например, туннельная печь).
Для единственного поля ввода метки (считывателя) - заезд/выезд определяется по наличию тележки в помещении. Пример во вложении.
Название: Re: Работа с таблицами
Отправлено: pan2000 от 12 Апреля 2025, 06:23:56
 Здравствуйте.

И есть ли возможность заполнения таблицы из БД полностью на всю форму без прокручивания (на картинке). В таблице количество строк равно 40. (http://)
Заполнить таблицу, состоящую из нескольких групп однотипных столбцов, "змейкой" можно (по крайней мере в MySQL версии 8.0) с использованием оконной функции LEAD.
Так для таблицы my_table из БД со столбцами col1, col2, col3 запрос на заполнение таблицы в Simple-Scada из двух групп не более чем в 20 строк:
SELECT *, LEAD(col1,20) OVER(),LEAD(col2,20) OVER(),LEAD(col3,20) OVER() FROM my_table LIMIT 20; 
Реальный запрос может быть усложнен за счёт замены NULL на пустую строку, форматирования данных, добавления вычисляемых столбцов. Скрин показывает результаты работы запроса по таблице из предыдущих примеров. Запрос для левой половины таблицы включает замену NULL, вычисление и форматирование столбца, правая - только вычисления.

Название: Re: Работа с таблицами
Отправлено: maratus от 16 Апреля 2025, 11:21:53
Здравствуйте! Спасибо Всем за помочь, подсказки. На сегодняшний день вывод из БД данных тележек сделал следующим образом. На форму разместил 2 таблицы, в 1 таблицу вывожу запрос с лимитом до 20 строк, во 2 таблицу вывожу со смещением (начинаю выборку с 21). Для выбора цвета строки зеленым или красным, задал условие (Если время пребывания меньше - время сушки - красный, если время пребывания больше - время сушки - зеленый.) Время сушки внутренняя глобальная переменная. Слежение за временем пребывания реализовал так: в таблицу  с тележками пишу значение времени в минутах (значение в скрипте каждую минуту обновляю с прибавлением 1). В целом все стабильно работает, корректно записываются и удаляются данные. Осталось разобраться сортировкой данных в таблице тележки в БД, сейчас добавление строк происходит хаотично, не последовательно. Далее на скада данные также выводятся - визуально смотрится не правильно. Нужно по схеме - первый зашел - первый в списке. Также есть небольшая проблема со считывателем меток, в регистрах постоянно висит последняя метка. У меня срабатывание на запись метки сделано по тэгу когда метка есть на считывателе. Иногда появление метки на считывателе опережает изменение значений меток, из за чего бывает ложная запись удаленной тележки.
 

Название: Re: Работа с таблицами
Отправлено: ZWolol от 16 Апреля 2025, 15:35:12
Добавь в запросы: order by timeCart1

Красный лучше оставь белым.

На счет метки не понял.
Название: Re: Работа с таблицами
Отправлено: maratus от 16 Апреля 2025, 18:26:36
есть 3 тега: 1) TagRead - меняется когда на в зоне видимости считывателя есть метка. 2) и 3) - последние байты ЕРС номера метки, по которым определяю тележки в таблице метки в БД. На скада создал скрипт - по изменению переменных. Как это работает на скрине. Бывает иногда, что метка TagRead изменяется быстрее чем остальные, отсюда сначала отрабатывает скрипт со старым значением, только потом уже с новой меткой. Как то так.
Название: Re: Работа с таблицами
Отправлено: pan2000 от 16 Апреля 2025, 22:12:31
    Здравствуйте.

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

Замечание по скрипту обработки SQL-запроса - к сожалению окончание скрипта не видно, но если у условия "if DataSet.IsEmpty = false then" нет альтернативы "else" с очисткой таблицы, то группа тележек, умудрившаяся выкатиться, полностью освободив помещение в течение последней минуты, может и не удалиться из таблиц формы.
Можно обрезать "жирок" со скриптов:
Код: (delphi)
begin
  // запрашиваем первые до 20 строк
  RunSQL('SELECT numberCart,timeCart1,timeCart2 FROM cart1 LIMIT 20;', Table1, 3);
  // запрашиваем остаток строк
  RunSQL('SELECT numberCart,timeCart1,timeCart2 FROM cart1 LIMIT 20 OFFSET 20;', Table2, 3);
end.
Код: (delphi)
var aRow, i: integer;
    aColor: cardinal;
begin
  if DataSet.Tag = 3 then
    with DataSet.Sender as TM_Table do
      for aRow := 0 to 19 do
        if not DataSet.EOF then
        begin
          if DataSet.Fields[2].AsInt > dryingTime1.AsInt then aColor := clGreen
          else aColor := clRed;
          for i := 0 to DataSet.FieldCount - 1 do
          begin
            GetCell(i, aRow).Text := DataSet.Fields[i].AsStr;
            GetCell(i, aRow).Color := aColor;
          end;
          DataSet.Next;
        end
        else
          for i := 0 to 2 do
          begin
            GetCell(i, aRow).Text := '';
            GetCell(i, aRow).Color := clNone;
          end;
end.

Что касается упорядочивания строк в порядке заезда тележек, то только одни времена суток (без даты) сортировкой упорядочить не удастся. Для случая только времени суток можно добавить в качестве первичного ключа новый столбец с автоинкрементом (см. в примере).

С проблемой считывателя меток нужно разбираться по его документации. Без этого пытаться городить всевозможные фильтры и логику бесполезно, т.к. доподлинно не известно всегда ли это будет работать или перестанет по изменению погоды, скоростью движения тележки и т.д.
В качестве шаманства с бубном, можно изменить фронт срабатывания TagRead (в предположении что один фронт индицирует начало считывания, а другой собственно завершение).
Название: Re: Работа с таблицами
Отправлено: ZWolol от 17 Апреля 2025, 02:45:35
Если TagRead срабатывает раньше формирования номера, то нужно использовать задержку для чтения метки.
Или читать номер на изменение меток (но тогда двойной проход тележки будет невозможен).

Красный цвет будет бить по шарам, лучше использовать нейтральный.
Красный сигнализирует аварию (например: когда тележка выезжает раньше времени).
Но, как я понял, выехавшая тележка удаляется из списка.
Название: Re: Работа с таблицами
Отправлено: maratus от 17 Апреля 2025, 15:30:02
Спасибо за код, все  8).
Данный мониторинг больше для рабочих, чтоб они не забывали соблюсти время пребывания тележек. Так как их в помещении одновременно более 30 штук, бывает сбои, человеческий фактор. Поэтому тут нет аварийного или предупреждающего сигнала, цвета красный и зеленый выбраны из аналогии светофора - красный нельзя, зеленый можно.  :D. Таблица будет выводится на большой телевизор - рабочие будут видеть количество тележек и время пребывания, больше ничего не требуется. Изначально весь проект делал на массивах, БД выбран для подстраховки от выключения компа, перезагрузки - поэтому тут не полноценный БД. Работает, хорошо! Задержку опроса тэгов решил увеличением частоты опроса до 3 сек, корректнее работает после этого.  Сортировку сделал по убыванию в таблицах сразу в запросе, так устраивает.
На днях увезу на тест в реальных условиях, после чего потребуется добавить следующие функции:
1. смс оповещение - при попытке выехать из сушилки раньше времени.
2. управление внешним реле - будут подключены сирена и световой сигнализатор.
3. вывод окон на разные телевизоры.

Еще раз всем спасибо!  ;)
Название: Re: Работа с таблицами
Отправлено: AndrewNA от 13 Февраля 2026, 16:00:17
Здравствуйте, помогите осуществить задуманное:
Есть тех процесс состоящий из этапов. Оператор начиная этап (нажатие кнопки старт) запускает таймер этапа. Этапы идут друг за другом.

Нужно отображать таблицу (пример во вложении) в которой в 1й колонке перечислены этапы, во второй время начала этого этапа, в третьей колонке можно задавать продолжительность, 4й предположительное время окончания и 5й колонке оставшееся время.
Название: Re: Работа с таблицами
Отправлено: pan2000 от 15 Февраля 2026, 23:45:48
      Здравствуйте.

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

Во вложении пример для таблицы редактируемой на странице в секундах (для быстроты). Редактируемый столбец "ПРОДОЛЖИТЕЛЬНОСТЬ".
Название: Re: Работа с таблицами
Отправлено: AndrewNA от 17 Февраля 2026, 09:32:42
Благодарю за пример, разбираюсь. Пока в ожидаемом времени ничего не отображается.

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

В идеале это приложение календарь на телефоне, где линейно отображаются временные интервалы этапов за сутки, а промежутки между ними время когда оператору сходить покурить. Во вложении отличные примеры с форума, продублирую может кому пригодятся.
Название: Re: Работа с таблицами
Отправлено: pan2000 от 24 Февраля 2026, 08:15:37
   Здравствуйте.

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

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

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