Введение

Открыл для себя программу Test Controller которая предназначена для управления и регистрации данных с различных устройств (мультиметры, источники питания, электронные нагрузки). На момент обзора актуальная версия Test Controller V2.58. Пообщаться с автором программы можно в ветке форума EEVblog.

У программы неплохой список поддерживаемого оборудования и возможность добавить поддержку нового устройства через текстовые конфигурационные файлы. Если сравнивать с Sigrok, то не придётся писать код и затем его компилировать. Я уже добавлял минимальную поддержку настольного мультиметра Agilent U3402A в libsigrok и это заняло несколько дней. В случае Test Controller процесс должен быть сильно проще.

Для демонстрации возможностей программы я добавлю поддержку двух устройств:

  • измерителя ёмкости аккумуляторов (схема, корпус, тестирование) который поддерживает протокол SCPI.

  • настольного мультиметра Agilent U3402A который не поддерживает протокол SCPI.

Установка

Команды и пути к файлам приведены для Linux, а точнее Debian 12. Если вы будете устанавливать в Windows или Mac OS, то читайте описание установки от автора программы.

Test Controller написана на Java и будет работать в Windows, Linux и MacOS. Установка с нуля для Debian 12 выглядит так:

$ sudo apt-get update
$ sudo apt-get install openjdk-17-jre
$ java -version
openjdk version "17.0.15" 2025-04-15
OpenJDK Runtime Environment (build 17.0.15+6-Debian-1deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.15+6-Debian-1deb12u1, mixed mode, sharing)

Скачиваю дистрибутив с сайта lygte-info.dk и распаковываю в директрорию ~/.local/ (все сторонние программы я устанавливаю в директорию ~/.local/ вместо /opt/ или /usr/local/):

$ wget https://lygte-info.dk/pic/Projects/TestController/TestController.zip
$ mkdir ~/.local/TestController/
$ unzip -d ~/.local/TestController/ TestController.zip
$ chmod +x ~/.local/TestController/{tcrun,tcrundebug}

Последняя команда не обязательна, если использовать запуск через меню окружения рабочего стола:

$ cat > ~/.local/share/applications/TestController.desktop <<_EOF_
[Desktop Entry]
Name=Test Controller
Path=$HOME/.local/TestController/
Exec=java -jar $HOME/.local/TestController/TestController.jar
Icon=$HOME/.local/TestController/TestController.png
Categories=Development
Version=1.0
Type=Application
Terminal=false
StartupWMClass=dk-hkj-main-Main
_EOF_

SCPI устройства

Измеритель ёмкости аккумуляторов поддерживает команды SCPI. Чтобы добавить его поддержку нужно создать файл ~/TestController/Devices/Power Monitor.txt и добавить в него описание устройства

#idString Andrei Tataranovich,Power Monitor,
#name Power Monitor
#handle PowerMonitor
#port com
#baudrate 9600
#driver SCPI
#eol \r\n

#value Current A D3
#value Voltage V D3

#askValues MEAS:CURR?;MEAS:VOLT?

#outputOff SYST:OUT OFF

Для начала добавил только получение показаний напряжения (MEAS:VOLT?) и тока (MEAS:CURR?) и отключение выхода (SYST:OUT OFF).

Документация по добавлению нового устройства есть для устройств поддерживающих протокол SCPI и для не-SCPI устройств.

После создания конфигурации для нового устройства нужно запустить программу, добавить устройство "Power Monitor" на вкладке "Load devices" и нажать кнопку "Reconnect"

Если всё сделано верно, то на вкладке "Commands" появится сообщение ";; Found Power Monitor on USB Serial (ttyUSB0)". Я отправил несколько команд устройству через строку слева от кнопки "Popups" и ответ виден в текстовом поле.

На вкладке "Current values" можно увидеть текущие показания напряжения и тока которые были настроены в конфигурации устройства

Чтобы начать регистрацию данных нужно настроить режим работы устройства (в Test Controller есть управление режимами работы, но я пока не разбирался с этим), вернуться на вкладку "Commands" и нажать кнопку "Log".

По мере записи данных они появляются в табличном виде на вкладке "Table" и при этом становятся активны вкладки "Chart", "Histogram" и "Range".

