Приручаем осциллографы FNIRSI: программа для анализа сохранённых снимков
Портативные осциллографы FNIRSI давно перестали быть экзотикой на столе радиолюбителя. Компактный 2C23T, «три в одном» 2C53T и 2C53P, планшет 1013D — каждый из них умеет сохранить снимок экрана во встроенную память. Подключаешь прибор по USB, он видится как флешка, копируешь файлы на компьютер. И вот тут начинается самое интересное: картинка есть, а что с ней делать дальше — непонятно.
Готового приложения под все мои осциллографы я не нашёл, поэтому сделал свою программу FNIRSI-2C53T-Decoder, которая открывает сохранённые файлы четырёх моделей FNIRSI, рисует осциллограмму, даёт курсоры и автоматические измерения, считает спектр и выгружает данные в CSV, XLSX, JSON и картинки.
У меня на столе сейчас три прибора FNIRSI: 2C23T, 2C53P и 1013D. Все три умеют сохранять снимки, но каждый делает это по-своему: разные имена файлов, разные папки, разные форматы. Картинку BMP можно вставить в отчёт, но измерить на ней что-то точнее «на глаз» нельзя. А мне хотелось вернуться к сохранённому сигналу вечером, спокойно поставить курсоры, посчитать частоту и размах, сравнить две записи и выгрузить отсчёты в таблицу.
В статье пойдет речь про программу FNIRSI-2C53T-Decoder для Windows, которая дает возможность полноценно работать с форматами снимков экранов этих осциллографов.

Все четыре модели, с которыми работает программа, сохраняют снимок экрана в виде обычного BMP. Разница в том, сохраняют ли они ещё и сами данные — отсчёты сигнала.
• 2C53T — при сохранении пишет пару файлов с одинаковыми именами: N.bmp (снимок экрана 320×240) и N.bin размером 607 байт. В BIN лежат 301 отсчёт на каждый из двух каналов.
• 2C53P — тоже пара, но в двух разных папках: снимок 480×272 в «Screenshot file», а данные в «Screenshot simple file», файл 927 байт, 461 отсчёт на канал.
• 2C23T — сохраняет только картинку img_01.bmp, img_02.bmp и так далее, 320×240. Файлов с данными нет вообще.
• 1013D — сохраняет снимок 800×480 кнопкой SAVE PIC и данные кнопкой SAVE WAVE. Файл данных называется N.wav, но к звуку отношения не имеет: это 15 000 байт с настройками прибора и двумя буферами по 1500 отсчётов.
Выглядит снимок экрана осциллографа как то так. Снимок экрана 2C23T: синусоида 1 кГц, 1 В/дел, 500 мкс/дел. Кроме этой картинки прибор не сохраняет других данных.

Снимок экрана 2C53P. Рядом с ним прибор кладёт BIN-файл с 461 отсчётом на канал. В отсчетах — сырые данные с АЦП, которые в теории могут дать информацию для самой «начинки» осциллограф, заново выстраивая весь график.

У 1013D примерно такая же ситуация. Вот пример снимка экрана 1013D: меандр 1 кГц на CH1 (второй канал не подключен, но сути это не меняет).

Схематично форматы файлов данных трёх моделей выглядят так.

Неочевидный момент для меня: файлы 2C53T и 2C53P хранят не амплитуду напряжения, а положение луча на экране. Каждый байт — это номер строки пикселей, где прибор нарисовал точку. Вольты на деление, время на деление и положение нуля в этих файлах не записаны. Без них BIN-файл — просто 301 или 461 число от 0 до 255. Узнать шкалы можно только со снимка экрана: там написано «H=200uS», «500mV» и стоит цветная метка нуля у левого края.
У 1013D всё наоборот, и это самый удобный формат: в заголовке WAV записаны вольты на деление, щуп, вход AC/DC, развёртка и положение нуля каждого канала. Формат 1013D разобрали энтузиасты Robert Tidey и W. Voigt, а формат 2C53T — RafaelDiasCampos, их работы есть на GitHub. Я перепроверил их выводы на файлах со своих приборов и дописал то, чего не хватало: флаги включения каналов 1013D, раскладку 2C53P и связь между буфером и экранными точками. К слову, именно для 1013D существуют альтернативные прошивки, которые дают возможность делать экспорт таблиц данных, использовать его как USB-осциллограф, а также подключать его к Ai-агентам (да, даже такое).

