Редактор Скриптера (IDE): писать и отлаживать код
Редактор Скриптера (Scripter IDE) — отдельная страница, на которой код Скриптера пишут и отлаживают. Окно узла scripter на холсте подходит для короткой правки. Когда кода много, а логика зала собирается из десятков команд и подписок, работайте в редакторе. Он знает ваши устройства и интерфейсы, подчёркивает опечатки в именах и показывает, какие команды ушли и где сломался код. В нём можно проверить устройство вручную.
Страница рассчитана на тех, кто уже знаком со Скриптером: что такое ctrl, три фазы и подписки — см. «Скриптер: логика кодом». Здесь — только сам редактор и отладка.
Чем редактор удобнее окна узла
В редакторе есть то, чего нет в окне узла:
автодополнение по вашей программе: имена устройств, команд, сигналов, интерфейсов и элементов панели берутся из проекта;
проверка имён: опечатка в имени подчёркивается жёлтым, есть быстрое исправление;
подсказка параметров команды из драйвера;
диагностика рядом с кодом: фазы, ошибки, трасса команд, значения, подключения, консоль;
терминал: проверить устройство вручную, не трогая код;
вся программа перед глазами: Скриптеры, подключения, интерфейсы и драйверы в дереве слева.
Как открыть редактор и переключаться между Скриптерами
В U-Logic откройте боковую панель и перейдите на вкладку Scripter.
Нажмите Открыть Scripter IDE. Редактор откроется в отдельной вкладке браузера; вход тот же, что в U-Logic.
Чтобы открыть конкретный Скриптер, щёлкните по его строке в списке Скриптеры в проекте на той же вкладке.
Если открыть редактор кнопкой, не выбрав Скриптер, страница будет пустой: в дереве слева виден только список Скриптеры. Щёлкните в нём по нужной строке. Группа в списке называется как вкладка потока, а строка под ней — как узел Скриптера.
Переключиться на другой Скриптер можно тем же щелчком по строке в секции Скриптеры дерева слева: откроется страница выбранного Скриптера. Заголовок страницы всегда показывает имя Скриптера, с которым вы работаете, поэтому перед правкой проверьте его.
Создать Скриптер можно прямо отсюда: в секции Скриптеры нажмите Новый скриптер, впишите имя, выберите «Текущая вкладка» или «Новая вкладка-флоу» и нажмите Создать. Если страница открыта без выбранного Скриптера, варианта «Текущая вкладка» нет.
Предупреждение
Создать сразу, без подтверждения, добавляет новый узел (и вкладку потока, если выбрана новая) в работающую программу. Вкладка U-Logic, которая уже была открыта, после этого устарела: обновите её страницу.
Экран редактора
Зоны экрана:
Верхняя панель — кнопки действий (подробно — в следующем разделе).
Дерево слева — Скриптеры, скрипты, подключения, интерфейсы панелей и драйверы проекта.
Вкладки открытых файлов — каждый открытый скрипт в своей вкладке; крестик закрывает вкладку. Если ни один файл не открыт, написано «Нет открытых файлов - выберите файл в дереве слева».
Код — с нумерацией строк, миникартой справа и стрелками сворачивания блоков.
Генератор — кнопка справа в строке вкладок (раздел «Генератор»).
Статус рядом с названием: показывает, сохранён ли черновик и совпадает ли он с работающим кодом.
Экран редактора: 1 — верхняя панель, 2 — дерево слева (секция «Скрипты»), 3 — вкладка On Start, 4 — код, 5 — «Генератор», 6 — статус «Синхронно с деплоем»
Секции дерева сворачиваются щелчком по заголовку; ширину дерева можно менять перетаскиванием, двойной щелчок возвращает исходную ширину. При первом входе все секции свёрнуты.
Примечание
В дереве видны все подключения, интерфейсы и Скриптеры программы, в том числе из других вкладок потока. Если показываете экран коллегам или заказчику, держите ненужные секции свёрнутыми.
Верхняя панель
Справа в верхней панели:
Deploy — отправить код этого Скриптера в программу. Перезапускается только он.
Запустить тест — выполнить последнюю отправленную версию кода (рядом подпись «последний задеплоенный код»).
Диагностика — открыть и закрыть панель диагностики справа.
Терминал — открыть и закрыть панель ручной проверки устройства.
Справка — краткое руководство по Скриптеру и объекту
ctrl, с поиском по разделам.Скачать проект и Загрузить проект — копия всего проекта и её восстановление (раздел «Копия проекта»).
Верхняя панель: 1 — Deploy, 2 — «Запустить тест» и подпись «последний задеплоенный код», 3 — «Диагностика», 4 — «Терминал», 5 — «Справка», 6 — «Скачать проект» и «Загрузить проект»
Для скриптов кнопки «Сохранить» нет: они сохраняются сами (раздел «Черновик и Deploy»). Кнопка «Сохранить» (подсказка «Сохранить активный драйвер») появляется, только когда открыт драйвер; о драйверах — Dynamic Driver.
Скрипты: фазы, свои вкладки, папки
Откройте секцию Скрипты в дереве слева. В ней:
On Start, On Message и On Stop — три фазы Скриптера (что выполняется когда — в разделе «Три фазы» страницы «Скриптер»). Щелчок по имени открывает скрипт в новой вкладке редактора.
Свои скрипты — на них можно разнести настройку по темам: «Источники», «Звук», «Микрофоны». Они выполняются в составе On Start: после его кода, по порядку.
+ Скрипт — добавить свой скрипт. Имя по умолчанию «Скрипт N».
Папка — создать папку вместе с первым скриптом. Чтобы положить скрипт в папку, назовите его «Папка/Имя»: папка создастся сама. Пустая папка не сохраняется.
Секция «Скрипты»: 1 — On Start, On Message и On Stop, 2 — свой скрипт (вкладка открыта справа), 3 — «+ Скрипт», 4 — «Папка»
У каждой строки есть Переименовать и Удалить. Перед удалением редактор спрашивает «Удалить скрипт «имя»?»; после действия появляется сообщение «Скрипт добавлен», «переименован» или «удалён». Три основные фазы переименовать и удалить нельзя.
Писать код
Автодополнение
Редактор подсказывает настоящие имена из вашей программы. Подсказка появляется при вводе кавычки, скобки или точки; Ctrl+Space вызывает её вручную.
Что набираете |
Что предлагает редактор |
|---|---|
|
имена подключений устройств |
|
команды драйвера этого устройства |
|
сигналы драйвера этого устройства |
|
имена интерфейсов панелей |
|
имена элементов этого интерфейса |
|
драйверы и транспорты |
Для ctrl, node, msg, send, log работают и обычные подсказки по JavaScript.
Автодополнение: 1 — строка ctrl.device('Демо, 2 — список подключений устройств
Зачем это нужно: имена устройств, команд и сигналов в коде — обычные строки. Ошибка в одном символе не ломает запуск, команда просто не уходит. Выбор имени из списка исключает такие ошибки.
Подсказка при наведении и параметры команды
Наведите курсор на имя устройства в
ctrl.device('Имя')— появится «Имя → драйвер X»: видно, какой драйвер подключён.Когда вы пишете
send('команда', { … }), редактор показывает имена и типы параметров команды из драйвера; знак?означает необязательный параметр.
Подсказка команд: 1 — список команд драйвера после ctrl.device('Демо: матрица').send('
Примечание
Подсказка команд работает, когда send написан цепочкой: ctrl.device('Имя').send('. Если сначала записать устройство в переменную (const matrix = ctrl.device('Имя')), то после matrix.send(' список команд не появится. Нужна подсказка — пишите цепочкой.
Жёлтые предупреждения и быстрое исправление
Если в кавычках стоит имя, которого нет в проекте, оно подчёркивается жёлтым. Наведите курсор — появится текст вида «Неизвестное имя (устройство): «имя» — возможно, «похожее»» или «— нет в проекте». То же с панелью, командой, сигналом и элементом панели. Отдельно редактор подчёркивает опечатки в ключевых словах (funtion, cosnt, retunr, whlie): «Возможно, опечатка: «x» → «y»».
Предупреждение: 1 — подчёркнутое «Демо: матриса», 2 — текст «Неизвестное имя (устройство): «Демо: матриса» — возможно, «Демо: матрица»»
Чтобы исправить, поставьте курсор на подчёркнутое слово и нажмите Ctrl+. (или щёлкните по лампочке) и выберите «Заменить на «…»». Автоматически ничего не заменяется.
Примечание
Проверяются только имена в кавычках. Имя, которое вы собрали в переменной (ctrl.device(name)), редактор не проверит. Если список устройств проекта пуст, предупреждений не будет вообще.
Жёлтое подчёркивание — подсказка, а не запрет: код всё равно можно отправить на Deploy. Но имя, которого нет в проекте, на работе даст молчащую кнопку или send, вернувший false (см. «Устранение неполадок»).
Генератор
Генератор вставляет заготовку типовой функции с уже подставленными именами из вашего проекта.
Поставьте курсор туда, где нужен код.
Нажмите Генератор в строке вкладок или
Ctrl+Alt+G(есть и пункт «Вставить генератор…» в контекстном меню редактора). Ещё один способ: набрать в пустом местеgenи выбрать подсказку.В окне «Генератор функции» впишите слово в поле Фильтр… — список сузится. Если ничего не подходит, написано «Ничего не найдено».
Выберите заготовку стрелками. Внизу виден предпросмотр кода. Нажмите
Enterили щёлкните по строке.Заготовка вставится в позицию курсора.
Tabпереводит к следующему месту, которое нужно заполнить.
Окно «Генератор функции»: 1 — «Фильтр…», 2 — список заготовок, 3 — предпросмотр кода
В списке: каркас On Start; обработчик нажатия кнопки; один обработчик на группу кнопок; подписка на сигнал устройства; отправка команды устройству; сырой режим с диагностикой; отправка в конкретный выход sender; сырой приём, отправка, HEX и HTTP-запрос (мимо драйвера); взаимоблокировка кнопок и переключатель; приём из потока и отправка в поток; подключение устройства из кода.
Поиск и замена
Поиск по тексту и замена — стандартные сочетания встроенного редактора: Ctrl+F и Ctrl+H. Блоки кода сворачиваются стрелками рядом с номерами строк.
Сохранение скриптов
Для скриптов Ctrl+S не нужен: правки сохраняются сами (следующий раздел).
Черновик и Deploy
В редакторе два состояния кода: черновик (то, что вы набрали) и задеплоенный код (то, что работает в программе).
Черновик. Через доли секунды после правки он сохраняется сам. Статус рядом с заголовком меняется: «Сохранение…» → «Сохранено - rev N чч:мм:сс». Если не вышло — «Ошибка сохранения». Работающая программа черновик не использует: можно спокойно писать и ломать.
Статус черновика: 1 — «Сохранено - rev 6 …»
Deploy. Чтобы код начал работать, нажмите Deploy и подтвердите: «Задеплоить скрипты этого узла в проект?» Что произойдёт:
в программе обновляется только код этого Скриптера (On Start, On Message, On Stop и ваши вкладки); окно узла открывать не нужно;
перезапускается только этот узел, и его On Start выполняется заново. Остальная программа работает как работала;
статус меняется на «Синхронно с деплоем» (зелёный), всплывает сообщение «Задеплоено в проект».
Отличие от «Развернуть». Развернуть в U-Logic применяет все изменения холста; Deploy в редакторе обновляет только код одного Скриптера. Если вы поменяли связи узлов на холсте, число выходов или добавили новые узлы, нужно Развернуть в U-Logic. Узел, которого ещё нет в программе, Deploy не обновит: редактор ответит «Узел не найден в проекте»: сначала разверните его в U-Logic.
Правка в двух местах. Код Скриптера можно править и в окне узла, и в редакторе, но это два разных места, и редактор не следит за окном узла. Deploy из редактора заменяет код узла черновиком редактора. Правка, сделанная в окне узла и не попавшая в редактор, после Deploy будет потеряна. Поэтому правьте код в одном месте.
Если в редакторе уже есть черновик, а вы открыли окно узла, в окне появится баннер «Найден черновик из отдельного редактора (rev N, чч:мм) — применить его в этот узел?» с кнопками Применить и Игнорировать. Применить подставляет код черновика в окно узла, Игнорировать оставляет код окна как есть.
Если черновик применили и задеплоили из другого места, в редакторе появится баннер «Черновик применён и задеплоен. Перезагрузите страницу для синхронизации с проектом.»
Конфликт черновика возможен только между двумя вкладками редактора с одним и тем же Скриптером. Тогда статус станет «Конфликт черновика», а сверху появится баннер «Черновик изменён в другом месте. Перезагрузите страницу, чтобы не потерять чужие изменения.» Перезагрузите страницу и повторите правку. Если два Deploy пришли одновременно, второй получит «Конфликт версий: проект изменён в другом месте. Обновите страницу.»; обновите страницу и повторите.
Другие сообщения Deploy: «Ошибка деплоя (код)», «Не удалось получить проект», «Ошибка деплоя (сеть)» — повторите; если сообщение не исчезает, обновите страницу.
Отладка по шагам
Код можно проверить, не нажимая кнопку на панели и не ожидая сообщения от соседнего узла. Порядок такой: Deploy → Запустить тест → смотреть Диагностику → исправить → Deploy → снова Запустить тест.
Запустить тест
Запустить тест запускает в узле On Message с сообщением { payload: {} }: без topic, payload — пустой объект. Выполняется последний задеплоенный код, а не черновик: поэтому после каждой правки нужен Deploy. Появляется сообщение «Тест запущен (выполняется последний задеплоенный код)». Если панель «Диагностика» открыта, она обновится сразу и ещё раз через долю секунды. Если запустить не удалось — «Не удалось запустить тест».
Учтите: в тесте у msg нет topic, поэтому ветки вида if (msg.topic === 'camera') не выполнятся, а условие по msg.payload выполнится (объект есть, он пустой). Для отладки такой логики на время подставьте значения в код.
Диагностика
Нажмите Диагностика. Справа откроется панель. Пока она открыта, данные обновляются каждые 1,5 секунды; в заголовке написано «обновлено чч:мм:сс». Разделы идут сверху вниз:
Фазы — три строки On Start, On Message, On Stop: цветная точка (зелёная — фаза выполнилась, красная — ошибка, серая — кода в фазе нет или она ещё не запускалась), длительность в миллисекундах и время.
Ошибки — строка вида «фаза · строка N · сообщение». Если ошибок нет — «Ошибок нет».
Трасса — что уходило и приходило, новое сверху: время, устройство и «→ команда параметры» (команда ушла), «← сигнал значение» (устройство ответило), «* подключено / отключено». Обмен без драйвера показан как «RAW 12B» (число — размер в байтах). Пусто — «Трассы нет».
Значения — таблица «Устройство / Сигнал / Значение / Время» с последними значениями. Пусто — «Значений нет».
Подключения — состояние устройств: подключено, отключено, неизвестно. Нет подключений — «Подключений нет».
Консоль — вывод вашего кода. Фильтр уровня (все, log, info, warn, error, debug) сужает список; кнопка Скрыть / Показать убирает раздел. Хранятся последние 200 записей. Пусто — «Консоли нет».
Внизу написано время последнего прогона или «Запусков ещё не было».
Разделы Значения и Подключения заполняются только для устройств, на которые этот Скриптер подписан (on, onStatus, get), и для подключений из ctrl.connect. Устройство, которому код только отправляет команды (send), там не появится, даже если команды уходят: смотрите такие команды в Трассе и проверяйте устройство в Терминале.
Панель «Диагностика» после теста с ошибкой: 1 — фазы, 2 — «Ошибки», 3 — «Трасса», 4 — «Значения», 5 — «Подключения», 6 — «Консоль»
Примечание
Номер строки в «Ошибках» только указывает место: щелчка по нему, чтобы перейти к строке, нет. Откройте вкладку фазы из сообщения и найдите строку по нумерации слева.
Для ошибки в своём скрипте сообщение выглядит как «On Start · строка N», а N считается по общему коду: сначала код On Start, затем каждый свой скрипт со строкой-заголовком с его именем. Поэтому, если в On Start строки N нет или там всё в порядке, ищите ошибку в своих скриптах: номер в них сдвинут. Надёжнее искать по тексту ошибки или поставить в подозрительных местах node.warn('метка 1').
Куда попадают node.log и console.log
Чтобы увидеть значение или убедиться, что код дошёл до нужного места, выведите сообщение:
console.log('…'),console.info,console.debug,log('…'),node.log('…')— в раздел Консоль редактора; в боковую панель отладка они не попадают;console.warn,console.error,node.warn('…'),node.error('…')— в Консоль и дополнительно в боковую панель отладка U-Logic.
Консоль редактора показывает вывод скрипта (а при ctrl.connect({ debug: true }) — ещё и обмен подключения, источник в строке: script или conn).
Пример: найти ошибку и исправить
Допустим, вы пишете реакцию на сообщение в Скриптере «Демо — отладка»: команда матрице «Демо: матрица» должна уходить, а что-то идёт не так.
Откройте Скриптер в редакторе и вкладку On Message. В код попала ошибка: третья строка обращается к имени, которого нет:
// Переключить матрицу и прочитать значение ctrl.device('Демо: матрица').send('route', { input: 0, output: 1 }); const level = undefinedName.value;
Нажмите Deploy и подтвердите. Статус стал «Синхронно с деплоем».
Нажмите Запустить тест, затем откройте Диагностику (снимок выше).
В полосе фаз On Message — красная точка. В разделе Ошибки появилась строка «On Message · строка 3 · undefinedName is not defined»: фаза, номер строки и текст ошибки. В редакторе эта строка красным не подсвечивается: ошибка выполнения видна только в Диагностике.
В Трассе — строка «Демо: матрица → route {«input»:0,»output»:1}». Команда ушла, потому что стоит выше ошибки; всё, что написано после строки 3, не выполнится. Будь ошибка выше
send— команды в Трассе не было бы.Исправьте строку 3: удалите её или замените на нужное значение. Статус сменится на «Сохранение…», затем «Сохранено…».
Снова Deploy → Запустить тест. Deploy перезапускает узел, и диагностика начинается заново: Ошибки, Трасса и Консоль очищаются. Если всё исправлено, в Ошибках написано «Ошибок нет», у On Message зелёная точка, а в Трассе одна новая строка с
route.
В «Значениях» и «Подключениях» в этом примере пусто («Значений нет», «Подключений нет»). В «Консоли» — строка «LOG script Скриптер запущен» из On Start.
Если после теста Трасса по-прежнему пуста, а ошибок нет, проверьте: правильно ли написано имя устройства (нет ли жёлтого подчёркивания).
Терминал: проверить устройство вручную
Терминал нужен, когда непонятно, что виновато: код или само устройство. Терминал отправляет устройству байты или команду драйвера и показывает ответ. Код при этом не нужен.
Предупреждение
Терминал отправляет настоящие команды работающему оборудованию: проектор включится, матрица переключится. Выбирайте подключение и команду осознанно, особенно на действующем объекте.
Нажмите Терминал — справа откроется панель.
В поле Подключение выберите подключение запущенного устройства (TCP, UDP, Telnet, SSH, WebSocket или локальное). Индикатор рядом показывает, есть ли связь («нет связи» — устройство недоступно или подключение не запущено).
В поле Режим выберите:
RAW — свои данные: впишите их в поле Данные и выберите кодировку
utf8илиhex;Команда — выберите команду драйвера и заполните поля её параметров.
Нажмите Отправить (или
Enter).Ответ появится в журнале ниже: направление, время и текст. Фильтр над журналом отбирает строки по виду (rx, tx, resp, status) или тексту; переключатель text / hex меняет вид данных.
Если устройство отвечает в терминале, но не реагирует в коде, ищите причину в коде: имя, параметры, подписка. Если не отвечает и в терминале — проблема в подключении или устройстве.
Журнал терминала обновляется раз в 0,8 секунды.
Если отправка не удалась, внизу появится короткое сообщение: «Сначала выберите подключение» (не выбрано подключение), «Выберите команду» (в режиме «Команда» не выбрана команда), «Транспорт не поддерживает отправку» (этот вид подключения не принимает данные из терминала) или «Не удалось отправить» (любая другая причина).
Терминал: 1 — «Подключение», 2 — «Режим» (Команда), 3 — команда route и поля input и output, 4 — «Отправить», 5 — журнал
Справка
Справка открывает окно «Документация Scripter» с вкладками «SDK ctrl.* — справочник», «Редактор (IDE)» и «Драйверы устройств», полем Поиск по разделам… и оглавлением. Это краткое руководство по объекту ctrl, под рукой, пока вы пишете код. Подробный справочник с примерами — на странице «Скриптер: логика кодом».
Копия проекта: скачать и загрузить
Скачать проект сохраняет ZIP-архив всего проекта: все потоки U-Logic и драйверы, не только этот Скриптер. Делайте копию перед крупными правками.
Предупреждение
Загрузить проект заменяет весь проект на устройстве содержимым архива и перезапускает программу U-Logic. Всё, чего нет в архиве, пропадёт. Редактор дважды просит подтверждение: до выбора файла и после него, с именем файла. Прежде чем подтвердить, убедитесь, что это нужный архив; копия проекта нужна и на случай ошибки. Подробнее о копиях и драйверах — Dynamic Driver.
Частые ошибки
Общий маршрут проверки по цепочке «панель → программа → устройство → панель» — на странице «Не работает: где смотреть».
Что случилось |
Причина и что делать |
|---|---|
«Запустить тест» выполняет старый код |
Тест запускает последний задеплоенный код. Нажмите Deploy и повторите тест. Статус должен быть «Синхронно с деплоем» |
Тест прошёл, ошибок нет, а команды не уходят |
В тесте у |
Жёлтое подчёркивание под именем |
Такого имени нет в проекте или это опечатка. Исправьте через |
«Конфликт черновика» или «Конфликт версий» |
Один Скриптер открыт в двух вкладках редактора или два Deploy пришли одновременно. Перезагрузите страницу и повторите правку |
Правка из окна узла пропала после Deploy в редакторе |
Deploy заменяет код узла черновиком редактора. Правьте код в одном месте; если правили в окне узла, сначала перенесите правку в редактор |
«Узел не найден в проекте» при Deploy |
Узла ещё нет в работающей программе. Разверните его в U-Logic, потом Deploy |
Правка в редакторе не работает |
Не нажат Deploy. Черновик сам в работу не попадает |
В «Ошибках» пусто, хотя что-то не работает |
Ошибка внутри таймера ( |
После «Загрузить проект» пропала часть программы |
Загрузка заменяет весь проект. Восстановите из своей копии, скачанной через Скачать проект |