VB与皮带秤解码,问题
要怎么做呀,我没学过VB 想用VB做,谁能帮帮我呀!!仪表使用8051主从式多站通讯方式,主机主动查询从站,从站根据不同的指令分别响应
1. 通讯命令格式:
要实现与仪表通讯,主机需要仪表分两步发送控制命令字。然后通过通讯 中断处理仪表响应数据。
(1) 先把通讯协议设置为:9600,m,8,1
通过串口发送 Address ﹣﹥ 仪表
延时(0.01s)
(2) 接着把通讯协议设置为: 9600,s,8,1
通过串口发送以下数据到仪表:
02 00 Data0 Data1 Data2 Data3 Crc-Code
﹣﹥仪表
其中:
Baud_Rate为通讯波特率: Address为通讯地址。
CommandCode为指令代码:
01H—写指令 向仪表写入数据
02H—读指令 读取仪表数据
03H—仪表键盘命令,等同仪表键盘操作。
FunCode为功能代码:
00H—“0” 01H—“1” 02H—“2”
03H—“3” 04H—“4” 05H—“5”
06H—“6” 07H—“7” 08H—“8”
09H—“9” 0AH—“.” 0BH—“C”
0CH—“累计” 0DH—“打印” 0EH—“开始”
0FH—“停止” 10H—“运行” 11H—“菜单”
12H—“上卷” 13H —“下卷” 14H—“右”
15H—“中” 16H—“左”
以上仅当发送键盘命令(CommamdCode=03H)是有效
22H—流量设定 FFH—读取屏显、累计值、流量及状态
Data0—Data3
发送写指令时(01H),为4字节浮点数。
发送读指令时(02H),所有字节为零。
发送键盘指令式(03H),所有字节为零。
数据响应:
发送写指令时(01H)或发送键盘指令时(03H),仪表无数据返回。
发送读指令式(02H),仪表返回92字节数据。
Data1—Data4 为瞬时流量 Data5—Data8 为设定流量
Data11—Data16 为主累计 Data17—Data91 为屏显
Data85—Data88 为间隔 Data89—Data90 为零点
Data92 为校验码
数据计算:
速度 data80---data 83
瞬时流量: Data1 Data2 Data3 Data4
流量数据(十六进制)Data3的最高位为符号位 阶码(补码表示)阶码值表示小数点距离流量最高字节的位置。
当Data3的最高位0时
瞬时流量=(Data3×16^4+Data2×16^2+Data1×16^0)×2[(Data4-256)-23]
当Data3的最高位1时
瞬时流量=﹣1×[(Data3-128)×16^4+Data2×16^2+Data1×16^0]×2^[(Data4-256)-23]
主累计: Data11 Data12 Data13 Data14 Data15 Data16
Data10 Data11 为主累计的小数部分
Data12 Data13Data14 Data15为主累计的整数部分
Data15的最高位为符号位
当Data15的最高位0时
主累计=Data16×16^6+Data15×16^4+Data14×16^2+Data13×16^0+Data12×16^(﹣2)﹢Data11×16^(﹣4)
当Data15的最高位1时
主累计=﹣1×[(Data16-128)×16^6+Data15×16^4+Data14×16^2+Data13
×16^0+Data12×16^(﹣2)+Data11×16^(﹣4)]
屏显: Data17 Data18………………Data91 共74字节数据
间隔: Data85, Data86, Data87, Data88
间隔= Data88×16^6+Data87×16^4+Data86×16^2+Data85×16^0
零点: Data89, Data90
零点= Data90×16^2+Data88×16^0
--------------------编程问答-------------------- 求解呀,4801681@qq.com 谢谢啦 --------------------编程问答-------------------- 这论坛没落了吗? --------------------编程问答-------------------- 看看先,别急
--------------------编程问答-------------------- 速度帮我看看呀,没学过VB --------------------编程问答-------------------- 按照协议做就是了,有何难? --------------------编程问答-------------------- 速度给我代码!!!!
--------------------编程问答-------------------- 关键我做了,做的不对,发送的格式可能不对,收不到数据 --------------------编程问答--------------------
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'————————————————————————————————————————————
Private Sub Form_Load()
MSComm1.CommPort = 4 ' 设置通信端口号为COM1
Timer1_Timer
End Sub
Private Sub Timer1_Timer()
MSComm1.Settings = "9600,m,8,1" ' 设置串口1参数
MSComm1.InputMode = 1 ' 接收文本型数据
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True ' 打开通信端口1
End If
MSComm1.Output = "1"
Timer3_Timer
Timer2_Timer
End Sub
Private Sub Timer2_Timer()
Call send
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent '选择事件
Case comEvReceive '接收到字符
Dim InByte() As Byte '定义一个二进制指针放接收到的数据
InByte = MSComm1.Input '数据转移到指针
Dim temp As Long
Dim temp1(91) As Double
Dim j As Long
For j = 0 To 91 '循环到指针上标
temp1(j) = InByte(j)
Next j
If temp1(2) < 1111111 Then
Label2.Caption = Format((temp1(2) * 65536 + temp1(1) * 256 + temp1(0)) * 2 * ((temp1(3) - 256) - 23), "0.00") '___________________皮带瞬时流量
Else
Label2.Caption = Format(-1 * (temp1(2) * 65536 + temp1(1) * 256 + temp1(0)) * 2 * ((temp1(3) - 256) - 23), "0.00") '___________________皮带瞬时流量
End If
'____________________________________________________________________________________________________________________
If temp1(82) < 1111111 Then
Label2.Caption = Format((temp1(82) * 65536 + temp1(81) * 256 + temp1(80)) * 2 * ((temp1(83) - 256) - 23), "0.00") '___________________皮带瞬时流量
Else
Label2.Caption = Format(-1 * (temp1(82) * 65536 + temp1(81) * 256 + temp1(80)) * 2 * ((temp1(83) - 256) - 23), "0.00") '___________________皮带瞬时流量
End If
'____________________________________________________________________________________________________________________
If temp1(14) < 1111111 Then
Label3.Caption = Format(temp1(15) * 16777216 + temp1(14) * 65536 + temp1(13) * 256 + temp1(12) + temp1(11) * 0.00390625 + temp1(10) * 1.52587890625E-05, "0.00") '___________________皮带累积量
Else
Label3.Caption = Format(-1 * (temp1(15) - 128) * 16777216 + temp1(14) * 65536 + temp1(13) * 256 + temp1(12) + temp1(11) * 0.00390625 + temp1(10) * 1.52587890625E-05, "0.00") '___________________皮带累积量
End If
End Select
End Sub
Private Sub Timer3_Timer()
MSComm1.OutBufferCount = 0
'MSComm1.Output = 0
End Sub
--------------------编程问答-------------------- Public Function WriteCom1(ByRef outstr) '-----------往串口里写如数据
main.MSComm1.Settings = "9600,s,8,1"
main.MSComm1.InputLen = 0
main.MSComm1.OutBufferCount = 0
main.MSComm1.InBufferCount = 0
main.MSComm1.Output = outstr
If main.MSComm1.PortOpen = False Then
main.MSComm1.PortOpen = True
End If
Do
Loop Until main.MSComm1.OutBufferCount = 0
'main.MSComm1.Output = 0
End Function
Public Sub send()
Dim outstr(6) As Byte
outstr(0) = &H2
outstr(1) = &H0
outstr(2) = &H0
outstr(3) = &H0
outstr(4) = &H0
outstr(5) = &H0
outstr(6) = outstr(0) + outstr(1) + outstr(2) + outstr(3) + outstr(4) + outstr(5) + &H1
WriteCom1 (outstr)
End Sub
--------------------编程问答--------------------
MSComm1.Settings = "9600,m,8,1" ' 设置串口1参数
这句是错的
改成:MSComm1.Settings = "9600,n,8,1" ' 设置串口1参数
--------------------编程问答-------------------- 以上是我做的,但是发送的格式不对,读不到数据,仪表没有返回数据,大侠们,速度帮帮我呀 --------------------编程问答--------------------
main.MSComm1.Settings = "9600,s,8,1" 这个是厂家要求的 不是我要这么做的,上米哦按的要求很名明确的 --------------------编程问答-------------------- s?
我还真没有接触过。。。 --------------------编程问答--------------------
我也第一次做 第一次碰到,悲催 今天写的挺高兴的没接过去试验,发的出去数据,但是没有回来的,说明发出去的数据格式不对
--------------------编程问答-------------------- http://download.csdn.net/detail/veron_04/4037248 --------------------编程问答-------------------- 这个 我知道,我有串口调试工具,关键这个仪表,需要改变通讯协议,麻烦,搞不成功! --------------------编程问答-------------------- 哪位高手 来指点一二啊 着急呀 死了呀 --------------------编程问答-------------------- LZ的这个协议写的不甚清楚,以下内容供参考:
(1) 先把通讯协议设置为:9600,m,8,1
通过串口发送 Address ﹣﹥ 仪表
延时(0.01s)
(2) 接着把通讯协议设置为: 9600,s,8,1
通过串口发送以下数据到仪表:
02 00 Data0 Data1 Data2 Data3 Crc-Code
﹣﹥仪表
sub Command1_Click
dim Addr as byte,FunCode as byte,D(6) as byte
dim sIn
addr=n'n为1-255 ,8051多机通信经常使用的地址范围,按单片机设定的地址设置
d(0)=
d(1)=
d(5)=
d(6)=getCRC 'CRC计算
with mscomm1
.commport=1 '端口1,你上面的代码怎么会写4?
.inbuffersize=1024
.setting= "9600,m,8,1"
.portopen=true
.output=(addr) '加入括号,可以进行类型自动转换
sleep(10)'数据发吧,先睡10毫秒
.portopen=false '准备改变设置
.setting ="9600,s,8,1"
.PortOpen=true
.Output= (d)
sleep(20)'睡会,等数据回来
sIn=.input
' 将sIn转换你需要的数据
end with
end sub
--------------------编程问答-------------------- .setting= "9600,m,8,1"
这是用于如8051单片机的多机通信的一种机制,发送地址时,发送数据的校验位设置1,则单片机会解析该数据为地址数据(此时数据的校验位不做校验解析),如果有很多单片机挂接到485总线上,单片机将会检查是否是呼叫自己(地址值),如果是,则进入通信状态;然后,PC端设置为s校验模式发送数据,(不能使用其他模式,否则会引起混乱。)
对了,LZ使用的串口是否有经过485转换?按照这种机制,单片机应该连接到485上,不能直接和PC的232连接
补充:VB , 控件