Собственно говоря, такие портативные и карманные осциллографы уже не раз выручали меня. Стоит такая модель совсем недорого, а вот пользы заметно больше. Сам по себе экран осциллографа отлично подходит для работы «здесь и сейчас». Ну и минусов у таких приборов «вагон и тележка» — экран маленький и совсем неудобен для измерений и работы с курсорами. На 2C23T и 2C53T это 320×240 пикселей — поставить курсоры точно на фронт сигнала весьма трудно. Да и сравнить два сигнала, снятых в разное время на одном экране попросту невозможно.

Отсюда и появилась идея сделать программу, чтобы можно было открыть файлы прямо с памяти осциллографа, построить честный график, дать курсоры и автоматические измерения, выгрузить отсчёты в таблицу. Программа сделана в виде portable-архива: распаковал, запустил FNIRSI-2C53T-Decoder.exe, и всё работает без установки Python и без Microsoft Office. Окно разделено на три части.
• Слева — список съёмных дисков (прибор появляется в нём сам после подключения), дерево папок, таблица файлов со статусом декодирования и «рабочая область» для сравнения нескольких записей.
• В центре — график и вкладка со снимком экрана прибора.
• Справа — вкладки «Файл», «Шкалы», «Вид», «Курсоры» и «Измерения».
Модель прибора программа определяет сама: по размеру BIN (607 или 927 байт), по расширению WAV или по размеру снимка. Для неоднозначных случаев — например, снимок 320×240 может быть и от 2C53T, и от 2C23T — модель выбирается в выпадающем списке слева. Файлы на приборе программа только читает, на диск осциллографа ничего не пишет.
Главное окно: запись 1013D, меандр 1 кГц, курсоры A/B и Y1/Y2, справа — автоматические измерения.

Для 2C53T и 2C53P шкалы (вольты и секунды) приходится читать со снимка экрана. Программа делает три вещи.
• Сверяет данные со снимком: каждый отсчёт из BIN ищется на соответствующем пикселе луча. На моих файлах 2C53P совпали 458 точек из 461. Если снимок не совпадает с данными, шкалы с него не берутся.
• Находит метку нуля канала — цветной треугольник у левого края. Ноль канала равен номеру строки центра метки, пересчитанному в коды.
• Распознаёт надписи «H=1mS», «1V X1 AC» по шаблонам символов. Шаблоны программа выучила на реальных снимках. Если встретится незнакомый символ, поле честно помечается «не распознано», а шкалу нужно ввести руками.
Вкладка «Снимок BMP»: красные точки — отсчёты из BIN, нанесённые на снимок 2C53P. Внизу — сколько точек совпало и какие надписи распознаны.

Каждое значение шкалы помечено источником: «из файла данных» (так у 1013D), «распознано по BMP» (у 2C53T, 2C53P, 2C23T), «введено вручную» или «неизвестно». Вольты на деление вводятся так, как показаны на экране прибора, то есть уже с учётом щупа X10.

А если шкалы нет совсем, программа не подставляет «удобные» 1 В и 1 мс. Ось X показывается в номерах отсчётов, ось Y — в делениях от центра экрана, а в строке состояния висит предупреждение. Так сделано специально: лучше честное «не знаю», чем красивая, но неверная цифра. Бывает такое, на самом деле, но редко. Я предпочитаю не лениться и переделать замеры в таких случаях. Выручает записывание в блокнотик условий замера — иногда это помогает восстановить данные. Вот пример открытого файла без шкал: оси в отсчётах и делениях, справа — список того, чего не хватает.

Как работать с программой.
Беру файл от 2C53P с синусоидой: 1 В/дел, 1 мс/дел. Ставлю курсор A на вершину, курсор B — на соседнюю вершину. Привязка к отсчётам включена, поэтому курсоры встают ровно на точки данных. Программа показывает Δt = 1 мс и 1/|Δt| = 1 кГц. Горизонтальные курсоры Y1 и Y2 на вершину и впадину дают ΔV = 3,35 В.

Одну тонкость программа подсказывает прямо в интерфейсе: 1/|Δt| — это частота сигнала только тогда, когда курсоры стоят на одинаковых фазах соседних периодов. Иначе это просто величина, обратная интервалу.
Автоматические измерения той же записи на соседней вкладке, считают минимум, максимум, размах, среднее, RMS, RMS переменной составляющей, амплитуды, период, частоту и скважность. Частота считается по фронтам с гистерезисом, чтобы шум не создавал ложных пересечений. Для этой синусоиды: размах 3,41 В, частота 993 Гц, скважность 49,8 %. Если фронтов меньше двух или сигнал тонет в шуме, вместо числа будет «Недостаточно данных» — никаких случайных значений.

