北方民族大學電氣信息工程學院 劉 超 劉 煒 趙 強
微型熱敏打印機在立體車庫存取車中的應用
北方民族大學電氣信息工程學院 劉 超 劉 煒 趙 強
本文介紹了一種利用可編程控制器(PLC)驅動微型熱敏打印機的方法。作者通過PLC的RS-485接口與熱敏打印機相連,利用串口直接驅動打印機的方法,運用軟件編程實現了PLC對熱敏打印機的驅動。該方法成功的實現了立體車庫存取車密碼的打印。
PLC驅動;熱敏打印機
隨著信息通信技術與經濟的迅猛發展,做為信息輸出終端的打印機,其應用已經涉及到商品流通、交通運輸、工業控制等領域,成為各種智能儀器儀表的重要數據輸出手段。其中熱敏打印機憑借其打印速度快、噪聲小、打印質量高、小型化、結構簡單、維護方便、高性價比等特點,在商場、醫療、電信、郵政等各個領域得到了廣泛的應用。本文利用PLC驅動熱敏微型打印機,實現了在立體車庫存取車的密碼打印輸出。
系統框圖如圖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 打印子程序流程圖
打印程序的主要任務是:(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 //存放新產生的數據
在調試初期,調取系統時間之后,打印出的時間之間有很大的間隔,圖5所示。在打印機初始化程序里,對字間距等方面進行處理,依然無法解決這個問題。后來將所需要處理的時間數據和所需要打印的漢字的機內碼,存入一個表內,在需要打印時直接調用這個表進行打印,解決了這個問題。