北方民族大學(xué)電氣信息工程學(xué)院 劉 超 劉 煒 趙 強(qiáng)
微型熱敏打印機(jī)在立體車庫存取車中的應(yīng)用
北方民族大學(xué)電氣信息工程學(xué)院 劉 超 劉 煒 趙 強(qiáng)
本文介紹了一種利用可編程控制器(PLC)驅(qū)動微型熱敏打印機(jī)的方法。作者通過PLC的RS-485接口與熱敏打印機(jī)相連,利用串口直接驅(qū)動打印機(jī)的方法,運(yùn)用軟件編程實現(xiàn)了PLC對熱敏打印機(jī)的驅(qū)動。該方法成功的實現(xiàn)了立體車庫存取車密碼的打印。
PLC驅(qū)動;熱敏打印機(jī)
隨著信息通信技術(shù)與經(jīng)濟(jì)的迅猛發(fā)展,做為信息輸出終端的打印機(jī),其應(yīng)用已經(jīng)涉及到商品流通、交通運(yùn)輸、工業(yè)控制等領(lǐng)域,成為各種智能儀器儀表的重要數(shù)據(jù)輸出手段。其中熱敏打印機(jī)憑借其打印速度快、噪聲小、打印質(zhì)量高、小型化、結(jié)構(gòu)簡單、維護(hù)方便、高性價比等特點,在商場、醫(yī)療、電信、郵政等各個領(lǐng)域得到了廣泛的應(yīng)用。本文利用PLC驅(qū)動熱敏微型打印機(jī),實現(xiàn)了在立體車庫存取車的密碼打印輸出。
系統(tǒng)框圖如圖1所示,包括上位機(jī),微型熱敏打印機(jī)。當(dāng)有人存車時,PLC與上位機(jī)通過串口得到存車的車位以及密碼等信息。PLC將獲得的信息進(jìn)行相應(yīng)的處理,用RS-485串口直接驅(qū)動微型熱敏打印機(jī)。
圖1 系統(tǒng)框圖
本設(shè)計采用北京榮達(dá)創(chuàng)新科技有限公司的RD-E32-S5熱敏嵌入式微型打印機(jī),其采用RS-485通信接口。本設(shè)計的通訊參數(shù)設(shè)置為:波特率9600BPS,8位數(shù)據(jù)位,1個停止位,無奇偶校驗,無握手方式。打印機(jī)的通訊參數(shù)可通過打印機(jī)后邊的DIP開關(guān)實現(xiàn)。具體撥碼如圖2所示,在程序中設(shè)定PLC的P0口進(jìn)行通信,利用PLC編程中的STL指令進(jìn)行程序編程。對P0口具體設(shè)置程序如下:
LD SM0.1
MOVB 16#49, SMB30
如圖2所示,本設(shè)計采用的是串口直接打印的方式。在這種方式下,不使用驅(qū)動程序,將字符直接輸出到端口,由打印機(jī)內(nèi)部的字庫來實現(xiàn)字符的轉(zhuǎn)換并打印。這種方式可以減少將字符轉(zhuǎn)換為圖形點陣的時間,速度更快,打印控制更加方便。
圖2 通訊設(shè)置
圖3 打印子程序流程圖
打印程序的主要任務(wù)是:(1)接收上位機(jī)發(fā)來的數(shù)據(jù)、命令,并存入相應(yīng)的緩沖區(qū)。(2)將緩沖區(qū)的數(shù)據(jù)進(jìn)行處理。如果是執(zhí)行命令,則進(jìn)行相應(yīng)的操作;如果是數(shù)據(jù)則進(jìn)行打印。(3)將緩沖區(qū)的數(shù)據(jù)傳輸至打印機(jī)進(jìn)行打印。設(shè)計采用的熱敏打印機(jī),最大緩存可達(dá)20K,由于傳輸?shù)臄?shù)據(jù)量較小,不會出現(xiàn)打印過程中數(shù)據(jù)未打印完畢而造成數(shù)據(jù)丟失的情況。
當(dāng)有人存車的時候,按下存車鍵,上位機(jī)產(chǎn)生隨機(jī)6位密碼,PLC接收上位機(jī)傳送的車位信息和密碼信息,將這些數(shù)據(jù)信息轉(zhuǎn)換成相應(yīng)的ASCII碼并放入一個規(guī)定字符串內(nèi)。當(dāng)允許打印時,程序調(diào)用處理好的數(shù)據(jù)直接傳輸至串口,驅(qū)動熱敏打印機(jī),打印出存車的時間、車位、密碼,以及注意事項等。
本設(shè)計根據(jù)實際需求,統(tǒng)一設(shè)置格式為選用16*16的漢字點陣,10點行間距,橫向放大兩倍,左右限寬度根據(jù)實際情況進(jìn)行設(shè)置。打印機(jī)中一個字符的寬度為12點,打印時間左右限寬度分別為12點;打印注意信息設(shè)置為26點;打印密碼設(shè)置為28點;打印車位時左限設(shè)置為30點,右限設(shè)置為27點;打印歡迎信息左右限寬度分別為36點。圖3為打印子程序流程圖。
下面為PLC驅(qū)動打印機(jī)打印時間的程序。PLC先讀取系統(tǒng)時間,將讀取的系統(tǒng)時間轉(zhuǎn)換成打印機(jī)可識別的ASCII碼,把轉(zhuǎn)換后的年月日的信息,以及需要打印的漢字“年”、“月”、“日”相對應(yīng)的漢字機(jī)內(nèi)碼填放到VW3500-VW3514 的15字節(jié)字符串里。然后將數(shù)據(jù)放到統(tǒng)一規(guī)定的打印地址進(jìn)行打印操作。程序清單如下:
LD SM0.0
LPS
TODR VB120 //讀取PLC的系統(tǒng)時間,數(shù)據(jù)為BCD碼
FILL 0, VW3500, 15
AENO
HTA VB120, VB2200, 12 //將讀取的BCD碼轉(zhuǎn)換為ASCII碼
LRD
MOVB 15, VB3500 //定義以VB3500開頭的15個字節(jié)的字符串
LRD
MOVW VW2200, VW3503//存放年的ASCII碼
LRD
MOVW 16#C4EA, VW3505//存放漢字“年”的漢字機(jī)內(nèi)碼
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//存放漢字“月”的漢字機(jī)內(nèi)碼
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//存放漢字“日”漢字機(jī)內(nèi)碼
通過上述程序進(jìn)行處理之后的時間信息,調(diào)用圖3中打印時間的打印程序。打印出的時間效果如圖4所示:
圖4 打印時間效果圖
在現(xiàn)實情況中存車的時候,由于存取車輛需要一定的時間,用戶在進(jìn)行存車操作的時候,可能上一個用戶存車還未完成,下一用戶已經(jīng)選擇了存車。此時就存在上一次的存車信息沒有打印完畢,下一存車信息已經(jīng)產(chǎn)生,打印機(jī)在打印的過程中不能接受新的數(shù)據(jù),否則會造成數(shù)據(jù)的丟失。那么就需要加入數(shù)據(jù)保存序列,將新產(chǎn)生的數(shù)據(jù)進(jìn)行保存,做為一個打印序列。當(dāng)前打印內(nèi)容打印完畢之后,將當(dāng)前緩沖區(qū)的數(shù)據(jù)清除,同時將下一序列的數(shù)據(jù)轉(zhuǎn)入緩沖區(qū)進(jìn)行打印,并將清空數(shù)據(jù)保存寄存器。
由于在實際情況中,打印機(jī)打印信息所需時間為5秒左右,我們的立體車庫有五個停車位,有很小的可能性幾個用戶同時進(jìn)行存車操作,為了防止特殊情況的發(fā)生,本系統(tǒng)設(shè)計三個數(shù)據(jù)保存序列,用以保存數(shù)據(jù)。三個序列足以應(yīng)對特殊情況。下面是有多組數(shù)據(jù)需打印時的處理程序:
LD T104
EU
R M11.0, 1
DECB VB90 //將存放數(shù)據(jù)的序列數(shù)減1
FILL +0, VW4200, 20 //VW4200為第一個序列的數(shù)據(jù)存放起始地址
SCPY VB4400, VB4200 //將第二個序列的數(shù)據(jù)前移至第一個序列內(nèi)
FILL +0, VW4400, 20 //VW4400為第一個序列的數(shù)據(jù)存放起始地址
SCPY VB4600, VB4400 //將第三個序列的數(shù)據(jù)前移至第二個序列內(nèi)
FILL +0, VW4600, 20 //存放新產(chǎn)生的數(shù)據(jù)
在調(diào)試初期,調(diào)取系統(tǒng)時間之后,打印出的時間之間有很大的間隔,圖5所示。在打印機(jī)初始化程序里,對字間距等方面進(jìn)行處理,依然無法解決這個問題。后來將所需要處理的時間數(shù)據(jù)和所需要打印的漢字的機(jī)內(nèi)碼,存入一個表內(nèi),在需要打印時直接調(diào)用這個表進(jìn)行打印,解決了這個問題。