Отдельно про разрешение. 2C53P сохраняет экранные точки: 461 отсчёт по горизонтали и 32 кода на вертикальное деление. Это шаг 0,03 деления — для оценки формы и частоты достаточно, но это не 12-битный АЦП. Программа пишет об этом прямо на вкладке измерений.
Пара слов про работу с 2C23T. Как я уже сказал выше, тут никаких файлов с данными или отчетами — просто скриншоты. Значит, данные можно получить только одним способом — оцифровать луч прямо по пикселям снимка.
Программа знает цвета лучей 2C23T (CH1 синий, CH2 жёлто-зелёный) и геометрию сетки: 12 на 8 делений по 25 пикселей. В каждом столбце экрана она находит пиксели луча и берёт их середину. Строки, где прибор печатает «Vavg / Vpp / Freq» поверх графика, пропускаются, а пропуски заполняются с явным предупреждением. Шкалы — «50us», «500mV X1 AC» — распознаются шаблонами, как и у 2C53.
Снимок 2C23T и оцифрованная кривая: точки оцифровки нанесены на снимок красным.

Насколько это точно? Проверил на своих нескольких снимках. На безрыбье, и рак — рыба. Частота совпадает с показаниями прибора: 1,00 кГц против 1,00 кГц, 11,07 кГц против 11,11 кГц. А вот размах получается на 2–10 % меньше, чем показывает 2C23T: тонкие вершины пилы и треугольника теряются, когда берёшь середину штриха. Программа подписывает такие данные как «оцифрованы со снимка, точность ±1 пиксель», чтобы их не перепутали с настоящими отсчётами.
Оцифрованный меандр 2C23T на графике: 11,07 кГц, шаг 2 мкс.

А вот с 1013D гораздо приятнее работать. Несмотря на то, что это довольно старая модель, она достаточно продвинутая в плане возможностей. Файл WAV содержит буфер на 1500 отсчётов по 16 бит — это 30 делений по горизонтали, вдвое больше, чем видно на экране. В заголовке лежат все настройки, поэтому шкалы программа берёт прямо из файла. В строке состояния так и написано: «шкалы известны».
Проверка на моих файлах: меандр 1 кГц при 1 В/дел даёт размах 3,24 В и частоту 1,000 кГц, а сам 1013D показывал на экране 3,17 В и 1,00 кГц. Ноль канала из заголовка попадает ровно на метку «1» на снимке. А 750 точек, которые прибор рисует на экране, оказались точным куском буфера, поэтому программа может показать, какой участок записи был виден на приборе. Запись 1013D в режиме «каждый канал отдельно»: курсоры синхронизированы на обоих графиках.

Одна особенность 1013D, на которой я сначала споткнулся: снимок и данные сохраняются отдельными командами и нумеруются независимо. Я сохранял их парами 19, 20, 21 — настройки в WAV и на снимке совпали полностью, а вот сами кадры нет: прибор был в режиме RUN, и между нажатиями сигнал успел сдвинуться. Вывод простой: если нужна точная пара «картинка + данные», сначала нажимаем STOP, потом SAVE PIC и SAVE WAVE.
Рабочая область позволяет положить на один график записи с разных приборов.
Ниже — меандр 1 кГц с 1013D и меандр с 2C53P. У каждой записи свой цвет, каналы включаются отдельно. Сдвиги по X и Y можно задать вручную, но они применяются только к картинке — в экспорт всегда идут исходные координаты.

Окно спектра (клавиша F) считает FFT по всей записи или по участку между курсорами. Для меандра 1013D с окном flat-top картинка как из учебника: пики на 1, 3, 5, 7 и 9 кГц с амплитудами 2,03 В, 0,67 В, 0,40 В, 0,29 В и 0,22 В. Отношение амплитуд третьей и первой гармоники — 0,33, пятой — 0,20, ровно 1/3 и 1/5, как и положено меандру. Дополнение нулями в программе есть, но она прямо пишет, что разрешение от этого не растёт: реальное разрешение здесь 66,7 Гц и определяется 1500 отсчётами.

