Если у вас есть блок питания 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.

Безопасность

Это самое важное, поэтому коротко и по делу:

  1. Выставьте OVP, OCP и OPP до того, как подключите нагрузку. Эти защиты живут в группе M0 и срабатывают в самом блоке, без участия компьютера.

  2. Автоотключение и последовательности выполняются в браузерной вкладке. Если компьютер уснёт, вкладку закроют или выдернут USB, блок просто останется на последней уставке. На программную защиту полагаться нельзя, только на аппаратную.

  3. На buck-моделях держите уставку не выше входного напряжения минус примерно 1,5 В. Иначе выход до неё не дотянет, а блок покажет CC даже при нулевом токе. Приложение это замечает и пишет INPUT LIMIT.

  4. После каждой записи уставки приложение читает значение обратно. Если блок сохранил что-то другое, вы увидите предупреждение с обоими числами.

  5. Клавиша 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