# Drucker anschließen an SPS, aber wie...?



## Outrider (24 Mai 2009)

Hallo,
Ich habe folgendes Simatic-system, CPU 314C-2DP , MP277 ( Touchpanel ) und ein CP-343-Lean, außerdem wäre ein PC mit windows 2000 übergeordnet vefügbar.
Das Ziel ist es nach jedem Fertigungscyklus automatisch ein Etikett auszudrucken in dem z.B. die Länge drauf steht und eventuell andere Produktwerte.
Der Drucker soll ein spezieller Label-Drucker sein,Firma kenn ich noch nicht.
Ich weis nicht wie das Lösungskonzept aussehen soll, es muß irgendwo der Treiber installiert werden entweder im Panel, wo meiner Meinung nach am USB der Drucker angeschlossen werden kann. Nur wie kann ich den Treiber installieren?
Oder muß das Ganze über ein übergeordneten PC laufen.
Ein weiterer wichtiger Punkt wäre dann, wie kriege ich die Daten aus dem Datenbaustein in den Drucker und wie erzeuge ich das Triggerbit zum anstoßen.

Wer kennt Rat, danke für Anregungen und Tipps


----------



## SWI (24 Mai 2009)

Hallo Outrider,

Labeldrucker werden meist seriell an einer SPS angeschlossen. Du müsstest somit einer serielle Baugruppe nachrüsten. Alternativ könnte
man die erforderlichen Daten via TCP an den PC senden der dann den
Drucker anspricht. Erfordert aber ein kleines Programm auf dem PC.

Gruß SWI


----------



## Human (24 Mai 2009)

Hi Outrider,

ich hatte mal einen Zebra-Drucker (ich glaube es war ein 105SL), soviel ich weiß kann man dem über TCP/IP den ZPL-Code für das Label schicken, allerdings brauchst du da einen Zebra-Drucker und zusätzlich noch eine Netzwerkschnittstelle (kostet extra).

Warum nimmst du anstatt der CP 343 Lean nicht eine CP 340 (RS232), RS232 wird noch von den meisten Druckern unterstützt?

Der Weg über das Panel glaube ich wird wenn du WinCC flexible nimmst in meinen Augen nicht funktionieren oder diverse Umwege, da flex nur seine eigenen Bilder drucken kann oder Reporte.

Wenn da Barcodes drauf sollen, glaube ich hast du da kaum eine Chance, da flexible so viel ich weiß keine Barcodes anzeigen bzw. auf einen Report drucken kann, da müsstest du dann eine Application schreiben, die dann von flexible aufgerufen wird und dann das druckt (meiner Meinung nach mit Kanonen auf Sptzen geschossen).


----------



## jabba (24 Mai 2009)

über TCP/IP geht es auch, hab ich aber noch nicht gemacht.

ich habe in solchen Fällen meist eine Zebra-Drucker, der wird über die CP340 angesteuert.
Wie Du das Triggerbit erzeugen kannst ist einfach, aber letztlich dein Problem, da wir auf grund der Angaben ja nicht wissen wann du drucken sollst. Du weist ja in der S7 wenn ein fertigungszyklus abgeschlossen ist, bereitst die Daten auf und gibst eine Send-Befehl an die CP340.

Weiter zum Drucker: Hier gibt es die Möglichkeiten:
A: Label auf einem PC erzeugen, in den Drucker laden, aus der SPS werden dann nur die Feldvariablen gesendet.
B: Label auf dem PC erzeugem, in die SPS laden, die passenden Stellen im DB rausfinden und beschreiben.

Ich setzte fast nur Variante 2 ein, da bei einem Druckertausch meist keiner da ist der das Etikett einspielen kann. Der Nachteil an Version B ist aber auch nicht unerheblich, denn es ist schwieriger ein Etikett zu ändern, da sich die Adressen im DB ändern.

Barcode ist überhaupt kein Problem, der wird gedruckt wie normaler Text.


----------



## TommyG (26 Mai 2009)

Wollt ich doch gerade sagen,

ZEBRA, je Streifen ein k-€, intelligente Innereien, also Schriftart auswählen, Zahlenreihe übergeben, dann kommt das Label raus. IMHO auch mit Grafik und so. 

Die Zebra's sind aber kompetent, dort hatte ich guten Support...

Greetz, tom


----------



## DJMetro (19 Mai 2010)

@jabba
Hi, kannst du mir vielleicht genauere Infos geben wie man sowas einrichten kann? Ich stehe auch vor so einem Projekt wo z.B. Benutzerdaten und Gewicht auf ein Label gedruckt werden sollen mit nem Zebra S4M.

Danke
Andreas


----------



## jabba (19 Mai 2010)

Schau dir mal an was ich bisher dazu geschrieben habe,