Теперь самое интересное — экспорт в таблицы и картинки.
Ради экспорта всё и затевалось. Ctrl+E открывает окно, где выбирается: текущая запись, все записи по отдельности или один общий CSV, и форматы — CSV, XLSX, JSON, PNG, SVG, PDF.

CSV получается машинно-читаемым: одна строка заголовка, десятичная точка, только те столбцы, которые действительно известны. Если шкала времени неизвестна, столбца time_s просто не будет — программа не придумывает время.

Для Excel есть отдельный вариант: точка с запятой и десятичная запятая, такой файл открывается двойным щелчком без мастера импорта.

XLSX собирается из листов: Waveform с отсчётами, Measurements с измерениями и методом расчёта, Metadata с настройками и их источниками, и FFT, если спектр считался.

Лист Metadata: у каждого параметра указан источник — из файла, со снимка или введён вручную.

Есть и экспорт картинок.
Картинки PNG, SVG и PDF строятся в «отчётном» виде: белый фон, оси с единицами, легенда, курсоры с подписями и предупреждения внизу, если с данными что-то не так. Есть и пакетный экспорт: выбрал папку прибора — получил CSV и PNG по каждой записи. Файл с ошибкой не останавливает пакет, а попадает в итоговый список.

Статья будет неполной, если не упомянуть про альтернативные прошивки для осциллографов, а конкретно — для FNIRSI 1013D. Существует несколько вариантов альтернативного программного обеспечения, расширяющих возможности штатной прошивки. Одна из наиболее известных прошивок — это Atlan 0.26v2, с доработками интерфейса, работой с опорными осциллограммами REF. Прошивка Atlan 0.27 получила поддержку USB CDC — прямого подключения осциллографа к компьютеру как виртуального COM-порта. Есть еще вариант — это fnirsi-1013d-mcp, объединяющий альтернативную прошивку, собственную конфигурацию FPGA и MCP-сервер для управления осциллографом с компьютера и AI-агентами. Проект интересен автоматизированными измерениями и анализом сигналов, расширенными возможностями работы с осциллограммами, измерениями, FFT и декодированием цифровых протоколов UART, SPI и I²C. В отличие от Atlan, это не просто обновление пользовательской прошивки: требуется совместимая FPGA, программирование её SPI Flash и подготовка загрузочной карты.
Скажу честно — пока не прошивал, довольствуюсь разработанной программой (благо 1013D умеет сохранять в удобоваримом формате). К тому же прошивка альтернативного ПО требует подбора версии под аппаратную ревизию, нужно проверять совместимость дисплея и сенсора, а также самостоятельно разбираться с USB-протоколом и возможностями передачи осциллограмм. Плюс нужен программатор для SPI-флешки и ПЛИС.

Итак, чего удалось добиться:
• Отсчёты 2C53T и 2C53P — экранные: 301 и 461 точка, по вертикали шаг 1/25 и 1/32 деления. Встроенные измерения прибора считаются по полной внутренней записи, поэтому могут отличаться от программы на пару процентов. Меня такая точность более чем устраивает.
• 2C23T не сохраняет данные в табличном виде, а только картинкой. Оцифровка этих картинок даёт ±1 пиксель, а размах выходит чуть меньше реального. Точность меньше, чем хотелось бы, но если вы работали с не-сенсорным 2C23T, то вы меня должны понять.
• 1013D — лучший кандидат для анализа на ПК: 1500 отсчётов и все настройки в файле. Но работают только файлы штатной прошивки FNIRSI; файлы альтернативных прошивок программа не открывает и прямо об этом сообщает.
Программа бесплатная для некоммерческого использования (лицензия CC BY-NC 4.0). Исходный код, готовый архив для Windows, инструкция и описание форматов — на GitHub: github.com/lexus2026HA/FNIRSI-2C53T-Decoder. В архиве есть папка samples с моими записями всех трёх приборов, чтобы попробовать программу без осциллографа.
Готового приложения под все мои осциллографы я не нашёл, поэтому сделал свою программу FNIRSI-2C53T-Decoder, которая открывает сохранённые файлы четырёх моделей FNIRSI, рисует осциллограмму, даёт курсоры и автоматические измерения, считает спектр и выгружает данные в CSV, XLSX, JSON и картинки.
У меня на столе сейчас три прибора FNIRSI: 2C23T, 2C53P и 1013D. Все три умеют сохранять снимки, но каждый делает это по-своему: разные имена файлов, разные папки, разные форматы. Картинку BMP можно вставить в отчёт, но измерить на ней что-то точнее «на глаз» нельзя. А мне хотелось вернуться к сохранённому сигналу вечером, спокойно поставить курсоры, посчитать частоту и размах, сравнить две записи и выгрузить отсчёты в таблицу.
В статье пойдет речь про программу FNIRSI-2C53T-Decoder для Windows, которая дает возможность полноценно работать с форматами снимков экранов этих осциллографов.

