Forum: Platinen Mehrere Platinen auf einer größeren zusammen fassen


von Micha R. (michaavr)


Lesenswert?

Hallo zusammen,

ihr kennt bestimmt das Problem. Ihr habt mehrere kleine Platinen 
erstellt. Das Mindestmaß (Platinengröße) ist aber nicht erreicht, um die 
Platinen bei einem Leiterplatten-hersteller machen zu lassen.

Also muss man die kleinen Platinen mit Panelize.ulp vorbehandeln und in 
ein neues Board eingefügt werden, was dann schlussendlich zum 
Leiterplattenhersteller geht.

So weit auch gut.

Doch wenn nun die Einzel-Platinen auf der größeren gedreht werden 
sollen, werden die Texte falsch mitgedreht. Wenn man die Platinen vom 
Hersteller erhält wundert man sich, warum manche Texte auf dem Kopf 
stehen usw.

Grund hierfür ist das Flag SPIN. Nur Texte und auch Bauteil-Namen und 
Werte, die gesmashed sind, werden richtig mitgedreht, wenn das SPIN-Flag 
sesetzt ist.

Nun meine Frage.
Hat jemand eine gute Idee, wie man auf einer Board-Datei alle Texte mit 
dem Flag SPIN versehen kann? Gibt es da vielleicht ein ULP uder ein 
Script?

Bei den Bauteilen in der Bibliothek ist dieses Flag standard mäßig nicht 
gesetzt. Und ich will auch nicht die ganzen Bibliotheken ändern.

Kann mir hier jemand einen guten Tip geben?

Gruß Mitch.

von chris (Gast)


Lesenswert?

Ein gut gemeinter Rat, vergiss Panelize.ulp
Teilweise werden dort Namen umgeändert usw. .
Ein besseres Tool, gerbmerge.

von Micha R. (michaavr)


Lesenswert?

Danke für die Antwort.

Aber gerbmerge sagt mir nicht viel. Handelt es sich hierbei um eine UPL 
oder ein eigenständiges Programm? Und wo kann man das beziehen?

Mitch.

von Micha R. (michaavr)


Lesenswert?

Gerbmerge scheidet aus.

Da ich keine Gerberfiles zum Platinenhersteller sende.
Ich brauche etwas, um die Board-Datei zu gestalten.

am besten ein ulp oder script.

Mitch.

von chris (Gast)


Lesenswert?

dann ändere doch mal
  if (Tspin) spin = "S";
  else spin = "";
zu
  if (Tspin) spin = "S";
  else spin = "S";

sollte das das Problem sein, ansonsten Poste ein Beispiel, daß man dir 
durch
ändern des ULP helfen kann.

von Micha R. (michaavr)


Lesenswert?

Die Idee ist grundsätzlich schon mal nicht schlecht. Leider werde dann 
Texte, die zuvor schon gesmahed waren wieder falsch mitgedreht.

Wenn man das Script so umbauen kann, dass die Spinflags nicht in den neu 
angelegten Layern von panelize gesetzt werden, sondern in der 
Original-Layer tValue, tNames und auch auf der Unterseite, dann wäre das 
super.

Kann jemand einen solchen Script schreiben?

Mitch.

von chris (Gast)


Lesenswert?

Da ich das skript nich benutze, poste bitte Beispieldaten, mit kurzer 
Beschreibung.

von Micha R. (michaavr)


Lesenswert?

Das UPL-Script ist auf der Seite von Cadsoft offiziel zum Download 
angeboten. Name: panelize.exe

Aber ich kann es hier mal posten:

#usage "<b>Generate name layers to panelize board</b>\n"
       "<p>"
       "Generates a command sequence which copies the name texts 
(support spin-flag) "
       "of all elements of your layout into newly generated layers (125 
and 126). "
       "After running the ULP you can GROUP, CUT and PASTE your layout "
       "to get an array of several boards. Make sure all layers are 
displayed before."
       "<p>"
       "The duplicated name texts in the new layers will not be changed. 
"
       "Please notice that you have to deactivate layers 25 and 26 if 
you use "
       "the CAM processor e.g. for generating gerber data. Instead, you 
have to activate "
       "the new layers 125 and 126. Thus you get an identical silk 
screen for all "
       "your layouts in this array."
       "<p>"
       "<b>Texts must be SMASHed before we can duplicate them!</b> "
       "<p>"
       "<author>Author: support@cadsoft.de</author>"

// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, 
EXPRESSED OR IMPLIED

#require 4.1106;

//  6.12.2004 Text with Spin-Flag support@cadsoft.de
// 28.06.2006 accept Sigle-Quote on end of name of element 
support@cadsoft.de

int  offset = 100;
string tcolor = "yellow";
string bcolor = "magenta";
int    used_name_layers[];
string used_name_[];

string cmd_header;
string cmd = "\nSET UNDO_LOG OFF;\nGRID MIL;\n"; // advisable for speed 
reasons
string h;

string check_single_quote(string s) {  // 2006.06.28
  int l = strlen(s);
  if (s[l-1] == '\'') s+="'";
  return s;
}

void test(void) {
  string txt = "Used Layers for >NAME\n";
  for (int n = 0; n < 256; n++) {
    if(used_name_layers[n]) {
      sprintf(h, "Layer %3d count %d\t%s\n", n, used_name_layers[n], 
used_name_[n]);
      txt += h;
    }
  }
  if (dlgMessageBox(txt, "OK", "Cancel") != 0) exit(-1);
  return;
}

void header(void) {
  for (int n = 0; n < 256; n++) {
    if(used_name_layers[n]) {
      sprintf(h, "layer %d _%s;\n", n + offset, used_name_[n]);
      cmd_header += h;
      if (n & 1) sprintf(h, "set color_layer %d %s;\n",  n + offset, 
tcolor);
      else       sprintf(h, "set color_layer %d %s;\n",  n + offset, 
bcolor);
      cmd_header += h;
    }
  }
}

void Text(string Ename, int Tlayer, int Tx, int Ty, int Tsize, real 
Tangle, int Tratio, int Tmirror, int Tspin) {
  sprintf(h, "Change Layer %d;\n", Tlayer + offset);
  cmd += h;
  sprintf(h, "Change Size %5.3f;\n", u2mil(Tsize));
  cmd += h;
  sprintf(h, "Change Ratio %d;\n", Tratio);
  cmd += h;
  string mirr, spin;
  if (Tmirror) mirr = "M";
  else mirr = "";
  if (Tspin) spin = "S";
  else spin = "";
  sprintf(h, "Text '%s' %s%sR%.1f (%5.3f %5.3f);\n", 
check_single_quote(Ename), spin, mirr, Tangle, u2mil(Tx), u2mil(Ty));
  cmd += h;
  return;
}



if (board) {
  board(B) {
    B.layers(L) {
      used_name_[L.number] = L.name;
    }
    header();
    B.elements(E) {  // smashed texts
      E.texts(T) {
        if (T.value == E.name) {
          used_name_layers[T.layer]++;
          Text(E.name, T.layer, T.x, T.y, T.size, T.angle, T.ratio, 
T.mirror, T.spin);
        }
      }
      E.package.texts(T) {  // unsmashed texts
        if (T.value == E.name) {
          used_name_layers[T.layer]++;
          Text(E.name, T.layer, T.x, T.y, T.size, T.angle, T.ratio, 
T.mirror, T.spin);
        }
      }
    }
  }
  // test();

  cmd += "SET UNDO_LOG ON;\nGRID LAST;\n";
  header();
  cmd_header += cmd;
  cmd = cmd_header;

  //  EditBox
  int Result = dlgDialog("Descriptions") {
    dlgHBoxLayout {
      dlgVBoxLayout { dlgSpacing(500); }
      dlgTextEdit(cmd);
    }
    dlgHBoxLayout {
      dlgPushButton("+Execute") dlgAccept();
      dlgSpacing(100);
      dlgPushButton("-Cancel") dlgReject();
      }
    };
  if (Result == 0) exit(0);
  exit(cmd);
}

else {
   dlgMessageBox("\n Start this ULP in a Board \n");
   exit (0);
}

von Micha R. (michaavr)


Lesenswert?

Sorry. Es heist natürlich panelize.ulp.

von Micha R. (michaavr)


Lesenswert?

Eine Board-Datei zu posten macht wenig Sinn.

Einfach Schaltplan neu und 4 Widerstände drauf. (R1 bis R4)
Denen einen Wert geben (Value).

Jetzt zum Board wechseln.

Die 4 Widerstände auf der Platine positionieren von links nach rechts R1 
bis R4.

Wenn man nun R1 rotiert, wird Name und Value immer von unten oder von 
rechts lesbar sein.

