2015-07-10 214 views
1

這是我的最後一個職位的延續:How to read weight from scale using ethernet connection的TcpClient iFix的錯誤:在當前狀態無效操作40020

創造VB10的TCP連接之後 - 我現在想在iFIX中從規模看重量(VB6 )。下面的代碼工作,如果我創建一個斷點,並逐步通過:strdata採取規模(51克此刻)的重量。然而,當我只需運行的代碼,我得到的錯誤:

Invalid operation at current state 40020.

什麼,我認爲正在發生的事情是值得做的如何迅速讀取或試圖讀取多次。任何提示都會很棒。

TCPclient指的是winsock,而frmclient指的是我的表單。命令「S」是量程獲取重量值的必要命令。謝謝!

Public Sub test() 
On Error GoTo errHandler 

Dim strData As String 
frmClient.tcpClient.LocalPort = 0 
frmClient.tcpClient.Connect "192.168.0.1", 8000 

'Dim i As Integer 

' For i = 0 To 2000 
' Debug.Print "connection status=" & frmClient.tcpClient.State 
' If frmClient.tcpClient.State = 7 Then 
' Exit For Next i 

frmClient.tcpClient.SendData "S" & vbCrLf 

frmClient.tcpClient.GetData strData 
MsgBox ("weight =" & strData) 

'Exit Sub 
errHandler: 
MsgBox Err.Description & " " & Err.Number 

'Resume Next 
End Sub 

回答

0

使用Winsock控件的DataArrival事件。

因此,像:

' ... in your "frmClient" Form ... 
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long) 
    Dim strData As String 
    tcpClient.GetData strData, vbString 
    MsgBox ("weight =" & strData) 
End Sub 

*顯然去除原來的test()方法GetData()調用。

+0

我試過,但沒有奏效。 tcpClient在窗體設計器中被初始化,但我在子窗體中關閉它,因此它會嘗試再次使用它,但不會重新初始化,因爲窗體仍然存在。這有意義嗎?我認爲我做了這不必要的複雜,因爲我在窗體設計器中調用模塊,所以窗體設計器繼續運行 – Dallas

+0

也許不關閉它然後?...如果您必須關閉它,請將其設置爲備份並使用Connect()方法。 –

+0

上面的代碼片段也未能處理TCP數據是流並且接收數據一次可能達到一個八位字節或以任何方式分塊的事實。您的代碼應該重新組合流並解析數據單元以使用它們。 TCP不是數據報協議。 – Bob77

0

得到它的工作!代碼如下。我在代碼執行開始時創建了一個picture sub來初始化端口/ IP,然後在最後關閉連接。我製作了一個定時器,可以在穩定後自動讀取重量,因此可以通過點擊按鈕或等待2秒(2000毫秒)來找到重量。祝你好運,並感謝您的幫助!

Public tcpC As New Winsock 

Private Sub CFixPicture_Close() 
    tcpC.Close 
End Sub 

Private Sub CFixPicture_Initialize() 
    tcpC.LocalPort = 0 
    tcpC.Connect "192.168.0.1", 8000 
End Sub 

Private Sub CommandButton1_Click() 

On Error GoTo errHandler 
    Dim strData As String 

    tcpC.SendData "S" & vbCrLf 
    tcpC.GetData strData 
    Text4.Caption = "Weight: " & strData 
Exit Sub 

errHandler: 
    MsgBox "error:" & Err.Description 
End Sub 

Private Sub readScale_OnTimeOut(ByVal lTimerId As Long) 
    Dim strData As String 

    tcpC.SendData "S" & vbCrLf 
    tcpC.GetData strData 
    Text4.Caption = "Weight: " & strData 
Exit Sub 
End Sub 
相關問題