Все четыре модели, с которыми работает программа, сохраняют снимок экрана в виде обычного BMP. Разница в том, сохраняют ли они ещё и сами данные — отсчёты сигнала.
• 2C53T — при сохранении пишет пару файлов с одинаковыми именами: N.bmp (снимок экрана 320×240) и N.bin размером 607 байт. В BIN лежат 301 отсчёт на каждый из двух каналов.
• 2C53P — тоже пара, но в двух разных папках: снимок 480×272 в «Screenshot file», а данные в «Screenshot simple file», файл 927 байт, 461 отсчёт на канал.
• 2C23T — сохраняет только картинку img_01.bmp, img_02.bmp и так далее, 320×240. Файлов с данными нет вообще.
• 1013D — сохраняет снимок 800×480 кнопкой SAVE PIC и данные кнопкой SAVE WAVE. Файл данных называется N.wav, но к звуку отношения не имеет: это 15 000 байт с настройками прибора и двумя буферами по 1500 отсчётов.
Выглядит снимок экрана осциллографа как то так. Снимок экрана 2C23T: синусоида 1 кГц, 1 В/дел, 500 мкс/дел. Кроме этой картинки прибор не сохраняет других данных.

Снимок экрана 2C53P. Рядом с ним прибор кладёт BIN-файл с 461 отсчётом на канал. В отсчетах — сырые данные с АЦП, которые в теории могут дать информацию для самой «начинки» осциллограф, заново выстраивая весь график.

У 1013D примерно такая же ситуация. Вот пример снимка экрана 1013D: меандр 1 кГц на CH1 (второй канал не подключен, но сути это не меняет).

Схематично форматы файлов данных трёх моделей выглядят так.

Неочевидный момент для меня: файлы 2C53T и 2C53P хранят не амплитуду напряжения, а положение луча на экране. Каждый байт — это номер строки пикселей, где прибор нарисовал точку. Вольты на деление, время на деление и положение нуля в этих файлах не записаны. Без них BIN-файл — просто 301 или 461 число от 0 до 255. Узнать шкалы можно только со снимка экрана: там написано «H=200uS», «500mV» и стоит цветная метка нуля у левого края.
У 1013D всё наоборот, и это самый удобный формат: в заголовке WAV записаны вольты на деление, щуп, вход AC/DC, развёртка и положение нуля каждого канала. Формат 1013D разобрали энтузиасты Robert Tidey и W. Voigt, а формат 2C53T — RafaelDiasCampos, их работы есть на GitHub. Я перепроверил их выводы на файлах со своих приборов и дописал то, чего не хватало: флаги включения каналов 1013D, раскладку 2C53P и связь между буфером и экранными точками. К слову, именно для 1013D существуют альтернативные прошивки, которые дают возможность делать экспорт таблиц данных, использовать его как USB-осциллограф, а также подключать его к Ai-агентам (да, даже такое).

Собственно говоря, такие портативные и карманные осциллографы уже не раз выручали меня. Стоит такая модель совсем недорого, а вот пользы заметно больше. Сам по себе экран осциллографа отлично подходит для работы «здесь и сейчас». Ну и минусов у таких приборов «вагон и тележка» — экран маленький и совсем неудобен для измерений и работы с курсорами. На 2C23T и 2C53T это 320×240 пикселей — поставить курсоры точно на фронт сигнала весьма трудно. Да и сравнить два сигнала, снятых в разное время на одном экране попросту невозможно.

