我使用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的位操作和数据通信方面不太熟,请高手指点指点啊,先谢谢了
发送的查询命令是: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的位操作和数据通信方面不太熟,请高手指点指点啊,先谢谢了
查询命令发送数据格式:
设备地址 命令字 起始地址 欲读字节长度 CRC校验
字节数 1 1 2 2 2查询命令应答数据格式:
设备地址 命令字 欲读字节长度 数据 CRC校验
字节数 1 1 1 N 2查询命令中的04是读值,电压表首地址为34H,字节数为4,数据格式为浮点数
问:1.那边是最高位
2.满量程的值是全ff
3.在没有测量电压的状态下为 全0
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
我现在才发现自己是被这个通信仪表的资料耍了,他的资料里说的是欲读字节长度,而MODBUS协议里说的是寄存器数,所以才多读了4个字节的数据。
国内某些企业也太不负责了,产品质量不咋滴也就不说了,连使用说明书也有问题。不过有一点我确实不知道,需要将得到的数据反序,学习了。再次感谢Tiger_Zhao。