Голова висит под колосниками. У неё неправильный адрес. До неё двенадцать метров вверх, лестница в другом конце зала, а прогон через сорок минут.
Ради этой ситуации в 2006 году придумали RDM.
281 триллион адресов, двоичный поиск по коллизиям и почему на дешёвом USB-свистке RDM не заработает никогда — разбор механики двустороннего DMX.
Голова висит под колосниками. У неё неправильный адрес. До неё двенадцать метров вверх, лестница в другом конце зала, а прогон через сорок минут.
Ради этой ситуации в 2006 году придумали RDM.
RDM (стандарт ANSI E1.20) добавляет к DMX512 обратный канал, не меняя ни кабеля, ни разъёмов. Трюк в том, что линия остаётся полудуплексной: в каждый момент говорит кто-то один.
Контроллер отправляет пакет с признаком «это RDM» (другой стартовый код), адресует его конкретному прибору и замолкает, освобождая шину. Прибор отвечает в образовавшееся окно — на всё про всё несколько миллисекунд, после чего контроллер возвращается к обычному вещанию DMX.
Отсюда сразу два практических следствия.
Во-первых, на время обмена DMX паузится. Иначе очередной кадр разрежет окно, в которое отвечает прибор. На сцене это незаметно — приборы держат последнее принятое значение и никуда не денутся, — но опрашивать линию посреди номера всё равно не стоит.
Во-вторых, RDM гораздо требовательнее к качеству линии, чем односторонний DMX. Вещание прощает отражения: вы шлёте одно и то же сорок раз в секунду, испорченный кадр просто пропадёт. Ответ прибора приходит один раз, и если его съело отражение от незатерминированного конца линии, прибор для вас не существует. Терминатор на конце линии при работе с RDM обязателен, а не «желателен, как учили в институте».
У каждого RDM-прибора есть UID — 48-битный идентификатор: 16 бит номера производителя и 32 бита номера устройства. Всего 2⁴⁸ ≈ 281 триллион комбинаций.
Контроллер не знает заранее, кто висит на линии. Спросить «представьтесь все» нельзя: приборы ответят одновременно, их сигналы сложатся на общей паре, и контроллер получит мусор.
Перебирать 281 триллион адресов, очевидно, тоже нельзя.
Стандарт решает это красиво. Контроллер задаёт вопрос не «кто ты», а «есть ли кто-нибудь в диапазоне UID от A до B», и слушает, что произойдёт.
Возможны ровно три исхода:
Классический двоичный поиск: каждый шаг сокращает пространство вдвое, и до конкретного прибора добираемся максимум за 48 шагов вместо триллионов. Найденных глушим, повторяем, пока вся линия не замолчит.
Тонкость, на которой держится вся конструкция: тишина и коллизия должны различаться. Если реализация путает «никого нет» с «ответили трое», поиск либо не найдёт половину приборов, либо зациклится. У нас на это стоят отдельные тесты на виртуальной линии, где коллизия подделывается специально, — потому что на реальном железе такой баг ловится в самый неудобный момент.
Ответ на широковещательный вопрос, кстати, устроен с избыточностью: байты идут парами с инверсией и контрольной суммой, чтобы приёмник мог отличить испорченный ответ от чужого. Это уже борьба стандарта за то, чтобы коллизия честно выглядела коллизией.
Тут придётся сказать неприятное про интерфейсы за тысячу рублей.
USB-DMX бывает двух пород. Open DMX — это буквально USB-UART (чипы FT232, CH340, CP210x) и трансивер RS-485. Тайминги кадра, включая BREAK, генерирует сам компьютер, дёргая линию через драйвер. Приёмника там нет вовсе: устройство умеет только передавать.
Enttec Pro и совместимые — это микроконтроллер, который принимает от компьютера сообщение «вот кадр, отправь» и сам формирует тайминги. И умеет слушать линию, отдавая полученное обратно по USB.
RDM требует принимать ответы в окне длиной миллисекунды. На Open DMX принимать нечем — не «плохо получается», а нечем физически. Никакая прошивка, никакой драйвер и никакая версия программы этого не изменят.
Поэтому Flux Lights в режиме Open DMX честно говорит, что RDM недоступен, вместо того чтобы делать вид, будто опрашивает линию.
Если RDM для вас важен, смотрите на это при покупке. Разница в цене окупается первым же монтажом, на котором не пришлось лезть на ферму.
Есть второй способ, где ничего из вышеописанного вам не нужно.
Сетевой узел Art-Net сам умеет RDM на своих выходах. Он уже обошёл свою линию, уже провёл двоичный поиск и держит готовую таблицу приборов. Пульту остаётся попросить её отдать.
Двоичный поиск тут не нужен вовсе, DMX останавливать незачем — линией распоряжается узел, а не мы. Единственная тонкость: перед запросом таблицу надо попросить обновить, иначе вернётся прошлая, где отключённые приборы ещё числятся живыми.
Так что если у вас сетевая схема, RDM достаётся почти бесплатно — вопрос только в том, поддерживает ли его ваш узел.
Обнаружение даёт модель, производителя, число занятых каналов и текущий адрес. Дальше:
Адрес меняется с пульта. Тот самый сценарий из начала статьи.
Identify — прибор начинает моргать. Незаменимо, когда в патче двенадцать одинаковых голов и надо понять, какая из них третья.
Personality — режим прибора. Одна и та же голова умеет занимать 14 каналов в базовом режиме и 32 в расширенном; переключается это тоже удалённо.
Датчики — температура, напряжение, часы наработки. Читаются по кнопке, а не постоянным опросом: держать линию занятой ради градусника — сомнительный размен. А вот перед сдачей объекта пройтись по температурам и найти голову, которая греется на десять градусов сильнее соседних, — хорошая привычка.