很多人在找MODBUS通讯代码,我把以前用VB.NET写的一些代码贴上来供参考
'判断电机是否在转动
Public Sub WaitMotorStop()
'判断电机是否在转动
Dim str1 As String = "1"
Do Until str1 = "0"
Comm2PLC(RCS, Relay901, "")
System.Threading.Thread.Sleep(50)
Dim str2 As String = FormMain.RS232.ReadExisting().ToString()
FormMain.RS232.DiscardInBuffer()
FormMain.RS232.DiscardOutBuffer()
'先高低位转换,再16进制转换为10进制。例如把78563412转换为12345678
If str2.Length > 6 Then
str1 = str2.Substring(6, 1)
End If
Loop
Thread.Sleep(200)
End Sub
‘----------------------------------------------------------------’
'写入PLC
Public Sub Comm2PLC(ByRef _Code As String, ByRef _Address As String, ByVal _Command As String)
Dim str1 As String = _Code & _Address & _Command '代码字+中间继电器+命令字
Dim str2 As String = Calculte_Vertification_bit(str1)
Dim str3 As String = str1 & str2
FormMain.RS232.WriteLine(str3 + vbCr)
FormMain.RS232.DiscardOutBuffer()
End Sub
‘----------------------------------------------------------------
'计算校验位
Function Calculte_Vertification_bit(ByVal str)
Dim str2 As String = Nothing
For i As Integer = 1 To Len(str)
Dim str1 As String = Asc(Mid(str, i, 1))
str2 = str2 Xor str1
Next
Return Hex(str2)
End Function
‘----------------------------------------------------------------
'运动坐标读取
Private Sub ReadCoord()
System.Threading.Thread.Sleep(10)
FormMain.RS232.DiscardInBuffer()
Comm2PLC(RD, Register1, "")
Try
System.Threading.Thread.Sleep(200)
Dim str1 As String = FormMain.RS232.ReadExisting().ToString()
'先高低位转换,再16进制转换为10进制。例如把78563412转换为12345678
If str1.Length > 3 Then
Dim str2 As String = str1.Substring(3, 1)
If str2 = "$" Then
str2 = Nothing
For i As Integer = 0 To 3
str2 = str2 + str1.Substring(12 - i * 2, 2)
Next
str2 = CInt("&H" & str2)
End If
txt_OriginCoordX.Text = str2
End If
Catch
End Try
End Sub
'-----------------------------------------
'回原点
Comm2PLC(WCS, Relay5, "1") 'Comm2PLC("%01#WCS", "R0005", "1")