//Эта страница доступна также на следующих языках:// [[circuit_simulation_improvements|English]] ====== Усовершенствование моделирования работы электрических схем в gschem ====== ===== Обоснование ===== Начинающим не так-то просто использовать **gschem** как оболочку для схемотехнического моделирования (для **ngspice** или **gnucap**). Вот что новому пользователю хотелось бы делать в **gschem**: * определять, какие виды анализа нужно запускать; * определять, графики каких напряжений и токов нужно выводить; * собственно запускать моделирование. Запуск моделирования и постобработка могут быть во внешней программе, вызываемой посредством IPC. Существует несколько графических оболочек, но они не решают всех вышеуказанных проблем: * [[http://www.geda.seul.org/tools/gspiceui/index.html|gspiceui]] * [[http://www.comefly.us/|kjwaves]] * [[http://easy-spice.sourceforge.net/|easyspice]] Все оболочки имеют одну проблему --- в них нельзя указать соединение, данные которого хотелось бы увидеть. Нужно знать имя соединения для узла. ===== Набросок проекта ===== Допустим, нам хотелось бы совсем немного изменить **gschem** и **libgeda**, чтобы иметь возможность, по крайней мере, установить несколько измерительных приборов и запустить моделирование. ==== Измерительные приборы ==== **Измерителями тока** могут быть обычные источники постоянного напряжения 0 В. Легче всего в качестве такого прибора использовать символ с двумя выводами, подобный обычному амперметру. Если нам захотелось бы подключить измеритель тока к выводу, то нужно, чтобы генератор списка соединений распознал его и заместил нашим «амперметром». Если в качестве амперметра использовать источник напряжения, генератору не нужно будет знать имён соединений внутри схемы. Все источники напряжения 0 В со специальным именем устройства являлись бы измерителями тока. **Измерителями напряжения** могут быть источники тока 0 А. Второй вывод источника тока присоединяется к //GND// атрибутом ''net''. Поэтому снова генератору списка соединений не нужно будет знать имён соединений, так как он сможет использовать соединение, подключенное к этому специальному источнику тока. Подобно вышеописанному источнику напряжения мог бы быть специальный (графический) символ, который распознавался бы генератором списка соединений. ==== Источники тока и напряжения ==== Определить параметры источников не так просто. В настоящее время они хранятся внутри атрибутов ''value'' символа, например ''value=pulse 0 1 10n 10n 100n 1u 2u''. Эти настройки должны соответствовать атрибутам SPICE ''pulse(V1 V2 TD TR TF PW PER)''. Было бы здорово иметь диалоговое окно, предлагающее пользователям имена атрибутов, а не только строку значения. Настройкой источников напряжения или тока могла бы заниматься модифицированная команда редактирования атрибутов (ee), которая вызывала бы для этих источников специальные диалоговые окна их свойств. В настоящее время эта команда вызывает диалоговое окно редактирования всех атрибутов символа. ==== Моделирование ==== Как сохранять параметры моделирования внутри **gschem**. Для хранения параметров одного моделирования можно использовать символ с названием устройства //SIMULATION//. Все параметры, определяющие один вид моделирования сохраняются как атрибуты, прикреплённые к данному объекту: * вид анализа (dc, ac, tran,...); * параметры программы моделирования; * программа моделирования? (можем ли мы запускать моделирование для одной и той же схемы в двух программах моделирования сразу?); * параметры для моделирования (глобальные параметры, температура, ...). v 20061020 1 C 41500 49200 1 0 0 spice-directive-1.sym { device=spice_simulation_block refdes=A1 simulation_name=random name simulation_active=1 simulation_type=DC 0V 1V 0.1V parametric_simulation1=V1 lin 0 5 0.1 parametric_simulation2=R1.value lin 10k 100k 10k option_TNOM=100 Deg option_ABSTOL=1e-3 global_param1=??? global_param2=??? } Таких объектов моделирования в одной схеме могло бы быть много. Для хранения дополнительных библиотек можно использовать либо директиву вложения (include), либо символ //LIBRARY//, содержащий все библиотеки в одном из двух видов: * как многострочный атрибут; * как несколько атрибутов библиотек, прикреплённых к символу //LIBRARY//. Между глобальными, пользовательскими и локальными библиотеками должно быть различие. Глобальные и пользовательские библиотеки могут определяться в //''gafrc''// или в новом конфигурационном файле //''spicerc''//. ==== Создание диалогового окна для моделирования внутри gschem ==== Допустим, всё что нам нужно, чтобы добавить поддержку моделирования в **gschem**, это одно диалоговое окно. * В нём должен содержаться список моделирований (в виде списка из их названий с кнопками разрешения/запрета). * В нём должны быть иконки для добавления измерителей. * Оно могло бы содержать кнопки для большинства общих символов: резистора, конденсатора, катушки индуктивности, диода, ... [R,C,L,D,M,E,F,G,H..] * Оно могло бы содержать несколько диалоговых элементов для настройки SPICE. * Оно могло бы содержать кнопки моделирования и закрытия. * Несколько добавочных кнопок, таких как, например: копировать моделирование, удалить моделирование, общие параметры... При создании такого диалогового окна все объекты моделирования собираются в перечень видов моделирования (в виде списка с кнопками разрешения/запрета). При изменении настроек меняются атрибуты соответствующего объекта моделирования. ==== Диалоговое окно параметров ==== Какие параметры нужны для этого диалогового окна? И почему? Расставленные нами измерители можно использовать, чтобы сообщать программе моделирования о том, какие нам хотелось бы сохранять переменные, или программе построения графиков о том, какие хотелось бы увидеть графики. Это вещи совершенно различные, и нам нужна возможность выбирать следующее: * выводить на графиках все маркеры и сохранять только напряжения соответствующих узлов; * выводить на графиках все маркеры, но сохранять все напряжения и токи (с помощью источников напряжения); * сохранять напряжения узлов только для схемы текущего уровня или также и для подсхем. ==== Запуск моделирования ==== Кнопка моделирования в диалоговом окне должна вызывать следующие действия: * сохранение схемы (спрашивать пользователя или использовать временный файл?); * создание списка соединений с помощью **gnetlist**; * создание файлов моделирования и включение туда списка соединений (можно ли это сделать тоже с помощью **gnetlist**?); * выполнение скрипта запуска моделирования (**guile**, **sh**, ...). Этот скрипт мог бы вызывать даже диспетчер, который бы занимался множеством крупномасштабных моделирований. ===== Приложение ===== ==== Символ измерителя напряжения (эскиз) ==== v 20061020 1 P 0 0 200 200 1 0 0 { T 100 0 5 10 0 1 0 0 1 pintype=pas T 0 100 5 10 0 1 0 0 1 pinseq=1 T 0 100 5 10 0 1 0 0 1 pinnumber=1 T 0 100 5 10 0 1 0 0 1 pinlabel=1 } V 300 300 150 3 10 0 0 -1 -1 0 -1 -1 -1 -1 -1 L 300 200 240 360 3 10 0 0 -1 -1 L 300 200 360 360 3 10 0 0 -1 -1 T 0 500 9 10 0 0 0 0 1 device=VOLTAGE_PROBE T 200 50 9 6 1 1 0 0 1 refdes=I_VP? T 0 700 9 10 0 0 0 0 1 net=GND:2 T 0 900 9 10 0 0 0 0 1 value=DC 0A ==== Символ измерителя тока (эскиз) ==== v 20061020 1 P 0 200 150 200 1 0 0 { T -150 50 5 10 0 1 0 0 1 pintype=pas T 50 250 5 10 0 1 0 0 1 pinseq=1 T 50 250 5 10 0 1 0 0 1 pinnumber=1 T 50 250 5 10 0 1 0 0 1 pinlabel=1 } V 300 200 150 3 10 0 0 -1 -1 0 -1 -1 -1 -1 -1 L 300 300 380 140 3 10 0 0 -1 -1 L 300 300 220 140 3 10 0 0 -1 -1 T 0 500 9 10 0 0 0 0 1 device=CURRENT_PROBE T 200 370 9 6 1 1 0 0 1 refdes=V_IP? P 600 200 450 200 1 0 0 { T 500 50 5 10 0 1 0 0 1 pintype=pas T 500 250 5 10 0 1 0 0 1 pinseq=2 T 500 250 5 10 0 1 0 0 1 pinnumber=2 T 500 250 5 10 0 1 0 0 1 pinlabel=2 } L 240 180 360 180 3 10 0 0 -1 -1 T 0 700 9 10 0 0 0 0 1 value=DC 0V ==== Ещё один символ измерителя тока (эскиз), который использует Kurt Peters ==== v 20061020 1 T 700 650 8 10 1 1 0 0 1 refdes=VAM? T 700 850 5 10 1 1 0 0 1 device=Ammeter T 700 1050 5 10 0 0 0 0 1 footprint=none T 700 1250 5 10 0 0 0 0 1 numslots=0 T 700 1450 5 10 0 0 0 0 1 description=ammeter for spice P 300 1200 300 900 1 0 0 { T 350 1000 5 8 1 1 0 0 1 pinnumber=1 T 350 1000 5 8 0 1 0 2 1 pinseq=1 T 400 850 9 8 1 1 0 5 1 pinlabel=+ T 300 700 5 8 0 1 0 5 1 pintype=pwr } P 300 0 300 300 1 0 0 { T 350 100 5 8 1 1 0 0 1 pinnumber=2 T 350 100 5 8 0 1 0 2 1 pinseq=2 T 300 500 5 8 0 1 0 3 1 pintype=pwr T 300 300 5 10 1 1 0 0 1 pinlabel=- } L 300 400 400 500 3 0 0 0 -1 -1 L 200 500 300 400 3 0 0 0 -1 -1 T 700 450 5 10 0 1 0 0 1 value=DC 0V L 300 400 300 800 3 0 0 0 -1 -1 L 100 800 500 400 3 0 0 0 -1 -1 B 0 300 600 600 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 L 200 800 100 800 3 0 0 0 -1 -1 L 100 700 100 800 3 0 0 0 -1 -1