1,502
社区成员
发帖
与我相关
我的任务
分享
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
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