Jetzt Rechtsklick auf R2 und Eigenschaften auswählen. Spinflag setzen 
und Fenster Schließen.

Jetzt mal R2 rotieren. Bei R2 wird Name und Wert mitgedreht.

Genau so brauche ich das Spin-Flag für alle Bauteile auf dem Board.

Ein Script ähnlich dem panelize-Script soll alle Bauteile auf dem Board 
finden und dieses Spin-Flag setzen.

Dafür gibt es 2 Gründe.

1. Wird das Spin-Flag bereits in der Original-Platine gesetzt, werden 
Teilweise Texte schon verdreht. Das ist auch gut so. Denn dann werden 
die im Original korrigiert und bleiben dann so. Auch beim Einfügen in 
die Zielplatine mit mehreren Einzelplatinen.

2. Wird das Spin-Flag innerhalb der panelize.ulp gesetzt, so werden 
diese Texte ebenfalls (zumindest) Teilweise verdreht zum Original 
dargestellt. Das hat zur Folge, dass ich 2x Bord-Dateien korrigieren 
muss. Das will ich eigentlich vermeiden.

Nochmal zurück zu den Widerständen.

Flags setzen
       Smash   SPIN
R1:    nein    nein
R2:    ja      nein
R3:    nein    ja
R4:    ja      ja

Jetzt panelize drüber laufen lassen.

Jetzt sieht man an den letzteren Widerständen, dass Texte nicht stimmen.

Probierts mal aus.

von Micha R. (michaavr)


Angehängte Dateien:

Lesenswert?

So ich habe jetzt hier mal Eagle-Files gepostet.

Bei der Datei 'Test_Panelize.*' handelt es sich um die Datei wie oben 
beschrieben mit den 4 Widerständen R1 bis R4 mit der zugehörigen 
Board-Datei.

Die Flags Smash und Spin wurden wie oben beschrieben in der Board-Datei 
gesetzt (nicht im Schaltplan). Dann wurde das original Panelize drüber 
laufen lassen.

Das Board wurde per Group und Cut in die Zwischenablage kopiert und in 
der Datei 'Test_NewBoard.brd' mit Paste eingefügt. Es wurde das Board 
einmal 1:1 (Original) eingesetzt und ein 2. mal daneben (Kopie). Dann 
nochmal eingefügt nach Rotation um links und ein letztes mal eingefügt 
mit weiteren 90° Rotation (also 180° gedreht) eingefügt.

Jetzt kann man R1 bis R4 bei den Drehungen beobachten Bei dem Board das 
um 90° gedreht wurde, sollten alle Values und Names von oben lesbar 
sein. Tun sie das?

von chris (Gast)


Lesenswert?

Dachte an eine Board Datei, die letze Antwort geht gut, gehe jetzt 
Essen, in ca 2 Stunden kann ich dir dann Antworten.

von Micha R. (michaavr)


Angehängte Dateien:

Lesenswert?

Hier ein weiteres Beispiel, wie es richtig aussehen sollte.

Für die bessere Darstellung wurden die Widerstände anders angeordnet.
Auch hier wurde die Platine (Quelle Test_panelize2.brd) ind die 
Zielplatine Test_NewBoard2.brd eingesetzt mit Rotation 0°, 90°, 180° und 
270°.

Schön zu sehen, dass Bauteilnamen richtig mitdrehen.

Hier sind bei allen Bauteilen die Smash und Spin-Flags gesetzt worden. 
In Test_panelize2.brd wurden die Namen und Werte nur einmal 
ausgerichtet, bevor panelize.ulp gestartet wurde. Dann einfach 
einkopiert in Zielplatine.

von chris (Gast)


Lesenswert?

Sorry, ist was dazwischengekommen,
Ev. normalize-text.ulp, macht ein smash von allen Texten.
Leider weiß ich nicht, wie man diese SPIN Flag über ULP oder SCRipt 
setzt.
Frag beim Hersteller von Eagle nach, mittels Email.
Wenn du das weißt, dann ist das Problem gleich behoben.

von Micha R. (michaavr)


Lesenswert?

Im Handbuch steht, dass das Spinflag zusammen mit Text gesetzt werden 
kann. Auch Rotate und Move läßt sich dazu verwenden.

So ein Beispiel aus dem Handbuch: ROTATE =MR90 IC1

Durch Zusatz von 'S' (vor dem MR90) läßt sich das SpinFlag gleich mit 
setzen.

Also: ROTATE =SMR90 IC1

