本文來源:《世紀星月刊》第2期 作者:劉月新
1 VBA簡介
Visual Basic的應用程序版(VBA)是Microsoft公司長期追求的目標,使可編程應用軟件得到的實現,它作為一種通用的宏語言可被所有的Microsoft 可編程應用軟件所共享。在沒有VBA以前,一些應用軟件如Excel、Word、Access、Project等都采用自己的宏語言供用戶開發使用,但每種宏語言都是獨立的,需要用戶專門去學習,它們之間互不兼容,使得應用軟件之間不能在程序上互聯。擁有一種可跨越多個應用軟件,使各應用軟件產品具有高效、靈活且一致性的開發工具是至關重要的。VBA作為一種新一代的標準宏語言,具有上述跨越多種應用軟件并且具有控制應用軟件對象的能力,使得程序設計人員僅需學習一種統一的標準宏語言,就可以轉換到特定的應用軟件上去,程序設計人員在編程和調試代碼時所看到的是相同的用戶界面,而且VBA與原應用軟件的宏語言相兼容,以保障用戶在代碼和工作上的投資。有了VBA以后,多種應用程序共用一種宏語言,節省了程序人員的學習時間,提高了不同應用軟件間的相互開發和調用能力。
2 串口通訊程序
上位機向串口發送讀命令之后需要等待下位機應答并讀取回復信息,常用的等待有3種方式:
1) 輪詢式
上位機向串口發送讀命令之后一直等待下位機應答,通訊程序處于一個等待循環中。
優點:速度快、誤碼率低(幾乎不存在誤碼)。
缺點:消耗CPU。(解決辦法:使用Sleep()API函數)。
2) 消息式
消息式通訊是采用響應WINDOWS消息的辦法讀取串口。
優點:節省CPU、誤碼率低。
缺點:發送接收機制過于繁瑣。
3) 定時接收式
定時接收式通訊是根據預設的定時器時間進行讀取數據。
優點:發送接收機制相對簡單、節省CPU。
缺點:誤碼率太高,不同的硬件需要配置不同的通訊時間參數,需要嚴格的校驗運算。
3 EXCEL-VBA串口通訊實例
軟件:EXCEL。
硬件:艾默生EC10 PLC。
功能:通過EXCEL中的按鈕控制PLC的輸出繼電器Y0。
界面:RUN(運行通訊)、STOP(停止通訊)、Y0(Y0 ON/OFF控制)。
主程序:
Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public com1 As New MSCommLib.MSComm
Public y0Stt As Boolean
Public y0_on As Boolean
Public tmrFlag As Boolean
Public tmr As Long
Sub runn()
On Error GoTo ed
com1.Settings = "9600,e,8,1"
If com1.PortOpen = False Then
com1.PortOpen = True
End If
tmr = SetTimer(0, 0, 500, AddressOf ontimer)
Exit Sub
ed:
MsgBox "串口打開錯誤!"
End Sub
Sub stopp()
If com1.PortOpen = True Then
com1.PortOpen = False
KillTimer 0, tmr
End If
End Sub
Public Function ontimer()
Dim a(7) As Byte
Dim add As Long
On Error GoTo ed
If tmrFlag = False Then
tmrFlag = True
If y0_on = True Then
y0_on = False
If y0Stt = True Then
a(0) = &H1
a(1) = &H5
a(2) = &H0
a(3) = &H0
a(4) = &HFF
a(5) = &H0
a(6) = &H8C
a(7) = &H3A
com1.Output = a
add = 0
Do
DoEvents
Sleep 10
add = add + 1
If add >= 100 Then
Exit Do
End If
Loop Until com1.InBufferCount >= 8
Else
a(0) = &H1
a(1) = &H5
a(2) = &H0
a(3) = &H0
a(4) = &H0
a(5) = &H0
a(6) = &HCD
a(7) = &HCA
com1.Output = a
add = 0
Do
DoEvents
Sleep 10
add = add + 1
If add >= 100 Then
Exit Do
End If
Loop Until com1.InBufferCount >= 8
End If
End If
End If
tmrFlag = False
Exit Function
ed: MsgBox "串口錯誤!"
tmrFlag = False
End Function
界面程序:
Private Sub cmd1_Click()
y0_on = True
y0Stt = Not y0Stt
End Sub
Private Sub cmdRun_Click()
runn
CheckBox1.Value = 1
End Sub
Private Sub cmdStop_Click()
stopp
CheckBox1.Value = 0
End Sub
4 結束語
由上可見,VBA已經廣泛應用于微軟的應用軟件當中,所以為更好的完善二次開發功能,眾多的組態軟件都在VBA支持上做了努力,世紀星組態軟件開發語言已與VBA非常相似,相信在未來的版本中,世紀星將全面支持VBA,它的二次開發功能會邁上一個新的臺階。 ■