На вкладке "Table" можно выбрать какие колонки отображать

Поддерживается сохранение и загрузка значений а также импорт и экспорт в формате CSV. При импорте/экспорте можно настроить какие колонки сохранить и в каком формате.

На вкладке "Chart" данные представлены в виде графика

Поддерживается выбор данных которые нужно отображать на графике. Есть возможность ограничить показ части данных (параметры "First sample to display" и "Last sample to display") и сохранить изображение в формате PNG.

На вкладке "Histogram" данные представлены в виде гистограммы

Можно выбрать какие данные отображать на гистограмме, показать определённую часть данных (аналогично вкладке "Chart") и сохранить изображение в формате PNG.

На вкладке "Scales for chart" настраивается график

я задал минимальные и максимальные значения для тока и напряжения чтобы график получился более наглядным

На вкладке "Range" можно проанализировать данные на определённом интервале

Я выбрал диапазон данных от 2-х часов до конца записи.

На вкладке "Math" можно добавить вычисляемые параметры. Например я добавил вычисление мощности через ток и напряжение

После этого со всех вкладках появляется новый параметр "PowerMonitorPower"

Для примера я вывел его на график совместно с напряжением и током.

На вкладке "Remap handles" можно сделать привязку устройств к конкретным идентификаторам. У меня использовалось только одно устройство у которого идентификатор "PowerMonitor", но его можно переназначить к более короткому "pm".

В случае если у вас несколько одинаковых устройств, то их можно назначить на различные идентификаторы, используя серийный номер.

На вкладке "Configuration" можно настроить основные параметры программы

Тестер ёмкости аккумуляторов поддерживает три настройки через команды SCPI:

  • включить или выключить выход

  • задать скорость измерений (медленно, средне, быстро)

  • задать режим измерений (двухпроводной или четырёхпроводной)

В программе есть функциональность для конфигурации устройств - добавлю в файл описания устройства дополнительные секции для этого

#cmdSetup buttonsOn Output
:read: SYST:OUT?
:string:
:write: SYST:OUT #
:tip: Turn output ON or OFF
:updatealloff:
Off OFF
On ON

#cmdSetup radio Mode
:read: CONF:MEAS:MODE?
:string:
:write: CONF:MEAS:MODE #
:tip: Setup measurement mode
2W 2W
4W 4W

#cmdSetup radio Rate
:read: CONF:MEAS:RATE?
:string:
:write: CONF:MEAS:RATE #
:tip: Setup measurement rate
Slow S
Medium M
Fast F

После перезапуска программы на вкладке "Commands" нужно нажать кнопку "Setup" и откроется дополнительное меню

Не-SCPI устроства

Я не засекал время, но по ощущениям добавление нового устройства, которое поддерживает протокол SCPI, заняло около часа. Теперь задача со "звёздочкой" - попробую добавить настольный мультиметр Agilent U3402A, который не поддерживает протокол SCPI.

Точнее не так - управление через SCPI доступно при условии наличия модуля расширения GPIB, но в моём экземпляре такого модуля нет. А вообще этот мультиметр это перелицованный Escort 3146A на который есть более адекватная документация на подключение к компьютеру.

В документации на Test Controller есть раздел посвящённый поддержке не-SCPI устройств. А пример рекомендуется смотреть в файле конфигурации HP3478A.

Для начала указываю метаданные конфигурации

#idString Agilent Technologies,U3402A,
#name Agilent U3402A
#handle U3402A
#port com
#driver Ascii
#eol \r\n

Мультиметр подключается к компьютеру через последовательный порт, а драйвер будет использоваться Ascii, т.к. общение с мультиметром идёт через тестовые команды.

Описание данных, которые поддерживает мультиметр. Несколько режимов могут выдавать один и тот же вид данных - например двухпроводное (2W_Resistance) и четырёхпроводное (4W_Resistance) измерение сопротивления или прозвонка (Continuity)