wenn das dann noch nicht klar ist, mußt du dich noch mal melden

Drucker 1
Drucker 2


----------



## DJMetro (19 Mai 2010)

Hi jabba,
wie der DB aussehen muss hab ich, denk ich, verstanden. Wie schicke ich diesen jetzt zum Drucker? Benutzen werde ich wohl die CP340. Hast du evtl. ein Beispielprogramm?

Andreas


----------



## jabba (19 Mai 2010)

Schau dir mal das Projekt an , ob da alles klar ist,
Ansonsten kann ich das am WE mal kruz beschreiben mit einem Musterprogramm.

Der Thread ansich war dieser.


----------



## DJMetro (20 Mai 2010)

Hi,
das ist ja eigentlich die Gegenrichtung in dem Projekt. Mal schauen ob ich damit was anfangen kann.


----------



## jabba (21 Mai 2010)

Hast du die ersten Treads durchgelesen ?

Du musst dir erst einmal im klaren sein, ob du Etikett im Drucker speicherst und dann nur die variablen sendest , oder immer das komplett ausgefüllte Etikett.
ich nehmer immer das gesamte Etikett.
Dazu erstelle ich das Etikett mit der Zebra Software und teste es. Dort wo die variablen Texte stehen setzte ich Platzhalter ein z.B. TT.MM.JJ für das Datum.
Wenn das passt drucke ich dieses nicht mehr zum Drucker, sondern an die SPS. Dazu wird der CP Empfang eingeschaltet und die Daten in einen DB geleitet. Dort steht nun das komplette Etikett zur Verfügung.
Wenn man den DB überprüft kann man schnell das Ende der Daten erkennen.
Dies ist die länge zum senden.
Zum testen gibt man nun einfach beim Send den DB und die Länge an.
Wenn das funktioniert hat man die hälfte schon geschafft. Nur ermittelt man im DB die Adressen der Platzhalter und ersetzt vor dem Drucken diese durch die gewünschten Einträge.


----------



## SchneiderCC (21 Mai 2010)

ein cab-Drucker wäre auch möglich, da können auch über die serielle Schnittstelle die zu druckenden DAten gesendet werden.


----------



## DJMetro (21 Mai 2010)

Hi,
so langsam bin ich dahinter gestiegen. Der Drucker wird aber erst nächste Woche geliefert, dann kann ich es auch testen. Zwei Fragen noch:
1. Muss in jedem DB jedes einzelne Zeichen als Char stehen oder gibts auch ne andere Möglichkeit?
2. Können auch Zeichen frei bleiben? Z.B. definiere ich für ein Feld z.B. 'Name' 20Zeichen und lege im DB halt 20 Byte dafür an. Jetzt habe ich aber nur einen Namen mit 5 Zeichen, können die restlichen Byte dann mit Leerzeichen gefüllt werden? Akzeptiert der Drucker das?


----------



## jabba (21 Mai 2010)

Ich hatte mal angefangen das in Teile zu zerlegen.

```
Header
Zeile 1 Kommando
Zeile 1 Text
Zeile 1 Abschluss
...
Zeile x Kommando
usw
```
Wenn ich das z.B. als Angestellter in einer Firma machen müßte und öfters so ein Drucker kommt, würde sich die einmalige Arbeit sicher lohnen. Da ich das aber beim Kunden mache und mit meiner Lösung sehr schnell zum Ziel komme ist es für mich bei meinen Festpreisangebot am einfachsten. Würde ich das über eine bequemen Baustein machen würden meine Kunden den nehmen und alles in Zukunft selber machen.

Prinzipell kannst Du sobalt dein DB klar ist die Struktur anpassen.
Wichtig ist das du z.B. für Datum 10 stellen deklarierst in diese auf jeden Fall mit Leerzeichen (hex20 Dez 32) füllst, ein Hex0 führt zu einem Fehler.

Werden am WE mal einen DB einstellen, mit und ohne Struktur als Beispiel.


----------



## jabba (23 Mai 2010)

Der DB muss nicht zwingend Char sein, kann auch Array[..] of char sein,wenn man aber was anderes als Char nimmt z.B. Byte oder Word, kann man mit den Zahlen nicht so viel anfangen.

Den Drucker gibt es aber als 200,300dpi und ZPL oder EPL.

So sieht als Muster ein ZPL Etikett mit Barcode aus:

