您现在所在的是:

施耐德电气论坛

回帖:6个,阅读:1491 [上一页] [1] [下一页]
702
sdw7766
文章数:13
年度积分:50
历史总积分:702
品牌积分(施耐德):0
注册时间:2010/4/14
发站内信
发表于:2010/5/31 17:41:54
#0楼
我用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位寄存器,设备返回数据的作用仅仅是告诉上位机数据已经成功设置到设备寄存器中了。

匿名用户
文章数:N/A
年度积分:0
历史总积分:0
注册时间:2010/5/16
发站内信
发表于:2010/6/15 13:35:52
#1楼
该用户被锁定,回复内容不予显示!
19260
pqsh 版主
文章数:7424
年度积分:1090
历史总积分:19260
品牌积分(施耐德):97
注册时间:2006/8/22
发站内信
2018论坛解答高手
发表于:2010/6/15 16:05:23
#2楼
你写的资料是对的,但你的程序不对.
str(12)的0不能要.因为16功能的字节数那个是8位的,没有高,低位.
也就是不算crc,这个modbus帧应该只有11字节(str(6)到str(16)=="上位机发送命令:02 10 00 06 00 02 04 01 02 00 00 DC FD".
如果我忘了我
请帮忙记得我
pqsh@163,326199298@v&q同号
19260
pqsh 版主
文章数:7424
年度积分:1090
历史总积分:19260
品牌积分(施耐德):97
注册时间:2006/8/22
发站内信
2018论坛解答高手
发表于:2010/6/15 16:07:34
#3楼
晕,2楼的广告太可恶了,搞得我回个那么早的帖!
如果我忘了我
请帮忙记得我
pqsh@163,326199298@v&q同号
702
sdw7766
文章数:13
年度积分:50
历史总积分:702
品牌积分(施耐德):0
注册时间:2010/4/14
发站内信
发表于:2010/7/23 8:47:18
#4楼
谢谢
谢谢楼上的解答啊,我都放好几天了,一直没人理我。然后就没来看。。。
我用很笨的方法给实现了,不是写俩寄存器吗16位。
既然单寄存器能实现,那我就写了两次单寄存器。。。。。。
702
sdw7766
文章数:13
年度积分:50
历史总积分:702
品牌积分(施耐德):0
注册时间:2010/4/14
发站内信
发表于:2010/8/13 15:41:00
#5楼
问题已解决
总结:
除了楼上的问题,还有下面的问题
str(5) = &H6 改为str(5)= &HB就OK了。
 从str(6)到str(16)正好11个字节,即十六进制数B.
注:但要注意 声明数组的地方Dim str(16) As Byte必须要严格,如果改为
 Dim str(17) As Byte则通讯不正常。
 希望对大家有帮助!!!
 哎,VB有点菜啊
 这个问题我解决了1个月。。。。受打击中ing
 以下程序正常:



Private Sub Command1_Click()''''这部分是写2个16位寄存器,运行不正常
Dim str(16) As Byte
 str(0) = &H0 ''''交换识别号高字节,通常为 0
 str(1) = &H0 ''''交换识别号低字节,通常为 0
 str(2) = &H0 ''''协议识别号高字节,为 0
 str(3) = &H0 ''''协议识别号低字节,为 0
 str(4) = &H0 ''''字节长度高字节
 str(5) = &HB ''''字节长度低字节
 str(6) = &HFF ''''单元识别号,确省为 255
 str(7) = &H10 ''''MODBUS功能码,16为预置多寄存器
 str(8) = &H0 ''''寄存器的起始地址高字节
 str(9) = &H2A ''''寄存器的起始地址低字节
 str(10) = &H0 ''''该行跟下一行表示预置2个寄存器
 str(11) = &H2
 str(12) = &H4''''该行表示一共4个字节的数据
 str(13) = &H0 ''''以下4个字节为写给寄存器的数据
 str(14) = &HE
 str(15) = &H1
 str(16) = &HF
 Winsock1.SendData str()
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
702
sdw7766
文章数:13
年度积分:50
历史总积分:702
品牌积分(施耐德):0
注册时间:2010/4/14
发站内信
发表于:2010/8/13 15:41:09
#6楼
问题已解决
总结:
除了楼上的问题,还有下面的问题
str(5) = &H6 改为str(5)= &HB就OK了。
 从str(6)到str(16)正好11个字节,即十六进制数B.
注:但要注意 声明数组的地方Dim str(16) As Byte必须要严格,如果改为
 Dim str(17) As Byte则通讯不正常。
 希望对大家有帮助!!!
 哎,VB有点菜啊
 这个问题我解决了1个月。。。。受打击中ing
 以下程序正常:



Private Sub Command1_Click()''''这部分是写2个16位寄存器,运行不正常
Dim str(16) As Byte
 str(0) = &H0 ''''交换识别号高字节,通常为 0
 str(1) = &H0 ''''交换识别号低字节,通常为 0
 str(2) = &H0 ''''协议识别号高字节,为 0
 str(3) = &H0 ''''协议识别号低字节,为 0
 str(4) = &H0 ''''字节长度高字节
 str(5) = &HB ''''字节长度低字节
 str(6) = &HFF ''''单元识别号,确省为 255
 str(7) = &H10 ''''MODBUS功能码,16为预置多寄存器
 str(8) = &H0 ''''寄存器的起始地址高字节
 str(9) = &H2A ''''寄存器的起始地址低字节
 str(10) = &H0 ''''该行跟下一行表示预置2个寄存器
 str(11) = &H2
 str(12) = &H4''''该行表示一共4个字节的数据
 str(13) = &H0 ''''以下4个字节为写给寄存器的数据
 str(14) = &HE
 str(15) = &H1
 str(16) = &HF
 Winsock1.SendData str()
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

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005