请教高手:
在用winsock控件读取PLC中数据的时候:dim arrivData as integer '触发winsock1_DataArrival事件后的PLC返回值,转换成十进制的数值winsock1.connect
send_Data(var_1) '向PLC发送指令的函数,var_1是待读取的一个地址变量
msgbox arrivData winsock1.connect
send_Data(var_2) '向PLC发送指令的函数,var_2是待读取的的地址变量
msgbox arrivData 运行后发现,两次输出的数据相同,如果改成下面的代码:dim arrivData as integer '触发winsock1_DataArrival事件后的PLC返回值,转换成十进制的数值winsock1.connect
send_Data(var_1) '向PLC发送指令的函数,var_1是待读取的一个地址变量
msgbox arrivData winsock1.close
winsock1.connectwinsock1.connect
send_Data(var_2) '向PLC发送指令的函数,var_2是待读取的的地址变量
msgbox arrivData 运行后发现,两次输出的数值有时相同,有时不同,且有时是正确的输出,有时又不正确,请教高手如何解决?谢谢~~
在用winsock控件读取PLC中数据的时候:dim arrivData as integer '触发winsock1_DataArrival事件后的PLC返回值,转换成十进制的数值winsock1.connect
send_Data(var_1) '向PLC发送指令的函数,var_1是待读取的一个地址变量
msgbox arrivData winsock1.connect
send_Data(var_2) '向PLC发送指令的函数,var_2是待读取的的地址变量
msgbox arrivData 运行后发现,两次输出的数据相同,如果改成下面的代码:dim arrivData as integer '触发winsock1_DataArrival事件后的PLC返回值,转换成十进制的数值winsock1.connect
send_Data(var_1) '向PLC发送指令的函数,var_1是待读取的一个地址变量
msgbox arrivData winsock1.close
winsock1.connectwinsock1.connect
send_Data(var_2) '向PLC发送指令的函数,var_2是待读取的的地址变量
msgbox arrivData 运行后发现,两次输出的数值有时相同,有时不同,且有时是正确的输出,有时又不正确,请教高手如何解决?谢谢~~
解决方案 »
- 想要一个关于winsock的实例!不知道有没有好心人可以给我!
- DLL向VB发的消息的问题
- 用VB生成的图,可以用AUTO CAD修改不???
- dateadd("m",1,"9999-12-01")出错的问题
- 关于ADO/XML的一个问题
- 高手请进:删除表时遇见的一个问题
- 在自定义控建中,只在运行时可用和只在设计时可用 用什么方法?
- 如何在其他form中修改mdi窗体下面的statusbar的值
- vb6中用dao3.6执行插入access2000数据时,不能马上执行,可能为异步,为什么?如何解决
- 用过VB7的朋友请告诉我,VB7现在编译程序可不可以将运行库加入exe中?(像Delphi那样可选)
- 如何获取一个指定目录下的所有子文件夹的名字?
- asp 中过程sub的递归问题
UDP无法判断连接状态,可以直接发送。两次发送要做一定的延时。不要用msgbox来观查变量值
用debug.print arrivData 来观查变量值
Private rtnValue As Long 'winsock控件中dataarrival事件中返回值
Private Sub cmd_Connect_Click() 'connect按钮
Timer1.Enabled = True
call connect_PLC
End Sub
Private Sub Timer1_Timer() '定时器定时触发事件
Call connect_PLC
Me.Refresh
End Sub
Private Sub Form_Initialize()
Winsock_1.Protocol = sckTCPProtocol
Winsock_1.LocalPort = 0
Winsock_1.RemoteHost = "191.165.10.13" 'PLC的IP地址
Winsock_1.RemotePort = 502
Timer1.Enabled = False ‘初始不开启定时器,在按下connect按钮后开启定时器
End Sub
Private Function LoByte(ByVal var_Int As Integer) As String
End Function '获取低位 Private Function HiByte(ByVal var_Int As Integer) As String
End Function '获取高位
Public Sub connect_PLC()
On Error Resume Next
Winsock_1.Close
Winsock_1.Connect
Do
If GetTickCount - lngOutTime > 80 * time_Step Then
Exit Sub
Else
DoEvents
End If
Loop Until Winsock_1.State = sckConnected
Call send_Signal(220) '向PLC发送第一个指令
If rtnValue > 0 Then '当返回值大于0
position(0) = rtnValue
Winsock_1.Close
Winsock_1.Connect
Do
DoEvents
Loop Until Winsock_1.State = sckConnected
Call send_Signal(220) '向PLC发送第二个指令
position(1) = rtnValue
Winsock_1.Close
Winsock_1.Connect
Do
DoEvents
Loop Until Winsock_1.State = sckConnected Call send_Signal_1(180) '向PLC发送第三个指令
position(2) = rtnValue
''======================================''''''''
'''''省略读取其他若干不同变量''''' ''======================================'''''''' End If
End SubPrivate Sub send_Signal(ByVal var_Int As Integer) '向PLC发送指令过程 On Error Resume Next
Dim sendstr(12) As Byte
sendstr(0) = 0
sendstr(1) = 0
sendstr(2) = 0
sendstr(3) = 0
sendstr(4) = 0 'high byte of byte length
sendstr(5) = 6 'low byte of byte length
sendstr(6) = 255
sendstr(7) = &H3 'read register
sendstr(8) = HiByte(var_Int) 'high byte of begin address
sendstr(9) = LoByte(var_Int) 'low byte of begin address
sendstr(10) = 0 'high byte of data length
sendstr(11) = 1 'low byte of data length
Dim aStr As String
Dim i, j As Integer
For i = 0 To 11
aStr = aStr & Chr(sendstr(i))
Next i
Winsock_1.SendData aStr
Exit SubEnd SubPrivate Sub Winsock_1_DataArrival(ByVal bytesTotal As Long)
'PLC获取返回数据过程
Dim a1, a2, b1, b2, s As String
Winsock_1.GetData s
If bytesTotal > 6 Then
a1 = Hex$(Asc(Mid$(s, 10, 1)))
a2 = Hex$(Asc(Mid$(s, 11, 1)))
End If
rtnValue = CLng("&H" & a1 & a2)
End Sub结果发现:position(100)中所有数据均相同,且都为220指令返回的值!!!
请教是怎么回事?如何解决?
谢谢~~