```
^XA~TA000~JSN^LT0^MMT^MNW^MTD^PON^PMN^LH0,0^JMA^PR4,4^MD0^JUS^LRN^CI0^XZ
^XA^LL0750
^PW1200
^FT390,390^A0N,58,57^FH\^FDhh:mm^FS
^FT71,390^A0N,58,57^FH\^FDTT.MM.JJJJ^FS
^FT319,201^A0N,58,57^FH\^FD######^FS
^FT319,106^A0N,58,57^FH\^FDXXXXXXXXXXXXXXXXXXXX^FS
^FT496,201^A0N,58,57^FH\^FDkg^FS
^BY4,3,236^FT87,665^BCN,,Y,N
^FD>:BBBBBBBBBBBBBBBBBBBB^FS
^FT71,201^A0N,58,57^FH\^FDGewicht  :^FS
^FT71,106^A0N,58,57^FH\^FDName     :^FS
^PQ1,0,1,Y^XZ
```
Man könnte jetzt auf die Idee kommen, mit mehreren Array of Char den Aufbau so zu zerlegen, das immer ein zu füllendes Feld einen Symbolischen Namen bekommt. Aber hier liegt eine Siemens eigene Gefahr, denn die DB's werden Wortweise verwaltet, sollte eine Variable z.B. 7 Zeichen lang sein, so würde das 8. Byte nicht angezeigt. Dies wäre folglich im Normalfall mit w#16#0 belegt. Als Folge davon funktioniert das Etikett nicht mehr.

Ich nehme daher meist einenm DB z.B. mit 300 Zeilen Char, dadurch habe ich auch die Möglichkeit Kommentare zu den Zeilen zu schreiben. (siehe Bild2)

Beim senden wird nun dieser DB mit der entsprechenden Länge gesendet.
Vorher verändert man noch die variablen Texte im Etikett. Aber Achtung wenn diese Texte mal länger oder kürzer sein sollten, z.B. bei String sollte man vorher den Bereich mit Leerzeichen füllen.

Nur mal als Muster :  hier werden im DB141 die Daten für das Etikett eingetragen: Die Fehlertexte werden aus einem DB geladen , Die Fehlernummer gibt die Position an, hier sind die Texte aber schon 22 Zeichen lang, und mit Leerzeichen aufgefüllt. Bei bedarf kann ich dir auch ein Muster einstellen für das auslesen aus einem String.

```
L     B#16#10                     // für alle S7
      T     LB     0
      L     B#16#2                      // Bytezugriff
      T     LB     1
      L     22                          // Länge
      T     LW     2
      L     143                         //DB  wo die Fehlertexte stehen
      T     LW     4
      L     22                          // Position Fehlercode
      L     "SR-NIO_Pumpen".BandPosition[1].Fehler_Nr    // Laden Fehlernummer aus aktuellen Satz
      *I                                // Mit der Länge multiplizieren
      L     8
      +I                                // Offset im DB
      L     22
      -I                                // Eintrag fängt mit 1 an nicht mit 0

      SLD   3
      T     LD     6
      L     B#16#84
      T     LB     6
      CALL  "BLKMOV"
       SRCBLK :=#Zeiger1
       RET_VAL:=#tINT
       DSTBLK :=P#DB141.DBX167.0 BYTE 22    // Fehlertext im Label


      CALL  "BLKMOV"                    // Seriennummer übertragen
       SRCBLK :=P#DB146.DBX38.0 BYTE 5
       RET_VAL:=#tINT
       DSTBLK :=P#DB141.DBX90.0 BYTE 5

      L     "SR-NIO_Pumpen".BandPosition[1].Tag    // Tag
      T     DB141.DBW  317
      L     "SR-NIO_Pumpen".BandPosition[1].Monat    // Monat
      T     DB141.DBW  320
      L     "SR-NIO_Pumpen".BandPosition[1].Jahr    // Jahr
      T     DB141.DBW  323
      L     "SR-NIO_Pumpen".BandPosition[1].Werker    // Werker
      T     DB141.DBW   82
      NOP   0
```


----------



## DJMetro (25 Mai 2010)

Hi,
danke erst mal für deine Mühe. Hast du auch Erfahrung mit der Anbindung per Ethernet? Im Prinzip funktioniert es dort genau so oder?


----------



## jabba (25 Mai 2010)

Hab ich zwar noch nicht bei einem Drucker geamacht, könnte man aber mit Hyperterminal schnell prüfen ob es geht wenn der Drucker da ist.

Prinzipiell bleibt die Art und Weise gleich, nur die Anbindung ist anders.
Hier muss man dann beachten ob PN-CPU oder CP wegen verschiedener Bausteine.
Auch muss man in diesem fall erst einmal ein Verbindung aufbauen, und dann senden. Dazu gibt es hier aber einige Beispiele.


----------



## DJMetro (26 Mai 2010)

Ist man eigentlich auf den Printserver von Zebra angewiesen oder kann man auch einen anderen nutzen? Jemand schon Erfahrung? Die von Zebra sind ja seehr teuer.


----------



## DJMetro (9 Juni 2010)

