Перейти к содержанию

Lavritech LED Hub

💫 Пользовательская документация LED Hub (beta)

Настройка программы осуществляется через файл setting.ini. Как правило, это однократная операция и она проводится при пуско-наладке светодиодного табло, но иногда может потребоваться корректировка некоторых параметров.

Во время редактирования файла setting.ini программа должна быть выключена, иначе изменения не применятся!
Программа применяет настройки из файла при запуске, и сохраняет в него настройки при закрытии.

Настройка дисплея

Секция [Display_1] описывает общие параметры дисплея. Здесь можно поменять ip-адрес, а также установить яркость в процентах. Остальные настройки менять не рекомендуется, они ставятся инженером при начальной настройке.

Пример настроек
[Display_1]
id=1
ip=192.168.1.200
brightness=100
screen_id=screen_info

Некоторые версии ПО поддерживают управление сразу несколькими табло, тогда будет несколько подобных секций: [Display_1], [Display_2]и так далее.

Настройка API (RPC-запросы)

Программа может распознавать запросы в формате JSON RPC 2.0. Подробную информацию про этот стандарт можно найти в википедии (на русском), а также в официальной cпецификации. Запросы можно использовать для вывода инфомации на табло.

Общая настройка

В файле настроек в секции [System] указываем порт, на котором будет работать rpc-сервер.
По-умолчанию выбран порт 1234.

Настройка RPC
[System]
rpc_server_port=1234

Также, по необходимости, можно включить режим отложенного отображения данных.
Подробнее про этот режим описано в соответствующем разделе.

[System]
rpc_server_port=1234
rpc_deferred_show_data=1 

Привязка поля API к области вывода данных

Как правило, самостоятельно менять привязки не требуется - они настраиваются при пуско-наладке табло. Но если потребуется изменить название поля в rpc-запросе, то это можно сделать через api_field. Ниже для справки приведена структура секции в файле настроек.

В файле настроек каждая привязка выглядит как отдельная секция:

Пример привязки
[DataBind_1]
name=bind_1
display_id=1
archive_field=n_car_0
api_field=display1/n_car_0
  • название группы в [ ], и название привязки - name - должно быть уникальным
  • display_id - идентификатор дисплея, как было указано в группе [Display_1] (id=1)
  • archive_field - название области для вывода информации на табло. Список областей чётко определён в программе, названия менять нельзя.
  • api_field - название поля для RPC. Это поля привязывается к archive_field, то есть это его псевдоним. api_field можно менять - можно создать любой псевдоним, но он должен быть уникальным в рамках ini-файла.

Таким образом, через привязку мы определяем название поля api_field, которое затем будем указывать в rpc-запросе при изменении данных на табло.

Вывод информации на табло

Вывод текста

Для установки значения в выбранную область нужно послать RPC-запрос, где указать метод SetFieldValue и его параметры.

Параметры (params):

  • field - название поля - api_field из привязки
  • value - значение - текст для вывода на табло
Пример запроса SetFieldValue
{ "id": 1, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "display1/n_car_0", "value": "text"} }
Вариант запроса для старых версий программы

Начиная с версии ПО v1.11 (01.03.2025) был исправлен тип поля id в соответствии со стандартом JSON-RPC 2.0.
Теперь в запросах и ответах поле id имеет числовой тип.

В более ранних версиях поле id являлось строкой и его значение нужно было заключать в кавычки.
Пример запроса дла версий программы до v1.11:

