Forum: Platinen Ausführung von Eagle ULPs unzuverlässig


von Leo (Gast)


Lesenswert?

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.
19
sprintf(device, "C%d08", slotNumber);
20
21
// Fügt den Move-Befehl zum string s hinzu
22
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
23
s += command;
24
25
// Fügt den Rotate-Befehl zum string s hinzu
26
sprintf(command, "rotate =R90 %s;", device);
27
s += command;
28
29
// OK x01
30
i++;
31
sprintf(device, "OK%d01", slotNumber);
32
33
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
34
s += command;
35
sprintf(command, "rotate =MR180 %s;", device);
36
s += command;
37
38
// R x13
39
i++;
40
sprintf(device, "R%d13", slotNumber);
41
42
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
43
s += command;
44
sprintf(command, "rotate =MR180 %s;", device);
45
s += command;
46
47
// R x15
48
i++;
49
sprintf(device, "R%d15", slotNumber);
50
51
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
52
s += command;
53
sprintf(command, "rotate =MR180 %s;", device);
54
s += command;
55
56
// R x19
57
i++;
58
sprintf(device, "R%d19", slotNumber);
59
60
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
61
s += command;
62
sprintf(command, "rotate =MR180 %s;", device);
63
s += command;
64
65
// ...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

von Walter T. (nicolas)


Lesenswert?

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.

von Leo (Gast)


Lesenswert?

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.

von Walter T. (nicolas)


Lesenswert?

Genau. Und welche Bewegungen willst Du machen?

von Leo (Gast)


Lesenswert?

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.

von Walter T. (nicolas)


Lesenswert?

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.

von Leo (Gast)


Lesenswert?

In
1
sprintf(device, "R%d19", slotNumber);

wird auch immer wieder ein neuer Bauteilname erzeugt. "device" wird 
jedes mal neu generiert, hier: R[slotNumber]19

von Moritz A. (moritz_a)


Lesenswert?

Lasse dir vor dem ausführen einmal "s" anzeigen, der Code hier vor das 
exit(s) sollte es Bewerkstelligen.
1
    int Result = dlgDialog("Descriptions") {
2
        dlgLabel("<b>Commands</b>");
3
        dlgHBoxLayout {
4
            dlgVBoxLayout { dlgSpacing(500); }
5
            dlgTextEdit(s);
6
        }
7
        dlgHBoxLayout {
8
            dlgPushButton("+Execute") dlgAccept();
9
            dlgSpacing(100);
10
            dlgPushButton("-Cancel") dlgReject();
11
        }
12
    };
13
    if (Result == 0) exit(0);

Und dann vergleiche den Code mit den Positionen, das sollte das Debuggen 
einfacher machen.

von Leo (Gast)


Lesenswert?

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.

von Leo (Gast)


Lesenswert?

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.

von Moritz A. (moritz_a)


Lesenswert?

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 ;)

von Leo (Gast)


Lesenswert?

Bei R317 und R320 sieht man z.B.: rotate =MR90 R317; bzw. rotate =MR90 
R320;

Im Schaltplan sind die aber auf dem Top-Layer und haben den Winkel 0.
1
move C308 (R 378 36);rotate =R90 C308;move OK301 (R -534 -222);rotate =MR180 OK301;move R313 (R -762 -399);rotate =MR180 R313;move R315 (R -762 -297);rotate =MR180 R315;move R319 (R -762 -195);rotate =MR180 R319;move R316 (R -762 -96);rotate =MR180 R316;move R314 (R -336 -387);rotate =MR90 R314;move IC302 (R -222 -384);rotate =MR0 IC302;move C309 (R -114 -390);rotate =MR270 C309;move R317 (R -582 75);rotate =MR90 R317;move R320 (R -489 75);rotate =MR90 R320;move LED301 (R -237 2529);rotate =R270 LED301;move LED302 (R -576 2604);rotate =R0 LED302;move R322 (R -576 2466);rotate =R90 R322;move R321 (R -276 2430);rotate =R90 R321;move R318 (R 84 1260);rotate =MR270 R318;move IC301 (R -231 1614);rotate =R90 IC301;move PTC305 (R -1188 414);rotate =MR270 PTC305;move PTC306 (R -1188 126);rotate =R270 PTC306;move PTC308 (R 738 180);rotate =MR180 PTC308;move PTC309 (R 738 -21);rotate =MR180 PTC309;move D305 (R -729 252);rotate =R0 D305;move D306 (R -363 2478);rotate =MR90 D306;move D308 (R 252 2481);rotate =MR90 D308;move D309 (R -48 2481);rotate =MR90 D309;move R305 (R -1005 561);rotate =R180 R305;move R309 (R 399 2481);rotate =MR180 R309;move R307 (R -768 471);rotate =R0 R307;move R311 (R 321 2652);rotate =MR180 R311;move R306 (R -909 282);rotate =R270 R306;move R310 (R 102 2481);rotate =MR180 R310;move R308 (R -204 2478);rotate =MR0 R308;move R312 (R 24 2580);rotate =MR180 R312;move C301 (R -33 1680);rotate =R90 C301;move C303 (R -423 1650);rotate =R270 C303;move C302 (R -231 1470);rotate =R0 C302;move C304 (R -768 396);rotate =R180 C304;move C306 (R 321 2577);rotate =MR0 C306;move C305 (R -363 2601);rotate =MR0 C305;move C307 (R 24 2658);rotate =MR0 C307;