Hi,
soo der Drucker ist heute endlich angekommen. Habe auch gleich einen Printserver besorgt. Über den Etiketten Designer funktioniert das Drucken auch einwandfrei. Jedoch wird es von der SPS noch nicht akzeptiert. Zum einen ist fraglich welchen Port ich einstellen muss und muss am Ende des Etiketts noch irgendwas gesendent werden das quasi als "Ende" erkannt wird und gedruckt wird? Auch wenn ich die Datei per Hyperterminal sende reagiert der Drucker noch nicht. 

Andi


----------



## jabba (9 Juni 2010)

Was ist das denn für ein Printserver ?
Wenn du den extra besorgt hast, wie ist der denn mit dem Zebra verbunden ?

Um die Kommunikation rauszukriegen könnte man ja das TCP/IP Protokoll mitschneiden und mal ansehen.

Wenn der Drucker im Windows ja geht, kannst Du unter 
Drucker-> Anschlüsse nachsehen welcher Port verwendet wird.


----------



## DJMetro (9 Juni 2010)

Der Printserver ist von Conceptronic und läuft via USB. In den Druckereigenschaften steht er auf LPR und grau hinterlegt steht der Port 515. Wenn ich aber auf diesen Port was schicke passiert aber weiter nichts. Irgendwann kam plötzlich mal was raus aus dem Drucker was ich vor 5 Minuten mal versucht hatte zu drucken. Kommt mir wie gesagt vor, als ob irgendein Abschluß fehlt um den Druck zu starten.

Andi


----------



## jabba (9 Juni 2010)

Vieleicht fehlt am ende noch ein CR+LF, aber der Weg ist ja schon mal richtig sonst käme ja gar nix.
Gibt doch genug Progs die den Datenverkehr aufzeichen, damit kann man das aufzeichnen.

Such mal zum LPR


----------



## DJMetro (9 Juni 2010)

Wie würde denn das CR+LF im DB aussehen?


----------



## jabba (10 Juni 2010)

Am ende sollte stehen


```
CR = b#16#0D // Dezimal 13
LF = b#16#0A // Dezimal 10
```

Das LDR Protokoll muss mit einem LF abschliessen.


----------



## DJMetro (10 Juni 2010)

Hi,
jabba. Hab es mit nem anderen Printserver von Axis hinbekommen. Der kann auch RAW auf Port 9900 verarbeiten und damit läufts.
Jetzt hab ich aber noch ein kleines Problem. Und zwar habe ich mit dem Designer ein Etikett entworfen. Dieses habe ich als Datei gedruckt und dann halt zu ner txt Datei umbenannt. Jetzt kann ich mir diese ja schön im Editor ansehen und bearbeiten und dann mit dem Hyperterminal von Windows an die CPU senden. Jedoch werden nicht alle Zeichen mitgesendet. Oft wird das ^ am Anfang der neuen Zeile vergessen. Weißt du weshalb?

Andreas


----------



## jabba (11 Juni 2010)

Das zeichen weg sind , kann ich mir nicht erklären. Hab das aber so auch noch nie ausprobiert.
Stimmt denn die Zeichenlänge nach der Übertragung ?.

Du brauchst das Etikett eigentlich ja nur einmal zur SPS zu schicken, dann kann man den DB dort anpassen.
Wichtig wäre das ein Senden von der SPS zum Drucker immer sauber funktioniert.

Mich Interessiert aber immer noch was das für ein printserver ist, bzw wie der am Drucker angeschlossen wurde.


----------



## DJMetro (25 Juni 2010)

Hi jabba,
inzwischen hab ich alles hinbekommen wie es soll. Das Etiketten Layout liegt jetzt im DB schön sortiert, wie man sehen kann, und die Daten werden direkt vor dem Druck zusammen gewürfelt und geladen. 
Mit dem Printserver hat sich auch geklärt. Der Drucker braucht die Daten auf Port 9900 im RAW Format. Das konnte er nicht. Jetzt hab ich einen von Axis und der funzt.
Den Grund warum Zeichen verloren gegangen sind, hab ich auch gefunden. Das Array muss immer eine gerade Anzahl haben. Also 2, 4, 6, etc. Sonst wird was verschoben. Wenn man die Daten online im DB beobachtet und in einer VAT Tabelle, dann sieht man, dass was nicht stimmt.
Vielen Dank nochmal für deine Hilfe :s12::sm24:

Andi


----------



## jabba (26 Juni 2010)

Schön das es läuft.
Auf das Problem mit dem Array bin ich auch mal reingefallen, da sucht man sich einen Wolf .


----------



## olmuk (25 Oktober 2011)

*Druckerdaten in OP laden*

Hallo Jabba,

habe aufmerksam Deine fundierten Anmerkungen gelesen.
Auch wenn es blöd klingt - wie genau funktioniert das Senden des labels an den DB ? Bitte um Info.

Danke und Gruß

olmuk


----------

