# Drucker per TCP ansteuern



## merlin (20 April 2010)

Hallo

Ich hab ein paar Differenzen mit einem Netzwerkdrucker.
Ich habe im TwinCAT den TCP/IP-Server eingebunden. Starte den Client auf die IP und den Port des Druckers. Wenn ich Daten rüber schreibe steht am Drucker auch "Datenverarbeitung". 

Was mir jetzt fehlt ist der Befehl für "Starte Ausdruck". Kann mir da wer helfen?

Wenn ich die Verbindung zum Server abbaue, startet der Druck und er druckt mir die Zeichen aus, die ich vorher geschickt habe. Das möchte ich so aber nicht. Ich würde die Verbindung offen halten um Rückmeldungen (Papierleer, Stau, ...) zu erhalten.

Danke
Thomas


----------



## Oberchefe (20 April 2010)

Welche Sprache spricht denn der Drucker? PCL, PJL, ESC/P 2,...?


----------



## merlin (21 April 2010)

Hallo

Nach dem Status-Ausdruck nach, spricht er PCL und PostScript.
Derzeit sende ich einfach per TCP auf den Port 9100 meine gewünschten Daten. Das funktioniert auch ideal. 

Nur zum Start des Druckjobs eben, muss ich die TCP Verbindung zum Drucker (der ja der Server ist) kurz abbrechen, dann startet er den Vorgang.

Da ich jedoch Rückmeldungen haben möchte (Druck erfolgreich, Papierstau und Papiermangel) möchte ich die Verbindung gerne offen halten.

Danke
Tom


----------



## Oberchefe (21 April 2010)

> Das funktioniert auch ideal.



Na ja, ohne Formatierung, ohne Linien und dergleichen, und wehe es verstellt jemand irgendeinen Defaultwert am Gerät.

Aber dennoch würde ich es mal mit einem FormFeed nach den Daten probieren, ASCII 12 (dezimal) bzw. 0c (hex).

Ansonsten mal "PCL 5 Printer Language Technical Quick Reference Guide" bei HP runterladen, da stehen die wichtigsten Sachen zu PCL drin.


----------



## merlin (27 April 2010)

Hallo Oberchefe

Kennst du den TCP/IP-Server von Beckhoff? Ich finde keine Möglichkeit direkte ASCII-Zeichen zu übertragen... Hast du eine Idee?

Danke
Thomas


----------



## Blockmove (27 April 2010)

merlin schrieb:


> Kennst du den TCP/IP-Server von Beckhoff? Ich finde keine Möglichkeit direkte ASCII-Zeichen zu übertragen... Hast du eine Idee?


 
Häng doch einfach den FormFeed an deine Druckdaten an.

Gruß
Dieter


----------



## merlin (27 April 2010)

Also entweder steh ich komplett am Schlauch oder ihr vertut euch etwas.

Ich sende: "Mein Testtext$R$N"

Das sendet den Text "Mein Testtext" mit anschliessendem carriage return / line feed

Sende ich nun den nächsten Text steht der halt in der 2. Zeile.

Aber: Am Drucker steht nur Datenverarbeitung. Die Seite würde er erst drucken mit einem FormFeed. Wie bitte bringe ich das FormFeed zum Drucker rüber?

Danke
Thomas


----------



## Blockmove (27 April 2010)

merlin schrieb:


> Ich sende: "Mein Testtext$R$N"
> 
> Das sendet den Text "Mein Testtext" mit anschliessendem carriage return / line feed
> 
> Sende ich nun den nächsten Text steht der halt in der 2. Zeile.



Sende mal "Mein Testtext$R$N$F"
Zumindest tippe ich mal, dass $F der Seitenvorschub ist. Ansonsten musst du mal deine Anleitung wälzen und nach dem passenden Steuerzeichen für Formfeed suchen.

Gruß
Dieter


----------



## merlin (27 April 2010)