{ "id": "1", "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "display1/n_car_0", "value": "text"} }
Примеры ответов
{"id": 1, "jsonrpc": "2.0", "result": "accepted"}
{"id": 1, "jsonrpc": "2.0", "result": "busy"}
{"id": 1, "jsonrpc": "2.0", "result": "wrong_field"}

В ответе может прийти один из результатов:

  • accepted - означает что rpc-команда принята к исполнению: новые данные успешно приняты программой, далее
    • если в настройках указано rpc_deferred_show_data=0 (или отсутствует), то программа начнёт выполнение задания на отображение принятых данных на дисплей
    • если в настройках указано rpc_deferred_show_data=1, программа просто запомнит значение поля, и будет ожидать запроса ShowFields для дисплея
  • busy - означает что дисплей пока занят (для дисплея где присутствует указанное поле уже активно задание отображения данных). То есть значение поля в данный момент времени поменять нельзя. Запрос отклоняется, его нужно будет повторить позже. Время пока дисплей будет занят зависит от разных факторов, в среднем рекомендуется подождать от 3 до 10 секунд в зависимости от условий эксплуатации и конфигурации. При режиме rpc_deferred_show_data=1 запрос ShowFields отрабатывается значительно быстрее, т.к. при этом обращения к дисплею не происходит.
  • wrong_field - означает что в поле field указано неверное значение, либо это поле не поддерживает данный функционал

Если нужно послать несколько запросов SetFieldValue в обычном режиме, необходимо выдерживать интервал между посылками (3-10 секунд). Подробнее см. "Примеры ответов". Чтобы снизить интервал между запросами SetFieldValue, можно воспользоваться режимом отложенного вывода информации. Это эффективно для табло с большим количеством зон отображения.

Вывод цветного текста

Начиная с версии ПО v1.11 в программу была добавлена возможность вывода цветного текста в область. Для этого в RPC-запросе используется метод SetFieldValue(как и в случае обычного вывода текста), но значение value имеет определённый формат (содержит мета-информацию).

Например: |001|A111БВ| - выведет строку "A111БВ" синим цветом:

  • | - разделитель
  • 001 - код цвета (синий)
  • | - разделитель
  • A111БВ - текст для вывода (номер машины)
Как происходит выбор между обычным запросом и запросом с мета-информацией?

Если текст начинается с символа разделителя | - то считаем что в тексте указана мета-информация о цвете.
Если же в начале строки символа | нет - то выбор цвета не осуществляется, надпись будет выведена цветом по-умолчанию.

Примеры:

  • "value": "|001|A111БВ|" - выведет надпись "A111БВ" синим цветом
    • допускается не указывать символ | в конце. "value": "|001|A111БВ" - тоже выведет надпись "A111БВ" синим цветом
  • "value": "A111БВ" - обычный текст, надпись будет выведена цветом по-умолчанию

Рассмотрим на примере светодиодного табло для отображения номеров машин разным цветом.
Например, цвет может использоваться для маркировки очерёдности выезда из бокса для отгрузки, или проезда определённого участка.

Будем использовать следующие цвета для обозначения действий:

  • Красный - "стоп" - код цвета 100
  • Жёлтый - "приготовиться", или "первый в очереди" - код цвета 110
  • Зелёный - "начать движение" - код цвета 010
  • Синий - "второй в очереди"
  • Белый - "действие не назначено" (цвет по-умолчанию) - код цвета 111
Как задаётся цвет?

Код цвета задаётся как код из трёх цифр по каналам цвета:
Красный Зелёный Синий

Примеры сочетаний:

  • 100 - красный
  • 010 - зелёный
  • 001 - синий
  • 110 - жёлтый
  • 111 - белый
  • 000 - чёрный (все каналы выключены) (на чёрном фоне не будет текста)

Ниже показаны примеры трёх значений value, примеры RPC-запросов и соответствующий результат на табло:

"|100|A211БВ|"
"|010|М220TБ|"
"|001|М003TС|"
{ "id": 1, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/1", "value": "|100|A211БВ|"} }
{ "id": 2, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/2", "value": "|010|М220TБ|"} }
{ "id": 3, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/3", "value": "|001|М003TС|"} }

Примечание. Фотографии сделаны при разном уровне яркости. Cм. настройку brightness в файле настроек.

Отложенный вывод информации

Иногда требуется изменить сразу несколько полей на табло одновременно. В этом случае удобно будет использовать данный режим.

Режим отложенного отображения данных можно включить через настройку rpc_deferred_show_data=1 в файле настроек.

В этом режиме по RPC-запросу SetFieldValue данные на дисплей отправляться не будут. Вместо этого данные запоминаются в памяти программы. Таким образом, если послать несколько запросов SetFieldValue - можно сделать пред-установку нескольких полей. Далее для вывода группы значений на табло нужно послать ещё один RPC-запрос: ShowFields

Запрос ShowFields служит для отображения данных на дисплее, которые были ранее изменены через метод SetFieldValue. Метод работает только если в системных настройках включен режим отложенного отображения данных rpc_deferred_show_data=1

В параметрах запроса нужно указать id дисплея, на который нужно вывести данные. Id дисплея можно найти настройках (в ini-файле) в группах вида [Display_x]

Пример запроса ShowFields
{"id": 2, "jsonrpc": "2.0", "method": "ShowFields", "params": {"display_id": "1"}}
Пример ответа на ShowFields
{"id": 2, "jsonrpc": "2.0", "result": "accepted"}

Также, в некоторых случаях ShowFields может вернуть результат "no data" (нет новых данных для отображения и отправки на дисплей). Это происходит, если:

  • не было запросов SetFieldValue и значения полей не поменялись
  • значения, переданные в SetFieldValue не отличаются от старых - тогда нет необходимости отрисовывать повторно на табло те же данные
  • выключен режим отложенного отображения данных: rpc_deferred_show_data=0 или отсутствует

Рассмотрим пример управления большим табло на 9 областей отображения в режиме отложенного вывода информации.

Примеры значений поля value:

    "|100|Д211AA|"
    "|010|Д212ББ|"
    "|001|Д213ВВ|"
    "|110|Д221AA|"
    "|011|Д222ББ|"
    "|101|Д223ВВ|"
    "|101|Д231AA|"
    "|100|Д232ББ|"
    "|111|Д233ВВ|"

Примеры RPC-запросов на запись значений.
В конце посылаем запрос для вывода значений на дисплей.

{ "id": 1, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/1", "value": "|100|Д211AA|"} }
{ "id": 2, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/2", "value": "|010|Д212ББ|"} }
{ "id": 3, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/3", "value": "|001|Д213ВВ|"} }

{ "id": 4, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/1", "value": "|110|Д221AA|"} }
{ "id": 5, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/2", "value": "|011|Д222ББ|"} }
{ "id": 6, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/3", "value": "|101|Д223ВВ|"} }

{ "id": 7, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/1", "value": "|101|Д231AA|"} }
{ "id": 8, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/2", "value": "|100|Д232ББ|"} }
{ "id": 9, "jsonrpc": "2.0", "method": "SetFieldValue", "params": { "field": "d1/1/3", "value": "|111|Д233ВВ|"} }

{"id": 10, "jsonrpc": "2.0", "method": "ShowFields", "params": {"display_id": "2"}}
Выбор интервалов между запросами

В режиме отложенного отображения данных:

Интервалы между запросами "SetFieldValue" можно сократить до 0,1-1 секунды.

Интервалы между запросами "ShowFields" должны быть больше, т.к. требуется время на посылку данных на дисплей.
Интервал должен быть не менее 5-10 секунд. Рекомендуемое значение - несколько минут.

Не рекомендуется использовать данные запросы для отображения часто сменяющейся информации (например, секундомер). Для этого существуют другие решения, см. LED PLC. Рекомендуется посылать запросы "ShowFields" только при необходимости отображения новых данных.

Результат вывода информации на светодиодное табло:

Проверка работы

Как осуществляется проверка?

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

Для самостоятельного тестирования запросов можно использовать одну из бесплатных утилит для посылки запросов по сети, например лёгковесную Packet Sender, или Postman.
Также на практике может быть удобным использовать небольшие скрипты на одном из языков программирования: Python, Golang или Visual Basic.

Сервисные запросы

Также поддерживаются дополнительные сервисные запросы.
Их удобно использовать для проверки связи между отправителем RPC-запроса и программой.

Примеры сервисных запросов
// Получить версию программы
{ "id": 1, "jsonrpc": "2.0", "method": "GetProgramVersion" }
// Ответ:
{ "id": 1, "jsonrpc": "2.0", "result": "v1.11.1"}

//Вывод тестового сообщения "test message" в лог программы (текст можно изменить)
{ "id": 1, "jsonrpc": "2.0", "method": "WriteLog", "params": [ "test message" ] }