当前位置:编程学习 > VB >>

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参数
--------------------编程问答-------------------- 以上是我做的,但是发送的格式不对,读不到数据,仪表没有返回数据,大侠们,速度帮帮我呀 --------------------编程问答--------------------
引用 9 楼 jkschl 的回复:
Public Function WriteCom1(ByRef outstr) '-----------往串口里写如数据
    main.MSComm1.Settings = "9600,s,8,1"
    main.MSComm1.InputLen = 0
    main.MSComm1.OutBufferCount = 0
    main.MSComm1.InBufferCo……

 main.MSComm1.Settings = "9600,s,8,1"  这个是厂家要求的 不是我要这么做的,上米哦按的要求很名明确的 --------------------编程问答-------------------- s?
我还真没有接触过。。。 --------------------编程问答--------------------
引用 12 楼 jkschl 的回复:
引用 9 楼 jkschl 的回复:

Public Function WriteCom1(ByRef outstr) '-----------往串口里写如数据
main.MSComm1.Settings = "9600,s,8,1"
main.MSComm1.InputLen = 0
main.MSComm1.OutBufferCount = 0
main.MSComm1.InBu……


我也第一次做  第一次碰到,悲催 今天写的挺高兴的没接过去试验,发的出去数据,但是没有回来的,说明发出去的数据格式不对
--------------------编程问答-------------------- 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 ,  控件
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,