微型热敏打印机在立体车库存取车中的应用
2015-02-07北方民族大学电气信息工程学院
北方民族大学电气信息工程学院 刘 超 刘 炜 赵 强
微型热敏打印机在立体车库存取车中的应用
北方民族大学电气信息工程学院 刘 超 刘 炜 赵 强
本文介绍了一种利用可编程控制器(PLC)驱动微型热敏打印机的方法。作者通过PLC的RS-485接口与热敏打印机相连,利用串口直接驱动打印机的方法,运用软件编程实现了PLC对热敏打印机的驱动。该方法成功的实现了立体车库存取车密码的打印。
PLC驱动;热敏打印机
1 引言
随着信息通信技术与经济的迅猛发展,做为信息输出终端的打印机,其应用已经涉及到商品流通、交通运输、工业控制等领域,成为各种智能仪器仪表的重要数据输出手段。其中热敏打印机凭借其打印速度快、噪声小、打印质量高、小型化、结构简单、维护方便、高性价比等特点,在商场、医疗、电信、邮政等各个领域得到了广泛的应用。本文利用PLC驱动热敏微型打印机,实现了在立体车库存取车的密码打印输出。
2 硬件设计
系统框图如图1所示,包括上位机,微型热敏打印机。当有人存车时,PLC与上位机通过串口得到存车的车位以及密码等信息。PLC将获得的信息进行相应的处理,用RS-485串口直接驱动微型热敏打印机。
图1 系统框图
本设计采用北京荣达创新科技有限公司的RD-E32-S5热敏嵌入式微型打印机,其采用RS-485通信接口。本设计的通讯参数设置为:波特率9600BPS,8位数据位,1个停止位,无奇偶校验,无握手方式。打印机的通讯参数可通过打印机后边的DIP开关实现。具体拨码如图2所示,在程序中设定PLC的P0口进行通信,利用PLC编程中的STL指令进行程序编程。对P0口具体设置程序如下:
LD SM0.1
MOVB 16#49, SMB30
如图2所示,本设计采用的是串口直接打印的方式。在这种方式下,不使用驱动程序,将字符直接输出到端口,由打印机内部的字库来实现字符的转换并打印。这种方式可以减少将字符转换为图形点阵的时间,速度更快,打印控制更加方便。
图2 通讯设置
图3 打印子程序流程图
3 打印程序设计
打印程序的主要任务是:(1)接收上位机发来的数据、命令,并存入相应的缓冲区。(2)将缓冲区的数据进行处理。如果是执行命令,则进行相应的操作;如果是数据则进行打印。(3)将缓冲区的数据传输至打印机进行打印。设计采用的热敏打印机,最大缓存可达20K,由于传输的数据量较小,不会出现打印过程中数据未打印完毕而造成数据丢失的情况。
当有人存车的时候,按下存车键,上位机产生随机6位密码,PLC接收上位机传送的车位信息和密码信息,将这些数据信息转换成相应的ASCII码并放入一个规定字符串内。当允许打印时,程序调用处理好的数据直接传输至串口,驱动热敏打印机,打印出存车的时间、车位、密码,以及注意事项等。
本设计根据实际需求,统一设置格式为选用16*16的汉字点阵,10点行间距,横向放大两倍,左右限宽度根据实际情况进行设置。打印机中一个字符的宽度为12点,打印时间左右限宽度分别为12点;打印注意信息设置为26点;打印密码设置为28点;打印车位时左限设置为30点,右限设置为27点;打印欢迎信息左右限宽度分别为36点。图3为打印子程序流程图。
下面为PLC驱动打印机打印时间的程序。PLC先读取系统时间,将读取的系统时间转换成打印机可识别的ASCII码,把转换后的年月日的信息,以及需要打印的汉字“年”、“月”、“日”相对应的汉字机内码填放到VW3500-VW3514 的15字节字符串里。然后将数据放到统一规定的打印地址进行打印操作。程序清单如下:
LD SM0.0
LPS
TODR VB120 //读取PLC的系统时间,数据为BCD码
FILL 0, VW3500, 15
AENO
HTA VB120, VB2200, 12 //将读取的BCD码转换为ASCII码
LRD
MOVB 15, VB3500 //定义以VB3500开头的15个字节的字符串
LRD
MOVW VW2200, VW3503//存放年的ASCII码
LRD
MOVW 16#C4EA, VW3505//存放汉字“年”的汉字机内码
LRD
AW> VW210, 9//如果月份大于9,将月份的高位和低位分别存放
MOVB VB2204, VB3506
MOVB VB2203, VB3507
LRD
LPS
AW<= VW210, 9//如果月分小于等于9,直接存放
MOVB VB2203, VB3507
LPP
MOVW 16#D4C2, VW3509//存放汉字“月”的汉字机内码
LRD
AW> VW212, 9//如果日期大于9,将日期的高位和低位分别存放
MOVB VB2206, VB3511
MOVB VB2205, VB3512
LPP
LPS
AW<= VW212, 9//如果日期小于等于9,直接存放
MOVB VB2205, VB3511
LPP
MOVW 16#C8D5, VW3513//存放汉字“日”汉字机内码
通过上述程序进行处理之后的时间信息,调用图3中打印时间的打印程序。打印出的时间效果如图4所示:
图4 打印时间效果图
在现实情况中存车的时候,由于存取车辆需要一定的时间,用户在进行存车操作的时候,可能上一个用户存车还未完成,下一用户已经选择了存车。此时就存在上一次的存车信息没有打印完毕,下一存车信息已经产生,打印机在打印的过程中不能接受新的数据,否则会造成数据的丢失。那么就需要加入数据保存序列,将新产生的数据进行保存,做为一个打印序列。当前打印内容打印完毕之后,将当前缓冲区的数据清除,同时将下一序列的数据转入缓冲区进行打印,并将清空数据保存寄存器。
由于在实际情况中,打印机打印信息所需时间为5秒左右,我们的立体车库有五个停车位,有很小的可能性几个用户同时进行存车操作,为了防止特殊情况的发生,本系统设计三个数据保存序列,用以保存数据。三个序列足以应对特殊情况。下面是有多组数据需打印时的处理程序:
LD T104
EU
R M11.0, 1
DECB VB90 //将存放数据的序列数减1
FILL +0, VW4200, 20 //VW4200为第一个序列的数据存放起始地址
SCPY VB4400, VB4200 //将第二个序列的数据前移至第一个序列内
FILL +0, VW4400, 20 //VW4400为第一个序列的数据存放起始地址
SCPY VB4600, VB4400 //将第三个序列的数据前移至第二个序列内
FILL +0, VW4600, 20 //存放新产生的数据
4 调试与结果
在调试初期,调取系统时间之后,打印出的时间之间有很大的间隔,图5所示。在打印机初始化程序里,对字间距等方面进行处理,依然无法解决这个问题。后来将所需要处理的时间数据和所需要打印的汉字的机内码,存入一个表内,在需要打印时直接调用这个表进行打印,解决了这个问题。