Внешнее оборудование - VISA: генератор сигналов UTG962

Автор
avatar-alexevsalexevs
Notebook

Работа с генератором сигналов UNI-T UTG962E при помощи интерфейса VISA

В этом примере рассматривается работа с внешним оборудованием из Engee - генератором сигналов UTG962E при помощи спецификации VISA и SCPI-команд. Производится настройка подключения, опрос памяти, сброс и конфигурирование выходного порта генератора. Показаны основные приёмы для автоматизации работы с генератором сигналов в Engee.

Введение

UTG962E - двухканальный генератор сигналов от компании Uni Trend (UNI-T). Его конфигурирование доступно в двух режимах: ручном и через спецификацию VISA посредством SCPI - команд.

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

Подготовка к работе

В первую очередь необходимо произвести установку пакета поддержки внешнего оборудования и установить подключение из хост-программы. Подробная пошаговая инструкция приведена в документации Engee и примерах из Сообщества.

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

После выполнения подготовительных шагов перейдём к установке соединения между Engee и генератором сигналов, предварительно подключим необходимый модуль пакета поддержки:

In [ ]:
using Main.EngeeDeviceManager.Devices.VISA

Установка соединения

Создадим объект VISA:

In [ ]:
visa = VISA.Visa()
Out[0]:
Main.EngeeDeviceManager.Devices.VISA.Visa("Visa", UUID("d1c57053-746b-486f-a34e-87c7d20d8451"))

После этого создадим сессию для работы с инструментами VISA:

In [ ]:
VISA.create_session(visa, "@py")

Получим список доступных физических портов:

In [ ]:
ports = VISA.get_ports(visa)
Out[0]:
5-element Vector{String}:
 "ASRL27::INSTR"
 "ASRL4::INSTR"
 "ASRL3::INSTR"
 "ASRL26::INSTR"
 "USB0::26198::2100::AWG1522510085::0::INSTR"

Последний порт из списка соответствует нашему генератору сигналов. Сохраним его идентификатор отдельно:

In [ ]:
port = last(ports)
Out[0]:
"USB0::26198::2100::AWG1522510085::0::INSTR"

Создадим абстракцию инструмента на указанном порте для работы с VISA:

In [ ]:
VISA.create_instrument(visa, port)

Соединение с устройством установлено, можно перейти непосредственно к работе.

Выполнение простых команд

Программирование генератора сигналов по VISA осуществляется при помощи SCPI-команд, специфичных для устройства. Полный список доступен в документации производителя.

Команда *IDN? возвращает данные об устройстве:

  • наименование производителя,
  • модель устройства,
  • серийный номер,
  • версию прошивки.

Для передачи команд и получения информации от устройства следует воспользоваться функцией VISA.writeread(), которой передаются созданный ранее объект VISA, идентификатор порта, SCPI-команда и время ожидания на получения информации от устройства.

In [ ]:
VISA.writeread(visa, port, "*IDN?", 1.2)
Out[0]:
"UNI-T Technologies,UTG900E,AWG1522510085,3.06"

Сбросим настройки генератора сигналов до заводских при помощи команды *RST и заблокируем его кнопочную клавиатуру командой :SYSTEM:LOCK OFF. Передать обе команды можно одновременно, через разделитель ; при помощи функции записи команд VISA.write().

In [ ]:
VISA.write(visa, port, "*RST;:SYSTEM:LOCK OFF");

Изменение формы генерируемого сигнала

Узнаем текущую форму генерируемого сигнала на первом канале устройства. Для этого запишем в него команду :CHAN1:BASE:WAV?.

In [ ]:
VISA.writeread(visa, port, ":CHAN1:BASE:WAV?", 1.2)
Out[0]:
"SINe"

⚠️ Обратите внимание, что данной функцией следует передавать на устройство только те команды, которые предполагают передачу ответов в программатор. Такие команды легко можно опознать по завершающему их вопросительному знаку.

Ответ SINe свидетельствует о том, что текущая форма сигнала - синусоидальная. Изменим форму на треугольную (RAMP) при помощи команды :CHAN1:BASE:WAV RAMP

In [ ]:
VISA.write(visa, port, ":CHAN1:BASE:WAV RAMP");
VISA.writeread(visa, port, ":CHAN1:BASE:WAV?", 1.2)
Out[0]:
"RAMP"

