登录
首页 串口通信 串口通信
回帖 发帖
正文

主题:我用vb编写modbus协议,遇到问题,请各位不吝指教

点击:2255 回复:4

本人用vb编写施奈德twido系列plc通讯口,传输的数据是乱码,也不能动作plc,不知问题出现在哪??望各位指教
程序如下:
  Private Sub Command2_Click()
 Dim value() As Byte
 Dim I As Integer
 Me.MSComm1.CommPort = 4
 Me.MSComm1.SThreshold = 0
 Me.MSComm1.Settings = "9600,e,8,1"
 Dim CRC  As String
 Dim d()  As Byte     '待传输数据
 ReDim d(5) As Byte
 Dim data As String
 d(0) = 2           'slave   address
 d(1) = 5          'function
 d(2) = 0           'starting   address   high
 d(3) = 1         'starting   address   low
 d(4) = &HFF           'no.of   registers   high
 d(5) = &H0           'no.of   registers   low
 CRC = CRC16(d)       '调用CRC16计算函数
           'CRC(0)为高位
           'CRC(1)为低位
 If Me.MSComm1.PortOpen = False Then
    Me.MSComm1.PortOpen = True
  End If

  Me.MSComm1.Output = Chr(2) + Chr(5) + Chr(0) + Chr(1) + Chr(&HFF) + Chr(&H0) + Chr(CRC16Lo) + Chr(CRC16Hi)
 
Do While I < 9
               I = I + 1
Loop
       value = Me.MSComm1.Input
       MsgBox (value)
 Me.MSComm1.PortOpen = False
 End Sub
     
  Public Function CRC16(data() As Byte) As String
                       'CRC寄存器
           Dim CL  As Byte, CH  As Byte                                   '多项式码&HA001
           Dim SaveHi  As Byte, SaveLo  As Byte
           Dim I As Integer
           Dim Flag  As Integer
           CRC16Lo = &HFF
           CRC16Hi = &HFF
           CL = &H1
           CH = &HA0
           For I = 0 To UBound(data)
               CRC16Lo = CRC16Lo Xor data(I)           '每一个数据与CRC寄存器进行异或
               For Flag = 0 To 7
                   SaveHi = CRC16Hi
                   SaveLo = CRC16Lo
                   CRC16Hi = CRC16Hi \ 2                                 '高位右移一位
                   CRC16Lo = CRC16Lo \ 2                                 '低位右移一位
                   If ((SaveHi And &H1) = &H1) Then               '如果高位字节最后一位为1
                       CRC16Lo = CRC16Lo Or &H80                     '则低位字节右移后前面补1
                   End If                                                         '否则自动补0
                   If ((SaveLo And &H1) = &H1) Then               '如果LSB为1,则与多项式码进行异或
                       CRC16Hi = CRC16Hi Xor CH
                       CRC16Lo = CRC16Lo Xor CL
                   End If
               Next Flag
           Next I
           Dim ReturnData(1)  As Byte
           ReturnData(0) = CRC16Hi             'CRC高位
           ReturnData(1) = CRC16Lo              'CRC低位
           CRC16 = ReturnData
       End Function
06-04-19 09:56
高手给小弟解决一下吧
谢谢!!
06-04-22 11:15
原因有几个:
1、CRC校验错误
2、也许传送的不是字符,而是ASC码,所以你在PLC上看到的是乱码
3、也许,你强置单线圈的地址有错误,这个是最大的可能。有些编码线圈编码地址是没有规律的,有的月不对外开放,而积存器地址就不一样,把把PLC地址(8进制)转化成十进制数,然后以十六进制存放在数据包的d(2) d(3)中就可以了,线圈(输出和输入)的地址是不能这样计算的,因此,最好找厂商,想他们要地址对照表,才可以!
欢迎大家交流:58959352(注明VB)
06-05-09 10:11
谢谢
06-05-21 16:10
看看。
13-11-24 20:29

工控新闻

更多新闻资讯