Obsługa drukarki Zebra ZT220, podłączonej przez LAN

0

Witam, walczę od kilku dnie z drukarką j.w. podłączoną poprzez sieć LAN. Oprogramowanie pisane jest na UBUNTU. W momencie kiedy jest drukarką domyślną w systemie drukowanie z Canvas nie stanowi problemu. Poniżej działający kod.

uses Printers;

procedure TForm1.Button6Click(Sender: TObject);
var
 JPG: TJPEGImage;
begin              
Printer.Title:='text'; 
Printer.Orientation:=poLandscape;
Printer.BeginDoc;
Printer.Canvas.Font.Size:=10;
Printer.Canvas.Font.Style:=[fsBold];       
Printer.Canvas.TextOut(29,110, 'text');
Printer.Canvas.Line(12,26,100,26); 
Printer.EndDoc;
end;

Problem pojawia się kiedy muszę umieścić grafikę. Poniższe rozwiązanie działa jednak nie zapewnia odpowiedniej jakości:

procedure TForm1.Button7Click(Sender: TObject);
var
 JPG: TJPEGImage;
 logo : integer;
begin
Printer.BeginDoc;
JPG := TJPEGImage.Create;
JPG.LoadFromFile('zd.jpg');

Printer.Canvas.Draw(15, 27, JPG);
Printer.EndDoc;
end;

Zależy mi aby przesłać do drukarki kod ZPL. Przygotowałem taki kod i przetestowałem. Nie wiem zaś jak mogę to zrobić. Jest sporo rozwiązań ale dla delphi i po Windows. Mnie zależy aby to było zrobione na linuksie i na drukarce podłączonej przez LAN.

Poniższa procedura:

procedure PrintString(S: String);
var
  Written: Integer;
begin
Printer.Write(S[1], Length(S), Written);
end;                     

procedure TForm1.Button8Click(Sender: TObject);
begin
Printer.RawMode:=true;
Printer.Orientation:=poLandscape;
Printer.BeginDoc;
PrintString(Memo1.Text);
Printer.EndDoc;
end;

działa ale wysyła tekst w postaci znaków drukowanych na etykiecie a nie rozkazu ZPL. Po zmianie RawMode na false wyskakuje błąd.

Mam nadzieje że powyższe kody pomogą innym i że uda się wypracować kod wysyłania rozkazów do drukarki pod linuksem.

dodanie znaczników <code class="delphi"> - @furious programming

0

jeśli chcesz użyć ZPLa to musisz się połączyć z drukarką przez gniazdo na porcie (domyślnym) 6101 (sprawdź jeszcze w ustawieniach drukarki czy nikt nie zmienił) i otwartym tekstem wysyłać komendy ZPL. Drukarka nie musi być zainstalowana wtedy na stacji w ogóle.

0

Ok ale jak powinien wyglądać kod do wysłania danych. To jest dla mnie problemem.

0

ale jaki kod??

TTCPBlockSocket to część pakietu Synapse ale może być zwykły Socket

  
var
  FSocket: TTCPBlockSocket;
begin
  FSocket.Connect(FIp, FPort);
  FSocket.SendString('^XA^LT0^MNW^MTD^PON^PMN^LH0,0^JMA^PR4,4^MD10^JUS^LRN^CI31^XZ^XA^MMT^LL1998^PW400LS0^FT256,1279^BCR,104,Y,N,N^FD0123456001122^FS^PQ1^XZ' + #13#10); //ustawia rozmiar etykiety, inne pierdoły i drukuje kod kreskowy - wszystko opisane w manualu do ZPLa
  FSocket.CloseSocket;
end;
0

Dokładnie chodziło mi o kod źródłowy. To co zostało przesłane jest odpowiedzią na moje pytanie. Jednak jestem zielony jeśli chodzi o sokety.
Przesyłam listing z nmap

nmap 192.168.14.110

Starting Nmap 5.21 ( http://nmap.org ) at 2015-05-15 12:43 CEST
Nmap scan report for 192.168.14.110
Host is up (0.00081s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
23/tcp   open  telnet
515/tcp  open  printer
6101/tcp open  backupexec
9100/tcp open  jetdirect                                                                                                                                      
9200/tcp open  wap-wsp

Z jakiego komponentu powinienem skorzystać w lazarusie. Jeśli można proszę o kompletną procedurę. Z góry dziękuję.

ps. Jak wczesniej wspomniałem zawartość kodu ZPL jest przygotowana.

dodanie znacznika <code class="none"> - @furious programming

1
chrzanio napisał(a):

Z jakiego komponentu powinienem skorzystać w lazarusie. Jeśli można proszę o kompletną procedurę. Z góry dziękuję.

No przecież masz napisane - ściągnij pakiet synapse, dodaj do uses blcksock

var
  FSocket: TTCPBlockSocket;
begin
  FSocket := TTCPBlockSocket.Create;
  try
    FSocket.Connect(FIp, FPort);
    FSocket.SendString(kod_ZPL)
    FSocket.CloseSocket;
  finally
    FSocket.Free;
  end;
end;
0

Operacja zakończona sukcesem. Bardzo Ci dziękuję.
Podsumowując dla zielonych jak ja.

Pobieramy pakiet http://synapse.ararat.cz/doku.php rozpakowujemy go w katalogu naszego projektu. Dodajemy do uses blcksock.
Wprowadzmy kod:

var
  FSocket: TTCPBlockSocket;
begin
  FSocket := TTCPBlockSocket.Create;
  try
    FSocket.Connect('192.168.14.110', '6101');
    FSocket.SendString(Memo1.Text);
    FSocket.CloseSocket;
  finally
    FSocket.Free;
  end;
end;

z podaniem stosownego adresu ip i portu i ciszymy się działającą drukarką.

Jeszcze raz dziekuję koledze

dodanie znacznika <code class="delphi"> - @furious programming

0

Projekt znacznie się posunął jednak w momencie kiedy program nie ma połączenia z drukarką lub siecią zupełnie przestaje reagować. Klauzula try nie pomogła. Czy jest jakieś inne rozwiązanie aby ominąć ten problem?

0
chrzanio napisał(a):

Klauzula try nie pomogła.

bo i też nie od tego ona jest. Pomoże tutaj wątek

0

Się podłączę pod wątek; @abrakadaber używasz jakiegoś wrappera na ZPL czy sam wydziergałeś? Jeśli to coś z zewnątrz, to co to jest i jak działa?

0

Do ZPL skorzystałem z Zebra Designer. W nim zaprojektowałem etykietę i wydrukowałem do pliku. Kiedy plik wynikowy otworzy się w edytorze tekstu (notatniku) wyświetli się kod ZPL.

0

Uzupełnię że po dzisiejszych testach drukowanie kodu kreskowego jako obrazka (opcja ZD) jest dokładniejsze przy większym zaciemnieniu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1