22Chaos-Drucker & Cutter-Simulation
Testet, ob Ihre Druckanwendung mit echten Störungen klarkommt – ohne Hardware. ZplVirtualPrinter verhält sich wie ein Netzwerkdrucker, der gezielt ausfällt: Papier- oder Farbbandende, offener Kopf, Übertemperatur, Pause, voller Puffer, Cutter-Fehler, RFID-VOID, Verbindungsabbruch nach n Bytes, Latenz, langsames Lesen, Teil-Schreibvorgänge, Stromausfall. Ausgelöst sofort, nach n Etiketten/Bytes/Schnitten, bei einem Befehl, nach einer Zeit oder per reproduzierbarem Zufall. ~HS, ~HQES, ~HM und SGD-getvar melden den Zustand wie ein echter Drucker; Etiketten warten im Puffer, bis die Störung behoben ist.
// using ZplCore.Printing;
await using var printer = new ZplVirtualPrinter(9100) { RenderSettings = new() { CutterInstalled = true } };
printer.LabelCut += (_, e) => Console.WriteLine($"{e.LabelIndex}: {e.Reason}"); // 3: PauseAndCutCount …
printer.Faults.FaultRaised += (_, e) => Console.WriteLine($"{e.Kind}: {e.Cause}");
printer.Start();
printer.Faults.Schedule(ZplFaultKind.PaperOut, ZplFaultTrigger.AfterLabels(3)); // Etikett 4 wartet
printer.Faults.Schedule(new ZplFaultRule(ZplFaultKind.Disconnect, ZplFaultTrigger.AfterBytes(1000)));
printer.Faults.Seed = 42; // reproduzierbarer Zufall
// … Ihre Druckanwendung sendet jetzt an 127.0.0.1:9100, liest ~HS und muss sich erholen …
printer.Faults.Clear(ZplFaultKind.PaperOut); // Papier eingelegt
var plan = ZplCutPlan.Analyze(zpl); // samples/zpl/cutter.zpl: ^MMC + ^PQ6,3
Console.WriteLine(string.Join(", ", plan.CutAfter)); // 2, 5 → Schnitt nach Etikett 3 und 6
var preview = new ZplRenderer(new ZplRenderSettings { CutMarks = true }).ProcessCommands(zpl);
zplcore serve --port 9100 --chaos chaos.json --cut-marks --out printed/
# chaos.json
{"seed":42,"printer":{"cutter":true,"labelPrintTimeMs":200},
"faults":[{"kind":"paperOut","after":{"labels":3},"clearAfterMs":5000},
{"kind":"latency","delayMs":300},{"kind":"disconnect","after":{"bytes":1000}}]}
Wo schneidet der Cutter?
ZplCutPlan.Analyze bzw. ZplRenderer.LastCutPlan sagt je Etikett, ob und warum geschnitten wird: ^MM-Modi inklusive verzögertem Schnitt mit ~JK und Kiosk-Modus (^CN/^KV), Pause-und-Schnitt-Wert von ^PQ, ^XB, gespeicherte Formate und ^SN-Kopien; Auffälligkeiten als ZPL4101–ZPL4105. Mit ZplRenderSettings.CutMarks = true zeichnen PNG, SVG und PDF unter jedes Etikett einen Streifen – gestrichelte Schnittlinie mit Schere, wo geschnitten wird (Standard aus, Ausgabe sonst unverändert).
samples/zpl/cutter.zpl: ^MMC + ^PQ6,3 – Schnitt nach Etikett 3 und 6

Quellen sind die Zebra-Programmierhandbücher; was dort nicht steht, ist als Annahme dokumentiert. Nicht simuliert: der JSON-Port 9200 und der Einzelverbindungs-Port; für Lasttests verarbeitet --concurrent Verbindungen parallel statt nacheinander wie ein Drucker.

