阀门启闭动态转矩检测装置与PC机的智能串行通信设计研究

发布时间:2011-05-09  点击数:2265

    调节阀启闭动态转矩检测系统以PC机为控制处理中心,由阀门启闭动态转矩检测装置采集数据,然后用异步串行通信方式传给PC机,实现由PC机对整个检测过程的自动控制。VB在开发可视化环境下的检测系统控制软件时有其独特的优势。首先,人机界面的建立比其它工具简单、快速;其次VB提供了串行通信控件,使开发者可以开发串行通信和系统程序,而功能上也提供了不少为用户所设想的简便之处。本义介绍的阀门启闭动态转矩检测系统中的有关程序即选用了VB作为编程工具。

一、阀门启闭动态转矩检测装置与PC机的串行通信

    用VB开发串行通信程序一般有两种方法:

    ①利用Windos的通信API函数

    Windows SDK提供了完备的API接口函数,利用API函数编写的串口通信程序功能更强大、更丰富,但编写复杂,其复杂化和专业化使很多开发者望而却步。

    ②采用通信控件实现

    使用控件是VB的一大优势,其编写程序较为简单,大多数VB程序员使用微软公司的MSComm控件来进行串行通信程序的开发。

    笔者编写的用于阀门启闭动态转矩检测装置与PC机的串行通信程序,主要利用了MSComm控件的一些属性与方法。MSComm控件提供了标准的事件处理函数、过程,通过设置串行通信的参数(端口号、波特率等),比较容易实现串行通信。

    1、阀门启闭动态转矩检测系统通信协议

    阀门启闭动态转矩检测装置与PC机之间采用RS232异步串行通信接口通信,数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。检测装置不断发送检测数据。每个数据块由4个字节组成,第一个字节的前三位定义为二进制常数1ll,是每个数据块的开始标志,其余3个字节的前三位均为二进制常量000;每两个字节的后五位表示一个十进制数,高位在前,低位在后。如图1所示。

     2、MSComm控件的主要属性和事件

     MSComm控件有很多属性,其中最基本的有以下几个:

     A、CommPort属性:设置并返回通讯端口号。端口号可以设置为l~99的任何数,如MSComm.CommPort=2表示设置当前通讯端口为COM2。

     B、Setting属性:设置并返回波特率、奇偶校验、数据位、停止位。格式为MSComm.Setting=String。String是一个包含四部分的字符串:第一部分为波特率;第二部分为奇偶校验,N表示不校验,M表示符号校验,E表示偶校验,0表示奇校验,S表示空格校验;第三部分为数据位数,其可选值为4,5,6,7,8;第四部分为停止位位数,其可选值为1,l.5,2。Setting属性的缺省值为“9600,N,8,1”。

     C、PortOpen属性:设置并返回通讯端口的状态(打开和关闭)。

     D、Input属性:从接收缓冲区返回和删除字符。该属性在运行时为只读。

     E、InputMode属性:设置和返回Input属性检索的数据类型。

     F、InputLen属性:设置并返回每次InPut属性从接收缓冲区中读取的字符数。InputLen属性的缺省值为0。设置InputLen为0时,Input将读取接收缓冲区的全部字符。

     G、Output属性:向传送缓冲区写数据。要传送的数据可是文本数据或二进制数据。

     H、CommEvent属性:返回最近的通信事件或错误。只要有通讯错误或接收事件发生时就会产生0nComm事件。CommEvent属性中存有该错误或事件的数值代码。

     I、Rthreshold属性:设置或传回引发接收事件的字符数,即属性页上的 “R阀值”。当接收寄存器达到所设置的字符数时,将会引发OnComm事件中的接收事件。此属性的默认值是0,其意义是无论寄存器中有多少字符均不会引发接收事件。

    3、本装置通信控件的属性

    本装置通信控件MSComm1重要属性设置如下:

    MSComm1.CommPort=2’选串行端口2

    MSComm1.Settings=“9600,n,8,1” ‘设置9600波特率,无奇偶校验,8个数据位,1个停止位
    MSComm1.OutBufferStze=30000’设置缓冲区大小为30000个字节
    MSComm1.InputMode=1’输入输出的数据类型为二进制
    MSComm1.RthreShold=0’不引发接收事件
    MSComm1.InputLen=7’指定由串行口一次读入的字符串长度
    MSComm控件提供了OnComm事件,用于通信错误或通信事件发生时,用户可在OnComm事件中编写代码。

    4、数据处理

    对接收的每个数据块,要通过一个简单算法,将二进制格式数据转换成两个十进制表示的数据。编写数据处理函数如下:

     Function BtoD(d1 as byte,d2 as byte)as integer

     BtoD=(d1 And&H10)/16*2^9_
          +(dl And&H8)/  8*2^8_
          +(d1 And&H4)/ 4*2^7_
          +(dl And&H2)/2*2^6_
          +(d1 And&H1)/1*2^5_
          +(d2 And&H10)/16*2^4_
          +(d2 And &H8)/8*2^3_
          +(d2 And &H4)/4*2^2_
          +(d2 And &H2)/2*2^1_
          +(d2  And  &H1)/1*2^0_
    End Function

    5、发送命令程序

    为了发送一个4字节二进制数{7E,01,F6,oA}数据传输命令,它必须先存到一个形式为Byte的动态数组,然后再将此动态数组传送出去。采用单击命令按钮方式发送传输命令,过程如下:

    Private Sub cmdstart_Click()‘开始按钮
    Dim outA()As Byte
    ……
        outA()=ChrB(&H7E)&ChrB(l)&ChrB(&HF6)&ChrB(&HA)
          MSComm1.Output=outA’向阀门启闭动态转矩检测装置发送数据传输命令

          U1max=0’数据1最大值存储变量清零
          U2max=0’数据2最大值存储变量清零
          T=Val(TxtSp1Int.Text)’数据采样时 间间隔
          CT=Va1(TxtConTime.Text)’数据采样时间

          TimerReceive.Enabled=True’启动接收阀门启闭动态转矩检测装置数据定时器
          End Sub

    6、接收数据程序

    接收数据是一个自动的周期性过程,通过子过程来实现,由定时器开启。接收数据时,每次要判断第一个字节是否为一个数据块的起始字节,只有是则连接的4个字节才为正确的数据,否则查看下一字节。通过设置Comm1.InputLen=7来实现每次从接收缓冲区内读取七个字节的数据,以保证每一个周期能读取一个数据块。接收数据子过程如下:

    Sub  ReceriveData()
    Dim Buf()As Byte
    Dim i As Integer
        Dim  Temp  As Integer
        Dim  c(3) As Byte
          Dim U1%,U2%
      Buf()=MSComml.Input
        For i=LBound (Buf)To  UBound(Buf)’查找数据块的第一个字节

          If Buf(i)\32=7 Then
              Temp=i
                  Exit For
              End If
          Next
        For i=0 To 3’读取一个数据块
           c(i)= Buf(TemP+i)
            Next

    U1=BtoD(c(0),c(1))’调用数据处理函数求数据1
    U2=BtoD(c(2),c(3))’调用数据处理函数求数据2
        If U1>U1 max Then’求数据1的最大值
            Ulmax=U1
          End If
        If U2>U2max Then’求数据2的最大值
              U2maX=U2
          End If
      End Sub

    7、通讯错误的处理

    由于外界干扰或电压波动等原因,PC机和阀门启闭动态转知检测装置之间的通信可能会出现错误,如接收缓冲区溢出、连接端口超速等。这些可能发生的事件都能在代码中引起运行错误。为了处理这些错误,须要将错误处理代码添加到程序中。通过控件中的OnComm事件可以捕捉和处理错误。在通信过程中所发生的通信错误是CommEvent属性返回的。当CommEVent属性值发生改变时,表明有通信错误,就会产生OnComm事件。同时,可以利用自动引发OnComm事件的特点在接收过程中加入状态显示码。通信错误的处理程序如下:

    Private  Sub  MSComm1_OnComm()
      Select Case MSComml.CommEvent
      case ComEventFrame’数据帧错误
    X=MsgBox(Framing  Error!,16)
    …错误处理
    Case ComEventOverrun’连接端口超速
    X=MsgBox(“数据丢失!”,16)
    …错误处理
    ……
      End Select
      End Sub

