Введение
Так уж сложилось, что моя профессиональная деятельность связана с разными областями науки и техники. Отчасти это произошло из-за того, что я преподаю в железнодорожном вузе, на старших курсах, и в дисциплинах, которые ставят мне в нагрузку, сходятся разные области наук. Специальные дисциплины вообще во многом междисциплинарные, как по духу, так и по содержанию.
Среди того, что мне приходилось вести есть такой курс: "Электронная и преобразовательная техника электрического транспорта железных дорог". Специалисту понятно - речь идет о силовой электронике, в самых радикальных её проявлениях. Конечно, для того чтобы не объяснять материал на пальцах, да и для проведения лабораторных работ, в дело идут симуляторы электронных схем. До недавнего времени я использовал LTSpice, однако теперь это невозможно. Но на мое счастье, благодаря vv_kuznetsov, воскрес из мертвых симулятор Qucs, пережив реинкарнацию в виде Qucs-S. Название подчеркивает совместимость с идеологией spice-моделирования электронных схем. Надо сказать что проект мне понравился, я пел, пою и буду петь дифирамбы данному проекту, ибо более достойной альтернативы (да еще и open source!) я не находил.
Однако, есть одна ложка дегтя. В этом симуляторе из коробки нет того что нужно мне - мощных силовых ключей. Так это класса 65-го... Однако таких моделей навскидку найти не удалось, не смотря на уверения коллег, что модели проборов выкладываются на сайтах производителей. Ага, сейчас...
Что же, остается один выход - создавать такие модели самому. Благо симулятор Qucs-S имеет массу инструментов для интеграции spice-моделей, чему даже посвящена отдельная статья. Вооружившись этой статьей, тщательно разобравшись в ней, мне удалось засунуть в симулятор произвольный силовой диод (да, это довольно просто). Но вот с IGBT-транзисторами меня ждал облом. В сети есть масса пространных описаний моделей этих приборов, но толкового рабочего решения не нашлось. Deepseek навел на след модели Хефнера, и даже предложил реализацию, которая в Qucs-S не заработала с ходу.
Ну что же, делать нечего. Придеться погрузиться в самую глубину вопроса - что есть SPICE, как его использовать. Читатель может сказать - да полно документации. Конечно, по симулятору ngspice, являющимся основным бэкэндом Qucs-S, документация исчерпывающая до жути. Правда построена она на принципе описания, а не на принципе освоения от простого к сложному. А последнее и хочется иметь для обучения, но увы... А раз так, то если уж я решился погрузиться в эту тему, то сам напишу такую документацию, в виде серии статей. Сяду на своего любимого коня - осваиваю сам - делюсь с окружающими. Такой формат моих статей привычен моим читателям. Так что, поехали!
1. Закон Ома для участка цепи
Пойдем "от сохи" - забудем на время про Qucs-S, а обратимся к его бэкнэнду - Ngspice. Взять его можно тут, вместе с упомянутой документацией в формате PDF. Для винды - устанавливается простой распаковкой архива, но желательно прописать путь к папке bin дистрибутива в переменной %PATH%, дабы запускать модели из произвольной точки файловой системы. Для линкусов и того проще - читайте мануалы к своим дистрибутивам, наверняка данный продукт есть в репозитории.
Установив Ngspice, нарисуем схему. В прямом смысле, руками, карандашом на бумаге. Вот такую

Простейшая цепь - источник с ЭДС равной E, нагрузка в виде резистора с сопротивлением R1. Пускай это будут конкретные значения, E = 100 В, R1 = 20 Ом. Добавим в схему узлы. Позвольте, какие узлы? Здесь же нет узлов! Узлов в понимании классического курса ТОЭ тут нет, а вот точки соединения компонентов схемы - есть! Поэтому добавим узлы, нумеруя их с нуля, вот так

