目录
第一章 FingerPrint条码打印机的指令控制集编程.... 3
第一章 FingerPrint条码打印机的指令控制集编程
1.1 编程说明
1. 详细的编程指南请参阅文档:1-960582-07 Fingerprint PRM 8.70-10.0.pdf;
1.2 条形码的打印
下面给一个VB6实例说明EasyCoder系列条码打印机的FingerPrint指令编程控制条形码的打印:
'设置打印机可以接收DP指令,Statement enabling or disabling the Intermec Direct Protocol.
pCommand = pCommand & "INPUT ON" & vbCrLf
'清空数值内存,Statement clearing strings, variables, and arrays in order to free memoryspace.
pCommand = pCommand & "CLEAR" & vbCrLf
'清空图像内存
pCommand = pCommand & "CLL" & vbCrLf
'设置不允许 Enable/disable direct commands
pCommand = pCommand & "SYSVAR(48) = 0" & vbCrLf
'设置下面的打印机设置命令不保存在打印机的永久内存中
pCommand = pCommand & "SYSVAR(35) = 0" & vbCrLf
'设置纸张类型为传送式(热转移式)
pCommand = pCommand & "SETUP ""MEDIA,PAPER TYPE,TRANSFER""" & vbCrLf
pCommand = pCommand & "SETUP ""MEDIA,PAPER TYPE,TRANSFER,RIBBON CONSTANT,66""" & vbCrLf
'设置色带要素,0-50,设置值越大打印的墨色越深(黑),后面还有一个对墨色深度的微调设置
pCommand = pCommand & "SETUP ""MEDIA,PAPER TYPE,TRANSFER,RIBBON FACTOR,25""" & vbCrLf
pCommand = pCommand & "SETUP ""MEDIA,PAPER TYPE,TRANSFER,LABEL OFFSET,0""" & vbCrLf
'设置标签纸张类型为中间有Gap间距的标签纸
pCommand = pCommand & "SETUP ""MEDIA,MEDIA TYPE,LABEL (w GAPS)""" & vbCrLf
'开始打印和结束打印每个标签时的微调值,例如下面表示开始打印时把标签纸回卷100dot,约12.5mm(这样会影响打印速度,但不回卷就打印错位!)
pCommand = pCommand & "SETUP ""FEEDADJ,STARTADJ,-100""" & vbCrLf
pCommand = pCommand & "SETUP ""FEEDADJ,STOPADJ,0""" & vbCrLf
'设置条码纸卷大小,宽度和高度,以dot为单位,203dpi分辨率下,1mm=8dot
pCommand = pCommand & "SETUP ""MEDIA,MEDIA SIZE,WIDTH,832""" & vbCrLf
pCommand = pCommand & "SETUP ""MEDIA,MEDIA SIZE,LENGTH,160""" & vbCrLf
'微调打印机的墨色深度 -10%|-8%|-6%|-4%|-2%|+0%|+2%|+4%|+6%|+8%|+10%
pCommand = pCommand & "SETUP ""MEDIA,CONTRAST,+10%""" & vbCrLf
'设置打印速度为 100 mm/s 可以设置值:(5~15)*10
pCommand = pCommand & "SETUP ""PRINT DEFS,PRINT SPEED,50""" & vbCrLf
'Statement for enabling or disabling the label taken sensor.(好像是是否打开标签剥离器功能,自动撕下标签)
pCommand = pCommand & "LTS& OFF" & vbCrLf
pCommand = pCommand & "CLIP ON" & vbCrLf
pCommand = pCommand & "CLIP BARCODE ON" & vbCrLf
pCommand = pCommand & "LBLCOND 3,0" & vbCrLf
pCommand = pCommand & "OPTIMIZE ""BATCH"" ON" & vbCrLf
'打印一个条形码
pCommand = pCommand & "DIR 1" & vbCrLf
pCommand = pCommand & "ALIGN 7" & vbCrLf
pCommand = pCommand & "PRPOS 480,70" & vbCrLf
'pCommand = pCommand & "BARFONT ON" & vbCrLf
pCommand = pCommand & "BARFONT ""Swiss 721 BT"",8,0,8,1,1,100,2 ON" & vbCrLf
'pCommand = pCommand & "BARSET ""CODE128"",3,1,1,60" & vbCrLf
pCommand = pCommand & "BARTYPE ""CODE128""" & vbCrLf
pCommand = pCommand & "BARRATIO 3,1" & vbCrLf
pCommand = pCommand & "BARHEIGHT 50" & vbCrLf
pCommand = pCommand & "BARMAG 1" & vbCrLf
pCommand = pCommand & "PRBAR ""G110-01-023456-2005""" & vbCrLf
'打印文本字符信息
pCommand = pCommand & "DIR 1" & vbCrLf
pCommand = pCommand & "ALIGN 7" & vbCrLf
pCommand = pCommand & "PRPOS 30, 60" & vbCrLf
pCommand = pCommand & "FONT ""Swiss 721 BT"",8,0,100" & vbCrLf
pCommand = pCommand & "PRTXT ""G110-01-023456_84""" & vbCrLf
pCommand = pCommand & "PRINTFEED" & vbCrLf
i = FreeFile
'打开打印机端口,其中的”LPT1:”可能需要根据你的打印机设置而改变
Open "\\xm\EasyCode" For Binary Access Write As #i
'发送给打印机,注意语句的最后一个参数必须是变量
Put #i, , pCommand
'关闭打印机端口
Close #i
1.3 汉字的打印
汉字的打印需要使用FingerPrint指令集中的位图打印指令PRBUF,该指令只能接收RLL Buffer编码的图像数据,基本思路是把要打印的汉字先生成位图,然后利用该指令进行图像打印。下面着重对RLL图像编码算法进行说明。
1.3.1 RLL算法规格说明
<begin><toggling pixelruns><end> //RLL格式的整体结构由3部分组成
<- total width of RLL pattern ->
//<begin>结构体的内容只能2者选其1:要么重复行,要么小白点
<begin> := <linereps>|<small white pixelrun>
<end> := <begin>|<empty> //2者选其1
//<toggling pixelruns>结构体的内容只能4者选其1:要么白黑点,要么黑白点,要么白点,要么空
<toggling pixelruns> := <whiteAndBlack pixelruns>|<blackAndWhite pixelruns>|
<white pixelrun>|<empty>
//<whiteAndBlack pixelruns>白黑点结构体的内容只能2选1:要么白点接着黑点,要么小白点接着黑点
<whiteAndBlack pixelruns> := <white pixelrun><black pixelrun>|
<small white pixelrun><black pixelrun>
//<blackAndWhite pixelruns>黑白点结构体的内容只能是:黑点接着白点
<blackAndWhite pixelruns> := <black pixelrun><white pixelrun>
//<linereps>重复行结构体的内容是相同行的数量,取值范围:[1,128]
<linereps> := ((-1)-(-128))*-1 number of equal lines
//<small white pixelrun>小白点结构体的内容是连续白点的数量,取值范围:[0,127]
<small white pixelrun> := 0-127, number of white pixels
//<black pixelrun>黑点结构体的内容是连续黑点的数量,取值范围:[0,255]
<black pixelrun> := 0-255, number of black pixels
//<white pixelrun>白点结构体的内容是连续白点的数量,取值范围:[0,255]
<white pixelrun> := 0-255, number of white pixels
//<empty>空结构体的内容是空,当且仅当整行只有1个像素点的极端情况才适用
<empty> := empty, extreme if the entire line fits in one pixelrun.
If there is no line repetion, there does not have to be any line repeat. If the pixelrun is out of range, it must be split into several runs.
Example of RLL format for an eight bit pattern:
-*-*-*-* 1,1,1,1,1,1,1,1,0 Note the last 0 to end with a white pixelrun
*-*-*-*- 0,1,1,1,1,1,1,1,1 begins with a white pixelrun of 0 pixels
--**--** 2,2,2,2,0 repetion, stopped with a white pixelrun of 0 pixels
**--**-- -2,0,2,2,2,2,-2 line and pixel repetions
**--**--
Example of coding a black square of 800 dots to valid RLL format:
-128,0,255,0,255,0,255,0,35,0,-128
-128,0,255,0,255,0,255,0,35,0,-128
-128,0,255,0,255,0,255,0,35,0,-128
-128,0,255,0,255,0,255,0,35,0,-128
-128,0,255,0,255,0,255,0,35,0,-128
-128,0,255,0,255,0,255,0,35,0,-128
-32,0,255,0,255,0,255,0,35,0,-32
算法规格的重要补充说明:
1. RLL图片编码是对位图以象素为单位进行分析,采用8位字节压缩,每个字节的数值表示了位图象素行上连续的黑点或白点的数量;
2. 象素行上的所有字节数值之和必须等于位图的象素宽度,每行的第一个字节必须表示连续白点的数量,第二个字节表示连续黑点的数量,最后一个字节必须是表示连续白点的数量;
3. 如果象素行的第一个点是黑点,那么该象素行的第一个字节值必须为0,表示以0个连续的白点开始(为什么要加这个字节0是因为RLL算法要求每行的第一个字节必须表示连续的白点数量),然后后面就是连续黑点的数量,白点数量...
4. 如果象素行是以黑点结束,那么好最后一个字节表示的是连续黑点的数量,此时就需要再加上一个字节值0,表示该行以0个连续白点结束(为什么要加这个字节0是因为RLL算法要求每行的最后一个字节必须表示连续白点的数量)
5. 因为字节8位最大可以表示0-255,所以如果连续的黑点或白点超过了255,那么需要分成若干字节表示,中间使用字节值0分开,例如表示连续259个点可以使用三个连续字节值表示:255 0 4;
6. RLL算法可以压缩重复的象素行,就是行的象素序列完全一样,只需在象素行的RLL字节行的首尾都加一个字节值,该字节表示重复的行数,该字节最大可以表示128个重复行(如果有1个重复行要使用字节值255表示,字节值的计算公式:256-重复行);假设有N个重复行(N<=128),那么该字节值为:256-N(由于N<=128,那么该字节值必定>127)
7. 如果没有重复行,并且像素行以白点开始,其连续白点的数量超过了127个,那么这种情况下就不能够适用规则5来赋予连续白点数量字节值,如果这样表示那么该字节值必定>127,那么打印机cpu就会把该字节值识别为重复行数的字节值,而不会把他识别为连续白点的数量字节值。故当且仅当这种情况出现时,我们在表示这个行第一个字节(连续白点数量)的时候需要使用小白点规则,其连续点数量字节值最大只能够表示到127,如果超出127需要采用中间增加字节值0的方式来实现分隔;目的是避开与重复行字节值的定义,重复行字节值必定是>127的,如此一来,打印机cpu就不会把这个<127的字节值识别为重复行字节值了,只会识别为连续白点的数量。注意只需要第一个字节使用小白点规则,后续字节仍然使用规则5。例如没有重复行,并且像素行第一个点是白点,其连续的数量达到500个,那么表示该连续白点数量的字节值按顺序分别应该为:127 0 255 0 128,特别注意:除此之外(没有重复行并且白点开始连续超过127个),其他情况仍然适用规则5,每个字节值可以最大保存255,超出255个点需要增加字节值0进行分隔,例如存在重复行,并且像素行第一个点是白点,其连续的数量达到500个,那么表示该连续白点数量的字节值按顺序分别应该为: 255 0 255
8.表示重复行的字节值最大可以表示到0-127,如果超出127个重复行,那么需要使用多个行累加表示,他们的象素字节行数据都一样,只是首尾的重复行字节值不一样而已;
1.3.2 RLL buffer格式说明
该格式主要用于打印机的PRBUF指令,该指令目前只能接收RLL格式的图像数据,它在RLL基础上增加了一些头信息,描述如下:
(一) 头信息总共有6个字节组成:
1) 第一个字节使用固定字符@,用16进制表示就是40,用10进制表示该字符就是60;
2) 第二个字节使用数值2,表示PRBUF Protecol采用的是RLL buffer format格式;
3) 第三、四个字节使用16进制表示图像的象素宽度,其中第三个字节表示高位字节,第四个自己表示低位字节,例如图像象素宽度为515,那么这两个字节值为 2和3,表示16进制的0203,等于10进制的515=(2*16*16+3)
4) 第五、六个字节使用16进制表示图像的象素高度,同上;
(二) 注意PRBUF指令中的数据大小字节数需要包括RLL Buffer格式头信息的6个字节和图像所有象素行数据字节长度;
1.4 其他调试经验
(一) SETUP ""MEDIA,PAPER TYPE,TRANSFER,RIBBON FACTOR,25 (0-50)可以改变打印的墨色深度;
(二) SETUP ""MEDIA,CONTRAST,+10%" (-10% ~ +10%) 可以微调打印的墨色深度;
(三) SETUP ""FEEDADJ,STARTADJ,-100""打印每个标签必须回滚100dot才能确保打印不错位;
(四) CODE128下,如果BARRATIO设置为3:1,BARMAG值设置为1,那么打印出来的条形码可能不会很清晰,可以尝试增大打印头的压力(顺时钟扭动打印头上的两个螺冒),并且设置打印的墨色深度值,再加上微调值基本就比较清晰了。
(五) 在熟悉指令集的过程中,比较快捷的办法是使用厂商自带的条码打印机软件LabelShop,并且在安装的驱动程序设置中启用打印日志记录,将所有打印任务都生成指令集文件,然后通过LabelShop打印出来的条码都会生成一个指令集文件,结合分析查看就可以比较快速的掌握指令的用法了。