Private Sub Combo5_Click()
Select Case Combo5.Text
Case "On"
Instruction = &H11
Case "Off"
Instruction = &H10
End Select
End Sub
Private Sub Command1_Click()
Dim OutByte(0 To 32) As Byte
Dim Num As Double
Dim Num2 As String
Dim L
Dim Lenth2 As String
Dim ByteXor As Byte
Dim StrXor As String
ReadPlc = True
If Text1.Text = "" Then
MsgBox "请输入寄存器地址", vbOKOnly, "系统提示"
Else
Num = Val(Text1.Text)
Num2 = Hex(Num)
Lenth2 = Hex(Lenth)
ByteXor = 0
OutByte(0) = 103 '起始字符
OutByte(1) = 5 '读写指令
OutByte(2) = Asc(0) 'PLC站地址
OutByte(3) = Asc(2)
OutByte(4) = Asc(Mid(Address_R, 1, 1)) '寄存器类型
OutByte(5) = Asc(Mid(Address_R, 2, 1))
OutByte(6) = Asc(Mid(Address_R, 3, 1))
OutByte(7) = Asc(Mid(Address_R, 4, 1))
L = Len(Num2) '寄存器地址
For i = 0 To L - 1
OutByte(11 - i) = Asc(Mid(Num2, L - i, 1))
Next i
For i = 0 To 3 - L
OutByte(11 - L - i) = Asc(0)
Next i
L = Len(Lenth2) '读取字节数
If L = 2 Then
OutByte(12) = Asc(Mid(Lenth2, 1, 1))
OutByte(13) = Asc(Mid(Lenth2, 2, 1))
Else
OutByte(12) = Asc(0)
OutByte(13) = Asc(Mid(Lenth2, 1, 1))
End If
For i = 1 To 29 'BCC校验码计算
ByteXor = ByteXor Xor OutByte(i)
Next i
StrXor = Hex(ByteXor)
If Len(StrXor) = 2 Then
OutByte(30) = Asc(Mid(StrXor, 1, 1))
OutByte(31) = Asc(Mid(StrXor, 2, 1))
Else
OutByte(30) = Asc(0)
OutByte(31) = Asc(Mid(StrXor, 1, 1))
End If
OutByte(32) = 71
End If
MSComm1.Output = OutByte
End Sub
Private Sub Command2_Click()
Dim OutByte(0 To 32) As Byte
Dim Num As Double
Dim Num2 As String
Dim L
Dim Lenth2 As String
Dim ByteXor As Byte
Dim StrXor As String
Dim Data_Send As Double
Dim Data_Send2 As String
Dim SetLenth2 As String
Read = False
If Text2.Text = "" Then
MsgBox "请输入寄存器地址", vbOKOnly, "系统提示"
Else
Num = Val(Text2.Text)
Num2 = Hex(Num)
SetLenth2 = Hex(SetLenth * 2)
Data_Send = Val(Text4.Text)
Data_Send2 = Hex(Data_Send)
ByteXor = 0
OutByte(0) = 103 '起始字符
OutByte(1) = 6 '指令写
OutByte(2) = Asc(0) 'PLC站地址
OutByte(3) = Asc(2)
OutByte(4) = Asc(Mid(Address_W, 1, 1)) '寄存器类型
OutByte(5) = Asc(Mid(Address_W, 2, 1))
OutByte(6) = Asc(Mid(Address_W, 3, 1))
OutByte(7) = Asc(Mid(Address_W, 4, 1))
L = Len(Num2) '寄存器地址
For i = 0 To L - 1
OutByte(11 - i) = Asc(Mid(Num2, L - i, 1))
Next i
For i = 0 To 3 - L
OutByte(11 - L - i) = Asc(0)
Next i
L = Len(SetLenth2) '写入数据的长度
If L = 2 Then
OutByte(12) = Asc(Mid(SetLenth2, 1, 1))
OutByte(13) = Asc(Mid(SetLenth2, 2, 1))
Else
OutByte(12) = Asc(0)
OutByte(13) = Asc(Mid(SetLenth2, 1, 1))
End If
'写入PLC的数据
L = Len(Data_Send2)
For i = 1 To L
OutByte(14 + 2 * SetLenth - i) = Asc(Mid(Data_Send2, L - i + 1, 1))
Next i
For i = 1 To SetLenth * 2 - L
OutByte(13 + i) = Asc(0)
Next i
'写入PLC的数据
For i = 1 To 29 'BCC校验码计算
ByteXor = ByteXor Xor OutByte(i)
Next i
StrXor = Hex(ByteXor)
If Len(StrXor) = 2 Then
OutByte(30) = Asc(Mid(StrXor, 1, 1))
OutByte(31) = Asc(Mid(StrXor, 2, 1))
Else
OutByte(30) = Asc(0)
OutByte(31) = Asc(Mid(StrXor, 1, 1))
End If
OutByte(32) = 71
End If
MSComm1.Output = OutByte
End Sub
Private Sub Command3_Click()
Dim OutByte(0 To 32) As Byte
Dim Num As Double
Dim Num2 As String
Dim L
Dim Lenth2 As String
Dim ByteXor As Byte
Dim StrXor As String
ReadPlc = False
If Text6.Text = "" Then
MsgBox "请输入寄存器地址", vbOKOnly, "系统提示"
Else
Num = Val(Text6.Text)
Num2 = Hex(Num)
Lenth2 = Hex(Lenth)
ByteXor = 0
OutByte(0) = 103 '起始字符
OutByte(1) = Instruction '读写指令
OutByte(2) = Asc(0) 'PLC站地址
OutByte(3) = Asc(2)
OutByte(4) = Asc(Mid(Address_B, 1, 1)) '寄存器类型
OutByte(5) = Asc(Mid(Address_B, 2, 1))
OutByte(6) = Asc(Mid(Address_B, 3, 1))
OutByte(7) = Asc(Mid(Address_B, 4, 1))
L = Len(Num2) '寄存器地址
For i = 0 To L - 1
OutByte(11 - i) = Asc(Mid(Num2, L - i, 1))
Next i
For i = 0 To 3 - L
OutByte(11 - L - i) = Asc(0)
Next i
'位地址
OutByte(12) = Asc(Mid(Bit, 1, 1))
OutByte(13) = Asc(Mid(Bit, 2, 1))
For i = 1 To 29 'BCC校验码计算
ByteXor = ByteXor Xor OutByte(i)
Next i
StrXor = Hex(ByteXor)
If Len(StrXor) = 2 Then
OutByte(30) = Asc(Mid(StrXor, 1, 1))
OutByte(31) = Asc(Mid(StrXor, 2, 1))
Else
OutByte(30) = Asc(0)
OutByte(31) = Asc(Mid(StrXor, 1, 1))
End If
OutByte(32) = 71
End If
MSComm1.Output = OutByte
End Sub
Private Sub Form_Load()
Instruction = &H11
Address_R = "0100"
Address_W = "0100"
Address_B = "0100"
Bit = "00"
Lenth = 2
SetLenth = 2
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
If (Err) Then
MsgBox "端口打开错误", vbOKOnly, "系统信息"
End If
MSComm1.RThreshold = 20
MSComm1.InputMode = 1
MSComm1.InBufferCount = 0
End Sub
Private Sub MSComm1_OnComm()
Dim Temp() As Byte
Dim Read(0 To 32) As Byte
Dim BBC As Byte
Dim XorByte As Byte
Dim BBC_Temp As Byte
Dim Value As Double
Dim Trans(1 To 8) As Byte
Dim TransValue As Double
Value = 0
XorByte = 0
Temp = MSComm1.Input
If ReadPlc = True Then
If Temp(LBound(Temp)) = 103 And Temp(LBound(Temp) + 1) = 1 Then '如果起始正确
For i = 0 To 20
Read(i) = Temp(i)
Next i
For i = 2 To 17 '计算校验码
XorByte = XorByte Xor Read(i)
Next i
For i = 2 To 19
If Read(i) > &H40 Then
Read(i) = Read(i) - &H37
Else
Read(i) = Read(i) - &H30
End If
Next
BBC_Temp = Read(19) + Read(18) * &H10
If XorByte = BBC_Temp Then
For i = 2 To Lenth * 2 + 1
Value = Value * &H10 + Read(i)
Next i
Text3.Text = Value
End If
End If
Else
If Temp(0) = 103 And Temp(1) = 2 Then
MsgBox "参数设定成功", vbOKOnly, "系统提示"
End If
End If
End Sub
尤其是这几句,希望能具体解释一下,多谢
OutByte(0) = 103 '起始字符
OutByte(1) = 5 '读写指令
OutByte(2) = Asc(0) 'PLC站地址
OutByte(3) = Asc(2)
OutByte(4) = Asc(Mid(Address_R, 1, 1)) '寄存器类型
OutByte(5) = Asc(Mid(Address_R, 2, 1))
OutByte(6) = Asc(Mid(Address_R, 3, 1))
OutByte(7) = Asc(Mid(Address_R, 4, 1))
L = Len(Num2) '寄存器地址
For i = 0 To L - 1
OutByte(11 - i) = Asc(Mid(Num2, L - i, 1))
Next i
For i = 0 To 3 - L
OutByte(11 - L - i) = Asc(0)
Next i
L = Len(Lenth2) '读取字节数
If L = 2 Then
OutByte(12) = Asc(Mid(Lenth2, 1, 1))
OutByte(13) = Asc(Mid(Lenth2, 2, 1))
Else
OutByte(12) = Asc(0)
OutByte(13) = Asc(Mid(Lenth2, 1, 1))
End If
For i = 1 To 29 'BCC校验码计算
ByteXor = ByteXor Xor OutByte(i)
Next i
StrXor = Hex(ByteXor)
If Len(StrXor) = 2 Then
OutByte(30) = Asc(Mid(StrXor, 1, 1))
OutByte(31) = Asc(Mid(StrXor, 2, 1))
Else
OutByte(30) = Asc(0)
OutByte(31) = Asc(Mid(StrXor, 1, 1))
End If
OutByte(32) = 71
End If
MSComm1.Output = OutByte
End Sub
Private Sub Command2_Click()
Dim OutByte(0 To 32) As Byte
Dim Num As Double
Dim Num2 As String
Dim L
Dim Lenth2 As String
Dim ByteXor As Byte
Dim StrXor As String
Dim Data_Send As Double
Dim Data_Send2 As String
Dim SetLenth2 As String
Read = False
If Text2.Text = "" Then
MsgBox "请输入寄存器地址", vbOKOnly, "系统提示"
Else
Num = Val(Text2.Text)
Num2 = Hex(Num)
SetLenth2 = Hex(SetLenth * 2)
Data_Send = Val(Text4.Text)
Data_Send2 = Hex(Data_Send)
ByteXor = 0
OutByte(0) = 103 '起始字符
OutByte(1) = 6 '指令写
OutByte(2) = Asc(0) 'PLC站地址
OutByte(3) = Asc(2)
OutByte(4) = Asc(Mid(Address_W, 1, 1)) '寄存器类型
OutByte(5) = Asc(Mid(Address_W, 2, 1))
OutByte(6) = Asc(Mid(Address_W, 3, 1))
OutByte(7) = Asc(Mid(Address_W, 4, 1))
L = Len(Num2) '寄存器地址
For i = 0 To L - 1
OutByte(11 - i) = Asc(Mid(Num2, L - i, 1))
Next i
For i = 0 To 3 - L
OutByte(11 - L - i) = Asc(0)
Next i
L = Len(SetLenth2) '写入数据的长度
If L = 2 Then
OutByte(12) = Asc(Mid(SetLenth2, 1, 1))
OutByte(13) = Asc(Mid(SetLenth2, 2, 1))
Else
OutByte(12) = Asc(0)
OutByte(13) = Asc(Mid(SetLenth2, 1, 1))
End If
'写入PLC的数据
L = Len(Data_Send2)
For i = 1 To L
OutByte(14 + 2 * SetLenth - i) = Asc(Mid(Data_Send2, L - i + 1, 1))
Next i
For i = 1 To SetLenth * 2 - L
OutByte(13 + i) = Asc(0)
Next i