Hallo zusammen,
mich würde mal interessieren, wie zuverlässig die Ausführung von ULPs
ist. Ich habe nämlich ein Problem mit einer eigenen ULP. Darin werden
nur "move"- und "rotate"-Kommandos benutzt, um Bauteile in einem Board
zu platzieren.
Die meisten Bauteile werden richtig platziert, es gibt aber ein paar,
bei denen passt's nicht ganz.
1
#usage "Platziert die übrigen Bauteile in den Slots 1,3,4,5 und 6 nach dem Muster in nur-Slot.brd."
2
3
// Die Bauteile sind in einer Modulgruppe durchnummeriert. R104 bedeutet, dass der Widerstand mit der Nummer 04 in Modul 1 gemeint ist.
4
// Das x markiert die Stelle, an der die Modulnummer steht (slotNumber).
5
int slotNumber = 3;
6
7
// x und y geben die Positionen für die Bauteile. Bezogen auf ein Referenzbauteil, das im Board mit "mark" markiert wird.
8
int x[]= {378,-534,-762,-762,-762,-762,-336,-202,-114,-582,-489,-237,-576,-576,-276,84,-231,-1188,-1188,738,738,-729,-363,252,-48,-1005,399,-768,321,-909,102,-204,24,-33,-423,-231,-768,321,-363,24};
9
int y[]= {36,-222,-399,-279,-195,-96,-387,-384,-390,75,75,2529,2604,2466,2430,1260,1614,414,126,180,-21,252,2478,2481,2481,561,2481,471,2652,282,2481,2478,2580,1680,1650,1470,396,2577,2601,2658};
10
11
12
int i = 0; // Klar... Zählvariable
13
string device; // Enthält den Bauteilnamen für die nächste Platzierung
14
string command; // Zwischenspeicher für ein Kommando
15
string s; // Gibt alle Kommandos an die Kommandozeile zurück
16
17
// Bauteilname: C x08
18
// Baut den gültigen Bauteilnamen zusammen. Ersetzt quasi das x.
// ...dann geht's hier noch ein ganzes Stück weiter
66
// wie oben.
67
68
// Kommandos an die Kommandozeile ausgeben
69
exit(s);
Das ist die erste ULP, die ich "mal schnell" zusammenschreiben wollte.
Jetzt weiß ich einfach nicht, warum das bei manchen Bauteilen nicht
funktioniert. Die sind mal richtig platziert aber nicht gespiegelt und
rotiert, dann liegt eins mal nicht genau auf der Position, wie sie im
Array steht, sondern ein paar Punkte darüber (x-Achse passt aber), usw.
Sind Probleme damit bekannt? Oder benutze ich vielleicht einen
schlechten Stil für ULPs (keine Funktionen benutzt z.B.)?
Vielen Dank für eure Aufmerksamkeit :)
Gruß Leo
Kannst Du die Bewegungen, die Du machen willst, mal grafisch
beschreiben?
Wenn es um Rotationen geht (allgemein, nicht nur Eagle): Willst Du um
ein Zentrum oder um die Mittelachse drehen? Oder um die Bauteilreferenz?
Für eine Drehung um einen beliebigen Punkt brauchst Du ja im allgemeinen
eine Drehung und zwei Verschiebungen.
Oh, oops es handelt sich hier um Eagle-ULPs und die Rotationen und
Positionen beziehen sich auf die Bauteil-Referenz. Eine Rotation
beschreibt die Drehung um die Bauteilmitte. Gespiegelt (mirror-Befehl)
bedeutet die Platzierung auf dem Bottom-Layer.
Die Bauteile liegen noch unplatziert im Board. Und ich möchte die an die
Positionen aus dem Array verlegen und danach die Spiegelung und Rotation
anpassen.
Ich verstehe gerade nicht, warum die
"sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
s += command;
sprintf(command, "rotate =MR180 %s;", device);
s += command;"
so oft wiederholt werden.
Im sichtbaren Abschnitt sehe ich mal kein Problem.
Ah, ok. Die Fehlplatzierungen waren meine Fehler. Danke Moritz. Aber
wenn ich mir die nicht rotierten und gespiegelten Bauteile ansehe, dann
stimmen die Eigenschaften im Board nicht mit dem Befehl überein. Der
Name und die Daten sind aber korrekt. Die entsprechenden Bauteile
bleiben übrigens unberührt und scheinen alle Widerstände zu betreffen,
die auf die Unterseite sollen.
Wenn ich das Layer von dem fehlplatzierten Bauteil ändere, dann wird das
aber durch die ULP auch nicht zurückgesetzt. Das heißt, das Bauteil wird
durch das Programm auch nicht wieder auf das Top-Layer gesetzt.
Rotationen werden trotzdem nicht durchgeführt. Die Bauteile sind
wirklich die Wiederstände M0805 aus der Bibliothek rcl.
Wie wäre es damit, wenn du mal die Befehle die dein ULP generierst mit
postest, was sie machen sollten, aber nicht machen?
Ein bisschen mehr Input wäre nicht verkehrt, nicht jeder hat Lust das
komplette ULP mitsamt Testplatine nachzubauen ;)
Dann stellt sich natürlich die Frage, was passiert, wenn du
1
move R317 (R -582 75);rotate =MR90 R317;
manuell über die Kommandozeile ausführst. Ist dein Ergebnis dann
richtig? Ich habe bisher auch nicht so ganz nachvollzogen, wann Eagle
die Bauteilnamen gerne in '' hätte, daher mache ich das mittlerweile
einfach grundsätzlich.
Das ist's! Rotate kommt anscheinend wegen dem =R und R aus dem
Bauteilnamen durcheinander. Ich habe gedacht, das = dient als
Steuerzeichen, sodass der ULP-Interpreter weiß, dass die nachfolgende
Zeichenkette die Orientierungsinformation beinhaltet. Aber man kann das
Bauteil ja auch relativ zur aktuellen Orientierung rotieren, wobei dann
= weggelassen wird. "rotate =MR90 R270" würde dann also interpretiert
werden als: Rotation absolut: 90°, gespiegelt; Rotation relativ: 270°
bezogen auf kein Bauteil. Warum muss ich nochmal diese Software
benutzen?
Leo schrieb:> "rotate =MR90 R270" würde dann also interpretiert> werden als: Rotation absolut: 90°, gespiegelt; Rotation relativ: 270°> bezogen auf kein Bauteil.
Eher "bezogen auf das Bauteil, das du als nächstes anklickst." Nur
überschreibst du den Befehl einfach danach wieder, anstatt ihn auf
irgendwas anzuwenden.
Ich rufe so mittlerweile ganz gerne Befehle auf, anstatt mich durch
irgendwelche Menüs zu hangeln. Ein "change width 10mil" klick ist
einfach flotter als alles andere :)
An der Stelle würde es auch helfen, einfach mal die Hilfe zu lesen. Da
steht sogar genau dein Problem beschrieben:
1
Syntax
2
ROTATE orientation • ..
3
ROTATE orientation 'name' ..
4
…
5
Die Hochkommas um name sind nötig zur Unterscheidung vom Wert der Orientierung wie in
6
ROTATE R45 'R1'
7
Sie können weggelassen werden, wenn der Kontext klar ist.