Очередная проверка формы сигнала возвращает нам сообщение RAMP, значит, форма сигнала была успешно изменена. Теперь запишем в генератор команды для поочерёдного изменения формы сигнала для всех доступных вариантов:

In [ ]:
FORMS = ["SIN","SQU","PULS","RAMP","ARB","NOIS","DC"];

Следующий цикл позволит нам переключать форму генерируемого сигнала, после чего произойдёт сброс настроек устройства.

In [ ]:
for form in FORMS
    VISA.write(visa, port, ":CHAN1:BASE:WAV $form");
    sleep(1);
end
VISA.write(visa, port, "*RST");

bandicam2025_05_2017_06_13_402_ezgif_com_optimize.gif

Как видно из записи, генератор корректно обрабатывает передаваемые команды, изменяя форму генерируемого сигнала.

Графический интерфейс в скрипте Engee

Для записи в устройство набора команд для полной конфигурации генерируемого сигнала, удобно записать их в вектор Vector{String} и передать, например, следующей вспомогательной функции:

In [ ]:
"""
Функция для записи в UTG962 SCPI команд, записанных в вектор
"""
function UTG962_write(command::Vector{String})
    for com in command
        VISA.write(visa, port, com);
        sleep(1);
    end
end;

Возможность добавить в скрипт Engee маску кодовой ячейки позволяет реализовать простой графический интерфейс для генератора:

In [ ]:
Канал = "1" # @param ["1","2"]
Форма = "RAMP" # @param ["SIN","SQU","PULS","RAMP","ARB","NOIS","DC"]
Частота_Гц = 271423 # @param {type:"slider",min:1,max:1000000,step:1}
Фаза_град = 0 # @param {type:"slider",min:-360,max:360,step:1}
Амплитуда = 3.587 # @param {type:"slider",min:0.002,max:20,step:0.001}

message = [
    ":CHANnel$Канал:MODe CONTinue",
    ":CHANnel$Канал:BASE:WAVe $Форма",
    ":CHANnel$Канал:BASE:FREQuency $Частота_Гц",
    ":CHANnel$Канал:BASE:HIGH $Амплитуда",
    ":CHANnel$Канал:BASE:LOW 0",
    ":CHANnel$Канал:BASE:PHAse $Фаза_град",
    ":CHANnel$Канал:OUTPut ON"
]

UTG962_write(message)


# VISA.write(visa, port, message);
# sleep(1);
# VISA.write(visa, port, ":CHAN$Канал:BASE:FREQ $Частота_Гц");
# sleep(1);
# VISA.write(visa, port, ":CHAN$Канал:BASE:PHAS $Фаза_град");
# sleep(1);
# VISA.write(visa, port, ":CHAN$Канал:BASE:AMPL $Амплитуда");
# sleep(1);
# VISA.write(visa, port, ":CHAN$Канал:OUTP ON");

bandicam2025_05_2017_11_27_953_ezgif_com_optimize.gif

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

Пример от производителя

В документации производителя приводится пример программирования пилообразного сигнала при помощи SCPI команд. В Engee его также удаётся воспроизвести:

In [ ]:
Sawtooth = [
    ":CHANnel1:MODe CONTinue",
    ":CHANnel1:BASE:WAVe RAMP",
    ":CHANnel1:BASE:FREQuency 30000",
    ":CHANnel1:BASE:HIGH 2",
    ":CHANnel1:BASE:LOW 0",
    ":CHANnel1:BASE:PHAse 90",
    ":CHANnel1:RAMP:SYMMetry 20",
    ":CHANnel1:OUTPut ON"
]

UTG962_write(Sawtooth)

После выполнения этих команд генератор выставит следующие, ожидаемые настройки сигнала:

image_2.png

Завершение работы

Для корректного завершения работы необходимо освободить шину для инструмента:

In [ ]:
VISA.close_instrument(visa, port)

И закрыть сессию работы с инструментом:

In [ ]:
VISA.close_session(visa)

Заключение

В примере мы рассмотрели возможности Engee для работы с внешним оборудованием - генератором сигналов UTG962 по спецификации VISA. При помощи SCPI команды можно запрограммировать устройство и получить текущие значения параметров. Engee позволяет не только автоматизировать работу с устройством, но и без дополнительных инструментов реализовать удобный и простой графический интерфейс.