在對(duì)組態(tài)王和VB的初始設(shè)置完成后,結(jié)合VB編寫的與智能儀表的通信程序,分別按照服務(wù)器和顧客運(yùn)行應(yīng)用程序,即可實(shí)現(xiàn)組態(tài)王與VB 的自動(dòng)數(shù)據(jù)交換。
2. 2 VB與智能儀表的通信
本系統(tǒng)采用VB專業(yè)版的MSComm控件與VB模塊化編程相結(jié)合,實(shí)現(xiàn)了VB與智能儀表間的通信,主要程序模塊及部分程序如下:
① 程序初始化模塊。主要完成串口的選擇、波特率、幀結(jié)構(gòu)設(shè)置、打開串口等串口的設(shè)置工作。
② 發(fā)送數(shù)據(jù)模塊。由手動(dòng)發(fā)送控制命令字和自動(dòng)發(fā)送控制命令字兩種方式,實(shí)現(xiàn)手動(dòng)采集數(shù)據(jù)和自動(dòng)采集數(shù)據(jù)。其中,自動(dòng)發(fā)送數(shù)據(jù)方式包括一個(gè)定時(shí)器發(fā)送程序和一個(gè)定時(shí)器時(shí)間響應(yīng)程序;定時(shí)器發(fā)送程序用來控制控制命令字的發(fā)送周期,定時(shí)器響應(yīng)程序用來完成現(xiàn)場(chǎng)各智能化儀表地址的循環(huán)賦值及控制命令字的發(fā)送。
上述模塊中定時(shí)器響應(yīng)程序的部分程序如下:
Private Sub Timer1 Timer
Timer1. Enabled = False
Text_SEND. Text = "" ∥清空發(fā)送文本框
MSComm. OutBufferCount = 0 ∥清除發(fā)送緩沖區(qū)數(shù)據(jù)
Dim OutByte (1 To 3) AsByte
IfNotMSComm. PortOpen Then ∥保證串口打開
MSComm. PortOpen = True
End If
'24臺(tái)積算儀循環(huán)數(shù)據(jù)采集
If k = 1 Then
OutByte (1) = &HCA
OutByte (2) = 0
OutByte (3) = 1
End If
If k = 2 Then
OutByte (1) = &HCA
OutByte (2) = 0
OutByte (3) = 2
End If
??
k = k + 1
If k > 24 Then
k = 1
End If
MSComm. InBufferCount = 0 ∥清除接收緩沖區(qū)數(shù)據(jù)
MSComm. OutBufferCount = 0 ∥清除發(fā)送緩沖區(qū)數(shù)據(jù)
MSComm. Output = OutByte
For j = 1 To 3
OutByte again ( j) = OutByte ( j)
Next
For i = 1 To 50000000
'延時(shí)Next
End Sub
③ 接收數(shù)據(jù)模塊。通過事件響應(yīng)的方式來完成現(xiàn)場(chǎng)數(shù)據(jù)的接收。如果串口收到現(xiàn)場(chǎng)數(shù)據(jù),并且使得數(shù)據(jù)緩沖區(qū)中的內(nèi)容超過一個(gè)字節(jié)時(shí),就會(huì)引發(fā)com2EvReceive事件。OnComm 函數(shù)用來負(fù)責(zé)捕捉com2EvReceive事件,并且將發(fā)送緩沖區(qū)中的現(xiàn)場(chǎng)內(nèi)容寫入VB的文本框進(jìn)行顯示,同時(shí)與組態(tài)王進(jìn)行DDE數(shù)據(jù)交換。
該模塊中的OnComm 函數(shù)響應(yīng)程序如下:
Private Sub Timer1 Timer
Timer1. Enabled = False
Text_SEND. Text = "" ∥清空發(fā)送文本框
MSComm. OutBufferCount = 0 ∥清除發(fā)送緩沖區(qū)數(shù)據(jù)
Dim OutByte (1 To 3) AsByte
IfNotMSComm. PortOpen Then ∥保證串口打開
MSComm. PortOpen = True
End If
'24臺(tái)積算儀循環(huán)數(shù)據(jù)采集
If k = 1 Then
OutByte (1) = &HCA
OutByte (2) = 0
OutByte (3) = 1
End If
If k = 2 Then
OutByte (1) = &HCA
OutByte (2) = 0
OutByte (3) = 2
End If
k = k + 1
If k > 24 Then
k = 1
End If
MSComm. InBufferCount = 0 ∥清除接收緩沖區(qū)數(shù)據(jù)
MSComm. OutBufferCount = 0 ∥清除發(fā)送緩沖區(qū)數(shù)據(jù)
MSComm. Output = OutByte
For j = 1 To 3
OutByte again ( j) = OutByte ( j)
Next
For i = 1 To 50000000
'延時(shí)Next
End Sub
Private Sub Timer1 Timer
Timer1. Enabled = False
Text_SEND. Text = "" ∥清空發(fā)送文本框
MSComm. OutBufferCount = 0 ∥清除發(fā)送緩沖區(qū)數(shù)據(jù)
Dim OutByte (1 To 3) AsByte
IfNotMSComm. PortOpen Then ∥保證串口打開
MSComm. PortOpen = True
End If
'24臺(tái)積算儀循環(huán)數(shù)據(jù)采集
If k = 1 Then
OutByte (1) = &HCA
OutByte (2) = 0
OutByte (3) = 1
End If
If k = 2 Then
OutByte (1) = &HCA
OutByte (2) = 0
OutByte (3) = 2
End If
??
k = k + 1
If k > 24 Then
k = 1
End If
MSComm. InBufferCount = 0 ∥清除接收緩沖區(qū)數(shù)據(jù)
MSComm. OutBufferCount = 0 ∥清除發(fā)送緩沖區(qū)數(shù)據(jù)
MSComm. Output = OutByte
For j = 1 To 3
OutByte again ( j) = OutByte ( j)
Next
For i = 1 To 50000000
'延時(shí)Next
End Sub
④ 容錯(cuò)模塊。通過增加數(shù)據(jù)采集容錯(cuò)模塊,保證數(shù)據(jù)采集的實(shí)時(shí)性、準(zhǔn)確性,提高系統(tǒng)工作可靠性。
⑤ 數(shù)據(jù)庫(kù)模塊。主要利用Access數(shù)據(jù)庫(kù),實(shí)現(xiàn)對(duì)計(jì)算機(jī)采集數(shù)據(jù)存儲(chǔ)、管理、分析及歷史數(shù)據(jù)的查詢等。
⑥ 其他程序模塊。主要完成發(fā)送、接收文本框的清空工作等。
通過上述幾個(gè)模塊的協(xié)調(diào)工作,就可以較好地實(shí)現(xiàn)VB與智能儀表間的串行通信、數(shù)據(jù)分析及歷史數(shù)據(jù)查詢等。
3 結(jié)束語(yǔ)
評(píng)論
查看更多