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

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

Автор Тема: Работа с таблицами  (Прочитано 732 раз)

maratus

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Работа с таблицами
« : 08 Апреля 2025, 11:43:20 »
Здравствуйте! Создаю небольшой проект для мониторинга за тележками. Мониторинг включает основные функции: считывание меток тележки, запись данных метки в таблицу БД (PostgreSQL), вывод из таблицы БД в форму для визуального контроля для рабочих (в виде таблицы), слежение временем нахождения в помещении. С первой и второй задачей более менее разобрался, данные тележек пишутся в БД, выводить в таблицу с помощью RunSQL тоже получается. Нужна помочь в реализации слежения за временем тележки, по истечении которого, строка в таблице должна подмигивать и закрашиваться в зеленый цвет. А также, если попытались удалить тележку из помещения раньше времени - строка должна закрашиваться в красный цвет.
И есть ли возможность заполнения таблицы из БД полностью на всю форму без прокручивания (на картинке). В таблице количество строк равно 40.

ZWolol

  • Пользователь
  • **
  • Сообщений: 51
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #1 : 08 Апреля 2025, 18:37:51 »
> заполнения таблицы из БД полностью
RunSQL для таблицы заполнит 40 строк по 4 колонки (в соответствии с полученными данными из запроса).

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

Ну а потом уж работай с таблицей с помощью TM_TableCell...

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1301
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #2 : 09 Апреля 2025, 17:23:49 »
Здравствуйте.

Цитировать
Нужна помочь в реализации слежения за временем тележки, по истечении которого, строка в таблице должна подмигивать и закрашиваться в зеленый цвет. А также, если попытались удалить тележку из помещения раньше времени - строка должна закрашиваться в красный цвет.
Доступные методы для работы с таблицей можно найти по ссылке. Примеры изменения цвета ячейки/строки/столбца можно найти по ссылке. Вы можете попробовать решить описанную задачу используя возможности скриптов, но подобные решения будут громоздкими и ненадежными. При перезапусках ПК или проекта все расчеты времени будут сбиваться.

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

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #3 : 09 Апреля 2025, 20:44:07 »
   Здравствуйте.

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

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

P.S. Для уменьшения скрипта раскладки данных используется более сложная форма запроса, при желании можно свести запрос к минимальному и усложнить обработку в скрипте (это по поводу смены БД).
Пример только для иллюстрации: задание интервала контроля ограничено 23:59:59, длительность нахождения в помещении ограничена ~ 800 часами, нет контроля общего числа тележек в помещении.
При условии не более 40 тележек в помещении, было бы правильно отображать в таблице состояния присутствующих в помещении тележек, а преждевременный выезд тележек перенести в отдельную таблицу.

ZWolol

  • Пользователь
  • **
  • Сообщений: 51
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #4 : 10 Апреля 2025, 05:50:53 »
> Способ предложенный ZWolol, рекомендуем не использовать.
Ну что ж так категорично?

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

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

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

> считывание меток тележки, запись данных метки в таблицу БД
Я это воспринял как автоматическое с датчика, а если заносится ручками, то смотрите пример @pan2000.

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #5 : 10 Апреля 2025, 12:27:28 »
   Здравствуйте.
Я это воспринял как автоматическое с датчика, а если заносится ручками, то смотрите пример @pan2000.
Наличие раздельных переменных для меток заезда и выезда не обязательно указывает на "ручки" :-\, равно как и ввод значения метки в поле. Достаточно изменить события на "Изменилась основная переменная" и это будет вариант для помещения с раздельным заездом и выездом (например, туннельная печь).
Для единственного поля ввода метки (считывателя) - заезд/выезд определяется по наличию тележки в помещении. Пример во вложении.

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #6 : 12 Апреля 2025, 06:23:56 »
 Здравствуйте.

И есть ли возможность заполнения таблицы из БД полностью на всю форму без прокручивания (на картинке). В таблице количество строк равно 40.
Заполнить таблицу, состоящую из нескольких групп однотипных столбцов, "змейкой" можно (по крайней мере в 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, вычисление и форматирование столбца, правая - только вычисления.

« Изменён: 16 Апреля 2025, 22:21:50 от pan2000 »

maratus

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


ZWolol

  • Пользователь
  • **
  • Сообщений: 51
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #8 : 16 Апреля 2025, 15:35:12 »
Добавь в запросы: order by timeCart1

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

На счет метки не понял.

maratus

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #9 : 16 Апреля 2025, 18:26:36 »
есть 3 тега: 1) TagRead - меняется когда на в зоне видимости считывателя есть метка. 2) и 3) - последние байты ЕРС номера метки, по которым определяю тележки в таблице метки в БД. На скада создал скрипт - по изменению переменных. Как это работает на скрине. Бывает иногда, что метка TagRead изменяется быстрее чем остальные, отсюда сначала отрабатывает скрипт со старым значением, только потом уже с новой меткой. Как то так.

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #10 : 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 (в предположении что один фронт индицирует начало считывания, а другой собственно завершение).
« Изменён: 17 Апреля 2025, 03:42:35 от pan2000 »

ZWolol

  • Пользователь
  • **
  • Сообщений: 51
    • Просмотр профиля
Re: Работа с таблицами
« Ответ #11 : 17 Апреля 2025, 02:45:35 »
Если TagRead срабатывает раньше формирования номера, то нужно использовать задержку для чтения метки.
Или читать номер на изменение меток (но тогда двойной проход тележки будет невозможен).

Красный цвет будет бить по шарам, лучше использовать нейтральный.
Красный сигнализирует аварию (например: когда тележка выезжает раньше времени).
Но, как я понял, выехавшая тележка удаляется из списка.
« Изменён: 17 Апреля 2025, 03:43:24 от ZWolol »

maratus

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

Еще раз всем спасибо!  ;)
« Изменён: 17 Апреля 2025, 17:30:13 от maratus »