1.前言
铁水计量房以前一直釆用的是称重仪表直接接 打印机,通过手动的方式按仪表上的打印键在打印机 上输出,然后通过人工汇总。要釆用软件进行计量, 首先要解决的问题是如何实时釆集仪表的数据。由 于称重仪表均有通过CCM 口通讯的功能,所以我们 釆用的是通过CCM 口来釆集的数据实现所需功能 的。
2.CCM 口简介及应用
CCM口,也就是RS - 232C串行接口,几乎每一台PC都包含COM有很多现场的显示仪表上也有 CCM口,本质而言,COM是PC为和外界通信所提供 的一种串行数据传输的接口。作为一种物理通信的 途径和设备,它和目前风靡的另一种串行接口 -- USB所提供的功能是一致的。不过RS - 232C显然 已经开始被后起之秀USB赶超,因为USB的传输速 率已经远远超过了 RS - 232C。尽管如此,RS- 232C 仍然具有非常广泛的应用,在相对长的一段时间里, 难以被USB等接口取代。RS - 232C接口(又称EIA RS - 232C) , 1970年由美国电子工业协会(EIA)联合 贝尔系统、调制解调器厂家及计算机终端生产厂家共 同制定,全名是数据终端设备(DTE)和数据通讯设 备(DCE)之间串行二进制数据交换接口技术标准”。
RS - 232C通常以两类接插件与外界相连,分别 称为DB9和DB25,如图1所示。
而接插件中各个针的定义则如表1。
两串口互连,连接方法有三种,如表2所示.
在这次数据采集的实际运用中,由称重仪表的 CCM口发送数据,由计算机COM口接收数据,再通 过程序对接收的数据进行处理,从中得到我们所需要 的数据。
VC+ +中对串口数据的读取 Visual C+ +为我们提供了一种好用的ActiveX 控件 Microsoft Communications Control (即 MSComm) 来支持应用程序对串口的访问,在应用程序中插入 MSComm控件后就可以较为方便地实现通过计算机 串口收发数据。MSCOMM不是工具控件,所以使用 的时候要添加,具体方法如下:
单击主菜单project的子菜单Add To project的 Components and Controls 选项;在弹出的 Components and Controls Gallery”对话框中选择 Registered ActiveX Ccntrds 文件夹中的 Microsoft Comm皿icaticns Con-trol, version 6.0 ”选项;单击其中的Insert”按钮, MSCcmm控件就被增加到工程中了。与此同时,类 CMSComm的相关文件 mscomm. h和 mscomm. cpp 也 —并被力口入 Project的 Header Files 和 Source Files 中。
这时在工具控件上就会多出一个类似电话的符 号,需要使用时将其拖入对话框中的任意位置,程序 运行时电话”图标会自动隐藏,接着,我们需要为控 件添加一个对应的成员变量m ccmm,其对应的变量 类型为CMSGcmm^这样就建立了 m mscom和IDC MSCCMM1(控件ID)控件的相互映射,在对话框初始 化时(即在::CnInitDialog函数中)打开串口 1:具体 源代码如下:
m Comm. SetCbmmPort( 1) ; //选择 COM1 m Comm. SetInBufferSize( 18);/股置接收缓冲 区大小
m Comm. SetInputMode( 1); //设置以二进制 方式读取数据
if( ! m Comm. GetPortCpen()) //如果串口未
打开则打开串口
m Comm. SetPortCpen( TRUE); //打开串 口 m Comm. SetSettings( '9600, n, 8, 1 ”); /股置 串口波特率9 600,无校验,8个数据位,1个停止位 m Comm. SetRThreshold( 1); / 渗数 1 表示每当 串口接收缓冲区中有多于或等于1个字符时将引发 —个接收数据的CnCcmm事件
m Comm. SetInputLen( 0) ; /股置当前接收区 数据长度为0,表示全部读取
m Comm. GetInput( ); / /先预读缓冲区以清除残 留数据
为了处理接收的数据,我们需要为MScomm控件 添力口对应的消息处理函数。即通过MFC类向导添加 成员函数CnComm,其主要功能是通过检测Com- mEvent的状态来确定串口是否有字符,如果有的话 就通过Getlnput方法读取串口缓冲区,然后通过数据 类型转换成Cstring型变量m rec存放。
这样就可以得到串口 1传过来的数据,老铁水计 量房使用的是8530C,新铁水计量房使用的是T800, 两者都是托利多公司的产品,仪表上的COM口都可 以以连续的方式向计算机CCM口发送托利多标准格 式数据,传送数据应注意将仪表的COM口波特率、数 据位、校验位设置成和计算机COM 口的设置一样。 数据格式如表3。
m rec接收的是仪表传送过来的数据,一共18 位,现在需要的就是将其中有用的数据提取出来,一 组18位数据中从第5位开始的后续6位是我们所需 要的计量数据,我们就采用m Tempzl = m rec. Md( 4, 6); //从字符串的第 5
位开始取6位赋值给m Tempz得到我们所需的数据,在实际使用时发现不能准 确的得到数据,我们就采取了判断起始位的办法,即 给上一句加一个判断条件,每一组18位的数据的第 一位都是02h,所以判断语句为: if(m rec.Lefi( 1) 02)
这样所得到的字符串m Tempz就是我们所需要 的数据,在实际运用中,需要用毛重减去皮重得到铁 水的净重,所以需要将字符串转化为整型变量: char *p =( LPSTR) (LPCSTR) m Tempz; m dangqz =atoi( p);
m dangqz就可以提供给数据库进行操作,然后 就是将m dangqz中的数据实时显示屏幕上,这时就 要用到计时器SetTimer。在::OnInitDialcg函数中,增加一个计时器:
SetTimer( TIMER TIME, 200, NULL); //200表示
计时器周期为200毫秒
在其相应的处理函数OnTimer中使用Empty方 法清空m rec和m Tempz中的内容。因为数据传输 的方式是连续方式,所以m rec和m Tempz实际上 是在不断更新,如果不清空m rec和m Tempz,编辑 框内永远显示的是第一次得到的值,使用计时器就是 为了让编辑框每隔200毫秒被清空一次,好让后来变 化了数据在编辑框内显示,从而达到实时显示的目 的。
然后为对话框里的实时显示编辑框添加一 CEdit 类成员变量m editdangqz,在OiCcmm函数最后添 加:
strtemp2. Fcrmat( %d”,m dangqz);//将整形转
换为字符串类型
m editdangqz. SetWindcwText( strtemp2); / /在编辑框中显示当前值在后来的调试过程中,我们发现了一个问题,在 实时显示的编辑对话框中极少数情况会出现与仪表 显示数据不符的现象,出现了仪表上有6位数据,屏 幕上却只显示3位,经过分析,是传输过程中出现的 问题,暂时无法解决,于是我们采取了另外一种方法 加以判断,即在确认计量时弹出一确认对话框,在弹 出之前取一个值,在弹出之后再取一个值,然后取两 个数值之差,如果这个差值在某一范围之内就可以就 表示这个值是可取的,弹出对话框记录成功”,否则 弹出提示请重新计量”这样就解决了出现的问 题。
至此,已实现了采集实时数据并显示的功能。
4.结束语
实时数据采集只是铁水衡计量管理软件中的一 部分。它的功能就是读取串口数据并提供有效数据 给计量程序使用。从目前系统运行情况来看基本能 满足系统正常运行的要求,但是,因本人水平有限,本 系统必然存在许多不足之处,希望能在以后的实践中 得到不断的完善和提高。