In dem Fall wird der Rotate-Befehl ausgeführt. S=Spin-Bit setzen, M weis 
ich nicht und R90 vermutlich Rechts 90°. Bauteil ist IC1

So funktioniert das per Script.

Per ulp weis ich es auch nicht.

in einem ULP müßte zuerst der aktuelle Winkel des Bauteils ermittelt 
werden. Um dann Anschließend auf diesen Winkel zu rotieren (also nicht 
ändern) und zusätzlich das Spin-Flag setzen.

Und wie das Spin-Flag gesetzt wird beim penelize ULP müßte in diesem 
Abschnitt stehen:

void Text(string Ename, int Tlayer, int Tx, int Ty, int Tsize, real
Tangle, int Tratio, int Tmirror, int Tspin) {
  sprintf(h, "Change Layer %d;\n", Tlayer + offset);
  cmd += h;
  sprintf(h, "Change Size %5.3f;\n", u2mil(Tsize));
  cmd += h;
  sprintf(h, "Change Ratio %d;\n", Tratio);
  cmd += h;
  string mirr, spin;
  if (Tmirror) mirr = "M";
  else mirr = "";
  if (Tspin) spin = "S";
  else spin = "";
  sprintf(h, "Text '%s' %s%sR%.1f (%5.3f %5.3f);\n",
check_single_quote(Ename), spin, mirr, Tangle, u2mil(Tx), u2mil(Ty));
  cmd += h;
  return;
}

Das ist ein Auszug aus panelize.

Mitch.

von chris (Gast)


Lesenswert?

Hallo, hier ist nun ein ULP, welches ein smash sowie das flag spin 
setzt.
Sollte das sein, was du haben wolltest, und das über das Orginal 
drüberlassen.

/// hier das ULP, Einleitung fehlt
// Author: Christoph Schrott

string cmd = "SET UNDO_LOG OFF;\n GRID mil 1;\n"; // Script command to 
execute

/* ------------- UTILITY FUNCTIONS --------------- */


/* ------------- MAIN ROUTINE --------------- */
if (board) {
  board(B) {
    B.elements(E) {  // smashed texts
      E.texts(T) {
        if (T.value == E.name) {
    if (!T.spin)
    sprintf(cmd,"%sROTATE SR0 '%s';\n",cmd,E.name);
        }
      }
      E.package.texts(T) {  // unsmashed texts
        if (T.value == E.name) {
    sprintf(cmd,"%sSMASH '%s';\n",cmd,E.name);
    if (!T.spin)
    sprintf(cmd,"%sROTATE SR0 '%s';\n",cmd,E.name);
        }
      }
    }
    B.texts(T) {
    if (!T.spin)
    sprintf(cmd,"%sROTATE SR0 (%f %f);\n",cmd,u2mil(T.x),u2mil(T.y));
    }

  }


  cmd += "GRID LAST;\nSET UNDO_LOG ON;\n";
  exit(cmd);

} else {
    dlgMessageBox(":You must run this ULP in board !");
    exit(1);
}

von Micha R. (michaavr)


Lesenswert?

Perfect!

Vielen, vielen Dank.

Das habe ich schon lange gebraucht.

Funktioniert so wie ich es haben wollte.

Wenn ich dir auch mal einen Stein in den Garten schmeißen kann, lass es 
mich wissen.

Gruß Mitch.

von Chris S. (schris)


Lesenswert?

Hier nochmals eingeloggt, ev, wenn du/jemand kleine Änderungen brauchst.

Chris

von Michelle K. (Firma: electronica@tdnet) (michellekonzack) Benutzerseite


Lesenswert?

Micha R. schrieb:
> Hallo zusammen,
>
> ihr kennt bestimmt das Problem. Ihr habt mehrere kleine Platinen
> erstellt. Das Mindestmaß (Platinengröße) ist aber nicht erreicht, um die
> Platinen bei einem Leiterplatten-hersteller machen zu lassen.

Hmmm, ich hatte einen bei Frankfurt gefunden, der sogar 20x20mm kleine 
macht.
Auf den Platinen sind nur ein TSSOP, und 4 TQFN Teile sowie ein paar 
Wiederstände, 3 Kondensatoren und eine Induction...  Außerdem macht er 
auch die Bestückung.

Jetzt wo ich in Produktion gehen wollte finde ich die Adresse nicht 
mehr...  :-/

Grüße
Michelle

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.