技術(shù)頻道

      VBA的妙用:串口通訊程序與EXCEL相結(jié)合

      1 VBA簡(jiǎn)介
        Visual Basic的應(yīng)用程序版(VBA)是Microsoft公司長(zhǎng)期追求的目標(biāo),使可編程應(yīng)用軟件得到完美的實(shí)現(xiàn),它作為一種通用的宏語言可被所有的Microsoft 可編程應(yīng)用軟件所共享。在沒有VBA以前,一些應(yīng)用軟件如Excel、Word、Access、Project等都采用自己的宏語言供用戶開發(fā)使用,但每種宏語言都是獨(dú)立的,需要用戶專門去學(xué)習(xí),它們之間互不兼容,使得應(yīng)用軟件之間不能在程序上互聯(lián)。擁有一種可跨越多個(gè)應(yīng)用軟件,使各應(yīng)用軟件產(chǎn)品具有高效、靈活且一致性的開發(fā)工具是至關(guān)重要的。VBA作為一種新一代的標(biāo)準(zhǔn)宏語言,具有上述跨越多種應(yīng)用軟件并且具有控制應(yīng)用軟件對(duì)象的能力,使得程序設(shè)計(jì)人員僅需學(xué)習(xí)一種統(tǒng)一的標(biāo)準(zhǔn)宏語言,就可以轉(zhuǎn)換到特定的應(yīng)用軟件上去,程序設(shè)計(jì)人員在編程和調(diào)試代碼時(shí)所看到的是相同的用戶界面,而且VBA與原應(yīng)用軟件的宏語言相兼容,以保障用戶在代碼和工作上的投資。有了VBA以后,多種應(yīng)用程序共用一種宏語言,節(jié)省了程序人員的學(xué)習(xí)時(shí)間,提高了不同應(yīng)用軟件間的相互開發(fā)和調(diào)用能力。

      2 串口通訊程序
        簡(jiǎn)單的串口通訊程序一般是先由上位機(jī)向下位機(jī)發(fā)送讀(write)或?qū)?read)數(shù)據(jù)命令,然后等待下位機(jī)應(yīng)答;下位機(jī)接受到命令之后,首先要對(duì)數(shù)據(jù)命令進(jìn)行校驗(yàn),對(duì)于符合校驗(yàn)約束的命令下位機(jī)會(huì)將相應(yīng)的數(shù)據(jù)回復(fù)到上位機(jī),對(duì)于不符合校驗(yàn)約束的命令下位機(jī)或?qū)⑵鋻仐壔蚧貜?fù)錯(cuò)誤信息;上位機(jī)接收到下位機(jī)的響應(yīng)之后,首先要對(duì)接收到的回復(fù)信息進(jìn)行校驗(yàn),對(duì)不符合校驗(yàn)約束的數(shù)據(jù)進(jìn)行異常處理,對(duì)符合校驗(yàn)約束的信息進(jìn)行解碼,解碼之后的信息便是上位機(jī)從下位機(jī)獲得的有效信息了。
        上位機(jī)向串口發(fā)送讀命令之后需要等待下位機(jī)應(yīng)答并讀取回復(fù)信息,常用的等待有3種方式:
      1) 輪詢式
        上位機(jī)向串口發(fā)送讀命令之后一直等待下位機(jī)應(yīng)答,通訊程序處于一個(gè)等待循環(huán)中。
        優(yōu)點(diǎn):速度快、誤碼率低(幾乎不存在誤碼)。
        缺點(diǎn):消耗CPU。(解決辦法:使用Sleep()API函數(shù))。
      2) 消息式
        消息式通訊是采用響應(yīng)WINDOWS消息的辦法讀取串口。
        優(yōu)點(diǎn):節(jié)省CPU、誤碼率低。
        缺點(diǎn):發(fā)送接收機(jī)制過于繁瑣。
      3) 定時(shí)接收式
        定時(shí)接收式通訊是根據(jù)預(yù)設(shè)的定時(shí)器時(shí)間進(jìn)行讀取數(shù)據(jù)。
        優(yōu)點(diǎn):發(fā)送接收機(jī)制相對(duì)簡(jiǎn)單、節(jié)省CPU。
        缺點(diǎn):誤碼率太高,不同的硬件需要配置不同的通訊時(shí)間參數(shù),需要嚴(yán)格的校驗(yàn)運(yùn)算。

      3 EXCEL-VBA串口通訊實(shí)例
        軟件:EXCEL。
        硬件:艾默生EC10 PLC。
        功能:通過EXCEL中的按鈕控制PLC的輸出繼電器Y0。
        界面:RUN(運(yùn)行通訊)、STOP(停止通訊)、Y0(Y0 ON/OFF控制)。

      世紀(jì)星組態(tài)軟件

        主程序:
        Option Explicit
        Public De clare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
        Public De clare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
        Public De clare 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 "串口打開錯(cuò)誤!"
        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 "串口錯(cuò)誤!"
        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 結(jié)束語
        由上可見,VBA已經(jīng)廣泛應(yīng)用于微軟的應(yīng)用軟件當(dāng)中,所以為更好的完善二次開發(fā)功能,眾多的組態(tài)軟件都在VBA支持上做了努力,世紀(jì)星組態(tài)軟件開發(fā)語言已與VBA非常相似,相信在未來的版本中,世紀(jì)星將全面支持VBA,它的二次開發(fā)功能會(huì)邁上一個(gè)新的臺(tái)階。 ■

      文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。

      主站蜘蛛池模板: 国产怡春院无码一区二区| 视频一区在线免费观看| 亚洲AV香蕉一区区二区三区| 国产在线精品一区二区在线观看| 亚洲AV无码一区东京热| 亚洲AV无码一区二区三区系列| 乱子伦一区二区三区| 日韩一区二区三区在线精品 | 国产成人久久一区二区不卡三区| 久久人妻无码一区二区| 亚洲国产成人久久综合一区77| 亚洲一区AV无码少妇电影☆| 中文字幕av人妻少妇一区二区| 国产一区二区视频在线观看| 久久人妻无码一区二区| 亚洲无线码一区二区三区| 国产成人久久精品一区二区三区| 狠狠色综合一区二区| 国产亚洲3p无码一区二区| 成人精品视频一区二区三区尤物| 国产AV午夜精品一区二区三区| 国产成人高清精品一区二区三区| 亚洲一区免费在线观看| 亚洲一区二区三区久久久久| 国产午夜精品一区二区三区小说| 一区二区三区精品视频| 日韩视频在线观看一区二区| 亚洲乱码国产一区网址| 无码一区二区三区亚洲人妻| 日本精品视频一区二区| 精品乱码一区二区三区在线| 精品国产一区二区三区在线观看| 色噜噜狠狠一区二区三区果冻 | 亚洲一区二区三区播放在线| 国产爆乳无码一区二区麻豆| 精品无人区一区二区三区在线| 亚洲一区AV无码少妇电影| 动漫精品一区二区三区3d| 亚洲AV无码一区东京热久久 | 国产成人av一区二区三区在线| 青娱乐国产官网极品一区|