Wiederbelebung eines Schneidplotters

Meine Schwägerin macht Werbedienstleistungen. Für Folienbeschriftungen arbeitet sie seit langer Zeit mit einem Schneidplotter. Das hat damals noch unter Windows XP angefangen.

Als der Support für XP auslief, gab es auf einmal keine Treiber mehr für ihren Secabo C 60 II Schneidplotter.

Dieser verweilte dann einige Jahre als Dauerleihgabe im Jenaer Hackspace, bevor er wieder zu mir zurückkehrte. Und weil ich gestern nix zu tun hatte, habe ich mich damit beschäftigt den Plotter wieder zu aktivieren.

Glücklicherweise gab es schon Vorarbeiten von einigen Mitgliedern des Hackspace:

Auf dem Plotter drücken wir die Taste on-Line.

minicom -b 9600 -D /dev/ttyUSB0

Stellen die Baudrate ein und senden sofort danach Positionsbefehle.

echo "IN;PU0,0;PU2000,0;PU2000,2000;PU0,2000;PU0,0;PU;" > /dev/ttyUSB0

Der Plotter spricht über den seriellen Anschluss HPGL bei 9600Baud(8N1).

Das war auch das erste, was ich probierte, und siehe da: der Arbeitskopf bewegt sich!

Mit etwas googlen fand ich heraus, dass ich Druckdaten aus einer Datei einfach per cat tmp/<DATEI> | minicom -b 9600 -o -D /dev/ttyUSB* an den Plotter senden kann. Dazu musste lediglich minicom aus den Linux-Paketquellen installiert werden.

Doch wie bekommt man eine plotbare Datei?

Wie oben erwähnt, hört der Plotter auf HPGL-Befehle. Die Hackspace-Leute hatten außerdem folgendes erwähnt:

Aus Inkscape heraus lassen sich Pfade als .plt-Dateien speichern. Diese können direkt an das Gerät gesendet werden, [...]

Also probierte ich dies aus. Leider funktionierte das so nicht, da Inkscape dazu ein Zusatzprogramm UniConvertor braucht, welches nicht in den aktuellen Paketquellen meiner Distribution war. Auch Herunterladen und selbst-compilieren des Programmes brachte keine Abhilfe. Dann las ich in diesem Thread, dass man einfach das „save copy as“, in der deutschen Version „Kopie speichern...“ aus dem Datei-Menü dafür verwenden kann, um eine HPGL-Datei zu exportieren.

Durch die Methode des geduldig Herumprobierens fand ich heraus, dass die Datei gleich drei Probleme verursachte:

  1. Inkscape schreibt in die Datei einen Befehl, welcher den Stiftdruck reguliert (Im Beispiel: FS150). Diese wird vom Plotter nicht verstanden.
  2. Inkscape schreibt in die Datei eine Anweisung zur Auswahl des Stiftes (SP0). Dieser musste erst auf 1 eingestellt werden (SP1).
  3. Inkscape schreibt die Koordinaten des Pfads nach dem Absenken des Stifts (PD) als lange Liste von X,Y-Werten. Dies wird vom Drucker nicht verstanden, er erwartet einzelne PDx,y-Anweisungen.

Eine Beispieldatei

IN;FS150;VS3;SP1;PU629,406;PD620,389,616,393,615,398,612,398,613,403,615,405,614,406,618,409,621,409,621,411...

muss also wie folgt angepasst werden:

IN;VS3;SP1;PU629,406;PD620,389;PD616,393;PD615,398;PD612,398;PD613,403;PD615,405;PD614,406;PD618,409;PD621,409;PD621,411...

Damit funktionierte es dann. Natürlich möchte man bei ellenlangen Steuerdateien diese Anpassungen nicht per Hand vornehmen. Also schrieb ich folgendes kleine Java-Programm:

package de.keawe.hpgl_fix;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @author Stephan Richter
 * 
 * Bereitet einen *.hpgl-Export (aus Inkscape)
 * zur Benutzung mit einem Secabo C60 II-Schneidplotter auf:
 * Inkscape exportiert die "PEN-Down"- und Bewegungsbefehle
 * als lange Kette von Tupeln (Bsp. PD0,0,0,50,50,50,50,0;),
 * womit der Plotter aber nicht klar kommt.
 * Deshalb wird diese Koordinatenkette zerlegt in einzelne
 * PD-Befehle (aus dem Beispiel wird PD0,0;PD0,50;PD50,50;PD50,0;)
 * 
 * Das Programm erwartet als Parameter einen Dateinamen <name>
 * und erzeugt eine Datei <name>.cleaned.
 * Diese kann mittels 
 * ```cat <name>.cleaned | minicom -b 9600 -o -D /dev/ttyUSB*```
 * an den Plotter gesendet werden.
 */
public class HpglFix {
    public static void main(String[] args) {
        try {
            BufferedReader file = new BufferedReader(new FileReader(args[0]));
            FileWriter out = new FileWriter(args[0]+".cleaned");
            String line;
            while ((line = file.readLine())!=null) {
                String[] commands = line.split(";");
                for (String cmd : commands) {

// Inkscape schreibt mit diesem Kommando den Anpressdruck in die Datei. Der Drucker kommt damit nicht klar.
                    if (cmd.startsWith("FS")) continue;

                    while (cmd.startsWith("PD")) {
                        String[] pts = cmd.split(",",3);
                        String token = pts[0]+","+pts[1];
                        out.append(token+";");
                        System.out.println(token);
                        cmd = pts.length>2 ? "PD"+pts[2] : "";
                    }
                    if (!cmd.isEmpty()) {
                        out.append(cmd+";");
                        System.out.println(cmd);
                    }
                }
            }
            file.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Und so geht's:

Add new comment

Restricted HTML

  • Allowed HTML tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.