Нулевой узел обязательно необходим в схеме. Дело в том, что современные численные методы расчета схем основывается на методе узловых потенциалов. А для его применения необходимо обозначить узел схемы, потенциал которого равен нулю. Именно узел с номером "0" и выполняет роль такого узла в схеме.
Задача состоит в том, чтобы определить ток, который течет в этой цепи. Ответ, разумеется очевиден - I = E / R1 = 100 / 20 = 5 А. Теперь поставим задачу рассчитать этот ток перед Ngspice.
Для этого нам нужно составить описание схемы, с указанием формы и метода расчета. Требуется написать так называемый netlist схемы. Что ж, в любом текстовом редакторе набираем следующие заклинания
*
* Анализ простейшей цепи на постоянном токе
*
.title Ohm's law demo
* Описание схемы
V1 1 0 DC 100 ; Источник напряжения
R1 1 0 20 ; Нагрузка - резистор сопротивлением 20 Ом
* Метод анализа
.op ; Расчет рабочей точки (статический режим на постоянном токе)
.end ; Конец описания схемы
Сохраняем это в файл с именем, ну например dc_simple.cir. Далее, в консоли перейдем в этот каталог и вызовем
E:\work\Projects\ngspice>ngspice_con dc_simple.cir
запуская консольный вариант симулятора. Симулятор загрузит схему, сообщив
Warning: can't find the initialization file spinit.
******
** ngspice-45.2 : Circuit level simulation program
** Compiled with KLU Direct Linear Solver
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Copyright 2001-2025, The ngspice team.
** Please get your ngspice manual from https://ngspice.sourceforge.io/docs.html
** Please file your bug-reports at https://ngspice.sourceforge.io/bugrep.html
** Creation Date: Sep 6 2025 16:39:28
******
Warning: no graphics interface!
You may use command 'gnuplot'
if GnuPlot is installed.
Note: No compatibility mode selected!
Circuit: Ohm's law demo
ngspice 1 ->
Симулятор, после сообщения что мы чего-то там не настроили, перечисления копирайтов, и что не выбран режим совместимости с другими spice-симуляторами (ох уж эти стандарты...), говорит нам что загружена схема Ohm's law demo, а это именно то что мы писали после .title. И более того - приглашает нас ввести новую команду. Занятно. Идем дальше и даем команду
ngspice 1 -> listing
Команда требует выдать листинг загруженной схемы. Ок, если все правильно, мы его получаем
ngspice 1 -> listing
Ohm's law demo
1 : ohm's law demo
2 : .global gnd
7 : v1 1 0 dc 100
8 : r1 1 0 20
10 : .op
12 : .end
ngspice 2 ->
Прошу обратить внимание на то, что если листинга нет, то мы получим список ошибок, допущенных нами при составлении netlist. Если же листинг есть, как в примере выше, то он лишен комментариев. Многострочные комментарии помечаются звездочкой, однострочные - точкой с запятой, думаю внимательный читатель обратил на это внимание.
Итак, листинг выдан, проверяем его всегда. И если все в порядке даем следующую команду
ngspice 2 -> run
И...
ngspice 2 -> run
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
Using SPARSE 1.3 as Direct Linear Solver
Reference value : 0.00000e+00
No. of Data Rows : 1
ngspice 3 ->
нам сообщили что проведен некий анализ, при этом температура среды 27 градусов по Цельсию (стандартно для западной электроники) и... что? Где результаты? А их нужно вывести. Что мы хотим? Ток? Ну хорошо знать как, и козырять эффектом послезнания, но я все же рискну, оставив объяснения на потом. Даем команду напечатать нам ток, текущий через источник напряжения V1
ngspice 3 -> print i(V1)
и получаем....
ngspice 3 -> print i(V1)
i(v1) = -5.00000e+00
ngspice 4 ->
Ура! Мы получаем 5 ампер... минус пять ампер...? Ах, да, я кое что забыл. А забыл вот это

