本人用MSComm控制元件去讀取溫度控制器的實時溫度,現在讀取正常,但有一個問題,就是不知樣去檢測儀表脫機。
uj5u.com熱心網友回復:
讀資料“無回應”,或者向儀表發請求資訊,儀表無回應,不就是表示“儀表脫機”了嗎?uj5u.com熱心網友回復:
想是這樣想的,但不知道怎樣去實作呀?是讀MSComm1.Input嗎?可以寫代碼出來嗎?謝謝uj5u.com熱心網友回復:
想是這樣想的,但不知道怎樣去實作呀?是讀MSComm1.Input嗎?可以寫代碼出來嗎?謝謝
uj5u.com熱心網友回復:
利用Timer控制元件輔助判斷是否超時無回應。uj5u.com熱心網友回復:
可不可給個代碼參考一下?
INByte = MSComm1.Input,,,我本想讀取MSComm1.Input,,如果為空那是脫機了,但是,寫不對,
uj5u.com熱心網友回復:
可以有多種方案。假定你是采用事件驅動方案的,即在 OnComm 事件中處理資料接收,那就可以在這里不斷重置 Timer。
如果 Timer 事件發生了,就說明溫控器發送資料超過了預定事件。
你可以設定連續發生 n 次 Timer 超時才確認設備離線。
uj5u.com熱心網友回復:
VB6真正的大神現身了。我就退下了。
uj5u.com熱心網友回復:
Private Sub Timer1_Timer() '300ms定時發送讀取實時溫度命令
Dim tbisend(7) As Byte
Dim crc
Dim btLoCRC As Byte, btHiCRC As Byte
Dim Buf As String
If MSComm1.PortOpen = True Then
tbisend(0) = "&h" + Hex(Val(1)) '地址碼
tbisend(1) = "&h" + Hex(Val(3)) '功能碼 03為讀,06為寫
tbisend(2) = "&h" + Hex(Val(16)) '起始地址高位
tbisend(3) = "&h" + Hex(Val(1)) '起始地址低位
tbisend(4) = "&h" + Hex(Val(0)) '暫存器個數高位
tbisend(5) = "&h" + Hex(Val(1)) '暫存器個數低位
crc = CRC16(tbisend, 6, btLoCRC, btHiCRC)
tbisend(6) = "&h" + Hex(btLoCRC) 'CRC高位
tbisend(7) = "&h" + Hex(btHiCRC) 'CRC低位
MSComm1.Output = tbisend '發送資料
Timer2.Enabled = True '打開脫機檢測
End If
End Sub
-------------------------------------------------------------------------------------------------------------------------
Private Sub MSComm1_OnComm()
Dim INByte() As Byte
Dim Buf As String
Dim btLoCRC As Byte, btHiCRC As Byte
'Dim Data As Integer
If MSComm1.CommEvent = comEvReceive Then '接收到資料以后<comEvReceive:發生接收事件>
INByte = MSComm1.Input
If INByte(1) = 3 Then '讀暫存器
Data = Hex(INByte(3)) + Hex(INByte(4)) ''讀取16進制的第三、第四位元組,再將其組合一起
Buf = CLng("&H" & Data) / 10 ''將讀取的16進制轉換為10進制,因為真實數值比讀取數值大10倍,所以除以10
Buf = Format(Buf, "###0.0")
Label20.Caption = Buf + " ℃"
Timer2.Enabled = False '有資料接收時,關閉脫機檢測
'End If
' MsgBox "CRC校驗錯誤"
End If
MSComm1.InBufferCount = 0 '清快取,這個一定要在最后一個END IF前。
End If
End Sub
--------------------------------------------------------------------------------------------------------------------------------
Private Sub Timer2_Timer() '脫機提示
Dim ind As Integer
ind = MSComm1.InBufferCount
If ind < 1 Then '當接收快取小于1,提示脫機
Label20.Caption = "TIME OUT"
End If
End Sub
這樣做大多時可以顯示到脫機,但不準確。
uj5u.com熱心網友回復:
能寫出這樣的代碼人,可見水平已經菜到什么程度了………………
uj5u.com熱心網友回復:
不好意思,不是一般菜,而是十分菜
uj5u.com熱心網友回復:
你的脫機檢測Timer2的周期設定的是多少?會不會把時限設定得太短了?你這種用Timer控制元件定時請求資料的,按我的想法只要一個Timer控制元件就夠了。
用一個Timer控制元件就可以完成資料請求和脫機檢測。
uj5u.com熱心網友回復:
你的脫機檢測Timer2的周期設定的是多少?會不會把時限設定得太短了?
你這種用Timer控制元件定時請求資料的,按我的想法只要一個Timer控制元件就夠了。
用一個Timer控制元件就可以完成資料請求和脫機檢測。
Timer2的周期設定為1000MS,,因為T1是用來讀實時資料的,有時可能會手動關閉,所以沒將檢測放在這里。
現在我用一個比較笨的方面可以實作,就是當T1發送資料時,打開T2,;當MSCOMM1收到資料時,關閉T2.
還有現在遇到一個問題,就是當程式正在運行時,如果我手動拔去USB轉COM介面時,程式出錯,8021,,然后卡死。請問有什么辦法可以跳過這個錯誤,謝謝。
uj5u.com熱心網友回復:

Modbus的啊~~~,參考一下我的代碼吧http://blog.csdn.net/bakw/article/details/50487609
多長時間讀不回來就報通訊故障就行了.
uj5u.com熱心網友回復:
Modbus的啊~~~,參考一下我的代碼吧http://blog.csdn.net/bakw/article/details/50487609
多長時間讀不回來就報通訊故障就行了.
好的,謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/69931.html
標籤:控件
