none
VB6.0中command元件執行程式會造成信號KEEP住 RRS feed

  • 問題

  • 各位大大,小弟在利用VB6.0撰寫一個與PLC通訊的程式,命令語法如下:

     

    Code Snippet

    Private Sub command16_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim outdata As String
    Dim RXD As String
    'PLC內部位元ON
    Form1.MSComm1.PortOpen = True
     t$ = "@00" + "WR" + "0022" + "0020"
     fcschk$ = fcs$(t$)
     outdata = t$ + fcschk$ + "*" + Chr(13)
     Form1.MSComm1.Output = outdata
     Form1.MSComm1.PortOpen = False


    End Sub
    '出口降
    Private Sub command16_MouseUP(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim outdata As String
    Dim RXD As String

    'PLC內部位元OFF
     Form1.MSComm1.PortOpen = True
     t$ = "@00" + "WR" + "0022" + "0000"
     fcschk$ = fcs$(t$)
     outdata = t$ + fcschk$ + "*" + Chr(13)
     Form1.MSComm1.Output = outdata
     wait = Timer + 0.2
     Do
     RXD = RXD + Form1.MSComm1.Input
     Loop Until Len(RXD) >= 10 Or Timer >= wait
     Form1.MSComm1.PortOpen = False

     

     

    但是問題來了!這樣的語法執行下,有時會造成PLC內部接點KEEP住,利用中斷點來看(在Command16_MOUSEUP中),發現他有時會miss掉,尤其是連續點擊或是快速點擊的情況下會發生,

     

    試過這樣的方式,利用P2值的變化來做

    Code Snippet

    Private Sub command16_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Static P2 As Integer
    Form1.MSComm1.PortOpen = True
    P2 = 7
    Call Button2(P2) '執行ON的動作
    Form1.MSComm1.PortOpen = False

    End Sub
    '出口降
    Private Sub command16_MouseUP(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Static P2 As Integer
    Form1.MSComm1.PortOpen = True
    P2 = 1
    Call Button2(P2)'執行OFF的動作
    Form1.MSComm1.PortOpen = False

     

     

    監控P值的變化,發現P2有時會變成Empty

    這2種方式都會發生信號KEEP住的情況,這樣是否有方法能避免呢

    2008年11月22日 下午 03:12

解答

  • 不太了解你的意思

     

    VB6 是單緒程式,當你在做某些動作時,其他動作會停掉,這是必然且唯一。

     

    通常通訊中,除非是目標為即時測量值,否則不應該掉信號,幾乎都是會先寫入硬體內建的儲存設備,收到通訊要求時,才把資料丟出來。

     

    如果你的設備是一直把即時測量值丟出來的,你必須換用支援多緒的開發工具來執行,例如 VBNET ,但這也只是降低遺失率,目前沒有百分百不遺失的方案,比如說當你的作業系統忙碌中時,執行緒也有可能沒分到足夠的時間抓資料,所以也可以看看硬體製造商提供的解決方案,通常是加大硬體內建儲存設備,來當作緩衝區。

    2008年12月6日 上午 12:32
    版主

所有回覆

  • 小弟實際監控P2值變化後發現。P2有時不會為1,目前為了確保MOUSE_UP的動作有確實被執行到

    便將程式改成這樣

    for X%= 0 to 1

    P=2

    call Button2(P2)

    NEXT X%

    情況改善很多了!!

    希望能有大大可以一同討論依下這各問題

    2008年11月25日 下午 03:52
  • 不太了解你的意思

     

    VB6 是單緒程式,當你在做某些動作時,其他動作會停掉,這是必然且唯一。

     

    通常通訊中,除非是目標為即時測量值,否則不應該掉信號,幾乎都是會先寫入硬體內建的儲存設備,收到通訊要求時,才把資料丟出來。

     

    如果你的設備是一直把即時測量值丟出來的,你必須換用支援多緒的開發工具來執行,例如 VBNET ,但這也只是降低遺失率,目前沒有百分百不遺失的方案,比如說當你的作業系統忙碌中時,執行緒也有可能沒分到足夠的時間抓資料,所以也可以看看硬體製造商提供的解決方案,通常是加大硬體內建儲存設備,來當作緩衝區。

    2008年12月6日 上午 12:32
    版主
  • 我已經知道VB為單緒的程式

    目前的作法是有將com1當成只讀不寫的通訊埠com2則是下達命令的

    但還是會有MOUSE_UP所觸發的程式會不被執行到

    但是以目前的做法來看!!似乎較少發生了

     

    2008年12月9日 下午 02:23
  • 部分即時設備會丟出數量訊號,比如說 Count 數,有時會用算的來解決掉資料的問題。

     

    例如雨量計每 0.5 mm 會丟出一個 Count ,有時候受無線電干擾,或是瞬時雨量過大,Count 就不是遞增,而是跳數個間隔,但可透過兩個數值相減取得雨量值。

    2008年12月9日 下午 02:29
    版主