Der String String "Mein Testtext$R$N$F" wird nicht akzeptiert:
Fehler 3908: Ungültige Stringkonstante

Die Anleitunge besagt, dass das ASCII-Zeichen 12 gesendet werden muss.
Ich suche jemanden der mit dem Beckhoff TCP/IP-Server mehr Erfahrung hat und weiss wie man dezitiert ASCII-Zeichen abschicken kann!!

Danke
Tom


----------



## Blockmove (27 April 2010)

Mit einer vernünftigen Fehlermeldung ist man doch gleich schlauer 
Nimm mal $P. Das müsste eine zulässige Stringkonstante sein ... zumindest laut Handbuch 

Gruß
Dieter


----------



## merlin (27 April 2010)

Hey

Leider nein 
Die String-Konstanten laut http://infosys.beckhoff.de/content/1031/tcplccontrol/html/tcplcctrl_constant_string.htm habe ich alle durch. Ohne Erfolg.

$P macht nichts anderes, als dass der Test der danach gesendet wird auf die nächste Seite gedruckt wird. $P löst aber den Druckvorgang an sich nicht aus. 

Danke trotzdem
Tom


----------



## bits'bytes (27 April 2010)

Also, leider kenne ich das Teil auch nicht aber lt. Handbuch kannst du 
den Code 12 eigentlich so senden

"StringUnd$N$R$0c" ... $Zeichen und 2 Hex Ziffern also 0 (null) und C (=12)

Vermutlich ist $P richtig und vermutlich funktioniert auch $0c, allerdings wird das vielleicht nur aktiv wenn noch ein Zeichen nachkommt,

also zb ein Leerzeichen

"StringUnd$N$R$0c " ... 

Da der Drucker auch das Leerzeichen drucken muss und vorher der Seitenvorschub eingetragen ist, könnte es so funktionieren....

Eventuell...


----------



## Oberchefe (27 April 2010)

> $P macht nichts anderes, als dass der Test der danach gesendet wird auf  die nächste Seite gedruckt wird.



Dann hilft warscheinlich auch kein EndOfText oder dergleichen.
Steuerzeichen:
http://de.wikipedia.org/wiki/Steuerzeichen

Na dann eben doch PCL verwenden.


----------



## apalm (8 Oktober 2012)

*Drucker ansteuern*

Hallo Forumsgemeinde,

ich muss auch einen CAB Drucker über Ethernet ansteuern. Soweit kommt das Telegramm auch an, 
aber es sind immer Protokollfehler enthalten.
Ich sende einfach ein Array of String und denke das es daran liegt.
Weiß jemand ob es als Array of Char passieren muss?
Code:

