基于Oracle EBS 的Zebra打印机条码打印系统

时间:2022-06-28 08:28:49

基于Oracle EBS 的Zebra打印机条码打印系统

摘要:为了实现与Oracle EBS系统对接通过Zebra条码打印机快速完成零部件生产制造过程中的条码打印,系统通过读取Oracle EBS系统数据库获得打印信息,同时通过调用Windows内部函数生成Zebra打印机可以识别的条码打印信息,通过并口传递给Zebra 打印机。系统实现了汉字、英文、数字、条码和方框等对象的处理和打印。

关键词:条码打印;ZPL 指令集;Oracle EBS;动态链接库;C#

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)29-6489-03

Oracle EBS系统被越来越多的企业实施应用,但是通过Oracle EBS打印条码却一直是该系统的一个弱点,为方便快捷的完成条码的打印,我们通过Microsoft Visual Studio 2010开发了应用于windows 操作系统的条码打印程序。该系统通过集成条码模并通过设定条件自动读取数据库信息,自动生成打印驱动程序,取代Zebra打印机自带打印程序,并且实现一键打印,适应车间操作人员标准化要求。同时该系统建立起Oracle EBS与斑马打印机的数据传输桥梁,实现两者之间的无缝衔接。

1 系统设计

该系统的主要关键在于条码打印模块。该模块首先从Oracle EBS数据库读取打印条码所需的数据信息,然后通过程序生成ZPL代码,代码中不仅包含转换的数据库中的数据信息,同时含有控制条码尺寸位置等信息。ZPL代码生成后将该指令传递给连接打印机的并口,由Zebra接收指令并打印出条码标签。

图1

系统设计通过Microsoft Visual Studio 2010 进行开发,使用C#作为开发语言。首先通过VS2010链接到Oracle EBS系统数据库,读取需要打印的零件信息存储在DataSet中,然后通过循环读取DataSet中的数据行信息并存放在多个变量中,通过调用打印子程序完成打印。并和连接打印机的串口建立数据通讯。

2 主要实现技术

2.1 并口通讯的实现

Zebra打印机通过并口实现与计算机通讯,所以程序首先需要打开并口与Zebra建立通讯。C#只提供了直接操作串口的类,如果直接操作并口的话需要调用API函数:

public class LPTControls

{……

[DllImport("kernel32.dll")]

private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);

[DllImport("kernel32.dll")]

private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWriter, out int lpNumberOfBytesWriten, out OVERLAPPED lpOverLapped);

[DllImport("kernel32.dll")]

private static extern bool CloseHandle(int hObject)

private int iHandle;

//打开LPT 端口

public bool Open()

{

iHandle = CreateFile("lpt1", 0x40000000, 0, 0, 3, 0, 0);

if (iHandle != -1)

{

return true;

}

else

{

return false;

}}

2.2 生成ZPL指令

Zebra打印机已经形成了成熟复杂的ZPL指令集,如果通过代码编写一个条码模板还是非常费时耗力的一项工作,我们可以通过Zebra打印机自带的条码设计软件ZebraDesigner先将格式设计出来,然后进行预览打印该条码的ZPL指令。

1)指令模板

^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3~SD24^JUS^LRN^CI0^XZ

^XA

^MMT

^LL0354

^PW709

^LS0

^FT32,0^XGls_long.GRF,1,1^FS

^FT50,160^XGls_descrption.GRF,1,1^FS

^FT50,215^XGls_gd.GRF,1,1^FS

^FT50,248^XGls_gc.GRF,1,1^FS

^FT50,302^XGls_cz.GRF,1,1^FS

^FT400,358^XGls_code.GRF,1,1^FS

^FT50,280^XGls_kb.GRF,1,1^FS

^BY3,12,145^FT242,307^B3N,N,,N,N

^FD@ls_code^FS

^PQ1,0,1,Y^XZ

^XA^IDls_long.GRF^FS^XZ

^XA^IDls_descrption.GRF^FS^XZ

^XA^IDls_gd.GRF^FS^XZ

^XA^IDls_gc.GRF^FS^XZ

^XA^IDls_cz.GRF^FS^XZ

^XA^IDls_kb.GRF^FS^XZ

^XA^IDls_code.GRF^FS^XZ

其中包含条码尺寸,各个条码的内容及位置。

2.3 打印汉字

Zebra M400打印机硬件本身不携带汉字字库,无法打印出ZPL指令中的汉字信息,需通过系统自带的动态链接库将汉字信息转换为图片字符串,并注入ZPL指令模板,形成一个完成的条码打印指令。核心代码如下:

