36м. Старшие осциллографы RIGOL: DHO1000 и DHO4000 — что добавляется и чем отличается управление
Части 36г–36ж разобрали осциллограф автора, RIGOL DHO900, ручка за ручкой и команда за командой. Рано или поздно на столе оказывается прибор постарше — в лаборатории, у коллеги, на производстве — и тогда нужны два ответа: что он умеет сверх DHO900 и заработает ли на нём скрипт, написанный для DHO900. Этот раздел отвечает на оба, и только на них: общее устройство канала, запуска, измерений и декодирования здесь не повторяется — оно в 36г, 36д, 36е и 36ж.
Источник у раздела необычный. На DHO1000 и DHO4000 у нас нет ни даташита, ни руководства пользователя — есть только руководство по программированию, справочник команд SCPI (язык команд прибора, 36ж). Но справочник команд многое выдаёт: какие модели он описывает, какие у команды допустимые значения, каких подсистем нет вовсе. Всё, что сказано ниже о старших сериях, следует из него; всё, что из него не следует, — в «Не проверено» в конце.
Опоры: RIGOL DHO1000/DHO4000 Programming Guide
(Books/DHO_programming_manual.pdf, 2022; дальше — «руководство
DHO1000/4000», страницы — по PDF-файлу): с. 23–24 — интерфейсы и
модели, с. 37–40 — сбор и память, с. 44–45 — декодирование, с. 93–104 —
канал и щупы, с. 144 — *IDN?, с. 196–197 — измерения, с. 214–224 —
анализ мощности, с. 277–283 — система и опции, с. 431–441 — чтение
осциллограммы. RIGOL DHO800/DHO900 Programming Guide
(Books/DHO800900_ProgrammingGuide_EN.pdf, 2024; «руководство
DHO800/900»): с. 23–24, 42–43, 47, 86, 93–97, 139, 148, 155, 217,
264–267, 297, 426–436 — то же для младших серий. Сравнение наборов
команд, разбор ответов и все числа модели — _verify/scope36m_check.py
(pypdf) и прогон _verify/scope36m/ (Python 3.11 и numpy в контейнере
stm-lab:1); листинг проверен против подставных приборов в том же
прогоне.
Как это называется в документации
Оригинал Перевод Programming Guide, SCPI command руководство по программированию, команда прибора root keyword, subsystem корень команды, подсистема: :POWer,:WAVeformoption, license, :SYSTem:OPTion:STATus?платная функция, ключ, проверка, установлена ли она power analysis, Power Quality, Ripple анализ мощности, качество сети на входе, пульсации на выходе Real_P, Apparent_P, Reactive_P активная, полная и реактивная мощность P_Factor, Phase_Angle, Crest Factor коэффициент мощности, угол, пик-фактор input impedance OMEG, FIFTy вход 1 МОм или 50 Ом HRESolution, :ACQuire:BITSрежим высокого разрешения и его разрядность active probe, current probe, demagnetize активный щуп, токовые клещи, размагнитить preamble преамбула: десять чисел, по которым коды точек переводят в вольты и секунды
36м.1 Кто такие DHO1000 и DHO4000 — по руководству
Модели. Руководство DHO1000/4000 начинается с таблицы моделей (с. 24):
| серия | модели | полоса | каналов |
|---|---|---|---|
| DHO4000 | DHO4204, DHO4404, DHO4804 | 200, 400, 800 МГц | 4 |
| DHO1000 | DHO1072, DHO1074, DHO1102, DHO1104, DHO1202, DHO1204 | 70, 100, 200 МГц | 2 или 4 (последняя цифра) |
| DHO800 | DHO802, DHO804, DHO812, DHO814 | 70, 100 МГц | 2 и внешний вход или 4 |
| DHO900 | DHO914, DHO914S, DHO924, DHO924S | 125, 250 МГц | 4 |
Две нижние строки — из руководства DHO800/900 (с. 24). По полосе DHO1000 стоит рядом с DHO800/900, DHO4000 уходит выше всех — до 800 МГц.
Что ещё видно из команд. Не из таблиц характеристик, а из того, какие команды есть и какие значения они принимают:
- вход 50 Ом — команда
:CHANnel<n>:IMPedanceс выбором 1 МОм или 50 Ом; руководство прямо пишет, что у DHO1000 входа 50 Ом нет (с. 99). Значит, он есть только у DHO4000. У DHO800/900 такой команды нет вовсе. Зачем 50 Ом и чем он опасен для вывода микроконтроллера — 36г.6; - режим High Res —
:ACQuire:TYPE HRESolution(с. 40) и:ACQuire:BITS14 или 16 бит; в остальных режимах — 12 бит (с. 37). У DHO900 этого режима нет (36г.16); - ограничение полосы — 20 МГц или 250 МГц (с. 93); у DHO800/900 только 20 МГц (руководство DHO800/900, с. 93). 250 МГц и 50 Ом недоступны на DHO1000 (с. 94);
- глубина памяти — у DHO4000 до 250 млн точек на один канал, с опцией до 500 млн; у DHO1000 — 50 млн, с опцией 100 млн (с. 38–39). Подробно — в 36м.7;
- активные и токовые щупы — смещение щупа, калибровка, задержка от −100 до 100 нс, размагничивание токовых клещей (с. 100–104);
- опции по ключу — память, полоса (например, DHO1000 с 70 до 100 или 200 МГц, DHO4000 с 200 до 400 или 800 МГц), анализ мощности, шины (с. 280–283);
- опорная частота 10 МГц — вход и выход на задней панели,
:SYSTem:RCLock(с. 277): два прибора можно привязать к одному кварцу; - GPIB — через модуль USB–GPIB,
:SYSTem:GPIB(с. 23, 278); у DHO800/900 только USB и LAN (руководство DHO800/900, с. 23).
Роль. Из этого складывается картина. DHO4000 — прибор для быстрых сигналов и силовой электроники: полоса до 800 МГц, вход 50 Ом для высокочастотного тракта, глубокая память, анализ мощности и шины автомобилей и авиации — всё это опции. DHO1000 — та же платформа команд, но по полосе и памяти ближе к DHO900 и без 50 Ом, анализа мощности и редких шин. DHO800/900 — компактные приборы, у которых зато есть то, чего нет у старших: цифровые каналы (DHO900), встроенный генератор и АЧХ (модели с буквой S) — 36м.4.
Ошибка. Считать, что «старше — значит всё то же плюс ещё». Генератора, логического анализатора и гистограммы в руководстве DHO1000/4000 нет: переход с DHO924S на DHO4404 отнимает функции.
36м.2 Как сравнивали два руководства
Метод. Обе книги устроены одинаково: каждая команда — заголовок вида «3.29.5 :WAVeform:DATA?», за ним раздел Syntax. Проверка раздела вынимает pypdf-ом из обоих PDF все такие заголовки, сравнивает имена без учёта регистра и считает, что есть в обеих книгах, а что — только в одной:
| руководство DHO1000/4000 | руководство DHO800/900 | |
|---|---|---|
| команд с разделом Syntax | 609 | 564 |
| общих | 508 | 508 |
| только в этой книге | 101 | 56 |
корней команд (подсистем и общих команд *…) |
41 | 44 |
Корень, которого нет у младших, — один: :POWer. Корней, которых нет
у старших, — четыре: :BODeplot, :HISTogram, :LA, :SOURce.
:SAVE есть в обеих книгах; у DHO800/900 в нём на 7 команд больше —
сохранение в сетевую папку.
Честная оговорка. Руководство DHO1000/4000 — 2022 года, версия
программы 00.01.00 (с. 2, 23); руководство DHO800/900 — 2024 года,
версия 00.01.03 (руководство DHO800/900, с. 2, 23). Между ними два
года прошивок. Часть различий может означать не «у прибора этого нет»,
а «в 2022 году этого ещё не было» или «не попало в книгу». Например,
:SAVe:SMB и :HISTogram вполне могли появиться в новой прошивке
старших серий. Надёжный ответ даёт только сам прибор: команда, которой
у него нет, кладёт в очередь ошибок -113,"Undefined header…"
(руководство DHO1000/4000, с. 277).
Что совпало целиком. Чтение осциллограммы :WAVeform — 14 команд,
те же режимы NORMal, MAXimum, RAW, те же форматы WORD, BYTE, ASCii,
та же преамбула из 10 полей и та же формула перевода кода в вольты
(с. 431–441 и с. 426–436 руководства DHO800/900). Измерения :MEASure —
те же 27 команд и тот же список из 42 величин. Отличие одно: у DHO900
источником может быть цифровой канал D0–D15.
Ошибка. Сравнивать по оглавлению. В оглавлении DHO1000/4000 есть
«:SAVE and :LOAD», в DHO800/900 — «:SAVE» и отдельно :LOAD:SETup
внутри; по оглавлению кажется, что разные, по командам — одно и то же.
36м.3 Только у DHO1000/4000
101 команда, по корням:
:TRIGgerи:BUS— 49 и 18. Запуск и декодирование FlexRay, I2S (звук), MIL-STD-1553 (авиация) и скорость фазы данных CAN-FD (с. 44–45, 300). FlexRay, I2S и MIL-STD-1553 — только DHO4000 и только с опцией; у DHO1000 их нет совсем. CAN-FD и LIN у DHO1000 — в базе, у DHO4000 — опция AUTO (с. 45, 280). У DHO800/900 LIN есть только у DHO900 (руководство DHO800/900, с. 47), CAN-FD нет. Зачем такие шины в справочнике по STM32: CAN-FD есть у STM32G4 и H7 (FDCAN), I2S — у SPI многих серий.:POWer— 17. Анализ мощности: 36м.5 и 36м.6. Только DHO4000, опция UPA (с. 214).:SYSTem— 8. Установка и проверка опций по ключу, GPIB, опорные 10 МГц, дата и время.:CHANnel— 7. Вход 50 Ом и команды для активных и токовых щупов.:CHANnel<n>:PROBe:DEMag— размагнитить токовые клещи перед измерением: остаточная намагниченность сердечника даёт сдвиг нуля тока (с. 104).:ACQuire— 2.:ACQuire:BITS(High Res) и старая:ACQuire:MEMDepth?, оставленная для совместимости (с. 39).
Что видно с этим и без этого. На DHO900 пульсации в милливольтах снимают через 20 МГц и усреднение (36г.7, 36г.16). На DHO4000 к этому добавляется High Res — шум падает в одиночной записи, без повторов. Вход 50 Ом убирает внешнюю проходную нагрузку на высокочастотном тракте.
Ошибка. Заказать DHO1000 «ради анализа мощности»: по руководству
:POWer у DHO1000 не поддерживается вовсе (с. 214).
36м.4 Только у DHO800/900
56 команд:
:SOURce— 19. Встроенный генератор: форма, частота, амплитуда, модуляция. Только DHO914S и DHO924S (руководство DHO800/900, с. 297).:BODeplot— 9. АЧХ и ФЧХ цепи генератором и каналами — те же модели с буквой S (с. 86).:LA— 9. Цифровые каналы D0–D15; DHO800 их не поддерживает (с. 155). Как ими пользоваться — 36ж.:HISTogram— 9. Гистограмма (с. 139; 36е).:SAVe:SMB— 7. Сохранение прямо в сетевую папку (с. 264–267).- По одной:
:MATH<n>:GRID,:TIMebase:XY:GRID,:SYSTem:KEYBOARDCheck?.
Глубина 5 млн точек. Значение 5M есть в списке :ACQuire:MDEPth
DHO800/900 (с. 42) и отсутствует у DHO1000/4000 (с. 38). Скрипт,
который ставит 5M, на старшем приборе получит ошибку.
Ошибка. Ждать, что скрипт стенда с генератором (:SOURce)
переедет на DHO4000: у старших в руководстве генератора нет, нужен
отдельный (36к).
36м.5 Анализ мощности: команды :POWer
Что это. Прибор сам считает по двум каналам — напряжению и току —
мощность и связанные с ней величины, со статистикой. Два вида
(:POWer:TYPE, с. 215):
- QUALity — качество переменного напряжения на входе: что потребляет устройство от сети или обмотки;
- RIPPle — пульсации постоянного напряжения на выходе.
Настройка (с. 215–224):
| команда | что задаёт | значения |
|---|---|---|
:POWer:VOLTage:SOURce, :POWer:CURRent:SOURce |
каналы напряжения и тока | CHANnel1…CHANnel4 |
:POWer:REFLevel:METHod |
опорные уровни в процентах или в вольтах (как прибор их применяет, руководство не пишет) | PERCent (по умолчанию) или ABSolute |
:POWer:REFLevel:PERCent:HIGH, MID, LOW |
уровни в процентах | 0…100, по умолчанию 90, 50, 10 |
:POWer:REFLevel:ABSolute:HIGH, MID, LOW |
уровни в вольтах | от −100 до 100 мВ |
:POWer:QUALity:FREQ:REFerence |
по какому сигналу считать частоту | VOLTage или CURRent |
:POWer:QUALity:DISPlay, :POWer:RIPPle:DISPlay |
показать результаты | ON или OFF |
:POWer:RIPPle:SOURce |
канал пульсаций | CHANnel1…CHANnel4 |
:POWer:STATistics:RESet |
сбросить статистику | — |
Ответ. :POWer:QUALity:STATistics:RESult? возвращает таблицу
строкой: в каждой строке имя величины, каналы, текущее, среднее,
наибольшее и наименьшее значение, отклонение и число измерений
(с. 222). Величины: частота Ref_Freq, Vrms и Irms, активная Real_P,
полная Apparent_P и реактивная Reactive_P мощность, коэффициент
мощности P_Factor, угол Phase_Angle, отношение напряжения к току Imp
и пик-факторы V_CrestFactor и I_CrestFactor. Числа — с единицами и
приставками: 4.5289mW, 999.50kHz. Для RIPPle в примере одна величина —
размах Meas_Vpp (с. 224).
Проверим пример руководства. Числа в примере на с. 222 связаны между собой, и это помогает понять, что прибор считает:
| величина | в примере | пересчёт из Vrms, Irms и Real_P |
|---|---|---|
| полная мощность | 7,8598 мВА | 88,273 мВ × 89,039 мА = 7,8597 мВА |
| коэффициент мощности | 576,21m | 4,5289 / 7,8598 = 0,57621 |
| угол | 54,81° | arccos 0,57621 = 54,82° |
| реактивная мощность | 6,4237 мвар | √(7,8598² − 4,5289²) = 6,4238 мвар |
| Imp | 991,39 Ом | 88,273 мВ / 89,039 мА = 0,9914 Ом |
Первые четыре сходятся с точностью до единицы последнего знака — это округление. Отсюда важное: угол в примере — это arccos коэффициента мощности, а не сдвиг между синусоидами (почему это различие решает — 36м.6). А Imp расходится с отношением Vrms/Irms в 1000 раз: либо опечатка примера, либо другие единицы. Единицы в ответе проверяйте на известной нагрузке.
Ошибки в самом руководстве. У :POWer:REFLevel:ABSolute:HIGH
диапазон от −100 до 100 мВ, а значение по умолчанию — 300 мВ, вне
диапазона (с. 217); у LOW — −300 мВ (с. 218). Пример к
:POWer:QUALity:DISPlay запрашивает :POWer:RIPPle:DISPlay? (с. 221).
Скрипт не должен полагаться на значения по умолчанию — ставить всё
явно и читать обратно.
Ошибка. Включить анализ мощности, не проверив опцию. На DHO4000
без UPA команды :POWer недоступны; проверка —
:SYSTem:OPTion:STATus? UPA, ответ 1 или 0 (с. 282–283).
36м.6 Зачем это импульсному блоку и двигателю
Модель. Вход простейшего блока питания: обмотка трансформатора 24 В, 50 Гц, сопротивление обмотки и проводов 0,5 Ом, диодный мост (0,7 В на диод), конденсатор 2200 мкФ, нагрузка 20 Ом. Для сравнения — та же обмотка на резисторе 16 Ом. Считаем то, что показал бы анализ мощности на входе моста:
| величина | резистор 16 Ом | мост с конденсатором |
|---|---|---|
| Vrms | 24 В | 23,06 В |
| Irms | 1,5 А | 2,806 А |
| активная мощность | 36 Вт | 42,3 Вт |
| полная мощность | 36 ВА | 64,71 ВА |
| коэффициент мощности | 1,000 | 0,654 |
| пик-фактор тока | 1,414 | 2,49 (пик 7,00 А) |
| arccos(PF) | 0° | 49,2° |
| сдвиг первой гармоники тока | 0° | 10,8° (cos 0,982) |
Что видно. Конденсатор заряжается только у вершины синусоиды: ток течёт 31 % времени короткими импульсами. Отсюда пик 7,00 А при действующем 2,806 А и коэффициент мощности 0,654. Но сдвига почти нет: первая гармоника тока опережает напряжение на 10,8°, её косинус 0,982. Мощность теряется не на сдвиге, а на форме тока: доля первой гармоники в действующем токе — 0,698, остальных гармоник в нём больше, чем основной (103 %). Полезную мощность переносит в основном первая гармоника, а действующий ток — и полная мощность — растут от всех.
Почему угол обманывает. Если угол — arccos коэффициента мощности (36м.5), прибор покажет 49,2°, хотя синусоиды сдвинуты на 10,8°. Конденсатор или дроссель «для компенсации сдвига» здесь не помогут — нечего компенсировать. Помогает только другая форма тока: корректор коэффициента мощности (активный — тот же повышающий преобразователь из 58.1) или дроссель на входе.
Пик-фактор и настройка канала. Ток 7,00 А в пике при действующем 2,806 А: шкалу канала тока выбирают по пику, а не по показаниям амперметра. В листинге 36м.8 канал тока — 2 А/дел: 25 кодов на деление, шаг 0,08 А, предел ±10,24 А — пик помещается. Токовые клещи перед измерением размагничивают (на DHO1000/4000 — командой, 36м.3).
Пульсации на выходе. На конденсаторе в среднем 28,4 В, размах
пульсаций 4,55 В с частотой 100 Гц: это и измеряет RIPPle
(Meas_Vpp). Выход отдаёт 40,3 Вт, на входе 42,3 Вт — мост и
обмотка забирают 5 %. Как уменьшить пульсации ёмкостью и почему у
импульсного стабилизатора к ним добавляются выбросы на частоте
переключения — 58.3 и 36г.7.
Двигатель. Тот же расчёт на входе привода двигателя: у привода с выпрямителем и конденсатором звена (57а) форма тока та же, что выше; у асинхронного двигателя прямо от сети, наоборот, ток почти синусоидален, и коэффициент мощности теряется на настоящем сдвиге. Анализ мощности различает эти случаи только вместе с пик-фактором: высокий пик-фактор — форма, низкий при малом PF — сдвиг. Ток в обмотках самого двигателя и как его мерить — 57б.
Безопасность. Пример намеренно взят на вторичной обмотке 24 В. На стороне сети 230 В напряжение снимают только дифференциальным щупом или изолированным каналом, ток — токовыми клещами; землю осциллографа не отрезают никогда (36а.5, 36з, 208.7). Анализ мощности этого правила не отменяет: он считает то, что пришло в каналы.
Ошибка. Сравнивать «мощность» с ваттметра-розетки и с прибора без проверки, что в окне целое число периодов. В модели окно — 10 периодов 50 Гц; при дробном числе периодов активная мощность «гуляет» от записи к записи.
36м.7 Перенос скрипта с DHO900: что поменять
Скрипт для DHO900 из 36ж на DHO1000/4000 в основном заработает: чтение памяти и измерения устроены одинаково (36м.2). Ломается он на мелочах — на значениях параметров, которых у другой серии нет:
| что | DHO800/900 | DHO1000/4000 | что делать в скрипте |
|---|---|---|---|
| модель | *IDN?: «RIGOL TECHNOLOGIES,<модель>,<серийный>,<версия>» (с. 148) |
так же (с. 144) | серию брать из второго поля |
| число каналов | :SYSTem:RAMount? |
:SYSTem:RAMount? «всегда 4» (с. 283) при двухканальных DHO1072, DHO1102, DHO1202 |
брать из последней цифры модели |
| наименьший масштаб при щупе 1X | DHO800 500 мкВ/дел, DHO900 200 мкВ/дел (с. 97) | DHO4000 100 мкВ/дел, DHO1000 500 мкВ/дел (с. 98) | не ставить меньше; читать масштаб обратно |
| смещение | ±8 В от 65,01 до 260 мВ/дел (с. 96) | ±10 В от 65,1 до 270 мВ/дел (с. 97) | не рассчитывать на запас ±10 В на DHO900 |
| вход 50 Ом | команды нет | :CHANnel<n>:IMPedance FIFTy — только DHO4000 (с. 99) |
ставить OMEG явно, FIFTy — только осознанно |
| ограничение полосы | 20M (с. 93) | 20M или 250M (с. 93) | 250M — только DHO4000 |
| глубина памяти, 1 канал | DHO800 25M, DHO900 50M | DHO1000 50M (опция 100M), DHO4000 250M (опция 500M) | выбирать по серии; 1M есть везде |
| то же, 2 канала | DHO800 10M, DHO900 25M | DHO1000 25M (50M), DHO4000 125M (250M) | |
| то же, 3–4 канала | DHO800 5M, DHO900 10M | DHO1000 10M (25M), DHO4000 50M (100M и 125M) | 5M у старших нет |
| режим сбора | Normal, Average, Peak, UltraAcquire (с. 43) | плюс HRESolution и :ACQuire:BITS (с. 37, 40) |
|
| чтение осциллограммы | :WAVeform, источники D0–D15 только у DHO900 |
те же 14 команд и преамбула | без изменений |
| измерения | :MEASure:ITEM, 42 величины, D0–D15 у DHO900 (с. 217) |
те же 42 величины (с. 196–197) | без изменений |
| декодирование | PARallel, RS232, SPI, IIC, LIN (DHO900), CAN (с. 47) | плюс IIS, FLEXray, M1553 — DHO4000 с опциями (с. 44–45) | |
| сохранение | :SAVE и :SAVe:SMB |
:SAVE и :LOAD — те же команды без SMB |
без изменений, если без SMB |
| мощность | :POWer нет — считать самим |
:POWer у DHO4000 с UPA |
ветка по :SYSTem:OPTion:STATus? UPA |
Отношение памяти. На двух каналах DHO4000 без опций держит в 5 раз
больше точек, чем DHO900; с опцией на одном канале — в 10 раз. Это не
бесплатно: чтение по сети идёт кусками через :WAVeform:STARt и STOP,
и время выгрузки растёт так же (36ж).
Ошибка. Перенести «магические» значения: 5M, масштаб 200 мкВ/дел
на DHO1000, :BUS1:MODE LIN на DHO800. Каждое — ошибка −113 или
другая в очереди, и без проверки очереди после каждой команды скрипт
молча снимет не то.
36м.8 Один скрипт на все серии
Задача. Измерить мощность на входе блока питания из 36м.6: канал 1 —
напряжение (дифференциальный щуп), канал 2 — ток (токовые клещи),
10 периодов 50 Гц. Скрипт узнаёт модель по *IDN?, на DHO4000 с опцией
UPA отдаёт расчёт прибору, на остальных читает память двух каналов и
считает сам:
# dho_any.py — мощность на входе блока питания: DHO800/900 и DHO1000/4000 одним скриптом
import re, sys, time
import numpy as np
import pyvisa
ADDR = sys.argv[1] # VISA-адрес: Utility → IO или :LAN:VISA?
CHUNK = 250000 # точек за одно чтение :WAVeform:DATA?
DEPTH2 = {"800": "10M", "900": "25M", "1000": "25M", "4000": "125M"} # наибольшая память на 2 канала без опций
scope = pyvisa.ResourceManager().open_resource(ADDR)
scope.timeout = 10000
scope.read_termination = scope.write_termination = "\n"
def cmd(s):
scope.write(s)
err = scope.query(":SYSTem:ERRor?").strip()
if int(err.split(",")[0]) != 0:
raise RuntimeError(s + " -> " + err)
def series(model):
"""DHO924S -> ("900", 4), DHO1072 -> ("1000", 2), DHO4804 -> ("4000", 4)."""
num = re.fullmatch(r"DHO(\d{3,4})S?", model).group(1)
return num[0] + "0" * (len(num) - 1), int(num[-1])
def si(text):
"""'4.5289mW' -> 0.0045289: так :POWer:...:RESult? пишет числа."""
m = re.match(r"([-+0-9.eE]+)([pnumkMG]?)", text)
return float(m.group(1)) * {"p": 1e-12, "n": 1e-9, "u": 1e-6, "m": 1e-3, "": 1.0,
"k": 1e3, "M": 1e6, "G": 1e9}[m.group(2)]
model = scope.query("*IDN?").split(",")[1]
ser, nch = series(model)
upa = ser == "4000" and scope.query(":SYSTem:OPTion:STATus? UPA").strip() == "1"
print("%s: серия DHO%s, каналов %d, память на 2 канала до %s, :POWer %s"
% (model, ser, nch, DEPTH2[ser], "есть" if upa else "нет — считаем сами"))
scope.write("*RST")
while scope.query("*OPC?").strip() != "1":
time.sleep(0.1)
for ch, probe, scale, unit in ((1, 10, 10, "VOLTage"), (2, 10, 2, "AMPere")):
cmd(":CHANnel%d:DISPlay ON" % ch)
cmd(":CHANnel%d:PROBe %d" % (ch, probe)) # дифференциальный щуп / токовые клещи
cmd(":CHANnel%d:UNITs %s" % (ch, unit))
cmd(":CHANnel%d:SCALe %g" % (ch, scale)) # 10 В/дел и 2 А/дел
cmd(":CHANnel%d:OFFSet 0" % ch)
cmd(":TIMebase:MAIN:SCALe 0.02") # 20 мс/дел: 10 периодов 50 Гц
cmd(":ACQuire:MDEPth 1M") # есть во всех четырёх сериях
cmd(":TRIGger:MODE EDGE")
cmd(":TRIGger:EDGE:SOURce CHANnel1")
cmd(":TRIGger:EDGE:LEVel 0")
cmd(":SINGle")
t0 = time.time()
while scope.query(":TRIGger:STATus?").strip() != "STOP":
if time.time() - t0 > 5:
raise TimeoutError("нет запуска за 5 с")
time.sleep(0.05)
if upa: # DHO4000 с опцией UPA: считает прибор
cmd(":POWer:TYPE QUALity")
cmd(":POWer:VOLTage:SOURce CHANnel1")
cmd(":POWer:CURRent:SOURce CHANnel2")
cmd(":POWer:QUALity:DISPlay ON")
rows = re.findall(r"\[([^\[\]]+)\]", scope.query(":POWer:QUALity:STATistics:RESult?"))
table = {r.split(",")[0].strip('"'): [c.strip('"') for c in r.split(",")] for r in rows}
head = table.pop("Name")
cur = {k: si(v[head.index("Current")]) for k, v in table.items()}
vrms, irms, p, crest = cur["Vrms"], cur["Irms"], cur["Real_P"], cur["I_CrestFactor"]
else: # остальные: память двух каналов и numpy
cmd(":WAVeform:MODE RAW")
cmd(":WAVeform:FORMat BYTE")
wave = []
for ch in (1, 2):
cmd(":WAVeform:SOURce CHANnel%d" % ch)
pre = scope.query(":WAVeform:PREamble?").split(",")
npts, yinc, yorg, yref = int(pre[2]), float(pre[7]), float(pre[8]), float(pre[9])
raw = b""
for start in range(1, npts + 1, CHUNK):
cmd(":WAVeform:STOP %d" % min(start + CHUNK - 1, npts))
cmd(":WAVeform:STARt %d" % start)
raw += scope.query_binary_values(":WAVeform:DATA?", datatype="B", container=bytes)
wave.append((np.frombuffer(raw, np.uint8) - yorg - yref) * yinc)
v, i = wave
vrms, irms = np.sqrt(np.mean(v * v)), np.sqrt(np.mean(i * i))
p, crest = np.mean(v * i), np.abs(i).max() / irms
scope.close()
print("Vrms %.2f В, Irms %.3f А, P %.2f Вт, S %.2f ВА, PF %.3f, пик-фактор тока %.2f"
% (vrms, irms, p, vrms * irms, p / (vrms * irms), crest))
Как устроено. Серия — из имени модели: три цифры — DHO800/900,
четыре — DHO1000/4000; последняя цифра — число каналов, поэтому
:SYSTem:RAMount? не нужен (36м.7). :SYSTem:OPTion:STATus? UPA
спрашивают только у DHO4000: у DHO1000 такой опции нет, у DHO900 —
самой команды. Всё, что отличает серии, собрано в ветке if upa;
настройка канала, запуск и чтение памяти — общие. Глубина 1M выбрана
потому, что она есть во всех четырёх сериях; окно 200 мс при ней — это
5 Мвыб/с. Каждая команда проверяется по очереди ошибок, как в 36ж:
команда чужой серии не пройдёт молча.
Прогон. Четыре подставных прибора в контейнере — DHO924, DHO1204, DHO4204 без опции и DHO4804 с опцией UPA. Каждый знает только заголовки команд из руководства своей серии (проверка сверяет их с PDF) и отдаёт сигнал модели 36м.6:
DHO924: серия DHO900, каналов 4, память на 2 канала до 25M, :POWer нет — считаем сами
Vrms 23.07 В, Irms 2.805 А, P 42.29 Вт, S 64.70 ВА, PF 0.654, пик-фактор тока 2.48
DHO1204: серия DHO1000, каналов 4, память на 2 канала до 25M, :POWer нет — считаем сами
Vrms 23.07 В, Irms 2.805 А, P 42.29 Вт, S 64.70 ВА, PF 0.654, пик-фактор тока 2.48
DHO4204: серия DHO4000, каналов 4, память на 2 канала до 125M, :POWer нет — считаем сами
Vrms 23.07 В, Irms 2.805 А, P 42.29 Вт, S 64.70 ВА, PF 0.654, пик-фактор тока 2.48
DHO4804: серия DHO4000, каналов 4, память на 2 канала до 125M, :POWer есть
Vrms 23.06 В, Irms 2.806 А, P 42.30 Вт, S 64.71 ВА, PF 0.654, пик-фактор тока 2.49
Ошибок в очередях — 0 на всех четырёх; выход за шкалу — 0 точек.
Ветка «считаем сами» прочитала по два канала за 8 обращений
:WAVeform:DATA? и разошлась с прибором в последнем знаке: код
BYTE — 256 ступеней, шаг напряжения 0,4 В при 10 В/дел. На DHO4804
ушло 5 команд :POWer и ни одного чтения памяти.
Чего прогон не доказывает. Подставной прибор отвечает так, как
описано в руководствах, — но настоящий может отвечать иначе: ждать
ли накопления статистики перед :RESult?, приходит ли таблица одной
строкой (перевод строки внутри ответа оборвал бы чтение на первой
строке), какие точно единицы в Imp. На DHO1000 и DHO4000 листинг
не запускался.
Ошибка. Узнавать серию по :SYSTem:RAMount? или по наличию
команды «попробуем — вдруг ответит»: первое врёт на двухканальных
DHO1000, второе оставляет ошибку в очереди и ломает проверку
следующей команды.
36м.9 Грабли
«Старше» не значит «больше». Генератора, АЧХ, цифровых каналов и гистограммы в руководстве DHO1000/4000 нет (36м.4).
Анализ мощности на DHO1000. Не поддерживается; на DHO4000 — только с опцией UPA (36м.5).
Угол — не сдвиг. На выпрямителе с конденсатором arccos(PF) = 49,2° при сдвиге первой гармоники 10,8° (36м.6).
Imp в 1000 раз. В примере руководства 991,39 Ом при Vrms/Irms = 0,9914 Ом — проверить единицы на известной нагрузке (36м.5).
Значения по умолчанию вне диапазона. ABSolute HIGH 300 мВ при диапазоне ±100 мВ — ставить уровни явно (36м.5).
5M и 200 мкВ/дел. Есть у DHO900, нет у DHO4000 или DHO1000 (36м.7).
:SYSTem:RAMount? = 4 на двухканальном. Каналы — из модели (36м.7).
Разные годы руководств. 2022 и 2024: различие может быть прошивкой; проверяет сам прибор и его очередь ошибок (36м.2).
Шкала тока по действующему значению. Пик-фактор 2,49 — шкалу выбирают по пику (36м.6).
36м.10 Итоги
- По руководству по программированию: DHO4000 — 200…800 МГц, 4 канала,
вход 50 Ом, память до 250 млн точек (500 млн с опцией), High Res
14/16 бит, анализ мощности и шины FlexRay, I2S, MIL-STD-1553 — опциями.
DHO1000 — 70…200 МГц, 2 или 4 канала, без 50 Ом и без
:POWer. - Наборы команд: 609 и 564, общих 508; только у старших — 101,
только у DHO800/900 — 56. Корень
:POWer— только у старших;:LA,:SOURce,:BODeplot,:HISTogram— только у младших. :WAVeformи:MEASureодинаковы: чтение памяти и измерения переносятся без правок. Ломают перенос значения параметров: глубины памяти, наименьший масштаб, 50 Ом, полоса 250 МГц.- Анализ мощности считает Vrms, Irms, три мощности, коэффициент мощности и пик-факторы. На входе выпрямителя с конденсатором PF 0,654 складывается из формы тока, а не из сдвига; «угол» = arccos(PF).
- Один скрипт на все серии: серия и каналы — из
*IDN?, опция —:SYSTem:OPTion:STATus?, проверка очереди ошибок после каждой команды.
Дальше: раздел 36н «Осциллограф и генератор в работе: практикум на DHO900 и DG900 Pro» — двенадцать задач для осциллографа и генератора на одном столе.