结合已开发完成一个称重管理系统,介绍计算机与显示仪表进行串口通信的具体实现方法及称重管理系统的功能模块设计,并将该方法应用于称重管理系统的实际斤发,针 对系统设计与测试过程中发现的若干问题给出了良好的解决方案。
0.引言
在现代企业的生产销售过程中,电子汽车衡在称 重环节中得到了广泛的应用。大多数厂家生产的汽车 衡设备都配有企业业务管理软件,但通常和企业的实际 业务需求有较大出人,实际中只能简单使用其重量显示 和打印功能。由于这种方式效率低下,无法充分发挥设 备的功效,更不能满足现代企业管理信息化的需求。
1.系统结构
根据实际业务需求和企业的实际环境,在整体上 设计出如图1所示的系统结构图。
当运输设备在汽车衡上停稳后,汽车衡的压力传 感器将压力弹性形变转换成3~30V的电信号,并传 送给称重显示仪表。仪表对输入的电信号进行调理、 放大、A/D转换等处理后,最后送到计算机串口。在计 算机上对获取到的数据流进行加工、处理后,形成称
重数据,最终形成所需的磅单并进行票据打印,同时 还将数据传到数据库服务器上,从而在整个企业内部 网内实现称重数据的共享。
2.串口连接与串口通信的实现方法
2.1串口连接的基本方法
目前较为常用的串口有9针串口(DB9)和25针 串口(DB25),通信距离较近时,可以用电缆线直接连 接标准RS-232端口(RS~422,RS~485较远),需附加 调制解调器(MODEM)。最为简单且常用的是三线制 接法,即地、接收数据和发送数据三线对应相连,表1 中给出三线制接法中各引脚的连接方法,本系统中采 用的是计算机的9针串行通信口与称重仪表的25针 串行通信口相连。
2.2串口通信的实现方法
本系统采用Delphi作为开发工具,实际中无论采 用何种编程语言,实现串行通信的方法主要有以下几种:
(1)利用Windows API通信函数;
(2)利用标准通信函数,例如:inp( )、inpw( )、inpd()、计 outp()、outpw()、outpd()等直接对串打口进行操作;
(3)使用 Microsoft 通柄控件 MSComm ;
(4)利用第三方编写的通信控件类,例如SPComm、总 Cserial 等;
(5)自行开发通信控件。
在几种方法中,第一种使用面较广,但由于比较 复杂,专业化程度高,使用较困难;第二种需要了解硬 件电路结构原理;第三种方法通用性较强,开发难度 低;第四种使用也较多,但安装通信控件类比较复杂; 第五种使用面较窄,要根据自身的实际情况去编写。 结合上述特性和Delphi开发环境的具体特点,本系 统利用MSComm控件来实现串口通信。
3.称重管理系统的具体实现
3.1系统功能模块的设计
针对该厂自身的实际拓扑情况和业务需求,设计 出各个独立的功能模块,分别为:
(1)称重功能模块:实现称重数据的采集,将仪表 中的数据通过串口读人计算机,一次是毛重,一次是 皮重,由系统自动计算出净重,并将相应的信息以票 据的形式打印出来,一份交售货人,另一份存底;
(2)基本信息管理模块:主要包括售货人的基本信 息、产品信息,司磅员信息,验收人信息以及系统管理 的不同权限的用户信息的管理,即信息的增、删、改等。
(3)财务结算模块:主要是根据售货人所持票据, 在系统中调出相应的信息,并进行付款结算;
(4)信息统计功能:对毛重、皮重、净重、总付款、 已付款、未付款和售货人等信息进行按时间段进行灵 活的统计和多口径的查询;
(5)系统配置模块:对磅单格式、货物单价、配置 串口及其他一些默认参数进行设置、更改;
(6)权限管理模块:可根据实际需要,由管理员动 态设置不同类型权限的等级,并设置对应权限的用户。
3.2数据库管理系统
由于本系统在网络环境下进行动作,一般小型数 据库不能满足需要,需要中、大型的网络数据库,鉴于 本系统在Windows平台上运行,故选用SQL Server数 据库管理系统,并安装在数据库服务器上。
3.3代码的编写
在系统开发前期设计工作完成后,接下来就是系 统的具体实现,以下为通过串口从汽车衡读取数据的 部分核心代码。
〃数据分析START
mscomml .CommPort:= 1; 〃定乂使用串口 1 mscomml.InputLen:=40; 〃设置接收缓冲区内用Input 读人字节数为40字节
mscomm 1 .InBu£ferSize:=40; 〃设置接收缓冲区的大小 为40字节
if (not mscomm 1. PortOpen) then //如果串行口没有打开
Try
mscomm 1 .PortOpen:=true;
except; end; //打开端口,并做异常处理
sleep(lOO); //等待100ms,用于保证串口数据
接收的完整性
if(mscomm 1 .InBufferCount>0) then // 若接收缓冲区内有 等待读取的字节数begin
sleep(300); // 等待 300ms
sbu£f:=Mscomm 1 .Input; //从接收缓冲区读取数据, 存入sbuff
if(pOS(丨」,Sbuff)<>0) then //若数据中有,则读入 负数,非法
Sbuff:=,-r
Else //若没有号,合法
// 读入的数据格式为“3001BI+00003001BI+00003001BI +00003001BI+00003…”
begin sbuff:=Copy(sbuff,Pos(,+,,sbufif)+1 ,length (sbufif)); // 查找 到分隔符并去除分隔符前的字符。再找到字符串后跟的分 隔符并驱除分隔符后的字符。加工为“_3001BI+ 00003001 Bj+00003001Bj+00003,,
sbuff:=Copy(sbuff, 1,6); // 加工为 “000030. •. ” end;
val(sbuff,fbu£f,eCode); II将sbuff中的字符串转换为数 据值型,存人fbuff,fbuff=30,ecode返回其操作成功与否,e- code=0表7K转换成功
ifeCode=0 then //如果数据转换成功 begin sbuff:=floattostr(fbuff); // 将 fbuff 的数据转换为字符串 01dDeviceData:=sbuff; //OldDeviceData 是最后在系 统中显示的重量
MSComm 1 .InBufferCount:=0; // 清空接收缓冲区的
数据
end;
if (mscomm 1 .PortOpen) then mscomm 1. PortOpen :=false; //关闭端口 end
else //缓冲区无数据,读取数据发生异常 begin if(mscomm 1 .PortOpen) then mscomm 1 .PortOpen:=false; mscomm 1 .InBufferCount:=0;
OldDevir.eDatai-2、 //设置磅重显示-2,读数据 发生异常 end;
//下面主要是将OldDeviceData中的数据显示在称重仪 表上,并设置稳定显示灯、不稳显示灯、零点显示灯相互间 转换和显示,并设置显示当前时间、日期等信息。(略)
4.系统在设计与测试中遇到的问题及解决方案
4.1网络故陣的检测
本系统需要在整个企业内部局域网内运行,各计算机间需要通信,尤其是与数据库服务器的通信。如 果网络中断或动作不正常,则会出现错误。为此,在程 序启动时,尝试连接数据库,使用异常情况处理,即使 用Delphi中的try和except异常处理语句来尝试连 接,以保证程序的健壮性。在系统中具体设计如下: try… //数据库的连接代码(略)
except
MessageBox(handle/读取数据库时,发生意外错误! Y 称重系统%MB_0K+MB_IC0NERR0R); //读取数据库连 接发生错误,提示出错信息
application.Terminate; //系统终止 end;
4.2保证计量数据的一致性
由于多个磅房使用同一数据库服务器进行计量, 并操作数据库,这样可能会出现同一时刻的并发操 作,这样就会导致数据不一致问题:例如丢失更新、脏 读、不可重复读,解决并发问题的主要方法是封锁,锁 就是在一段时间内禁止用户做某些操作以避免产生 数据不一致。锁具体可分为独占锁(即排它锁)、共享 锁和更新锁。在程序设计时,根据不同的操作加对应 的锁。 〃
4.3串行口数据的获取
在系统实现时,由于该厂各磅房使用不同系列型 号的称重仪表(大多是上海耀华系列),且说明书不 全。开始时设置不同的串口通信参数,例如“9600,IV, 8,l,,、“4800,N,8,r等,使用中间变量来获取缓冲区 的数据流,然后根据程序单步执行,跟踪程序的执行, 例如某一磅的数据格式为:“3001Bj+00003001Bj+ 00003001BI+00003001 Bj+00003 …”其中 “+” 号为起始 标志,标志读入数的正负,紧接着的6位为称重数据, “0”为结束标志,“1B”表示长度为1个字节数据的结 束,该数据流表示的重量为30KG。由于多个磅的型号 不同,其参数也不同,给系统的实现带来很大的不便, 为此专门设计一个测试不同磅的串口通信参数和输 出的数据流。
5.结语
系统投入使用后,解决了某公司在生产与经营中 存在的诸多问题,保证了生产的正常进行,极大的提 高了计量速度与生产管理效率,且扩展性较好,随着 生产规模的不断扩大,可以增加多个磅房,达到并超 过了预想设计能力,取得了良好的经济效益。整个系 统具有较高的实用价值和推广应用价值。