Forum: Mikrocontroller und Digitale Elektronik LTSpice - grammatical error bei .FUNC


von Thomas K. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche zur Zeit das IGBT-Modell von Peter Lauritzen
http://www.ee.washington.edu/research/pemodels/modtext/igbt-pt.html
in LTSpice zum Laufen zu bringen. Man kann das Modell in Saber- oder 
Verilog-A-HDL öffentlich herunterladen und das habe ich versucht in 
SPICE zu übersetzen. Beim Testen der Übersetzung als *.cir bringt 
LTSpice die Fehlermeldung: "--grammatical error--" gefolgt von mehreren 
Zeilen mit Funktionen in der Art : "((-(((if(bq()*bq()>cqm()*1.0e2,2 ... 
"usw.

Ablauf: Drücken auf Run -> "Reducing parameter expressions" -> 
"Substituting parameters(line 0) ... bis teilweise (line 5) -> Ausgabe 
des Fehlers

Mein Eindruck: Beim Anschauen des angegebenen Fehlers und der 
enthaltenen Funktionen bleibt LTSpice bei .FUNC iA() {...} stecken. Alle 
Unterfunktionen in iA() werden korrekt eingesetzt bis zu dem Punkt wo 
eine Unterfunktion wieder iA() selbst aufruft, quasi eine 
Funktionen-Schleife. Kann SPICE überhaupt mit solchen Formulierungen 
umgehen bzw. kann man es so schreiben/programmieren dass SPICE damit 
klarkommt?

Vielleicht würde eine Startwert-Vorgabe wie iA() = 0 helfen, aber ich 
weiß nicht wie ich diese implementieren sollte. Ich wäre für jeden 
Hinweis dankbar.
Gruß
Thomas

von Thomas K. (Gast)


Lesenswert?

Konnte jemand den Fehler reproduzieren?

von Helmut S. (helmuts)


Lesenswert?

Es dauert lange und endet mit einer Fehlermeldung.

Reducing parameter expressions...
Substituting parameters(line 0)
...
Substituting parameters(line 3)
Substituting parameters(line 4)
Substituting parameters(line 4)
Substituting parameters(line 5)

