Если у вас есть блок питания Riden серии DPS или DPH, то вы знаете, что управлять им можно не только кнопками на панели. У «коммуникационных» версий (с USB или Bluetooth-модулем) есть последовательный порт, и по нему блок отвечает на команды Modbus. Я написал для него веб-приложение, которое работает прямо в браузере. Называется оно DPS Control.
Устанавливать ничего не нужно, фирменная программа тоже не нужна. Открываете страницу в десктопном Chrome или Edge, втыкаете USB-адаптер, жмёте Connect, и всё. Данные никуда не уходят: соединение идёт напрямую между браузером и адаптером.
Живое приложение: https://wespeakenglish.github.io/DPS-Control/
Исходники под MIT: https://github.com/WeSpeakEnglish/DPS-Control
Что оно умеет
Кроме очевидного (показания напряжения, тока и мощности в реальном времени), там есть:
график и запись данных в CSV, причём можно писать «как приходит» или раз в N секунд;
ramp и I-V sweep;
последовательности шагов и автоотключение по условию;
группы памяти M0-M9;
сырая Modbus-консоль для экспериментов;
симулятор, чтобы попробовать всё без железа;
светлая и тёмная тема, по умолчанию как в системе.
Как это работает
Протокол обычный Modbus RTU: 8 бит данных, без чётности, 1 стоп-бит, 9600 бод и адрес 1 по умолчанию. Используются функции 0x03 (чтение), 0x06 (запись одного регистра) и 0x10 (запись нескольких). За один запрос можно прочитать не больше 32 регистров, а между кадрами нужна пауза хотя бы в 3,5 символа (на 9600 это около 4 мс).
Доступ к COM-порту из страницы даёт Web Serial API. Он есть только в Chrome и Edge на десктопе, в Firefox и Safari его нет.
Подключение
Сначала проверьте, что у вас именно коммуникационная версия блока. Если на плате нет разъёма UART и нет USB/BT-модуля, управлять по порту не получится.
Разъём на DPS | USB-UART адаптер (3,3 В) |
|---|---|
TX | RX |
RX | TX |
GND | GND |
VCC | не подключать |
Разъём на блоке маленький, четыре контакта с шагом 1,25 мм. Адаптер нужен с логикой 3,3 В (подойдут CP2102, CH340 или FT232 с переключателем). Линию VCC блока на адаптер подавать нельзя. Если у вас родной USB- или Bluetooth-модуль от Riden, он втыкается в разъём напрямую и появляется в системе как COM-порт.
Регистры
Вот основные регистры, с которыми работает приложение:
Регистр | Имя | Что это |
|---|---|---|
0x00 | U-SET | уставка напряжения, В ×100 |
0x01 | I-SET | уставка тока, ×100 или ×1000 в зависимости от модели |
0x02 | UOUT | выходное напряжение, ×100 |
0x03 | IOUT | выходной ток, ×100 |
0x04 | POWER | мощность |
0x05 | UIN | входное напряжение, ×100 |
0x07 | PROTECT | 0 норма, 1 OVP, 2 OCP, 3 OPP |
0x08 | CV/CC | 0 это CV, 1 это CC |
0x09 | ONOFF | выход включён или выключен |
0x0B | MODEL | номер модели, например 5015 |
0x23 | EXTRACT_M | запись числа 0-9 загружает группу M0-M9 |
Группы памяти лежат с адреса 0x50 + 0x10 × n: M0 это 0x50, M1 это 0x60 и так далее до M9 на 0xE0.
В документации производителя (ссылки в конце) нашлись неточности. Например, для CV/CC оба значения подписаны как «CV», хотя единица означает CC. А S-INI описан с двумя десятичными знаками, хотя на самом деле это просто флаг 0 или 1. Ещё несколько мест, где легко ошибиться:
Масштаб тока зависит от модели. У 15- и 20-амперных блоков I-SET умножен на 100, у 5-амперных на 1000. Поэтому в
devices.jsonесть полеscale.Регистр POWER лучше не читать. Положение десятичной точки в нём меняется (×100, а выше 99,99 Вт уже ×10). Приложение его игнорирует и считает мощность само, как U × I.
IOUT на 5-амперных моделях. В документации и в сторонней утилите rdserialtool это место описано неоднозначно. Я везде использую ×100. Если на вашем блоке ток окажется в 10 раз больше, чем есть на самом деле, дайте знать.
Автоопределение и devices.json
Модель приложение читает из регистра 0x0B и по ней подбирает лимиты и масштабы. Все известные устройства описаны в devices.json:
{ "schema": 1, "defaults": { "baud": 9600, "address": 1, "bauds": [2400, 4800, 9600, 19200], "pollMs": 100, "timeoutMs": 300 }, "devices": [ { "id": "DPS5015", "model": 5015, "type": "Buck", "verified": true, "vMax": 50, "iMax": 15, "pMax": 750, "scale": { "v": 100, "iSet": 100, "iOut": 100, "opp": 10 }, "baud": 9600, "address": 1, "appLimits": { "ovp": 52, "ocp": 15.5, "opp": 760 } } ] }
Обязательны только четыре поля: id, model, vMax и iMax. Остальное подставится по умолчанию. Чтобы добавить свой блок, достаточно дописать ещё одну запись. Если модели в списке нет, приложение прикинет лимиты по номеру (5015 это 50 В и 15 А) и честно напишет, что устройство непроверенное.
Одна тонкость. Если открыть index.html двойным кликом (адрес file://), Chrome не даст странице прочитать соседний файл. Тогда в настройках нужно один раз нажать Load devices.json…. Через GitHub Pages или через python -m http.server файл подхватится сам. А если не сработало ничего, используется копия, зашитая в HTML.
Что проверено и что нет
На реальном железе я проверял только DPS5015. Остальные модели (DPS5020, DPS3005, DPS5005, DPS8005, DPH5005) прогонялись только на встроенном симуляторе, а регистры и масштабы для них взяты из документации и rdserialtool. Для DPH3205 запись в списке есть, но ни один источник её не подтверждает.
Если у вас другая модель и значения отличаются в 10 раз, выберите модель вручную в настройках и напишите мне, поправлю.
Не подойдут: Riden RD60xx и Joy-IT JT-RD60xx (тоже Modbus, но карта регистров совсем другая), DPS с прошивкой OpenDPS (у неё свой протокол), блоки без платы связи, а также DPM8600 и серия XY.
Безопасность
Это самое важное, поэтому коротко и по делу:
Выставьте OVP, OCP и OPP до того, как подключите нагрузку. Эти защиты живут в группе M0 и срабатывают в самом блоке, без участия компьютера.
Автоотключение и последовательности выполняются в браузерной вкладке. Если компьютер уснёт, вкладку закроют или выдернут USB, блок просто останется на последней уставке. На программную защиту полагаться нельзя, только на аппаратную.
На buck-моделях держите уставку не выше входного напряжения минус примерно 1,5 В. Иначе выход до неё не дотянет, а блок покажет CC даже при нулевом токе. Приложение это замечает и пишет INPUT LIMIT.
После каждой записи уставки приложение читает значение обратно. Если блок сохранил что-то другое, вы увидите предупреждение с обоими числами.
Клавиша Esc мгновенно выключает выход и останавливает всё, что запущено.
Мелочи, которые приятно иметь
В заголовке вкладки видны текущие вольты и амперы, так что за ними можно следить из соседней вкладки.
Если блок перестал отвечать, показания становятся серыми.
Пока идёт запись, отсечка или любой инструмент, экран не засыпает.
Поля уставок следуют за блоком: покрутили ручку на передней панели, и в приложении значение поменялось. Если мешает, галочку можно снять.
После каждой команды приложение сразу перечитывает состояние
Попробовать
Откройте https://wespeakenglish.github.io/DPS-Control/ в десктопном Chrome или Edge. Если блока под рукой нет, нажмите Simulator. Он имитирует выбранное устройство: есть резистивная нагрузка с настройкой, плавное установление выхода, ограничение по входному напряжению и около 1 % потерянных кадров.
Буду рад звёздочкам на GitHub, issues и отчётам о других моделях.
Источники
DPS3005 CNC Communication Protocol V1.2 (RD Tech): PDF
DPS5020 communication protocol, английский перевод V1.2: PDF
rdserialtool, независимая карта регистров DPS: github.com/rfinnie/rdserialtool
Протокол Riden RD60xx, чтобы сравнить карты регистров: PDF
