我用VB写的跟PLC以太网通信的程序,采用winsock控件,modbus协议,施耐德PLC(型号BMX P342020)。预置单寄存器一切正常,写多个寄存器各种不行,仔细查看多遍也没找到原因,高手拯救我一下吧。。。万分感激啊。
为什么写单寄存器很正常 写多个寄存器不行呢??????????????????
下面是VB程序:
Private Sub Command1_Click()''''这部分是写2个16位寄存器,运行不正常
Dim str(17) As Byte
str(0) = &H0 ''''交换识别号高字节,通常为 0
str(1) = &H0 ''''交换识别号低字节,通常为 0
str(2) = &H0 ''''协议识别号高字节,为 0
str(3) = &H0 ''''协议识别号低字节,为 0
str(4) = &H0 ''''字节长度高字节
str(5) = &H6 ''''字节长度低字节
str(6) = &HFF ''''单元识别号,确省为 255
str(7) = &H10 ''''MODBUS功能码,16为预置多寄存器
str(8) = &H0 ''''寄存器的起始地址高字节
str(9) = &H2A ''''寄存器的起始地址低字节
str(10) = &H0 ''''该行跟下一行表示预置2个寄存器
str(11) = &H2
str(12) = &H0 ''''该行跟下一行表示一共4个字节的数据
str(13) = &H4
str(14) = &H0 ''''以下4个字节为写给寄存器的数据
str(15) = &HE
str(16) = &H1
str(17) = &HF
Winsock1.SendData str()
End Sub
Private Sub Command4_Click()''''这部分是写单个16位寄存器,运行很正常
Dim str2(11) As Byte
str2(0) = &H0 ''''交换识别号高字节,通常为 0
str2(1) = &H0 ''''交换识别号低字节,通常为 0
str2(2) = &H0 ''''协议识别号高字节,为 0
str2(3) = &H0 ''''协议识别号低字节,为 0
str2(4) = &H0 ''''字节长度高字节
str2(5) = &H6 ''''字节长度低字节
str2(6) = &HFF ''''单元识别号,确省为 255
str2(7) = &H6 ''''MODBUS功能码,6为预置单寄存器
str2(8) = &H0 ''寄存器的起始地址高字节
str2(9) = &H2A ''寄存器的起始地址低字节
str2(10) = &H0 ''数据内容高字节
str2(11) = &HEF ''数据内容低字节
Winsock1.SendData str2()
End Sub
Private Sub Form_Load() ''''与PLC建立通讯连接
Winsock1.Close
Winsock1.Connect "127.0.0.1", 502 ''''PLC的IP地址
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ''''显示PLC返回的数据
Dim strdata() As Byte
Dim m, n As Integer
Dim t As String
m = Winsock1.BytesReceived
Text2.Text = m
ReDim strdata(m)
Winsock1.GetData strdata, vbByte, m
For n = 0 To m - 1
t = t & Hex(strdata(n))
Next
Text1.Text = t ''''PLC返回的数据显示在文本框Text1中
End Sub
这是与写寄存器有关的一点资料
2)写单个16位寄存器
上位机发送命令:02 06 00 05 00 12 19 F5
设备返回的数据:02 06 00 05 00 12 19 F5
第一个字节:02,表示设备地址。
第二个字节:06,为功能码字节,06号功能码的作用为预置单个16位寄存器。
第三第四个字节:0005,表示的是上位机发送命令所预置的寄存器的地址。
第五第六个字节:0012H,表示上位机要将地址为5的16位寄存器预置为12H(十进制为18)。
第七第八个字节:19 F5,为CRC校验字节。
设备正常返回时,返回的数据与上位机发送的命令完全一致。
3)写多个16位寄存器
上位机发送命令:02 10 00 06 00 02 04 01 02 00 00 DC FD
设备返回的数据:02 10 00 06 00 04 21 F8
发送的命令:
第一个字节:02,表示设备地址。
第二个字节:10H(十进制为16),为功能码字节,10H号功能码的作用为预置多个16位寄存器。
第三第四个字节:0006,表示的是上位机发送命令所预置的多个寄存器的起始地址为0006H。
第五第六个字节:0002,表示上位机要连续预置连续的两个寄存器。
第七个字节:04,表示后面跟着的4个字节数据是要预置到指定寄存器中去的。
紧跟在第七个字节后的四个字节便是要预置到指定寄存器中的数据,结合前面的信息,我们知道这条命令是要将0102H(十进制为258)预置到地址为6的寄存器中,0000H预置到地址为7的寄存器中。
最后两个字节:9C08,为CRC校验字节。
返回的数据:
第一个字节:02,表示设备地址。
第二个字节:10H(十进制为16),为功能码字节。
第三第四个字节:0006,表示的是上位机发送命令所预置的多个寄存器的起始地址位0006H。
第五第六个字节:0004,表示上位机预置了连续的两个寄存器即4个字节的有效数据。
第七第八个字节:19 F5,为CRC校验字节。
无论是强制位寄存器还是预置16位寄存器,设备返回数据的作用仅仅是告诉上位机数据已经成功设置到设备寄存器中了。