#value VoltageDC V D6 DC_Voltage,Diode
#value CurrentDC A si DC_Current
#value VoltageAC V D6 AC_Voltage
#value CurrentAC A si AC_Current
#value Resistance ohm si 2W_Resistance,4W_Resistance,Continuity
#value Frequency Hz si Frequency
#value VoltageACDC V D6 AC+DC_Voltage
#value CurrentACDC A si AC+DC_Current

Не уверен что мне потребуется регистрировать данные сопротивления, диодов или прозвонки, но добавил их на всякий случай. Поймал себя на мысли что ещё ни разу не использовал измерения "AC+DC" для напряжения или тока и пока не особо представляю где это требуется.

Далее описание команд которые переключают режимы измерений

#scpiCmd DCV txrx S100
#scpiCmd ACV txrx S110
#scpiCmd 2WO txrx S120
#scpiCmd 4WO txrx S130
#scpiCmd DCI txrx S140
#scpiCmd ACI txrx S150
#scpiCmd DIOD txrx S160
#scpiCmd FREQ txrx S170
#scpiCmd ACDCV txrx S180
#scpiCmd ACDCI txrx S190
#scpiCmd CONT txrx S1A0

Эти команды как бы эмулируют SCPI - например "#scpiCmd DCV txrx S100" - объявляем команду "DCV" которая передаётся в мультиметр в виде команды "S100" и считывается ответ, но значение не возвращается. Эти команды можно выполнять на вкладке "Commands".

Далее описание команд для получения статуса мультиметра и запроса данных

#scpiCmd READ:FUNCTION? txrx? R0
:string:
:readmath: substring(value, 6, 7)

#scpiCmd READ:RATE? txrx? R0
:string:
:readmath: substring(value, 5, 6)

#scpiCmd READ:DATA? txrx? R1

В отличии от команд переключения режимов нам нужно получить данные (вместо txrx используется txrx?) а также сделать их интерпретацию (substring()).

Чтобы программа не пыталась общаться с "неправильным" устройством добавлю получение информации о модели и её проверку

#scpiCmd model? txrx? RV
:readmath: getMatchGroup(value, "^(.+),(.+)$", 2)

#scpiCmd getDeviceSW? txrx? RV
:readmath: getMatchGroup(value, "^(.+),(.+)$", 1)

#verifyDevice 6 model?

Если устройство неверно ответит на команду RV или в ответе будет указана другая модель, то общение с ним прекратится.

Блок описание команд управления режимом работы

#cmdModeLayout 2 6

#cmdMode DC_Voltage 0
DCV

#cmdMode AC_Voltage 1
ACV

#cmdMode AC+DC_Voltage 8
ACDCV

#cmdMode AC+DC_Current 9
ACDCI

#cmdMode DC_Current 4
DCI

#cmdMode AC_Current 5
ACI

#cmdMode 2W_Resistance 2
2WO

#cmdMode 4W_Resistance 3
4WO

#cmdMode Frequency 7
FREQ

#cmdMode Diode 6
DIOD

#cmdMode Continuity 10
CONT

В итоге становится активным меню "Mode" в котором можно выбрать режим работы

Для меню "Setup" добавил отображение текущего режима работы и частоты измерений

#cmdSetup info Mode
:read: READ:FUNCTION?
:readmath: getElement("DC Voltage;AC Voltage;2W Resistance;4W Resistance;DC Current;AC Current;Diode;Frequency;DC+AC Voltage;DC+AC Current;Continuity",listIndex(value, "0 1 2 3 4 5 6 7 8 9 A", " "), ";")
:updatemodechange:
:tip: Primary display mode

#cmdSetup info Rate
:read: READ:RATE?
:readmath: getElement("Slow;Medium;Fast", listIndex(value, "S M F", " "), ";")
:updatemodechange:
:tip: Measurement rate

Само меню выглядит так

Чем больше пользуюсь этой программой, тем больше она мне нравится своей расширяемостью. Пока не получилось прикрутить переключение диапазонов и частоты измерений, но это в планах.