private void PrintBarcode(string Ls_long1, string Ls_description1, string Ls_kb1, string Ls_gc1, string Ls_gd1, string Ls_cz1, string ls_code1,int i)

{

LPTControls.LPTControls lpt = new LPTControls.LPTControls();

string mycommanglines;

mycommanglines = "";

if (i == 0)

{

mycommanglines = System.IO.File.ReadAllText("print_head.txt");//print.txt

}

else

{

mycommanglines = System.IO.File.ReadAllText("print.txt");//print.txt

}

string sBarCodeCMD = ""; //

StringBuilder Ls_long = new StringBuilder(2048);

StringBuilder Ls_description = new StringBuilder(2048);

StringBuilder Ls_kb = new StringBuilder(1024);

StringBuilder Ls_gc = new StringBuilder(1024);

StringBuilder Ls_gd = new StringBuilder(1024);

StringBuilder Ls_cz = new StringBuilder(1024);

StringBuilder ls_code = new StringBuilder(1024);

int i1;

i1 = GETFONTHEX(Ls_description1, "宋体", "ls_descrption.GRF", 0, 33, 15, 1, 0, Ls_description);

int i2;

i2 = GETFONTHEX(Ls_kb1, "黑体", "ls_kb.GRF", 0, 30, 20, 0, 0, Ls_kb);

int i3;

i3 = GETFONTHEX(Ls_gc1, "黑体", "ls_gc.GRF", 0, 30, 20, 0, 0, Ls_gc);

int i4;

i4 = GETFONTHEX(Ls_gd1, "黑体", "ls_gd.GRF", 0, 35, 15, 0, 0, Ls_gd);

int i5;

i5 = GETFONTHEX(Ls_long1, "arial", "ls_long.GRF", 0, 150, 100, 1, 0, Ls_long);

int i6;

i6 = GETFONTHEX(Ls_cz1, "黑¨体", "ls_cz.GRF", 0, 30, 20, 0, 0, Ls_cz);

int i7;

i7 = GETFONTHEX(ls_code1, "黑体", "ls_code.GRF", 0, 30, 25, 1, 0, ls_code);

sBarCodeCMD = Ls_cz.ToString() + Ls_long.ToString() + Ls_description.ToString() + Ls_kb.ToString() + Ls_gc.ToString() + Ls_gd.ToString() + ls_code.ToString() + mycommanglines;

sBarCodeCMD = sBarCodeCMD.Replace("@ls_code", ls_code1);

lpt.Open();

lpt.Write(sBarCodeCMD);

lpt.Close();

}

Zebra打印机只能识别ZPL指令,所以需要将打印的条码内容及格式以ZPL指令传送给打印机

3 系统总体构造与实现

实现系统的打印首先需要将系统连接到Oracle EBS 系统数据库,连接oracle数据库需要引入System.Data.OracleClient 类,该类中含有操作oracle数据库的所有方法。同时打开LPT端口,准备将生成的ZPL指令传输至打印机。本系统通过将数据表中的数据读取到dataGridView中,然后通过循环读取dataGridView中的字段信息,通过调用PrintBarcode函数完成条码的打印。

在打印过程中,为了实现条码的连续快速打印,打印ZPL第一行指令^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3~SD24^JUS^LRN^CI0^XZ

只在每次打印第一张条码上出现,后面条码只需从打印内容指令处^XA^MMT开始即可,这样打印机每次按照第一张初始化的参数打印剩余条码,实现打印机快速连续的打印。实现的方法为在函数 PrintBarcode中定义了一个参数”i”,如果i=0则调用含有头信息的模板,否则调用内容信息模板,这样即可实现完整ZPL指令的生成。

4 结束语

通过将该系统应用于车间生产线终端,操作人员可以快捷、快速地完成零件条码标签的打印,通过标签实现了ERP系统物流与信息流的衔接。程序运行稳定,打印效率高、进一步提高了一线员工的工作效率和工作质量。

参考文献:

[1] Andrew T.C#与.NET 4高级程序设计[M]. 5版.北京:人民邮电出版社,2011:56-78.

[2] 希尔特.C# 4.0完全参考手册[M].北京:清华大学出版社,2010:600-689.

[3] 谢金龙,王伟.条码技术及应用[M].北京:电子工业出版社,2009:121-207.

[4] 庞明.物联网条码技术与射频识别技术[M].北京:中国财富出版社,2011:258-342.

上一篇:加强医院计算机信息化建设,提升医院综合管理水... 下一篇:探索独立学院《大学信息技术基础》课程中的技...