Minuten später
-- Grammatical Error ---
((-(((if(bq()*....


Ich kann heute Abend noch etwas anderes probieren.

Funktionieren exakt die selben Gleichungen mit einem andeern SPICE?

Gruß
Helmut

von Helmut S. (helmuts)


Angehängte Dateien:

Lesenswert?

Nachdem ich fehlende Klammern gesetzt habe bin ich jetzt bei dieser 
Meldung. Woher willst du wissen, dass deine Formeln überhaupt stimmen, 
wenn schon Klammern fehlten?

WARNING: infinite recursion in: 
"ddt((if((((((v(a)-v(k))/vth)-(ln((if((tt()*(in45()-ip46())+qb-2*qp5())* 
(tt()*(in45()-ip46())+qb-2*qp5())>(qb*(qp5()+tt()*ip46()))*1.0e2,2*(qb*( 
qp5()+tt()*ip46()))/((tt()*(in45()-ip46())+qb-2*qp5())+sqrt((tt()*(in45( 
)-ip46())+qb-2*qp5())*(tt()*(in45()-ip46())+qb-2*qp5())+8*(qb*(qp5()+tt( 
)*ip46())))),0.25*(-(tt()*(in45()-ip46())+qb-2*qp5())+sqrt(abs((tt()*(in 
45()-ip46())+qb-2*qp5())*(tt()*(in45()-ip46())+qb-2*qp5())+8*(qb*(qp5()+ 
tt()*ip46())))))))*((if((tt()*(in45()-ip46())+qb-2*qp5())*(tt()*(in45()- 
ip46())+qb-2*qp5())>(qb*(qp5()+tt()*ip46()))*1.0e2,2*(qb*(qp5()+tt()*ip4 
6()))/((tt()*(in45()-ip46())+qb-2*qp5())+sqrt((tt()*(in45()-ip46())+qb-2 
*qp5())*(tt()*(in45()-ip46())+qb-2*qp5())+8*(qb*(qp5()+tt()*ip46())))),0 
.25*(-(tt()*(in45()-ip46())+qb-2*qp5())+sqrt(abs((tt()*(in45()-ip46())+q 
b-2*qp5())*(tt()*(in45()-ip46())+qb-2*qp5())+8*..........  Da geht es 
noch ein paar Seiten so weiter.

von Thomas K. (Gast)


Lesenswert?

Vielen Dank für deinen Einsatz! Du hast leider recht. Ich geh in eine 
Ecke und schäme mich eine Runde, denn eigentlich habe ich bei der 
Fehlermeldung mit --grammatical error-- mehrfach die Zahl der Klammern 
geprüft (aber nur in der Fehlermeldung und nicht in den Formeln).

Mit PSPICE hab inzwischen aber auch gesehen dass ein paar gefehlt haben. 
Die werden bei meiner "Übersetzung" abhanden gekommen sein, da besonders 
die IF-Anweisungen in Verilog anders geschrieben sind. Die unendliche 
Rekursion konnte ich mit PSPICE noch nicht erzeugen, denn es bemängelt 
andere Stellen die ich noch korrigieren muss. Bin mal gespannt ob das 
selbe herauskommt wie bei dir mit LTSPICE.

Ein Informatiker-Kollege meinte dass eine Abbruch-Bedingung notwendig 
wäre, damit die Rekursion ausgerechnet werden kann. Ich kann erst morgen 
testen, aber mir schwebt sowas wie: nach 30 Iterationen iA=0 setzen 
(quasi ein Umweg für die Anfangsbedingung iA = 0) oder etwas mit .op , 
aber das habe ich noch nicht komplett verstanden.

von Helmut S. (helmuts)


Lesenswert?

Zum Prüfen ob die Anzahl der aufgehenden und zugehenden Klammern 
übereinstimmt, habe ich an den Dateinamen ".c" gehängt und dann den 
Texteditor PSPAD genommen. Bei .c-Dateinen stellt der die zugehörige 
Klammer farblich dar. Dadurch sieht man zumindest ob eine Klammer fehlt 
oder zu viel ist.

von Thomas K. (Gast)


Angehängte Dateien:

Lesenswert?

Momentan ist noch keine Lösung in Sicht.
Während LTSpice noch eine Fehlermeldung schafft, stürzt PSpice leider ab 
(bzw. behauptet der Server wäre nicht erreichbar).
In Lauritzen_Verilog.txt wurde das gleiche Modell in Verilog 
geschrieben. Ich hatte aus Saber in Spice übersetzt. Interessant ist 
dass die Gleichungen für die "System variables" in Verilog anders 
formuliert wurden als in Saber. Anstatt:
iCak = ddt(q56)

wird ein Stromzweig mit unbekanntem Knoten (floating node, hier: n_iCak) 
erzeugt:
I(n_iCak) <+ iCak - ddt(q56)

sodass der Simulator folgende Gleichung löst:
0 = iCak - ddt(q56)

Zu Beginn wird iCak definiert als:
iCak = V(n_iCak)


Ich versuche das für Spice zu adaptieren. Der Aufbau erinnert mich an 
die Infineon-Modelle, in denen kleine "Hilfs"-Netzwerke existieren nach 
der Art:

Rhilfe 11 0 100meg
Ghilfe 0 11 {X - V(11)}
mit X als beliebigen Wert aus Schaltung oder Funktionen.
In anderen Teilen des Modells wird dann mit V(11) weiter gerechnet. Das 
leuchtet mir allerdings noch nicht ganz ein, denn je höher der 
Widerstand gewählt wird, desto kleiner wird V(11) und mehr passiert 
nicht.

Das schau ich mir jetzt alles genauer an.

Gruß
Thomas

von Thomas K. (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe inzwischen weiter an dem Modell gearbeitet. Falls noch jemand 
mitliest:
Durch das Ersetzen der Systemvariablen mit den Hilfsnetzwerken konnte 
ich die Rekursion beseitigen. Das sieht folgendermaßen aus:

Die Funktion .FUNC udep {u5G()-uox()}
wird zu
Rudep udep 0 100meg
Budep 0 udep I=u5G()-uox()-V(udep)

und der Funktionsaufruf udep() in den anderen Teilen des Modells wird 
duch V(udep) ersetzt.

für Rudep größer als 10meg nimmt V(udep) den Wert der davor stehenden 
Formel an, also V(udep) = u5G () - uox() ... zumindest theoretisch (als 
Test habe ich z.Bsp.:
Btest 0 1 I = ddt(sin(time))-V(1)
Rtest 1 0 100meg
gewählt und für V(1) cos(time) erhalten.)

Damit ist die Rekursion beseitigt, aber es stellt sich die nächste 
Schwierigkeit ein. Obwohl zum Beispiel I(BiCgk) einen fließenden Strom 
zeigt (die anderen sind meist =0A ), hat V(BiCgk) keinen Zahlenwert 
sondern "1.#QNAN0e+000". Selbst wenn kein Strom fließt, sollte für den 
Knoten doch ein Potential angezeigt werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.