Комментарии (23)


  1. easimonenko
    26.05.2025 18:41

    Как понимаю, программа не свободная? Может есть ещё какие альтернативы для SCPI?


    1. tataranovich Автор
      26.05.2025 18:41

      Не свободная и даже не open source. Из альтернатив я пробовал Sigrok и PyVISA. Если добавлять поддержку нового устройства, то pyvisa сильно проще на мой взгляд.


      1. easimonenko
        26.05.2025 18:41

        Понял. Спасибо!


    1. Ivanii
      26.05.2025 18:41

      Когда потребовался похожий функционал я использовал Эксель и PLX-DAQ, возможно чото подобное есть в OpenOffice(LibreOffice WPS Office и т.д.).


      1. easimonenko
        26.05.2025 18:41

        Спасибо!


    1. pvvv
      26.05.2025 18:41

      Имхо проще самому на любом скриптовом языке сделать простые обёртки для чтения различных измерительных устройств, чем пытаться приколхозить к какому-то чужому гую, ещё и без исходников.

      https://github.com/pavel212/uffi/blob/master/example/hp3458a.lua

      А чтобы потом не поток циферок в консоли разглядывать, он в несколько строчек заворачивается в gnuplot для отображения графиков на лету.

      И в совсем запущенных случаях если это кому-то на сторону для использования отдать надо примитивный гуй с полями ввода всяких параметров тоже в пару строк добавляется что-нибудь вроде https://www.tecgraf.puc-rio.br/iup/en/dlg/iupgetparam.html


      1. tataranovich Автор
        26.05.2025 18:41

        Есть много способов решить эту задачу если умеешь писать код - я пробовал sigrok, (относительно несложно, но затратно по времени) и pyvisa (легко).

        В случае Test Controller достаточно создать файл конфигурации - это медленнее чем с pyvisa, но из коробки появляется много возможностей, которые уже решили за тебя.


        1. pvvv
          26.05.2025 18:41

          Да, но только возможности эти довольно ограничены, и если надо что-нибудь лишь чуть сложнее чем просто отображение циферки на экране, геморроя сразу вылезет гораздо больше.

          Например измеряемое напряжение будет от какого-нибудь датчика, которым на какой-нибудь подвижке ездить надо, или поворачивать, или греть и смотреть зависимость от температуры.

          Хотя казалось бы просто ещё пару команд (тех же scpi) отправить подвижке/нагревателю и опросить его статус.

          но сразу же всё упрётся ограниченность языка этого конфиг файла и лютые костыли для обхода этого.


          1. tataranovich Автор
            26.05.2025 18:41

            А что я теряю пользуясь "ограниченными возможностями", если мне их сейчас достаточно? На мой взгляд лучший код - это код который не пришлось писать.


            1. pvvv
              26.05.2025 18:41

              мало того, в 95% случаев простого самописца без какого-либо гуя, который тупо в текстовый csv файл значения непрерывно пишет более чем достаточно.

              но easimonenko про альтернативы спрашивал.


              1. Serge78rus
                26.05.2025 18:41

                Я в свое время вообще пришел к тому, что для доступа к приборам наиболее гибко использовать простейшие утилиты командной строки, а все остальное делать с помощью bash скрипта, написанного под конкретную задачу. Например, надо снять характеристики какого-нибудь dc/dc - пишем скрипт, управляющий программируемым источником питания, электронной нагрузкой и мультиметром, результаты пишем в SQLite, а потом уже с помощью gnuplot строим какие нужно графики (зависимость выходного напряжения от входного, зависимость выходного напряжения от тока нагрузки и т.д.).

                Если кому вдруг будет интересно:

                https://github.com/Serge78rus/rd6006p - управление источником RD6006P

                https://github.com/Serge78rus/vc8145 - общение с мультиметром VC8145

                https://github.com/Serge78rus/scpi - управление приборами, поддерживающими SCPI (есть пример работы с электронной нагрузкой ET5410)

                Заранее прошу извинить за недостаточную "вылизанность" программ - писалось наспех для удовлетворения сиюминутных потребностей по мере их возникновения


                1. pvvv
                  26.05.2025 18:41

                  да, только я со временем вообще всё в lua перенёс.

                  и сами "драйвера" устройств стали проще, и логику работы приятнее описывать, чем на bash.


                1. tataranovich Автор
                  26.05.2025 18:41

                  @Serge78rusваше оборудование заявлено как поддерживаемое в Test Controller - можете глянуть заработает ли оно без лишних телодвижений?


                  1. Serge78rus
                    26.05.2025 18:41

                    Ну не сегодня точно. Если удастся поиграться на этой неделе, то отпишусь о результатах.


                  1. Serge78rus
                    26.05.2025 18:41

                    Попробовал подключить RD6006P и сразу потребовались те самые "лишние телодвижения", о которых Вы спрашивали.

                    У меня источник RD6006P (идентификатор прибора 60065), а программа из коробки знает только RD6006 (идентификатор прибора 60062), RD6012 (идентификатор прибора 60121) и RD6018 (идентификатор прибора 60181). RD6006P - это вариант RD6006 с двойной стабилизацией (после импульсного стабилизатора стоит еще линейный). Отличается от RD6006 существенно меньшими пульсациями и разрешающей способностью установки и измерения напряжения и тока.

                    Ладно, дописал в файл RidenRD60xx.txt конфигурацию для RD6006P с нужным идентификатором прибора 60065. Источник начал опознаваться программой, но напряжение и ток показывает в 10 раз больше, чем надо. И если ток поправить оказалось довольно просто заменой значения для переменной CurrentScaleFactor с 1000 на 10000, то с напряжением все гораздо печальней - авторы файла RidenRD60xx.txt не удосужились завести для его масштабирования переменную, а жестко вбили в SCPI команды умножение и деление на 100 (а для RD6006P надо 1000), т.е. нужно завести переменную VoltageScaleFactor для всех распознаваемых типов приборов и в командах найти и заменить где надо 100 на эту переменную. На этом пока остановился, отложив на потом, когда появится необходимость или будет совсем уж нечем заняться.

                    Попутно похоже и с током нашел ошибку: в некоторых SCPI командах (в частности для чтения IOut) вместо переменной CurrentScaleFactor жестко прописано значение 100, т.е. эти значения будут корректными только для RD6012 и RD6018, а не для RD6006.


                    1. tataranovich Автор
                      26.05.2025 18:41

                      @Serge78rusспасибо что проверили. Не обратил внимание что у вас RD6006P а не RD6006 (точнее до сегодняшнего не был в курсе о существовании улучшенной версии).

                      А мультиметр и электронная нагрузка заработали без проблем или не проверяли?


                      1. Serge78rus
                        26.05.2025 18:41

                        VC8145 не заработал, пишет что таймаут. В конфигурационном файле для него в общем-то и менять нечего. Но, насколько я понял из конфигурационного файла, он если и заработает, то умеет читать только число с основного дисплея (это я и сам умею:)). Поскольку официальной документации протокола я не нашел, мне было бы интересно посмотреть, как читаются данные с дополнительного дисплея, но увы...


                      1. tataranovich Автор
                        26.05.2025 18:41

                        @Serge78rusкак написан "драйвер" для VC8145 можно глянуть в TestController.jar загрузив его через какой-либо декомпилятор для Java (например http://java-decompiler.github.io/). Начать стоит с "dk.hkj/devices/dk.hkj.devices.DeviceVC8145.class".

                        Отсутствие исходников не особо затрудняет анализ этой программы.


                      1. tataranovich Автор
                        26.05.2025 18:41

                        @Serge78rusописание для протокола VC8145 есть тут: https://web.archive.org/web/20161014083250/http://www.26th.net/blog/vichy-vici-vc8145-digital-multimeter-rs232-protocol/

                        И там же есть команда для чтения показаний второго дисплея.


                      1. Serge78rus
                        26.05.2025 18:41

                        Спасибо! Это гораздо более полная информация, чем те обрывки, что мне удалось найти в свое время.


                      1. Serge78rus
                        26.05.2025 18:41

                        ET5410 заработал без видимых проблем, во всяком случае связь идет и текущие данные показывает. Естественно все не проверял, а надо бы (судя по косякам с коэффициентом для IOut у RD60xx)


      1. easimonenko
        26.05.2025 18:41

        Понял. Спасибо!


  1. yrub
    26.05.2025 18:41

    так включите системный "look and feel" пропертей, шо оно выглядит как чудо из начала 90-ых?