二、保存数据

    通过串口传送过来的数据经过处理后,连同对应的时间参数,送入数据库,供MIS系统查询、绘制趋势曲线、打印报表等使用。数据表结构如表1所示:

表1 数据表结构

列名 数据类型 可否为空 说明
T Integer(2) NOT NULL 时间(主键)
U1 Integer(4) NOT NULL 数据1
U2 Integer(4) NOT NULL 数据2

三、绘制趋势曲线

    将采集到的数据绘制成趋势曲线(U1-T和U2-T),进行统计、计算和分析,以得到产品的性能指标。

    1、绘图方法的使用

    在VB中,最方便使用的绘图组件是图片框(Picture Box),此组件可以使用相关的绘图方法将数据绘到图片框中,使结果显示在其上。在绘制趋势曲线中只需用到直线的绘制方法,在VB中画直线是迈过Line方法来实现的,它的语法为:

    Object.Line[step] [x1,x1] [step](x2,y2)[,<颜色>[,B[F]]

    其中,x1,y1为直线的起点坐标,x2,y2为直线的终点坐标,颜色用于设置直线的颜色,B、F为绘制矩形时所用。当使用Line方法绘制连结的线时,前一条线的终点就是后一条线的起点。线的宽度取决于DrawWidth属性值,线型取决于DrawStyle属性值。执行Line方法后,CurrentX和CurrentY性被参数设置为终点。

    2、插值公式的使用

    间门启闭动态转矩检测系统中PC机接收的数据为每隔一定时间间隔采样、处理和读取的,为了能更好地显示曲线的趋势走向,需要使用插值法求中间点。常用牛顿插值公式计算中间点坐标。牛顿插值公式如下:

   

    牛顿插值公式是一个递推公式,当需要增加一个节点时,只要多计算一行就可以了,比较方便实用。利用该公式即可骗写出在绘制趋势曲线过程中用到的构造牛顿插值公式子过程。

    3、绘制趋势曲线

    读取数据库中的数据,利用牛顿插值函数及Line方法,可得到如图2所示的检测结果趋势曲线(U1-T和U2-T)

    程序代码如下:

    Private Sub DrawNewTonGraph(Xmin As Single,Xmax As Single,stp As Single,m1 As Integer,m2 As Integer,k As Single,c,Pie As object)
    ’Stp为横坐标绘图步长;m1为曲线的横坐标数据在数据表中的字段名,m2为曲线的纵坐标数据在数据表中的字段名;k为曲线比例系数;c为曲线的颜色;Pic为绘图的图片框

        Dim x As Single ‘X坐标
        Dim y As Single ‘Y坐标
        NewTonInterpolationl ml,m2’调用构造中顿插值公式子过程
        Pic.DrawWidth=2’设置曲线宽
        Pic.DrawStyle=vbSolid’设置曲线线型
        x=Xmin
        y=NewTonInterpolation2(x)’用牛顿插值公式求X点的y值
        Pic.PSet(x,y),c’设置起点
          x=x+Stp
        While  x<Xmax
            y=NewTonInterpolation2(x)
            Pic.Line-(x,y*k),c’由上一次的位置画至此点
              x=x+stp
          Wend
          x=Xmax
          y=NewTonInterpolation2(x)
        pic.Line-(x,y*k),C
      End Sub

四、结论

    阀门启闭动态转矩检测系统为一主从式系统,上位机为PC机,应用程序全部用VB开发,由PC机实现对整个检测过程的自动控制,可以完整地记录被测阀门在开启与关闭的全过程中所需的时间(开度)与转矩、时间(开度)与位移的关系,并以数据显示、趋势曲线、输出最大值及报表等形式,反映阀门的制造与装配质量信息。本文中给出的原程序均巳在VB6.0环境下调试通过,其中的编写方法对其他类似的检测系统也有一定的借鉴作用。