Как стать автором
Обновить

Одна программа для управления и регистрации данных с различных устройств

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров2.4K

Введение

Открыл для себя программу 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

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

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

Теги:
Хабы:
+17
Комментарии16

Публикации

Ближайшие события