Если у вас есть блок питания 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
ссылка на оригинал статьи https://habr.com/ru/articles/1105250/