von Leo (Gast)


Lesenswert?

So nochmal besser lesbar:
1
move C308 (R 378 36);rotate =R90 C308;
2
move OK301 (R -534 -222);rotate =MR180 OK301;
3
move R313 (R -762 -399);rotate =MR180 R313;
4
move R315 (R -762 -297);rotate =MR180 R315;
5
move R319 (R -762 -195);rotate =MR180 R319;
6
move R316 (R -762 -96);rotate =MR180 R316;
7
move R314 (R -336 -387);rotate =MR90 R314;
8
move IC302 (R -222 -384);rotate =MR0 IC302;
9
move C309 (R -114 -390);rotate =MR270 C309;
10
move R317 (R -582 75);rotate =MR90 R317;
11
move R320 (R -489 75);rotate =MR90 R320;
12
move LED301 (R -237 2529);rotate =R270 LED301;
13
move LED302 (R -576 2604);rotate =R0 LED302;
14
move R322 (R -576 2466);rotate =R90 R322;
15
move R321 (R -276 2430);rotate =R90 R321;
16
move R318 (R 84 1260);rotate =MR270 R318;
17
move IC301 (R -231 1614);rotate =R90 IC301;
18
move PTC305 (R -1188 414);rotate =MR270 PTC305;
19
move PTC306 (R -1188 126);rotate =R270 PTC306;
20
move PTC308 (R 738 180);rotate =MR180 PTC308;
21
move PTC309 (R 738 -21);rotate =MR180 PTC309;
22
move D305 (R -729 252);rotate =R0 D305;
23
move D306 (R -363 2478);rotate =MR90 D306;
24
move D308 (R 252 2481);rotate =MR90 D308;
25
move D309 (R -48 2481);rotate =MR90 D309;
26
move R305 (R -1005 561);rotate =R180 R305;
27
move R309 (R 399 2481);rotate =MR180 R309;
28
move R307 (R -768 471);rotate =R0 R307;
29
move R311 (R 321 2652);rotate =MR180 R311;
30
move R306 (R -909 282);rotate =R270 R306;
31
move R310 (R 102 2481);rotate =MR180 R310;
32
move R308 (R -204 2478);rotate =MR0 R308;
33
move R312 (R 24 2580);rotate =MR180 R312;
34
move C301 (R -33 1680);rotate =R90 C301;
35
move C303 (R -423 1650);rotate =R270 C303;
36
move C302 (R -231 1470);rotate =R0 C302;
37
move C304 (R -768 396);rotate =R180 C304;
38
move C306 (R 321 2577);rotate =MR0 C306;
39
move C305 (R -363 2601);rotate =MR0 C305;
40
move C307 (R 24 2658);rotate =MR0 C307;

von Moritz A. (moritz_a)


Lesenswert?

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.

von Leo (Gast)


Lesenswert?

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?

von Leo (Gast)


Lesenswert?

Also beim rotate-Befehl den Bauteilnamen immer in ''. Vielen Dank, 
Moritz und Nicolas.

von Moritz A. (moritz_a)


Lesenswert?

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.

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.