2015-07-10 47 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 
相关问题