VB winsock控件连接PLC的问题?

north00 2010-04-06 08:54:40
请教高手:
在用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.connect

winsock1.connect
send_Data(var_2) '向PLC发送指令的函数,var_2是待读取的的地址变量
msgbox arrivData


运行后发现,两次输出的数值有时相同,有时不同,且有时是正确的输出,有时又不正确,请教高手如何解决?

谢谢~~
...全文
384 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
north00 2010-04-07
  • 打赏
  • 举报
回复
源代码如下:

Private position(100) As Integer    '存放记录的数据点
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 Sub

Private 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 Sub

End Sub

Private 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指令返回的值!!!
请教是怎么回事?如何解决?
谢谢~~

chinaboyzyq 2010-04-07
  • 打赏
  • 举报
回复
通讯协议:TCP判断连接状态,如果已经连接,则可以发送
UDP无法判断连接状态,可以直接发送。

两次发送要做一定的延时。

不要用msgbox来观查变量值
用debug.print arrivData 来观查变量值
north00 2010-04-07
  • 打赏
  • 举报
回复
事实上我是把接收到的数值存放在变量里的,然后输出到listview控件里的,发现好多中间有错误
zdingyun 2010-04-06
  • 打赏
  • 举报
回复
建议取消MSGBOX,改用标签来显示.其它需要通信协议才能判断.

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