VB編程技術(shù)在汽車(chē)衡管理軟件上的應(yīng)用
本文通過(guò)對(duì)一個(gè)汽車(chē)衡管理系統(tǒng)軟件的編程過(guò)程,介紹了用VB6.0編程軟件在汽車(chē)衡管理系統(tǒng)中的技術(shù)應(yīng)用
1.引言
Visual Basic (簡(jiǎn)稱(chēng)VB)是Win- dows環(huán)境下簡(jiǎn)單、易學(xué)、高效的編 程語(yǔ)言開(kāi)發(fā)系統(tǒng),以其所見(jiàn)即所得 的可視化界面設(shè)計(jì)風(fēng)格和32位面向 對(duì)象的程序設(shè)計(jì)等特點(diǎn),已廣泛地應(yīng) 用于各個(gè)領(lǐng)域,是很多計(jì)算機(jī)軟件開(kāi) 發(fā)人員采用的開(kāi)發(fā)工具。VB提供了良 好的界面設(shè)計(jì)能力,提供了強(qiáng)大的 數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)功能和微機(jī)串口通信功 能。完全能夠滿(mǎn)足汽車(chē)衡管理系統(tǒng) 的數(shù)據(jù)采集、處理和存儲(chǔ)要求。下 面以SCS微機(jī)汽車(chē)衡稱(chēng)重軟件為例’ 敘述VB軟件對(duì)系統(tǒng)中幾個(gè)重要功能 程序的設(shè)計(jì)。
2.管理軟件功能需求
SCS微機(jī)汽車(chē)衡稱(chēng)重系統(tǒng)主要 通過(guò)計(jì)算機(jī)串口連接汽車(chē)衡稱(chēng)重儀 表,處理儀表所獲取的汽車(chē)重量信 息,達(dá)到管理汽車(chē)稱(chēng)重?cái)?shù)據(jù)的目的。 系統(tǒng)軟件要求達(dá)到的功能主要有:
(1)設(shè)置管理權(quán)限,達(dá)到操作 人員分級(jí)登錄操作。
(2)記錄、貯存并打印每一次 稱(chēng)重結(jié)果。包括車(chē)號(hào)、貨物名稱(chēng)、運(yùn) 貨單位、駕駛員、毛皮重、凈重、進(jìn) 出廠過(guò)磅時(shí)間、司磅員等內(nèi)容。
(3)查詢(xún)打印功能。可按車(chē) 號(hào)、時(shí)間范圍、司磅員、貨物種類(lèi)、 駕駛員等或任意組合查詢(xún)過(guò)去稱(chēng)重 記錄,并可打印輸出。
(4)統(tǒng)計(jì)打印功能??蓪?duì)稱(chēng)重 結(jié)果自動(dòng)進(jìn)行統(tǒng)計(jì),并打印各種報(bào) 表,如月報(bào)、年報(bào)、分類(lèi)報(bào)表等。
(5)數(shù)據(jù)維護(hù)功能。包括記錄
限制修改和刪除,數(shù)據(jù)備份和導(dǎo)出。
在這個(gè)系統(tǒng)軟件中,重點(diǎn)是編寫(xiě)數(shù)據(jù)采集的串口通信模塊和數(shù)據(jù)庫(kù) 操作訪(fǎng)問(wèn)功能程序。用Visual Ba- sic編程語(yǔ)言來(lái)編制這些程序,也就 要充分理解串口通信和數(shù)據(jù)庫(kù)訪(fǎng)問(wèn) 相關(guān)的控件特點(diǎn)和應(yīng)用技術(shù)。
3.數(shù)據(jù)采集程序模塊的設(shè)計(jì)
3.1選擇MSComm控件實(shí)現(xiàn)串口 通信
用VB開(kāi)發(fā)串口通信程序常用兩 種方法,一種是利用WINDOWS的通 信API函數(shù)實(shí)現(xiàn),另一種是采用VB 內(nèi)集成的MSComm通信控件實(shí)現(xiàn)。在 實(shí)例中選用MSComm控件實(shí)現(xiàn)串口通 信的編程,該控件具有豐富的與串 口通信密切相關(guān)的屬性和事件,提 供了對(duì)串口的各種操作。在通信過(guò) 程中,當(dāng)發(fā)送數(shù)據(jù)、收到數(shù)據(jù)或產(chǎn) 生傳輸錯(cuò)誤時(shí),觸發(fā)MSComm控件的 OnComm事件,然后可以通過(guò)判斷 CommEvent屬性值獲得事件類(lèi)型,再 根據(jù)事件類(lèi)型進(jìn)行相應(yīng)數(shù)據(jù)處理。 因此用其實(shí)現(xiàn)微機(jī)串口的數(shù)據(jù)通信 相當(dāng)簡(jiǎn)單,以很少的程序代碼就可 以輕松實(shí)現(xiàn)串口的訪(fǎng)問(wèn)和數(shù)據(jù)通信。
3.2儀表參數(shù)及其數(shù)據(jù)通信協(xié)議 以微機(jī)管理系統(tǒng)連接汽車(chē)衡XK3 190-A9稱(chēng)重顯示器為例。該儀表可 連接8個(gè)350 0或12個(gè)700 0的高精度稱(chēng) 重傳感器,用于測(cè)量汽車(chē)重量數(shù)據(jù)。 儀表測(cè)量準(zhǔn)確度為III級(jí)(N=3000) 按顯示分度值設(shè)置不同,測(cè)量范圍 最大值100噸。該儀表具有RS-232/ RS422 (選配)串行通訊接口,能與 微機(jī)進(jìn)行串口數(shù)據(jù)通信,實(shí)時(shí)傳送 檢測(cè)數(shù)據(jù)。
該儀表串口數(shù)據(jù)通信協(xié)議是:數(shù) 據(jù)傳輸速率為600/1200/2400/9600bps (可選),數(shù)據(jù)格式(10位):1位 開(kāi)始位,8位數(shù)據(jù)位(ASCII編碼)’1位停止位,無(wú)奇偶校驗(yàn)位。通訊方 式有連續(xù)方式和指令方式兩種,這里 只列舉連續(xù)通訊方式中的格式。
所傳送的數(shù)據(jù)為儀表顯示的當(dāng) 前稱(chēng)量(毛重或凈重)。每幀數(shù)據(jù)由 10組數(shù)據(jù)組成。格式如表1。
3.3部分參數(shù)的技術(shù)說(shuō)明
(1)為滿(mǎn)足各種儀表參數(shù)和計(jì) 算機(jī)不同運(yùn)行環(huán)境的需要,把串口 通信的一些參數(shù)用數(shù)據(jù)庫(kù)的表進(jìn)行 存放,程序通過(guò)讀取表數(shù)據(jù)來(lái)進(jìn)行 通信環(huán)境參數(shù)的設(shè)置。這樣做用戶(hù) 可以修改數(shù)據(jù)表的數(shù)據(jù)來(lái)改變運(yùn)行 參數(shù),以滿(mǎn)足實(shí)際需要。
(2)為了提高接收數(shù)據(jù)的讀 取速度,實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè)功能,設(shè)置 MSComm1的屬性RThreshold=4,接 收緩沖區(qū)收到四個(gè)字節(jié)產(chǎn)生OnComm 事件;InputLen=1,每次讀取一個(gè) 字節(jié)。設(shè)置接收數(shù)據(jù)模式采用二進(jìn)制形式,即InputMode=comInputM odeBinary。設(shè)置InBufferSize=50 (設(shè)置接收緩沖區(qū)為50字節(jié)), OutBufferSize=2 (設(shè)置發(fā)送緩沖區(qū) 為2字節(jié))。
(3)定義一個(gè)Byte類(lèi)型數(shù)組變 量來(lái)存放重量數(shù)據(jù)值。注意用Input 屬性讀取數(shù)據(jù)時(shí),還要看儀表輸出 數(shù)據(jù)位格式的編碼方式。壓縮的BCD 碼存入Byte類(lèi)型變量,VB系統(tǒng)只按 十進(jìn)制數(shù)處理,這要通過(guò)一個(gè)簡(jiǎn)單 算法換算,解壓BCD碼才能還原成十 進(jìn)制表示數(shù)值。本例ASCII編碼直接 賦值給數(shù)組Byte類(lèi)型變量。
3.4源程序代碼 系統(tǒng)數(shù)據(jù)庫(kù)dbl. mdb建立一個(gè)名 為‘‘串口”的表,字段分別為串口、 波特率、校驗(yàn)、停止位、數(shù)據(jù)位、 流控制,記錄串口運(yùn)行參數(shù)設(shè)置信 息。在窗體中添加名為MSComml的 MSComm控件,名為Label7顯示重量 數(shù)據(jù)的標(biāo)簽控件,名為Text3、Text4存貯毛重、皮重的文本框控件等。 串口初始化模塊:
Private Sub Form—Load() MSComml.CommPort = rec(“串 口”)‘賦值串口端口號(hào),本例為COM1 MSComml.Settings = rec(“波 特率” )& ",n, 8,1" ‘無(wú)奇偶校 驗(yàn),8位數(shù)據(jù)位,1位停止位 MSComml.InputLen = 1 MSComml.RThreshold = 4 If MSComml.PortOpen = False Then ‘判斷串口端口是否打開(kāi) MSComml.PortOpen = True ‘打開(kāi)端口 Else
MsgBox ‘‘串行端口號(hào)已被占用, 請(qǐng)選擇其它端口!”, vbCritical + vbOKOnly, “系統(tǒng)信息”
Exit Sub
數(shù)據(jù)讀取、轉(zhuǎn)換及顯示模塊: Private Sub MSComml_OnComm() Dim buf() As Byte ‘定義一個(gè)數(shù)據(jù)變量 If MSComml. CommEvent = 2 Then ‘判斷接收緩沖區(qū)內(nèi)字符數(shù) 達(dá)到Rthreshold指定的值 buf = MSComml.Input ‘讀取一個(gè)字節(jié) If buf(0) = 2 Then ‘判斷是否為開(kāi)02(XON)開(kāi)始 c2 = buf⑴
‘以下讀取各位重量數(shù)據(jù)分別賦值 c3 = buf⑵ c4 = buf⑶ c5 = buf(4) c6 = buf(5) c7 = buf(6) c8 = buf(7)
以下為對(duì)各位字節(jié)數(shù)據(jù)進(jìn)行轉(zhuǎn) 換和組合顯示
shuju = Chr (c2) + Chr (c3) + Chr(c4) + Chr (c5) + Chr (c6) + Chr (c7) + Chr (c8) Label7. Caption =shuju ‘賦值顯示
If Optionl.Value=True Then ‘Optionl為毛重選項(xiàng)。判斷是 否Optionl被選中
Text3. Text = Val(Label7. Caption) ‘賦值給毛重文本控件 End If
I f Opti on2 . Val ue = True Then ‘Option2l為皮重選
項(xiàng)。判斷是否Option2被選中
Text4. Text = Val(Label7. Caption) ‘賦值給皮重文本控件 End If
LabellO. Caption= “數(shù)據(jù)穩(wěn)定!〃 Else
LabellO. Caption = “連接正 常,但數(shù)據(jù)不穩(wěn)定...!〃
MSComml. PortOpen = False ‘重新關(guān)閉和開(kāi)啟串口端口 一次 MSComml.PortOpen = True
End If End If End Sub
4.數(shù)據(jù)庫(kù)程序模塊設(shè)計(jì)
4.1數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì) 本例以Microsoft Access數(shù)據(jù) 庫(kù)進(jìn)行稱(chēng)重?cái)?shù)據(jù)的管理,建立db1. mdb數(shù)據(jù)庫(kù)。汽車(chē)衡完成一個(gè)稱(chēng)重過(guò) 程一般是某車(chē)號(hào)汽車(chē)稱(chēng)毛重,再過(guò)皮 重(或者稱(chēng)重順序反調(diào))得出凈重 后,數(shù)據(jù)存入數(shù)據(jù)表,打印報(bào)表。在 實(shí)際稱(chēng)重中稱(chēng)毛重和過(guò)皮重的過(guò)程并 不連續(xù),有時(shí)要連續(xù)稱(chēng)幾臺(tái)汽車(chē)的毛 重或皮重,因此必須建立一個(gè)用于存 貯稱(chēng)重暫存數(shù)據(jù)的表。在db1.mdb數(shù) 據(jù)庫(kù)中建立報(bào)頭、帳戶(hù)、本地表、稱(chēng) 重、單位設(shè)置、歷史皮重、串口、物 質(zhì)類(lèi)別等數(shù)據(jù)表。“本地表”用于存 貯歷史稱(chēng)重?cái)?shù)據(jù),“稱(chēng)重”表存貯 稱(chēng)重暫存數(shù)據(jù),本例重點(diǎn)介紹“本 地表”和“稱(chēng)重”兩個(gè)關(guān)鍵表的結(jié) 構(gòu)設(shè)計(jì),如表2,表3所示
4.2數(shù)據(jù)庫(kù)編程
系統(tǒng)登錄”、“稱(chēng)重管理”、“報(bào) 表管理”等多個(gè)窗體,都涉及到對(duì) db1.mdb數(shù)據(jù)庫(kù)的編程,主要應(yīng)用了 Visual Basic對(duì)Access數(shù)據(jù)庫(kù)操作 的編程語(yǔ)言。如:
dim conn as new adodb. connec-tion
dim rs as new adodb. recordset
連接數(shù)據(jù)庫(kù)
with conn
If . StateOadstateclosed Then .Close
.ConnectionString = “pro -vider=Microsoft.Jet.0LEDB.4.0; Data Source=” & App.path & “數(shù)據(jù)庫(kù)名.mdb;Mode=ReadWrite; Persist Security Info=False” .Open End With 查詢(xún)記錄
if rs. stateOadstateclosed then rs.close
rs.open “select * from 表 名”,conn,adopenkeyset,adlockre adonly
set mshflexgrid1.datasource
=rs
rs.close 新增記錄
conn. execute “insert into 表名(...)values(...)”
修改記錄
conn. execute “update 表名 set ... where ...”
刪除記錄
conn. execute “delete from 表 名where... ”等等,鑒于論文篇幅 的限制本例數(shù)據(jù)庫(kù)編程源代碼略。