Да, указать полярность на источнике. Положительным направлением протекания тока считается направление от "+" к "-". Стрелкой на источнике показано направление протекания тока в нагрузку - так же точно от "+" к "-". Но меряя ток на источнике, а именно этим мы и занимались, мы попросили померять ток на нашем источнике, забывая, что направление тока у измерителя получиться обратным. Ведь он думает что ток течет снизу вверх в плюс. а он течет сверху в низ, по факту. Вот и минус нарисовался. Но модуль тока рассчитан верно, что не может нас не радовать. Мы решим эту проблему но чуть позже, а пока....
2. А что это было?
Итак, в схеме есть компоненты, соединенные линиями. На линиях должны быть узлы, где соединяются данные компоненты. Говоря проще, каждый компонент имеет два (или более) узла, соединяющих его с другими компонентами схемы. Например, источник, какого его описание? Оно таково
V1 1 0 DC 100 ; Источник напряжения
Описание состоит из лексем, разделенных пробелами. Итак
V1 - V - всегда означает источник напряжения. То что следует после, любая буквенно-цифровая последовательность, имеет отношение к уникализации данного объекта в схеме. Итак, источник напряжения. Далее номера узлов 1 и 0. Первый узел - всегда анод, то есть "+". Плюс источника на узле 1. Второй - катод, то есть минус. Минус на узле "0". Далее "DC" означает что источник постоянного тока. Ну а число потом - величина ЭДС источника. Правда просто?
Источники могут содержать более сложное описание, но то что перечислено - главное.
Второй компонент схемы - резистор. Одним выводом он подключен к плюсу источника, другим к минусу. Поэтому мы и написали
R1 1 0 20 ; Нагрузка - резистор сопротивлением 20 Ом
Где
R - резистор. Дальнейшее, без пробелов лишь маркер данного резистора, определяющее его уникальное имя.
Второе число - узел с высоким потенциалом. В данном случае, и это очевидно, он подключен к узлу 1 источника, что и указано.
Второе число - узел с низким потенциалом, нулевой узел, минус источника.
Третье число - величина сопротивления, в данном случае 20 Ом.
Итак, общий синтаксис описания источников таков
VXXXXXX +n -n DC Voltage
А резисторы так
RYYYYYY +n -n Resistance
n +/- - номер узла с высоким и низким потенциалом. Но если бы все было так просто, я бы и ни писал ничего. Но оставим нюансы для следующих встреч, а пока, уверен, объяснил я понятно.
Идем дальше. После описания схемы идет директива
.op ; Расчет рабочей точки (статический режим на постоянном токе)
Что сие значит? А значит оно указание симулятору обсчитать схему на постоянном токе с определение рабочей точки. В данном случае оно говорит - посчитай статический установившийся режим. Подели 100 на 20, грубо говоря.
И да, еще раз скажу о том, что многострочные комментарии предваряются звездочкой, а однострочные - точкой с запятой.
3. А почему минус?
А потому, что мы попались в ловушку. помните как говорил нам преподаватель по ТОЭ. "Если вы указали в схеме направление тока, но получили минус, значит вы не угадали. Все Ок".
Все это верно, но. В данной простой схеме все понятно - есть узел с нулевым потенциалом и направление тока очевидно. Давайте решим эту проблему. Для этого модернизируем нашу схему и netlist. Схему -так

Мы добавили источник с напряжением равным нулю. А в месте с ним новый узел схемы, номер 2. что ж, учтем это в нетлисте
*
* Анализ простейшей цепи на постоянном токе
*
.title Ohm's law demo
* Описание схемы
Vmeas 2 1 0; Пустой источник-измеритель
V1 2 0 DC 100 ; Источник напряжения
R1 1 0 20 ; Нагрузка - резистор сопротивлением 20 Ом
* Метод анализа
.op ; Расчет рабочей точки (статический режим на постоянном токе)
.end ; Конец описания схемы
Загрузим это в симулятор, возражений у него это не вызывает
Circuit: Ohm's law demo
ngspice 1 -> listing
Ohm's law demo
1 : ohm's law demo
2 : .global gnd
7 : vmeas 2 1 0
8 : v1 2 0 dc 100
9 : r1 1 0 20
11 : .op
13 : .end
ngspice 2 ->
Запустим симуляцию
ngspice 2 -> run
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
Using SPARSE 1.3 as Direct Linear Solver
Reference value : 0.00000e+00
No. of Data Rows : 1
ngspice 3 ->
Попробуем получить ток источника Vmeas
ngspice 3 -> print i(Vmeas)
i(vmeas) = 5.000000e+00
ngspice 4 ->
Да-да, наши честные 5 ампер.... Без минуса. Минус отсутствует потому, что наш источник-измеритель - пассивный элемент схемы. Он не вырабатывает ЭДС и даже род тока для него неопределен описанием (что допускается). По сему он работает по правилу - ток идет от "+" к "-", а описав его так
Vmeas 2 1 0; Пустой источник-измеритель
мы лишь у казали путь снятия тока в схеме оператором i(....). Если вы попытаетесь сделать аналогичное с другим пассивным элементом, а в нашей схеме это так, то...
ngspice 4 -> print i(R1)
Error: no such function as i,
or i(R1) is not available.
ngspice 5 ->
у вас ничего не выйдет. В классике spice, по видимому, измерителями могут быть только активные элементы схемы.
Заключение
Это пилотная статья нового цикла. Ругайте, хоть обругайтесь. Но! Я хочу выразить огромное уважение Вадиму Кузнецову, который vv_kuznetsov за огромную работу по созданию свободного симулятора схем. И, мне, как заинтересованному лицу очень приятно, что недавно вышел новый релиз. Я уже освоил его, буду двигаться в плане освоения дальше.
В своем новом цикле хочу показать обратную сторону и Qucs-S тоже, думаю Вадим не обидится. Хочу заметить одну мысль - сложное познается из простого. В этом философия моих постов на данном ресурсе и вообще норма жизни.
Всех вам благ, мои читатели, и до новых встреч!