vb与电子秤仪表的通讯问题
最近公司安装了两台电子秤,要实现与程控软件的通讯。程控软件用的是vb脚本,厂家只提供了通讯协议。我不是计算机专业的,不知道该如何实现。希望有高手帮帮忙指点下,以解燃眉之急。在此谢谢各位了。通讯协议如下:
通讯协议
1.1 概述
仪表使用8051主从式多站通讯方式, 主机主动查询从站, 从站根据不同指令分别响应。
1.2 字节帧共 11 位, 根据地址位(第10位)不同分地址帧和数据帧。
1.2.1 地址帧
0 X X X X X X X X 1 1
起始位 数据位(8位) 地址位 停止位
1.2.2 数据帧
0 X X X X X X X X 0 1
起始位 数据位(8位) 地址位 停止位
1.3 命令帧格式
地址 + 指令 + 代码 + 数据0 + 数据1 + 数据2 + 数据3 + 效验
其中首字节为地址, 使用地址帧格式(第10位置1)。 其余字节使用数据帧格式。
1.3.1 地址 0 - 250 与仪表通讯地址对应
1.3.2 指令 01H, 写指令, 向仪表写入数据
02H, 读指令, 读仪表数据
03H, 键盘命令, 向仪表写入键盘命令, 等同键盘操作, 详细命令见 1.3.4
1.3.3 数据代码
00H - 最大称容量 01H - 流量缓冲时间
02H - 零点死区 03H - 零点跟踪范围
04H - 高流量设定点 05H - 低流量设定点
06H - 计数分度 13H - 控制比例
14H - 积分系数 15H - 微分系数
16H - 控制点
浮点数
FEH - 累计量, 累计量,设定值,皮带速度
FFH - 屏幕显示, 返回 64字节字符代码
1.3.4 数据0 - 数据3
·.发送读指令(01H)时, 所有字节为零
·发送写指令(02H)时, 表示 4 字节浮点数
·发送键盘命令指令(03H)时, 数据0 表示键盘命令, 其余字节置零
键盘命令表
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 - "左"
1.4 通讯示例
1.4.1 发送键盘命令, "RUN"
主机-仪表#1 仪表 -- 主机
01H ;仪表地址 无
03H ;指令代码
10H ;按键代码
00H ;数据0
00H
00H
00H ;数据3
14H ;冗余效验码
1.4.2 读仪表#1数据
主机 -- 仪表#1 仪表 -- 主机
01H ;仪表地址 XXH ;流量 4 字节
02H ;读指令代码 ……………………
00H ;数据0 XXH ;设定点 4 字节
00H ……………………
00H XXH ;累计量 8 字节
00H ………………….
00H ;数据3 XXH ;屏幕显示 64字节
03H ;冗余效验码 XXH ;冗余效验码
共 81 字节
1.4.3 写仪表#1控制点
主机 -- 仪表#1 仪表 -- 主机
01H ;仪表地址 无
01H ;写指令代码
16H ;控制点代码
XXH ;数据0
XXH
XXH
XXH ;数据3
XXH ;冗余效验码 我需要取出其中的流量和累积量用与显示。 参阅:http://topic.csdn.net/u/20070427/03/16415e91-4833-49f3-96ff-8ec17b5a5160.html 谢谢zdingyun的回复,下面是我根据通讯协议自己写,帮看下有什么问题?
Dim arr1() As Byte '发送读命令
ReDim arr1(0 To 7)
arr1(0) = &H1
arr1(1) = &H2
arr1(2) = 0
arr1(3) = 0
arr1(4) = 0
arr1(5) = 0
arr1(6) = 0
arr1(7) = &H3
If (Not MSComm1.PortOpen) Then
MSComm1.PortOpen = True
End If
MSComm1.OutBufferCount = 0
MSComm1.Output = arr1
Private Sub MSComm1_OnComm() ’接收数据
Dim buffer As Variant
Dim dzccur As Integer ’用来保存流量
Dim dzcsum As Integer ’用来保存累积量
Select Case MSComm1.CommEvent
' Handle each event or error by placing
' code below each case statement
' Errors
Case comEventBreak ' A Break was received.
Case comEventFrame ' Framing Error
Case comEventOverrun ' Data Lost.
Case comEventRxOver ' Receive buffer overflow.
Case comEventRxParity ' Parity Error.
Case comEventTxFull ' Transmit buffer full.
Case comEventDCB ' Unexpected error retrieving DCB]
' Events
Case comEvCD ' Change in the CD line.
Case comEvCTS ' Change in the CTS line.
Case comEvDSR ' Change in the DSR line.
Case comEvRing ' Change in the Ring Indicator.
Case comEvReceive ' Received RThreshold chars.
If MSComm1.InBufferCount >= 81 Then
buffer = MSComm1.Input
dzccur = buffer(0)*1000+buffer(1)*100+buffer(2)*10+buffer(3)
dzcsum = buffer(8)*10000000+buffer(9)*1000000+buffer(10)*100000+buffer(11)*10000+buffer(12)*1000+buffer(13)
*100+buffer(14)*10+buffer(15)
MSComm1.InBufferCount = 0
End If
Case comEvSend ' There are SThreshold number of characters in the transmit buffer.
Case comEvEOF ' An EOF charater was found in the input stream
Case Else
MSComm1.PortOpen = False
End Select
End Sub http://download.csdn.net/detail/veron_04/1262066
补充:VB , 控件