我使用VB6.0的MSCOMM控件与一个电压表通信,读取电压值,使用的是MODBUS协议。
  发送的查询命令是:01 04 00 34 00 04 B0 07
  接收到的是:       01 04 08 43 C2 D9 4F 43 C1 92 5D 2D C2
  已知电压表电压值在380V左右。我对接受到的第4-11数据做了处理,转换成Double输出,但是结果总是不正确。我的代码如下:Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
     ByRef Destination As Any, _
     ByRef Source As Any, _
     ByVal Length As Long)Private Sub Form_Load()
    MSComm1.CommPort = 1
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.RThreshold = 13
    MSComm1.InputLen = 0
    MSComm1.SThreshold = 1
    MSComm1.InputMode = comInputModeBinary
    MSComm1.PortOpen = True
    Text1.Text = ""
End SubPrivate Sub MSComm1_OnComm()
  Dim InByte() As Byte
  Dim OutByte(0 To 7) As Byte
  Dim dou As Double
  Select Case MSComm1.CommEvent
     Case comEvReceive
        InByte = MSComm1.Input
        For I = LBound(InByte) To UBound(InByte)
            Buf = Buf + Str(InByte(I)) + Chr(32)
        Next I
        
        For t = 3 To 10
            OutByte(t - 3) = InByte(t)
        Next t
        
        
        CopyMemory dou, OutByte(0), 8
        
        Text9.Text = Buf
        Text10.Text = UBound(InByte)
        Text11.Text = LBound(InByte)
        Text12.Text = FormatNumber(dou, 2)
  End Select
End Sub
我感觉应该是转换方面做错了。是不是应该将中间的8个数据,合并为4个BYTE(高字节左移4位再与低字节相与),然后再转换为Singel类型的数据?我是VB新手,对于VB的位操作和数据通信方面不太熟,请高手指点指点啊,先谢谢了

解决方案 »

  1.   


    查询命令发送数据格式:
          设备地址   命令字   起始地址   欲读字节长度  CRC校验
    字节数   1        1        2          2          2查询命令应答数据格式:
              设备地址     命令字   欲读字节长度    数据     CRC校验
    字节数        1         1         1          N        2查询命令中的04是读值,电压表首地址为34H,字节数为4,数据格式为浮点数
      

  2.   

    “43 C2 D9 4F 43 C1 92 5D”
    问:1.那边是最高位
        2.满量程的值是全ff
        3.在没有测量电压的状态下为 全0
      

  3.   

    查了下
    1)1 个寄存器 2 字节,所以发送命令的寄存器数只要 2 就可以了
     发送 01 04 00 34 00 02 XX XX 
    2)而且是 Big-Endian 的,需要反序成 Little-Endian 的再转换成 Single
     接收 01 04 04 43 C2 D9 4F XX XXDim OutByte(0 To 3) As Byte
    Dim v as single
    ...
    For t = 0 to 3
        OutByte(t) = InByte(6-t)
    Next
    CopyMemory v, OutByte(0), 4
    v 值为 389.6977
      

  4.   

    更正:上面应该是链接 MODBUS协议 而不是图片。
      

  5.   

    应该会有通讯协议给你的,你的是基于modbus协议的,格式肯定是按照modbus来的,我们想知道的是00 34 这个起始地址后面的4个单元中是否存放的就是电压值呢,而且返回的是8个数据,不知道是不是4代表的是寄存器个个数,每个寄存器包含两个字节,协议中应该指定来每个自己的含义啊! 
      

  6.   

    谢谢Tiger_Zhao的回答,根据他的回答解决了我的问题。同时也要谢谢其他朋友。
    我现在才发现自己是被这个通信仪表的资料耍了,他的资料里说的是欲读字节长度,而MODBUS协议里说的是寄存器数,所以才多读了4个字节的数据。
    国内某些企业也太不负责了,产品质量不咋滴也就不说了,连使用说明书也有问题。不过有一点我确实不知道,需要将得到的数据反序,学习了。再次感谢Tiger_Zhao。