Узлы «Общие»
В категорию «общие» палитры U-Logic (редактор программы управления) входят узлы, которые нужны в любой программе: запускать её (inject), показывать, что происходит (debug, status), связывать далёкие части вкладки (рабочего листа программы) без проводов (link in, link out, link call) и оставлять заметки (comment). Ещё два узла, complete и catch, ловят завершение обработки и ошибки.
Как открыть окно любого узла, как пользоваться встроенной справкой и где остальные категории — на странице «Узлы U-Logic». Примеры ниже взяты с учебных вкладок: «Первая программа» (по шагам) и «Демо-зал» (обзор). Подписи полей даны так, как они показаны в окне узла; английские подписи не переводятся.
inject: запустить программу
Зачем. Программе нужно с чего-то начаться: записать таблицы при запуске, раз в несколько секунд спросить устройство о состоянии, проверить цепочку по нажатию. Узел inject сам создаёт сообщение и отправляет его по выходу. У него нет входа: он всегда начало цепочки.
Окно узла inject «Раз в 5 с»: 1 — «Имя», 2 — свойство сообщения, 3 — «Отправить через … сек, затем», 4 — «Повторять», 5 — «каждые N сек»
Поля окна (все они на вкладке «Свойства»):
«Имя» — подпись на вкладке. Пишите, что узел запускает: «При запуске», «Раз в 5 с».
Список свойств сообщения: в строке —
msg., имя свойства, знак «=» и значение. Здесь одно свойство,msg.payloadсо значением «milliseconds since epoch» (метка времени). Для каждого свойства выбирается тип значения: строка, число, логический тип, JSON, метка времени, выражение, переменная среды,msg.,flow.,global.. Кнопка «добавить» под списком добавляет ещё свойство. Часто содержимое не важно:injectнужен только как «пускатель» для следующего узла.Отметка «Отправить через … сек, затем» — отправить сообщение один раз после запуска программы.
«Повторять» — как часто отправлять дальше: «нет», «с интервалом», «с интервалом в промежутке», «в определенное время».
Параметры выбранного повтора: «каждые N сек/мин/час»; для промежутка — «каждые N мин» между двумя временами и дни недели (пн…вс); для определённого времени — время и дни недели.
Кнопка слева от узла отправляет сообщение вручную.
Пример на учебных вкладках.
В «Первой программе»
inject«При запуске» включает «Отправить через» 1 секунду и не повторяется. Он подключён к узлуchange«Карты кнопок и входов», который при запуске записывает таблицы в память программы (подробно — блок A). Одного такого сообщения достаточно: таблицы нужно записать один раз.
Цепочка примера: inject «При запуске» → change «Карты кнопок и входов» (на снимке — группа «Старт: карты»)
В «Демо-зале»
inject«Раз в 5 с» повторяет отправку «с интервалом» 5 секунд и начинает через 6 секунд после запуска. Он посылает кодеку запрос о состоянии звонка: кодек сам о звонке не сообщает, его приходится спрашивать (подробно — «Команды устройствам и ответы»).
Цепочка примера: inject «Раз в 5 с» → device - command «Кодек: состояние звонка»
Что вы увидите. После «Развернуть» нажатие кнопки слева от узла отправляет сообщение по выходу. С отметкой «Отправить через» и с повтором сообщения идут сами. Чтобы увидеть сообщение, подключите к выходу debug.
Частые ошибки.
Нажали кнопку слева от узла до «Развернуть» — редактор сообщит, что узел не развёрнут. Сначала нажмите «Развернуть».
Ждёте, что «Отправить через» сработает при нажатии кнопки. Оно срабатывает один раз при запуске программы (после «Развернуть»), а не при нажатии.
После правки таблицы запись в
changeнужно повторить: нажмите «Развернуть» и кнопку слева отinject, иначе в памяти останется старая таблица.
debug: посмотреть сообщение
Зачем. Самая частая работа с программой — выяснить, что именно пришло в сообщении: ответ устройства, событие панели, результат вычисления. debug показывает сообщение в боковой панели отладки и ничего не пересылает дальше. У него один вход и нет выходов.
Окно узла debug «Что прислал процессор»: 1 — «Имя», 2 — «Выводить», 3 — отметка «окно отладки», 4 — отметка «статус узла»
Поля окна (номера — как на снимке; в самом окне «Имя» стоит последним):
«Имя» — подпись на вкладке. Для постоянных узлов пишите, что смотрите: «Что прислал кодек».
«Выводить» — что показывать. По умолчанию
msg.payload; «весь msg объект сообщения» — сообщение целиком (подходит, когда вы не знаете, в каком поле нужное значение); «выражение» — результат выражения, например$string(payload).В группе «В» отметка «окно отладки» — выводить в боковую панель отладки (включена по умолчанию).
В той же группе отметка «статус узла (32 символа)» — показывать значение под узлом на вкладке. После включения рядом выбирается, что показывать: то, что выводит этот узел,
msg., выражение или «message count» (счётчик сообщений).
Пример на учебных вкладках.
В «Первой программе»
debug«Что прислал кодек» и «Что прислал процессор» выводятpayloadответов устройств. В готовой вкладке они выключены: включите узел кнопкой справа от него, когда нужно посмотреть ответы.
Цепочка примера: device - response listener «Звук: ответы» → debug «Что прислал процессор» (выключен: кнопка справа пустая) и → switch «Какая подписка?»
В «Демо-зале»
debug«Что прислала панель» выводит выражение$string(payload)— событие панели одной строкой. Он тоже выключен.
Цепочка примера: UI - Panel in «События панели» → debug «Что прислала панель» (выключен: кнопка справа пустая)
Как подключить debug к выходу узла, развернуть и прочитать сообщение — в блоке «Как проверять: узел debug» «Первой программы».
Что вы увидите. Открыта вкладка отладки на правой боковой панели (значок «жук»). В ней строки сообщений; payload и другие поля можно развернуть. Если включена отметка «статус узла», значение видно под узлом.
Частые ошибки.
Сообщений нет — узел выключен кнопкой справа от него или не развёрнут. Включите узел и нажмите «Развернуть».
Длинное значение в статусе под узлом обрезано: там помещается 32 символа. Полное значение смотрите в боковой панели.
Забытые включённые
debugзасоряют отладку. После проверки отключите узел или удалите.
status: узнать, что узел сменил состояние
Зачем. Под многими узлами виден статус: например, device - command показывает состояние соединения. Узел status превращает смену статуса в сообщение. Программа может на неё отреагировать, например показать на панели, что связь с матрицей пропала. Входа у него нет, выход один.
Окно узла status: 1 — «Получать статус», 2 — кнопка «Выберите узлы…»
Поля окна:
«Получать статус» — от каких узлов: «всех узлов», «in same group» (узлы в одной группе с этим) или «выбранных узлов».
Кнопка «Выберите узлы…» — открывает выбор узлов для варианта «выбранных узлов»; рядом строка поиска. В выборе показаны только узлы той же вкладки, на которой стоит
status.
Ещё в окне — «Имя»: подпись на вкладке. Поле стоит внизу, под списком узлов; на снимке его нет.
Пример (на учебных вкладках status нет; добавьте его на вкладку «Первая программа», которую вы импортировали, и ничего не сохраняйте):
Откройте вкладку «Первая программа». Перетащите на свободное место
statusиdebugи соедините выходstatusсо входомdebug.В
statusв «Получать статус» выберите «выбранных узлов», нажмите «Выберите узлы…» и отметьте узелdevice - command«Матрица: подать вход».В
debugвыберите «весь msg объект сообщения». Нажмите «Развернуть».Проверив, удалите два добавленных узла.
Цепочка примера: status «Статусы узлов» → debug «Что изменилось». На снимке status следит за «всех узлов»; в примере выше — «выбранных узлов»
Что вы увидите. Каждый раз, когда device - command меняет статус (например, соединение с устройством оборвалось и восстановилось), в отладке появляется сообщение с полем msg.status: в нём fill (цвет значка), shape (форма), text (подпись под узлом) и source — какой узел сменил статус (id, type, name). На вкладке подпись под узлом status показывает, за кем он следит: при выбранных узлах — число узлов («статус: 1»), при «всех узлов» — «статус: все».
Частые ошибки.
Выбрали «всех узлов» и получили лавину сообщений — на вкладке много узлов, у каждого меняется статус. Выберите нужные.
Не находите нужный узел в списке «Выберите узлы…» — он на другой вкладке.
statusследит только за узлами своей вкладки; поставьте его туда же, где нужный узел.Ждёте сообщения от узла, у которого нет статуса: меняться нечему.
link in, link out, link call: связь без проводов
Зачем. На большой вкладке провода от одного узла к десяти другим превращаются в клубок. Узлы link out и link in работают как «разрыв провода»: сообщение, пришедшее в link out, выходит из связанных с ним link in, как бы далеко они ни стояли, в том числе на другой вкладке. link call вызывает такую «подпрограмму» и ждёт ответ.
link in
Начало «оборванного провода»: входа нет, выход один. Сообщение, которое пришло в связанный link out, выходит отсюда.
Окно узла link in «→ панель»: 1 — «Имя», 2 — строка поиска над списком связанных link out
Поля окна (на снимке видна верхняя часть окна; под строкой поиска — список узлов, в нём отмечается нужный):
«Имя» — подпись на вкладке.
Строка поиска и под ней выбор
link out, которые с ним связаны.
Пример на «Демо-зале». С link in «→ панель» связаны девять link out, все они тоже называются «→ панель». Дальше он ведёт к UI - Panel out «Команды панели». Так все блоки отправляют изменения на панель через одну точку. Как выглядит эта группа на вкладке — на снимке в разделе link out.
link out
Конец «оборванного провода»: один вход, выходов нет. Отправляет сообщение связанным link in или возвращает ответ тому link call, который вызвал подпрограмму.
Окно узла link out «→ блоки экранов»: 1 — «Mode», 2 — строка поиска над списком связанных link in
Поля окна (номера — как на снимке; «Имя» в окне стоит выше «Mode»):
«Mode»: «Send to all connected link nodes» (отправить всем связанным
link in) или «Return to calling link node» (вернуть ответ томуlink call, который вызвал).Строка поиска и под ней выбор
link in, с которыми он связан (в режиме возврата не нужен).
Пример на «Демо-зале». События панели принимает один UI - Panel in, а нужны они восьми блокам. Вместо восьми проводов стоит link out «→ блоки экранов», связанный с восемью link in «события панели»; каждый из них продолжает цепочку в своём блоке (следом идёт ui - switch). Один вход проще проверять. Подробнее — в обзоре «Демо-зала».
Цепочка примера: в группе «2. Связь с панелью» «События панели» → link out и → debug «Что прислала панель» (выключен: кнопка справа пустая); отдельно link in → «Команды панели». На вкладке у link in и link out виден только значок, имён нет, а связь между ними задана в окне узла, а не проводом
link call
Вызов «подпрограммы» с ожиданием ответа: один вход, один выход. Сообщение уходит в выбранный link in, а ответ приходит из link out в режиме возврата и выходит из link call дальше.
Окно узла link call: 1 — «Link Type», 2 — строка поиска над списком link in, 3 — «Тайм-аут»
Поля окна (номера — как на снимке):
«Link Type»: «Fixed target» (цель выбирается в окне) или «Dynamic target (msg.target)» (цель берётся из сообщения).
Строка поиска и под ней выбор
link in, к которому он обращается.«Тайм-аут» — сколько секунд ждать ответ (по умолчанию 30); в окне он стоит выше «Link Type».
Пример link call (на учебных вкладках его нет; соберите на новой вкладке «Демо»). Задача: сделать «подпрограмму», которую можно вызвать из любого места. По номеру входа она возвращает название.
«Подпрограмма»:
перетащите
link in,changeиlink outи соедините по порядку;в
link inвпишите «Имя» — «Название входа»;в
changeзадайте правило «Установить»msg.payload, тип значения «выражение», значение"HDMI " & payload(знак&склеивает текст; про выражения — в разделе оchange);в
link outвыберите «Mode» — «Return to calling link node».
«Вызов»:
перетащите
inject,link callиdebugи соедините по порядку;в
link callоставьте «Link Type» — «Fixed target» и выберитеlink in«Название входа»;в
injectзадайтеmsg.payloadчислом2.
Цепочка примера: вверху link in → change «Добавить «HDMI»» → link out; внизу inject «Номер входа 2» → link call «Вызвать «Название входа»» → debug «Результат». У link in и link out на вкладке виден только значок; провода между верхней и нижней цепочками нет — link call связан с link in выбором в окне
Нажмите «Развернуть» и кнопку слева от
inject.
Что вы увидите. Сообщение уходит в link call, попадает в подпрограмму через link in, обрабатывается и возвращается тому же link call, а из него выходит дальше в debug. link call ждёт ответ не дольше времени «Тайм-аут». В отладке должно быть HDMI 2.
Частые ошибки со связями
link outсвязан не с темlink in(или не связан) — сообщение уходит в никуда. Проверьте оба конца в окнах узлов.В режиме «Dynamic target (msg.target)» в
msg.targetдолжно лежать имя или идентификаторlink in; другое значение вызов не найдёт.Вызываемая подпрограмма заканчивается обычным
link outв режиме «Send to all connected link nodes» вместо «Return to calling link node»:link callне получит ответ, и сработает тайм-аут.Узлы
linkс одинаковыми именами в списке выбора не отличить. Давайте им понятные имена («→ панель», «события панели»).
Короткие узлы
Три узла с небольшим числом полей. Все поля узла — во встроенной справке: откройте вкладку «справка» боковой панели (значок книги) и выберите узел.
Узел |
Что делает |
|---|---|
сообщает, что выбранные узлы закончили обработку сообщения |
|
ловит ошибки узлов и выдаёт сообщение с описанием |
|
заметка на вкладке; ничего не делает |
Так выглядят все три узла на пробной вкладке (в complete отмечен узел «Записать значение», catch ловит ошибки всех узлов):
Цепочки примера: заметка «Заметка: что делает вкладка»; inject «Запуск» → change «Записать значение» → debug «Результат»; complete «Запись завершена» → debug «Узел закончил»; catch «Ловить все ошибки» → debug «Ошибка»
complete: сообщение о завершении обработки
Зачем. Запустить следующий шаг, когда выбранные узлы закончили обработку сообщения, например после длинной цепочки. Входа нет, выход один: когда выбранные узлы закончили, complete выдаёт сообщение. На вкладке под узлом подпись «завершение: N».
Окно узла complete «Запись завершена»: 1 — «Имя» (в окне стоит внизу), 2 — кнопка «Выберите узлы…» и список узлов вкладки
Поля окна (номера — как на снимке; в самом окне «Имя» стоит последним):
«Имя» — подпись на вкладке.
Кнопка «Выберите узлы…» (рядом строка поиска) и под ней список узлов вкладки: отметьте те, за которыми нужно следить. В строке каждого узла справа — его тип; на снимке отмечен «Записать значение». Узел без выбранных узлов редактор не принимает: отметьте хотя бы один.
На учебных вкладках complete не использован.
catch: поймать ошибку
Зачем. Ошибка одного узла не должна остаться незамеченной. catch ловит ошибки узлов и выдаёт сообщение: описание ошибки лежит в msg.error, его можно показать в debug. Входа нет, выход один. На вкладке под узлом подпись «ловить: все».
Окно узла catch «Ловить все ошибки»: 1 — «Имя» (в окне стоит внизу), 2 — «Ловить ошибки», 3 — «Игнорировать ошибки, пойманные другими узлами Catch»
Поля окна (номера — как на снимке; в самом окне «Имя» стоит последним):
«Имя» — подпись на вкладке.
«Ловить ошибки»: «всех узлов», «выбранных узлов» или «in same group» (узлов из той же группы).
Отметка «Игнорировать ошибки, пойманные другими узлами Catch» — чтобы одну и ту же ошибку не получали два
catch.
На учебных вкладках catch не использован.
comment: заметка на вкладке
Зачем. Подпись и описание для того, кто будет читать вкладку: что делает блок, что настроить после импорта. Узел ничего не делает: у него нет ни входов, ни выходов. В «Демо-зале» так подписан каждый блок («0. Что настроить после импорта», «1. Старт: настройки зала и адресная книга» и другие); в «Первой программе» заметки тоже стоят над блоками.
Окно узла comment «Заметка: что делает вкладка»: 1 — «Имя», 2 — поле описания с панелью форматирования
Поля окна:
«Имя» — заголовок заметки, виден на вкладке.
Описание — длинный текст заметки. Это поле без подписи: сверху панель форматирования (заголовки h1–h3, жирный и курсив, списки, ссылка и другие кнопки), справа от неё кнопка «развернуть» для увеличения поля.