一、代码
1.1 ZPL指令生成模块
csharp
public class ZebraLabelGenerator
{
private const string StartMarker = "^XA";
private const string EndMarker = "^XZ";
public string GenerateLabel(string template, dynamic data)
{
string zpl = template
.Replace("{ProductCode}", data.ProductCode)
.Replace("{BatchNo}", data.BatchNo)
.Replace("{ExpiryDate}", data.ExpiryDate.ToString("yyyyMMdd"))
.Replace("{SerialNo}", GenerateSerialNumber(data));
return $"{StartMarker}{zpl}{EndMarker}";
}
private string GenerateSerialNumber(dynamic data)
{
// 实现序列号生成逻辑(示例:批次号+流水号)
return $"{data.BatchNo}-{Guid.NewGuid().ToString("N").Substring(0,8)}";
}
}
1.2 打印控制器实现
csharp
using System.IO.Ports;
public class ZebraPrinterController : IDisposable
{
private SerialPort _port;
private const int BaudRate = 9600;
private const Parity Parity = Parity.None;
private const StopBits StopBits = StopBits.One;
private const int DataBits = 8;
public void Connect(string portName)
{
_port = new SerialPort(portName, BaudRate, Parity, DataBits, StopBits);
_port.DataReceived += (s, e) => HandlePrinterResponse();
_port.Open();
}
public void SendPrintJob(string zplCommand)
{
try
{
_port.WriteLine(zplCommand);
Log($"发送指令: {zplCommand.Substring(0,50)}...");
}
catch (TimeoutException ex)
{
HandleCommunicationError(ex);
}
}
private void HandlePrinterResponse()
{
string response = _port.ReadExisting();
if (response.Contains("^XA"))
Log("收到打印机确认信号");
}
public void Dispose() => _port?.Dispose();
}
二、自动化包装打印流程
2.1 数据准备
csharp
public class PackagingData
{
public string ProductCode { get; set; }
public string BatchNo { get; set; }
public DateTime ProductionDate { get; set; }
public int Quantity { get; set; }
}
2.2 打印任务执行
csharp
public class AutoPrintingService
{
private readonly ZebraLabelGenerator _labelGenerator;
private readonly ZebraPrinterController _printerController;
public AutoPrintingService()
{
_labelGenerator = new ZebraLabelGenerator();
_printerController = new ZebraPrinterController();
}
public void StartBatchPrinting(IEnumerable<PackagingData> dataList)
{
_printerController.Connect("COM3"); // 根据实际端口修改
foreach (var data in dataList)
{
string template = File.ReadAllText("LabelTemplate.zpl");
string zplCommand = _labelGenerator.GenerateLabel(template, data);
try
{
_printerController.SendPrintJob(zplCommand);
Thread.Sleep(500); // 防止卡纸
}
catch (Exception ex)
{
HandlePrintError(data, ex);
}
}
}
}
三、ZPL模板示例 (LabelTemplate.zpl)
csharp
^XA
^FO20,20^A0N,30,30^FD产品编号: {ProductCode}^FS
^FO20,60^A0N,30,30^FDBATCH号: {BatchNo}^FS
^FO20,100^A0N,30,30^FD生产日期: {ExpiryDate}^FS
^FO150,60^BCN,100,Y,N,N^FD{SerialNo}^FS
^XZ
四、关键功能扩展
4.1 自动分页控制
csharp
public void PrintMultiPageLabel(string content, int pageCount)
{
for(int i=0; i<pageCount; i++)
{
string pageCommand = $"{content}^{(i==pageCount-1)?"^XZ":""}";
_printerController.SendPrintJob(pageCommand);
}
}
4.2 打印队列管理
csharp
public class PrintQueueManager
{
private Queue<PackagingData> _queue = new Queue<PackagingData>();
public void Enqueue(PackagingData data) => _queue.Enqueue(data);
public void ProcessQueue()
{
while(_queue.Count > 0)
{
var data = _queue.Dequeue();
// 执行打印逻辑
}
}
}
五、异常处理机制
csharp
public class PrinterExceptionHandler
{
public void HandleCommunicationError(Exception ex)
{
Log($"通信错误: {ex.Message}");
RestartPrinter();
}
public void HandlePrintError(PackagingData data, Exception ex)
{
Log($"打印失败: {data.BatchNo} - {ex.Message}");
SaveFailedJob(data);
}
private void RestartPrinter()
{
_printerController?.Dispose();
Thread.Sleep(2000);
_printerController.Connect("COM3");
}
}
六、性能优化
-
批量打印优化
csharppublic void SendBatchCommands(List<string> commands) { string batch = string.Join("\n", commands); _printerController.SendPrintJob(batch); } -
缓冲区管理
csharpprivate StringBuilder _commandBuffer = new StringBuilder(1024 * 1024); // 1MB缓冲区 public void BufferCommand(string command) { if(_commandBuffer.Length > 900 * 1024) // 保留100KB空间 FlushBuffer(); _commandBuffer.Append(command); } -
异步打印
csharppublic async Task PrintAsync(string zplCommand) { await Task.Run(() => SendPrintJob(zplCommand)); }
参考项目 斑马打印机实现包装自动打印 www.3dddown.com/csa/57414.html
七、部署与测试
7.1 环境要求
- 操作系统:Windows 10/11
- .NET Framework 4.8+
- 硬件:USB/串口斑马打印机(如ZT410/ZT230)
7.2 测试用例
csharp
[TestClass]
public class ZebraPrinterTests
{
[TestMethod]
public void TestSinglePrint()
{
var service = new AutoPrintingService();
var data = new PackagingData {
ProductCode = "P-12345",
BatchNo = "BATCH-001",
Quantity = 1
};
service.StartBatchPrinting(new List<PackagingData>{data});
Assert.IsTrue(File.Exists("PrintLog.txt"));
}
}
八、扩展功能建议
-
二维码生成集成
csharppublic string GenerateQRCode(string data, int size = 100) { return $"^BQ{size},{size},N,{data}^FS"; } -
RFID标签写入
csharppublic string AddRFIDCommand(string epc, string tid) { return $"^RFW,H,{epc},{tid}^FS"; } -
Web API集成
csharp[HttpPost("print")] public IActionResult PrintLabel([FromBody] PrintingRequest request) { // 处理Web端打印请求 }