Как вы используете поведенческий резистор в pySpice?
Я пытаюсь смоделировать очень простую схему с поведенческими резисторами, которые меняют состояние на основе глобального параметра. На самом деле я просто новичок в *spice и играю с «резисторами как переключателями».
Рабочая схема в ngspice:
.param pos = 1
vin 1 0 dc 10
r1 1 2 r='{pos} == 1 ? 1u : 1G'
r2 2 0 1
r3 1 3 r='{pos} == 2 ? 1u : 1G'
r4 3 0 1
Что при запуске (и «pos» изменено) делает именно то, что я ожидаю:
Circuit: resistor switch circuit
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
No. of Data Rows : 1
v(2) = 9.999990e+00
v(3) = 1.000000e-08
Reset re-loads circuit resistor switch circuit
Circuit: resistor switch circuit
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
No. of Data Rows : 1
v(2) = 1.000000e-08
v(3) = 9.999990e+00
Я хотел бы воссоздать эту схему в pyspice, которая выглядит так:
circuit = Circuit('resistor switch circuit')
circuit._parameters['pos'] = 1
circuit.V('input', 'in', circuit.gnd, 10@u_V)
circuit.R(1, 'in', 'pos1', raw_spice='r=\'{pos} == 1 ? 1u : 1G\'')
circuit.R(2, 'pos1', circuit.gnd, 1@u_Ohm)
circuit.R(3, 'in', 'pos2', raw_spice='r=\'{pos} == 2 ? 1u : 1G\'')
circuit.R(4, 'pos2', circuit.gnd, 1@u_Ohm)
print(circuit)
И генерирует список соединений, который, насколько я могу судить, (фактически) такой же, как список соединений ngspice выше:
.title resistor switch circuit
.param pos=1
Vinput in 0 10V
R1 in pos1 r='{pos} == 1 ? 1u : 1G'
R2 pos1 0 1
R3 in pos2 r='{pos} == 2 ? 1u : 1G'
R4 pos2 0 1
Однако его запуск приводит к следующему:
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 4, new internal line no.: 5:
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Syntax error: letter [{]
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 4, new internal line no.: 5:
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Expression err: {pos}==1?1u:1g}
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 4, new internal line no.: 5:
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Cannot compute substitute
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 6, new internal line no.: 7:
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Syntax error: letter [{]
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 6, new internal line no.: 7:
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Expression err: {pos}==2?1u:1g}
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 6, new internal line no.: 7:
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Cannot compute substitute
Я считаю, что pyspice поддерживает поведенческие резисторы:https://pyspice.fabrice-salvaire.fr/releases/v1.3/api/PySpice/Spice/BasicElement.html#PySpice.Spice.BasicElement.BehavioralResistor
Но независимо от того, как я пытаюсь дать выражение:
circuit.R(1, 'in', 'pos1', '{pos} == 1 ? 1u : 1G')
circuit.R(1, 'in', 'pos1', R='{pos} == 1 ? 1u : 1G')
и т. д. Я всегда получаю какую-то ошибку при попытке запустить симуляцию. Кажется, что только "raw_spice=" действительно дает совместимый список соединений, но затем терпит неудачу при моделировании.
Как вы на самом деле используете поведенческий резистор в pyspice?
1 ответ
Согласно комментарию Джошуа, включение {} вокруг имени переменной/параметра (как с {pos} в моих примерах), кажется, не требуется для правильного синтаксического анализа.
Как ни странно, ngspice напрямую принимает этот формат. Будучи новичком в использовании списков соединений, я видел, что этот формат довольно часто используется в примере кода, и, поскольку он работал, предположил, что это необходимо для обозначения vars/params - это не так.
Удаление постороннего '{}' из создания компонента (хотя я все еще передаю уравнение через raw_spice) решает проблему и позволяет запустить симуляцию. Отвечаю здесь для дальнейшего использования.