Отсюда и появилась идея сделать программу, чтобы можно было открыть файлы прямо с памяти осциллографа, построить честный график, дать курсоры и автоматические измерения, выгрузить отсчёты в таблицу. Программа сделана в виде portable-архива: распаковал, запустил FNIRSI-2C53T-Decoder.exe, и всё работает без установки Python и без Microsoft Office. Окно разделено на три части.
• Слева — список съёмных дисков (прибор появляется в нём сам после подключения), дерево папок, таблица файлов со статусом декодирования и «рабочая область» для сравнения нескольких записей.
• В центре — график и вкладка со снимком экрана прибора.
• Справа — вкладки «Файл», «Шкалы», «Вид», «Курсоры» и «Измерения».
Модель прибора программа определяет сама: по размеру BIN (607 или 927 байт), по расширению WAV или по размеру снимка. Для неоднозначных случаев — например, снимок 320×240 может быть и от 2C53T, и от 2C23T — модель выбирается в выпадающем списке слева. Файлы на приборе программа только читает, на диск осциллографа ничего не пишет.
Главное окно: запись 1013D, меандр 1 кГц, курсоры A/B и Y1/Y2, справа — автоматические измерения.

Для 2C53T и 2C53P шкалы (вольты и секунды) приходится читать со снимка экрана. Программа делает три вещи.
• Сверяет данные со снимком: каждый отсчёт из BIN ищется на соответствующем пикселе луча. На моих файлах 2C53P совпали 458 точек из 461. Если снимок не совпадает с данными, шкалы с него не берутся.
• Находит метку нуля канала — цветной треугольник у левого края. Ноль канала равен номеру строки центра метки, пересчитанному в коды.
• Распознаёт надписи «H=1mS», «1V X1 AC» по шаблонам символов. Шаблоны программа выучила на реальных снимках. Если встретится незнакомый символ, поле честно помечается «не распознано», а шкалу нужно ввести руками.
Вкладка «Снимок BMP»: красные точки — отсчёты из BIN, нанесённые на снимок 2C53P. Внизу — сколько точек совпало и какие надписи распознаны.

Каждое значение шкалы помечено источником: «из файла данных» (так у 1013D), «распознано по BMP» (у 2C53T, 2C53P, 2C23T), «введено вручную» или «неизвестно». Вольты на деление вводятся так, как показаны на экране прибора, то есть уже с учётом щупа X10.

А если шкалы нет совсем, программа не подставляет «удобные» 1 В и 1 мс. Ось X показывается в номерах отсчётов, ось Y — в делениях от центра экрана, а в строке состояния висит предупреждение. Так сделано специально: лучше честное «не знаю», чем красивая, но неверная цифра. Бывает такое, на самом деле, но редко. Я предпочитаю не лениться и переделать замеры в таких случаях. Выручает записывание в блокнотик условий замера — иногда это помогает восстановить данные. Вот пример открытого файла без шкал: оси в отсчётах и делениях, справа — список того, чего не хватает.

Как работать с программой.
Беру файл от 2C53P с синусоидой: 1 В/дел, 1 мс/дел. Ставлю курсор A на вершину, курсор B — на соседнюю вершину. Привязка к отсчётам включена, поэтому курсоры встают ровно на точки данных. Программа показывает Δt = 1 мс и 1/|Δt| = 1 кГц. Горизонтальные курсоры Y1 и Y2 на вершину и впадину дают ΔV = 3,35 В.

Одну тонкость программа подсказывает прямо в интерфейсе: 1/|Δt| — это частота сигнала только тогда, когда курсоры стоят на одинаковых фазах соседних периодов. Иначе это просто величина, обратная интервалу.
Автоматические измерения той же записи на соседней вкладке, считают минимум, максимум, размах, среднее, RMS, RMS переменной составляющей, амплитуды, период, частоту и скважность. Частота считается по фронтам с гистерезисом, чтобы шум не создавал ложных пересечений. Для этой синусоиды: размах 3,41 В, частота 993 Гц, скважность 49,8 %. Если фронтов меньше двух или сигнал тонет в шуме, вместо числа будет «Недостаточно данных» — никаких случайных значений.

Отдельно про разрешение. 2C53P сохраняет экранные точки: 461 отсчёт по горизонтали и 32 кода на вертикальное деление. Это шаг 0,03 деления — для оценки формы и частоты достаточно, но это не 12-битный АЦП. Программа пишет об этом прямо на вкладке измерений.
Пара слов про работу с 2C23T. Как я уже сказал выше, тут никаких файлов с данными или отчетами — просто скриншоты. Значит, данные можно получить только одним способом — оцифровать луч прямо по пикселям снимка.
Программа знает цвета лучей 2C23T (CH1 синий, CH2 жёлто-зелёный) и геометрию сетки: 12 на 8 делений по 25 пикселей. В каждом столбце экрана она находит пиксели луча и берёт их середину. Строки, где прибор печатает «Vavg / Vpp / Freq» поверх графика, пропускаются, а пропуски заполняются с явным предупреждением. Шкалы — «50us», «500mV X1 AC» — распознаются шаблонами, как и у 2C53.
Снимок 2C23T и оцифрованная кривая: точки оцифровки нанесены на снимок красным.

