TCPClient iFix 错误:当前状态下的无效操作 40020

Posted

技术标签:

【中文标题】TCPClient iFix 错误:当前状态下的无效操作 40020【英文标题】:TCPClient iFix error: Invalid Operation at Current State 40020 【发布时间】:2015-07-10 14:22:42 【问题描述】:

这是我上一篇文章的延续:How to read weight from scale using ethernet connection

在 vb10 中创建 TCP 连接后 - 我现在尝试从 iFix (vb6) 中的秤读取重量。如果我创建一个断点并单步执行,下面的代码将起作用:strdata 采用秤的重量(目前为 51g)。但是,当我简单地运行代码时,我得到了错误:

当前状态为 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

【问题讨论】:

【参考方案1】:

使用 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() 调用。

【讨论】:

我试过了,但没有用。 tcpClient 在表单设计器中初始化,但我在子程序中将其关闭,因此它尝试再次使用它但不会重新初始化,因为表单仍然存在。这有意义吗?我认为我让这变得不必要地复杂了,因为我在表单设计器中调用了模块,所以表单设计器继续运行 也许不关闭它?...如果您必须关闭它,请将其重新设置并使用 Connect() 方法。 上面的代码 sn-p 也无法处理 TCP 数据是一个流并且接收数据可能一次到达一个八位字节或以任何方式分块的事实。您的代码应该重新组装流并解析数据单元以使用它们。 TCP 不是数据报协议。 是的......但我们绝对没有得到关于这个规模的协议的信息。这里的重点是 Winsock 控件有一个 DataReceived() 事件,该事件仅在连接处于正确状态时触发。没有它,您必须使用轮询循环等待ConnectionState 处于正确状态,然后才能继续使用其他代码。【参考方案2】:

搞定了!代码如下。我创建了一个图片子来在代码执行开始时初始化端口/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

【讨论】:

以上是关于TCPClient iFix 错误:当前状态下的无效操作 40020的主要内容,如果未能解决你的问题,请参考以下文章

前后端分离下的无状态会话管理

Visual Studio 2017 错误:无法启动程序,当前状态下的操作不合法

尝试在 VS2013 中启动 ASP.NET 项目时出现“当前状态下的操作不合法”错误?

我的无状态小部件触发了我无法分配的错误消息

“无法访问 MobileFirst 服务器。响应代码:”M​​aximo Work Execution 7.6.3.1 IFIX 001 错误

ifix组态软件 ALM报警文件偶尔会出现丢失某一条操作记录,求解答。