VB编程技术在汽车衡管理软件上的应用
本文通过对一个汽车衡管理系统软件的编程过程,介绍了用VB6.0编程软件在汽车衡管理系统中的技术应用
1.引言
Visual Basic (简称VB)是Win- dows环境下简单、易学、高效的编 程语言开发系统,以其所见即所得 的可视化界面设计风格和32位面向 对象的程序设计等特点,已广泛地应 用于各个领域,是很多计算机软件开 发人员采用的开发工具。VB提供了良 好的界面设计能力,提供了强大的 数据库访问功能和微机串口通信功 能。完全能够满足汽车衡管理系统 的数据采集、处理和存储要求。下 面以SCS微机汽车衡称重软件为例’ 叙述VB软件对系统中几个重要功能 程序的设计。
2.管理软件功能需求
SCS微机汽车衡称重系统主要 通过计算机串口连接汽车衡称重仪 表,处理仪表所获取的汽车重量信 息,达到管理汽车称重数据的目的。 系统软件要求达到的功能主要有:
(1)设置管理权限,达到操作 人员分级登录操作。
(2)记录、贮存并打印每一次 称重结果。包括车号、货物名称、运 货单位、驾驶员、毛皮重、净重、进 出厂过磅时间、司磅员等内容。
(3)查询打印功能。可按车 号、时间范围、司磅员、货物种类、 驾驶员等或任意组合查询过去称重 记录,并可打印输出。
(4)统计打印功能。可对称重 结果自动进行统计,并打印各种报 表,如月报、年报、分类报表等。
(5)数据维护功能。包括记录
限制修改和删除,数据备份和导出。
在这个系统软件中,重点是编写数据采集的串口通信模块和数据库 操作访问功能程序。用Visual Ba- sic编程语言来编制这些程序,也就 要充分理解串口通信和数据库访问 相关的控件特点和应用技术。
3.数据采集程序模块的设计
3.1选择MSComm控件实现串口 通信
用VB开发串口通信程序常用两 种方法,一种是利用WINDOWS的通 信API函数实现,另一种是采用VB 内集成的MSComm通信控件实现。在 实例中选用MSComm控件实现串口通 信的编程,该控件具有丰富的与串 口通信密切相关的属性和事件,提 供了对串口的各种操作。在通信过 程中,当发送数据、收到数据或产 生传输错误时,触发MSComm控件的 OnComm事件,然后可以通过判断 CommEvent属性值获得事件类型,再 根据事件类型进行相应数据处理。 因此用其实现微机串口的数据通信 相当简单,以很少的程序代码就可 以轻松实现串口的访问和数据通信。
3.2仪表参数及其数据通信协议 以微机管理系统连接汽车衡XK3 190-A9称重显示器为例。该仪表可 连接8个350 0或12个700 0的高精度称 重传感器,用于测量汽车重量数据。 仪表测量准确度为III级(N=3000) 按显示分度值设置不同,测量范围 最大值100吨。该仪表具有RS-232/ RS422 (选配)串行通讯接口,能与 微机进行串口数据通信,实时传送 检测数据。
该仪表串口数据通信协议是:数 据传输速率为600/1200/2400/9600bps (可选),数据格式(10位):1位 开始位,8位数据位(ASCII编码)’1位停止位,无奇偶校验位。通讯方 式有连续方式和指令方式两种,这里 只列举连续通讯方式中的格式。
所传送的数据为仪表显示的当 前称量(毛重或净重)。每帧数据由 10组数据组成。格式如表1。
3.3部分参数的技术说明
(1)为满足各种仪表参数和计 算机不同运行环境的需要,把串口 通信的一些参数用数据库的表进行 存放,程序通过读取表数据来进行 通信环境参数的设置。这样做用户 可以修改数据表的数据来改变运行 参数,以满足实际需要。
(2)为了提高接收数据的读 取速度,实现实时监测功能,设置 MSComm1的属性RThreshold=4,接 收缓冲区收到四个字节产生OnComm 事件;InputLen=1,每次读取一个 字节。设置接收数据模式采用二进制形式,即InputMode=comInputM odeBinary。设置InBufferSize=50 (设置接收缓冲区为50字节), OutBufferSize=2 (设置发送缓冲区 为2字节)。
(3)定义一个Byte类型数组变 量来存放重量数据值。注意用Input 属性读取数据时,还要看仪表输出 数据位格式的编码方式。压缩的BCD 码存入Byte类型变量,VB系统只按 十进制数处理,这要通过一个简单 算法换算,解压BCD码才能还原成十 进制表示数值。本例ASCII编码直接 赋值给数组Byte类型变量。
3.4源程序代码 系统数据库dbl. mdb建立一个名 为‘‘串口”的表,字段分别为串口、 波特率、校验、停止位、数据位、 流控制,记录串口运行参数设置信 息。在窗体中添加名为MSComml的 MSComm控件,名为Label7显示重量 数据的标签控件,名为Text3、Text4存贮毛重、皮重的文本框控件等。 串口初始化模块:
Private Sub Form—Load() MSComml.CommPort = rec(“串 口”)‘赋值串口端口号,本例为COM1 MSComml.Settings = rec(“波 特率” )& ",n, 8,1" ‘无奇偶校 验,8位数据位,1位停止位 MSComml.InputLen = 1 MSComml.RThreshold = 4 If MSComml.PortOpen = False Then ‘判断串口端口是否打开 MSComml.PortOpen = True ‘打开端口 Else
MsgBox ‘‘串行端口号已被占用, 请选择其它端口!”, vbCritical + vbOKOnly, “系统信息”
Exit Sub
数据读取、转换及显示模块: Private Sub MSComml_OnComm() Dim buf() As Byte ‘定义一个数据变量 If MSComml. CommEvent = 2 Then ‘判断接收缓冲区内字符数 达到Rthreshold指定的值 buf = MSComml.Input ‘读取一个字节 If buf(0) = 2 Then ‘判断是否为开02(XON)开始 c2 = buf⑴
‘以下读取各位重量数据分别赋值 c3 = buf⑵ c4 = buf⑶ c5 = buf(4) c6 = buf(5) c7 = buf(6) c8 = buf(7)
以下为对各位字节数据进行转 换和组合显示
shuju = Chr (c2) + Chr (c3) + Chr(c4) + Chr (c5) + Chr (c6) + Chr (c7) + Chr (c8) Label7. Caption =shuju ‘赋值显示
If Optionl.Value=True Then ‘Optionl为毛重选项。判断是 否Optionl被选中
Text3. Text = Val(Label7. Caption) ‘赋值给毛重文本控件 End If
I f Opti on2 . Val ue = True Then ‘Option2l为皮重选
项。判断是否Option2被选中
Text4. Text = Val(Label7. Caption) ‘赋值给皮重文本控件 End If
LabellO. Caption= “数据稳定!〃 Else
LabellO. Caption = “连接正 常,但数据不稳定...!〃
MSComml. PortOpen = False ‘重新关闭和开启串口端口 一次 MSComml.PortOpen = True
End If End If End Sub
4.数据库程序模块设计
4.1数据库表结构设计 本例以Microsoft Access数据 库进行称重数据的管理,建立db1. mdb数据库。汽车衡完成一个称重过 程一般是某车号汽车称毛重,再过皮 重(或者称重顺序反调)得出净重 后,数据存入数据表,打印报表。在 实际称重中称毛重和过皮重的过程并 不连续,有时要连续称几台汽车的毛 重或皮重,因此必须建立一个用于存 贮称重暂存数据的表。在db1.mdb数 据库中建立报头、帐户、本地表、称 重、单位设置、历史皮重、串口、物 质类别等数据表。“本地表”用于存 贮历史称重数据,“称重”表存贮 称重暂存数据,本例重点介绍“本 地表”和“称重”两个关键表的结 构设计,如表2,表3所示
4.2数据库编程
系统登录”、“称重管理”、“报 表管理”等多个窗体,都涉及到对 db1.mdb数据库的编程,主要应用了 Visual Basic对Access数据库操作 的编程语言。如:
dim conn as new adodb. connec-tion
dim rs as new adodb. recordset
连接数据库
with conn
If . StateOadstateclosed Then .Close
.ConnectionString = “pro -vider=Microsoft.Jet.0LEDB.4.0; Data Source=” & App.path & “数据库名.mdb;Mode=ReadWrite; Persist Security Info=False” .Open End With 查询记录
if rs. stateOadstateclosed then rs.close
rs.open “select * from 表 名”,conn,adopenkeyset,adlockre adonly
set mshflexgrid1.datasource
=rs
rs.close 新增记录
conn. execute “insert into 表名(...)values(...)”
修改记录
conn. execute “update 表名 set ... where ...”
删除记录
conn. execute “delete from 表 名where... ”等等,鉴于论文篇幅 的限制本例数据库编程源代码略。