Насколько это точно? Проверил на своих нескольких снимках. На безрыбье, и рак — рыба. Частота совпадает с показаниями прибора: 1,00 кГц против 1,00 кГц, 11,07 кГц против 11,11 кГц. А вот размах получается на 2–10 % меньше, чем показывает 2C23T: тонкие вершины пилы и треугольника теряются, когда берёшь середину штриха. Программа подписывает такие данные как «оцифрованы со снимка, точность ±1 пиксель», чтобы их не перепутали с настоящими отсчётами.
Оцифрованный меандр 2C23T на графике: 11,07 кГц, шаг 2 мкс.

А вот с 1013D гораздо приятнее работать. Несмотря на то, что это довольно старая модель, она достаточно продвинутая в плане возможностей. Файл WAV содержит буфер на 1500 отсчётов по 16 бит — это 30 делений по горизонтали, вдвое больше, чем видно на экране. В заголовке лежат все настройки, поэтому шкалы программа берёт прямо из файла. В строке состояния так и написано: «шкалы известны».
Проверка на моих файлах: меандр 1 кГц при 1 В/дел даёт размах 3,24 В и частоту 1,000 кГц, а сам 1013D показывал на экране 3,17 В и 1,00 кГц. Ноль канала из заголовка попадает ровно на метку «1» на снимке. А 750 точек, которые прибор рисует на экране, оказались точным куском буфера, поэтому программа может показать, какой участок записи был виден на приборе. Запись 1013D в режиме «каждый канал отдельно»: курсоры синхронизированы на обоих графиках.

Одна особенность 1013D, на которой я сначала споткнулся: снимок и данные сохраняются отдельными командами и нумеруются независимо. Я сохранял их парами 19, 20, 21 — настройки в WAV и на снимке совпали полностью, а вот сами кадры нет: прибор был в режиме RUN, и между нажатиями сигнал успел сдвинуться. Вывод простой: если нужна точная пара «картинка + данные», сначала нажимаем STOP, потом SAVE PIC и SAVE WAVE.
Рабочая область позволяет положить на один график записи с разных приборов.
Ниже — меандр 1 кГц с 1013D и меандр с 2C53P. У каждой записи свой цвет, каналы включаются отдельно. Сдвиги по X и Y можно задать вручную, но они применяются только к картинке — в экспорт всегда идут исходные координаты.

Окно спектра (клавиша F) считает FFT по всей записи или по участку между курсорами. Для меандра 1013D с окном flat-top картинка как из учебника: пики на 1, 3, 5, 7 и 9 кГц с амплитудами 2,03 В, 0,67 В, 0,40 В, 0,29 В и 0,22 В. Отношение амплитуд третьей и первой гармоники — 0,33, пятой — 0,20, ровно 1/3 и 1/5, как и положено меандру. Дополнение нулями в программе есть, но она прямо пишет, что разрешение от этого не растёт: реальное разрешение здесь 66,7 Гц и определяется 1500 отсчётами.

Теперь самое интересное — экспорт в таблицы и картинки.
Ради экспорта всё и затевалось. Ctrl+E открывает окно, где выбирается: текущая запись, все записи по отдельности или один общий CSV, и форматы — CSV, XLSX, JSON, PNG, SVG, PDF.

CSV получается машинно-читаемым: одна строка заголовка, десятичная точка, только те столбцы, которые действительно известны. Если шкала времени неизвестна, столбца time_s просто не будет — программа не придумывает время.

Для Excel есть отдельный вариант: точка с запятой и десятичная запятая, такой файл открывается двойным щелчком без мастера импорта.

XLSX собирается из листов: Waveform с отсчётами, Measurements с измерениями и методом расчёта, Metadata с настройками и их источниками, и FFT, если спектр считался.

Лист Metadata: у каждого параметра указан источник — из файла, со снимка или введён вручную.

Есть и экспорт картинок.
Картинки PNG, SVG и PDF строятся в «отчётном» виде: белый фон, оси с единицами, легенда, курсоры с подписями и предупреждения внизу, если с данными что-то не так. Есть и пакетный экспорт: выбрал папку прибора — получил CSV и PNG по каждой записи. Файл с ошибкой не останавливает пакет, а попадает в итоговый список.