```
iLength := LEN(sWeight);
IF iLength = 4
THEN
strWeight := LEFT(sWeight,1);
END_IF
IF iLength = 5
THEN
strWeight := LEFT(sWeight,2);
END_IF
IF iLength = 6
THEN
strWeight := LEFT(sWeight,3);
END_IF




IF VisuPrinterEin
THEN
bPrinterAktiv := TRUE;
bPrinterInAktiv := FALSE;
ELSIF VisuPrinterAus
THEN
bPrinterAktiv := FALSE;
bPrinterInAktiv := TRUE;
END_IF

IF bReset THEN
    bEvDruckerAusfahren := FALSE;
    bEvDruckerEinfahren := TRUE;
    bPrinterReady := FALSE;
    bDruckerPrintStart := FALSE;


    state := 1;
    END_IF


CASE state OF
1:
    bPrinterReady := FALSE;
    IF bPrint THEN
    bEvDruckerEinfahren := FALSE;
    state := 10;
    END_IF;

10:
    (* Create TCP/IP connection *)
        fbConnect(     sSrvNetID         := '',
                    nMode            := CONNECT_MODE_ENABLEDBG,(* Enable debug output *)
                    sRemoteHost     := sRemoteHost,
                    nRemotePort         := nRemotePort,
                    tReconnect        := T#20s,
                    bEnable            := TRUE,
                    eState            => eState );
        IF NOT fbConnect.bBusy THEN


            IF NOT fbConnect.bError THEN
                IF eState = eSOCKET_CONNECTED THEN(* we are connected *)
                    state     := 20;
                END_IF
            ELSE bErrorTcp := TRUE;

(* connect error: log error
                errors.A_AddTail( putError := fbConnect.nErrId ); *)
            END_IF
        END_IF


20:
sendBuffer[0] := 'M l LBL;LAY1$R$L';
sendBuffer[1] := 'R ER;PALM$R$L';
sendBuffer[2] := 'R SO;ELSTAR$R$L';
sendBuffer[3] := 'R GR;70/80$R$L';
sendBuffer[4] := 'R GW;300KG$R$L';
sendBuffer[5] := 'R KL;1$R$L';
sendBuffer[6] := 'A 1$R$L';
state := 30;

30:
fbSend( bExecute := FALSE );
                            fbSend(    sSrvNetID     := '',
                                    hSocket        := fbConnect.hSocket,
                                    cbLen        := SIZEOF(sendBuffer),(* size of header + size of user data *)
                                    pSrc        := ADR(sendBuffer),(* pointer to the frame data *)
                                    bExecute    := TRUE,
                                    tTimeout         := T#5s );
state := 40;

40:
fbSend( bExecute := FALSE );
                    IF NOT fbSend.bBusy THEN

                        IF NOT fbSend.bError THEN(* no error *)
    fbConnect( bEnable:= FALSE, eState=>eState );
        IF eState = eSOCKET_DISCONNECTED THEN
            state := 203;
        END_IF

                        END_IF
                    END_IF

203:
IF bDruckerBereit AND bDruckerError
THEN
bEvDruckerAusfahren := TRUE;
END_IF
IF NOT bDruckerEingefahren
THEN
state := 204;
END_IF

204:
IF bDruckerAusgefahren  THEN
bEvDruckerAusfahren := FALSE;
bDruckerPrintStart := TRUE;
state := 205;
END_IF

205:
IF NOT bStempelEingefahren
THEN
state := 2059;
END_IF

2059:
IF bStempelEingefahren
THEN
state := 2060;
bDruckerPrintStart := FALSE;
END_IF

2060:
bEvDruckerEinfahren := TRUE;
state := 206;
206:
IF bDruckerEingefahren
THEN
bEvDruckerEinfahren := FALSE;
bDruckerPrintStart := FALSE;
bPrinterReady := TRUE;
state := 1;
END_IF





















;
END_CASE
```


----------



## Scrat (8 Oktober 2012)

Hi,

versuch doch einfach mal den String via CONCAT() zusammenzufügen, und als ein String zu senden. Sollte normal als String funktionieren.
Hab zwar bis jetzt nur Drucker von CAB via RS232 angesteuert, aber die Syntax bei TCP sollte gleich sein. Wichtig ist am Ende der Befehl A1. Sonst druckt er nicht!

Gruß Scrat


----------



## apalm (8 Oktober 2012)

Hi,
habe ich auch schon versucht das Problem ist, dass es genau einmal funktioniert und beim zweiten mal
kriege ich mehrer Protokollfehler.
Dann schalte ich den Drucker einmal aus und dann funktioniert es wieder einmal 
Hat jemand eine Idee?


----------



## Scrat (10 Oktober 2012)

Hast Du mal nen Netzwerksniffer dazwischen gehängt?
Wäre mal interessant zu wissen was tatzächlich ankommt.


----------



## apalm (10 Oktober 2012)

Welchen empfehlst du denn, Wireshark?


----------



## Scrat (15 Oktober 2012)

Ja, zum Beispiel Wireshark. 
Beachte aber, dass Du einen HUB (keinen Switch) dazwischen hängst um die Datenpakete aufzuzeichnen. Sonst kommt nix.

Gruß Scrat


----------