Статья будет неполной, если не упомянуть про альтернативные прошивки для осциллографов, а конкретно — для FNIRSI 1013D. Существует несколько вариантов альтернативного программного обеспечения, расширяющих возможности штатной прошивки. Одна из наиболее известных прошивок — это Atlan 0.26v2, с доработками интерфейса, работой с опорными осциллограммами REF. Прошивка Atlan 0.27 получила поддержку USB CDC — прямого подключения осциллографа к компьютеру как виртуального COM-порта. Есть еще вариант — это fnirsi-1013d-mcp, объединяющий альтернативную прошивку, собственную конфигурацию FPGA и MCP-сервер для управления осциллографом с компьютера и AI-агентами. Проект интересен автоматизированными измерениями и анализом сигналов, расширенными возможностями работы с осциллограммами, измерениями, FFT и декодированием цифровых протоколов UART, SPI и I²C. В отличие от Atlan, это не просто обновление пользовательской прошивки: требуется совместимая FPGA, программирование её SPI Flash и подготовка загрузочной карты.
Скажу честно — пока не прошивал, довольствуюсь разработанной программой (благо 1013D умеет сохранять в удобоваримом формате). К тому же прошивка альтернативного ПО требует подбора версии под аппаратную ревизию, нужно проверять совместимость дисплея и сенсора, а также самостоятельно разбираться с USB-протоколом и возможностями передачи осциллограмм. Плюс нужен программатор для SPI-флешки и ПЛИС.

Итак, чего удалось добиться:
• Отсчёты 2C53T и 2C53P — экранные: 301 и 461 точка, по вертикали шаг 1/25 и 1/32 деления. Встроенные измерения прибора считаются по полной внутренней записи, поэтому могут отличаться от программы на пару процентов. Меня такая точность более чем устраивает.
• 2C23T не сохраняет данные в табличном виде, а только картинкой. Оцифровка этих картинок даёт ±1 пиксель, а размах выходит чуть меньше реального. Точность меньше, чем хотелось бы, но если вы работали с не-сенсорным 2C23T, то вы меня должны понять.
• 1013D — лучший кандидат для анализа на ПК: 1500 отсчётов и все настройки в файле. Но работают только файлы штатной прошивки FNIRSI; файлы альтернативных прошивок программа не открывает и прямо об этом сообщает.
Программа бесплатная для некоммерческого использования (лицензия CC BY-NC 4.0). Исходный код, готовый архив для Windows, инструкция и описание форматов — на GitHub: github.com/lexus2026HA/FNIRSI-2C53T-Decoder. В архиве есть папка samples с моими записями всех трёх приборов, чтобы попробовать программу без осциллографа.
Самые обсуждаемые обзоры
+52
Нет на руках их приборов. Покупать специально лень.
А вообще сделать автоматизированную станцию для работы с ИИ-агентами интересная. Подключить еще и логический анализатор и т.п.
Ниже написал про это
Но с лицензией есть нюансы.
Лицензия CC BY-NC 4.0 предназначена в первую очередь для медиаконтента (тексты, дизайн, медиа), а не для программного обеспечения. Фонд Creative Commons прямо заявляет, что их лицензии не рекомендуются для кода, так как они не учитывают такие понятия, как статическая/динамическая линковка, компиляция и исходный код.
Т. к. PySide6 поставляется под лицензией LGPLv3, то включение его в один .exe нарушает LGPLv3, т. к. та требует, чтобы пользователи имели возможность заменить библиотеку на другую её версию (например, обновить её вручную). В случае .exe (PyInstaller?) это сделать затруднительно. Однако, как пишет ИИ, «большинство авторов open-source проектов не обращают на это внимания, и правообладатель PySide6 (The Qt Company) редко преследует некоммерческие проекты за такие огрехи сборки.»
Но в целом это узко специализированное приложение. По сути, я для себя делал это)
Тем более спасибо, что поделились! :)
Не первый раз наблюдаю такие тупняки.
На днях просил разработать шим-контроллер для волоконного лазера — плавает, собака, не знает что писать. А я уж губу раскатал — китайцы стали разбирать старые волоконные модули и можно достаточно дёшево взять ячейку на 130/260 Вт с резонатором и линзой. Вот только контроллера к ним нету