大家好,用VB做这样一个程序怎么做啊?要求:从外部仪表通过232串口不时接受温度数据,然后把数据存放到Acess2000里,并在屏幕上形成一个X轴为时间,Y轴为温度的不断变化的曲线。我VB底子很差,现在无从下手,谢谢各位了,能不能讲详细点。譬如形成动态实时曲线是要怎么实现,怎样放到数据库啊?
非常谢谢!

解决方案 »

  1.   

    这是画实时曲线的一个例子,你可以参考一下。可以选择画6条曲线和一条曲线,要引用:'实时曲线左移函数
    Public Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As Long, ByVal x As _
            Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal _
            hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal DrawStyle As _
            Long) As Long'实时曲线
    Public Sub RTCurveDraw(picDraw As PictureBox, crvType As String, cYmax As Integer, cYmin As Integer, crvData1 As Double, crvData2 As Double, crvData3 As Double, crvData4 As Double, crvData5 As Double, crvData6 As Double)    Dim ypixels, xpixels, i%
        Dim ShowMode As Long, ii As Long, tm As String, hBmp As Long
        Dim a(1 To 6) As Double
        a(1) = crvData1
        a(2) = crvData2
        a(3) = crvData3
        a(4) = crvData4
        a(5) = crvData5
        a(6) = crvData6
        
        
        picDraw.DrawWidth = 1
        hBmp = picDraw.hDC
        ShowMode = &HCC0020
        ii = BitBlt(hBmp, 0, 0, picDraw.ScaleWidth - 1, picDraw.ScaleHeight - 1, hBmp, 1, 0, ShowMode)
        
        Dim t As Integer
        t = Minute(Now())
        nMinutes = t
        If nMinutes > nTempMinutes Then
            picDraw.CurrentX = picDraw.ScaleWidth - 19
            picDraw.CurrentY = picDraw.ScaleHeight - 11
            picDraw.Print nMinutes
        End If
        nTempMinutes = nMinutes
        
        picDraw.ScaleMode = vbPixels
        ypixels = picDraw.ScaleHeight - 1
        xpixels = picDraw.ScaleWidth - 1    Select Case crvType
            Case "Temp"
            For i = 1 To 6
                cY1(i) = Int(ypixels - (a(i) - cYmin) / (cYmax - cYmin) * ypixels)
                If cY1(i) = cY0(i) Then cY1(i) = cY1(i) + 1
            Next
            picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed
            picDraw.Line (xpixels - 1, cY0(2))-(xpixels - 1, cY1(2)), &H404080
            picDraw.Line (xpixels - 1, cY0(3))-(xpixels - 1, cY1(3)), vbGreen
            picDraw.Line (xpixels - 1, cY0(4))-(xpixels - 1, cY1(4)), vbBlack
            picDraw.Line (xpixels - 1, cY0(5))-(xpixels - 1, cY1(5)), vbBlue
            picDraw.Line (xpixels - 1, cY0(6))-(xpixels - 1, cY1(6)), &HFF00FF
            For i = 1 To 6
                cY0(i) = cY1(i)
            Next
            
            Case "Ma"
            cY1(1) = Int(ypixels - (a(1) - cYmin) / (cYmax - cYmin) * ypixels)
            If cY1(1) = cY0(1) Then cY1(1) = cY1(1) + 1
            picDraw.Line (xpixels - 1, cY0(1))-(xpixels - 1, cY1(1)), vbRed
            cY0(1) = cY1(1)
            
        End Select
        
    End Sub
      

  2.   

    注释没有写,Sorry读数据用mscomm就OK了。
      

  3.   

    非常谢谢 Winters_lee!
    但我VB的确是很差看不太懂,但这个太急,现在从头系统学又来不及,所以还有详细点的吗?譬如从开始的建坐标系开始....
    先谢谢了啊!!!~~
      

  4.   

    不需要建什么坐标系啊,在窗体上建一个PictureBox控件,调整一下它的大小,然后在这个PictrueBox的右边或左边画y轴范围坐标就OK了,注意这个PictrueBox的高就是你画的曲线的最大值,如果你还是不太懂的话,真的需要先看一下书,因为基础的东西还是需要的(如果你准备自己做这个的话)。太急就请人做嘛!请我也行啊,呵呵......
      

  5.   

    我从网上找了一个例子,不懂,向大家请教:[实时曲线]
    实时曲线反映的是现场数据的实时性和当前趋势,因此在实现时需显示曲线的动态变化,参考DCS,当前点在曲线的最右端显示,而整个曲线动态地向左移动。具体实现如下:
    1、选择需要显示的窗体Form1,加入图片框Picture1,根据实际需要设置图片的大小并移到合适的位置,并在图片的外面画好量程----时间坐标系;
    2、 在全局模块中定义位块传输API函数BitBlt( )和全局变量:
    Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long
    Gobal S As Long `量程
    Gobal L As Long `上一次的纵坐标值
    Gobal T As Integer `上一次时间值(分)
    3、 Private Sub Form1_Load()
    Picture1.AutoRedraw = False `曲线不重画
    Picture1.ScaleMode = 3 `以象素方式(Pixel)
    L = -1 `设置初值
    S = 400
    T = -1
    End Sub
    4、根据现场数据采集的采样频率,设置定时器Timer1的定时值,曲线移动就

    Timer1实现:
    Private Sub Timer1_Time()
    Dim w As Long, h As Long, y1 As Long, Data As Long
    Dim hBmp As hDC, ShowMode As Long, ii As Long, t1 As Integer
    w = Picture1.Width
    h = Picture1.Height
    hBmp = Picture1.hDC
    ShowMode = &HCC0020 `ROP模式(复制)
    Data = Get_RealDatabase( ) `从实时数据库取当前监控值
    y1 = (S - Data) / S * h `根据量程转变成具体坐标
    ii = BitBlt(hBmp,0,0,w-1,h,hBmp,1,0,ShowMode) `整个曲线右移一个像素点
    Picture1.Line (w - 1,y) - (w,y1) , RGB(0,255,0)
    y = y1
    t1 = Val(Mid$(Time$,3,2))
    If T < > t1 Then `在曲线下方显示时间(用分表示)
    Picture1.CurrentX = w - 16
    Picture1.CurrentY = h - 8
    Picture1.Print Mid$(Time$,1,5)
    T = t1
    End If
    End Sub
    ---------------------------我按照步骤,打开VB6.0,然后在Form1里加入图片框Picture1,然后菜单栏里:工程-->添加模块,然后写上下面代码:
    Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long
    Gobal S As Long 
    Gobal L As Long Gobal T As Integer 为什么出现:  编译错误:缺少分割符或)   编译错误:缺少语句结束是哪儿的问题啊,谢谢了啊
      

  6.   

    Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As g,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long你把这3行合成1行就没有错了,换行的时候要用 _ 加上 & ,不然就不能和下面的语句合起来了
      

  7.   

    Winters_lee非常非常感谢你!我水平实在太差,当然想让你们这些高手帮忙,可没有RMB啊。这两天拿着2本VB书,但翻完再来看这题,还是盲目。再来麻烦不好意思,如果不想回答,也可以给我指点一下,主要重点看看哪一部分。非常感谢你!!我按照你说的那个方法一步一步来。1.打开VB6.0中文版,新建一工程,拖入PictureBox控件,调整大小,(这里想问一下:怎样画X、Y轴啊)2、打开 工程-->添加模块,输入:
    Public  Declare  Function  BitBlt  Lib    "GDI32  "  (ByVal  hDestDC  As  Long,  ByVal  x  As  _  
                   Long,  ByVal  Y  As  Long,  ByVal  nWidth  As  Long,  ByVal  nHeight  As  Long,  ByVal  _  
                   hSrcDC  As  Long,  ByVal  xSrc  As  Long,  ByVal  ySrc  As  Long,  ByVal  DrawStyle  As  _  
                   Long)  As  Long  
    Public  Sub  RTCurveDraw(picDraw  As  PictureBox,  crvType  As  String,  cYmax  As  Integer,  cYmin  As  Integer,  crvData1  As  Double,  crvData2  As  Double,  crvData3  As  Double,  crvData4  As  Double,  crvData5  As  Double,  crvData6  As  Double)  
     
           Dim  ypixels,  xpixels,  i%  
           Dim  ShowMode  As  Long,  ii  As  Long,  tm  As  String,  hBmp  As  Long  
           Dim  a(1  To  6)  As  Double  
           a(1)  =  crvData1  
           a(2)  =  crvData2  
           a(3)  =  crvData3  
           a(4)  =  crvData4  
           a(5)  =  crvData5  
           a(6)  =  crvData6  
             
             
           picDraw.DrawWidth  =  1  
           hBmp  =  picDraw.hDC  
           ShowMode  =  &HCC0020  
           ii  =  BitBlt(hBmp,  0,  0,  picDraw.ScaleWidth  -  1,  picDraw.ScaleHeight  -  1,  hBmp,  1,  0,  ShowMode)  
             
           Dim  t  As  Integer  
           t  =  Minute(Now())  
           nMinutes  =  t  
           If  nMinutes    >  nTempMinutes  Then  
                   picDraw.CurrentX  =  picDraw.ScaleWidth  -  19  
                   picDraw.CurrentY  =  picDraw.ScaleHeight  -  11  
                   picDraw.Print  nMinutes  
           End  If  
           nTempMinutes  =  nMinutes  
             
           picDraw.ScaleMode  =  vbPixels  
           ypixels  =  picDraw.ScaleHeight  -  1  
           xpixels  =  picDraw.ScaleWidth  -  1  
     
           Select  Case  crvType  
                   Case    "Temp  "  
                   For  i  =  1  To  6  
                           cY1(i)  =  Int(ypixels  -  (a(i)  -  cYmin)  /  (cYmax  -  cYmin)  *  ypixels)  
                           If  cY1(i)  =  cY0(i)  Then  cY1(i)  =  cY1(i)  +  1  
                   Next  
                   picDraw.Line  (xpixels  -  1,  cY0(1))-(xpixels  -  1,  cY1(1)),  vbRed  
                   picDraw.Line  (xpixels  -  1,  cY0(2))-(xpixels  -  1,  cY1(2)),  &H404080  
                   picDraw.Line  (xpixels  -  1,  cY0(3))-(xpixels  -  1,  cY1(3)),  vbGreen  
                   picDraw.Line  (xpixels  -  1,  cY0(4))-(xpixels  -  1,  cY1(4)),  vbBlack  
                   picDraw.Line  (xpixels  -  1,  cY0(5))-(xpixels  -  1,  cY1(5)),  vbBlue  
                   picDraw.Line  (xpixels  -  1,  cY0(6))-(xpixels  -  1,  cY1(6)),  &HFF00FF  
                   For  i  =  1  To  6  
                           cY0(i)  =  cY1(i)  
                   Next  
                     
                   Case    "Ma  "  
                   cY1(1)  =  Int(ypixels  -  (a(1)  -  cYmin)  /  (cYmax  -  cYmin)  *  ypixels)  
                   If  cY1(1)  =  cY0(1)  Then  cY1(1)  =  cY1(1)  +  1  
                   picDraw.Line  (xpixels  -  1,  cY0(1))-(xpixels  -  1,  cY1(1)),  vbRed  
                   cY0(1)  =  cY1(1)  
                     
           End  Select  
             
    End  Sub 然后再怎么做啊?
      

  8.   

    ByVal DrawStyleAs Long少一个空格ByVal DrawStyle  As Long
      

  9.   

    把我前两天做的给你看看吧,但是没有导到access中,至于数据的获得可以用mscomm控件就行拉!!我是通过timer控件实时形成的数据Option Explicit 
    Public iAAlert As Integer     '报警值
    Const HY = 4000       'y轴的最大表示值
    Const LX = 30000      'x轴的最大位置Const iV = 200   '时间间隔
    Dim i As Long     '临时变量
    Dim iD As Long    'x的坐标
    Dim iA As Long    'y的坐标
    Dim Inum As Long  '实时y的坐标值Private Sub Command1_Click()
    Form2.Show
    End SubPrivate Sub Form_Load()Dim sA As String    '文件中的值
    Me.Move (Screen.Width - Mainform.Width) \ 2, (Screen.Height - Mainform.Width) \ 2  '调整picture的位置
    Picture1.ScaleMode = 3
    Open App.Path & "\date.txt" For Input As #1
        Input #1, sA
    Close #1iAAlert = sA
       
    '初始化picture的位置
    Picture1.Top = 0
    Picture1.Left = 0
    Picture1.Width = Mainform.Width
    Picture1.Scale (0, HY)-(LX, 0)     '建立自己的作标系统'初始化报警线的位置
    With Line1
        .X1 = 0
        .X2 = Picture1.ScaleWidth
        .Y1 = iAAlert
        .Y2 = iAAlert
    End With
    End Sub
    Private Sub Timer1_Timer()i = iD + iVWith Picture1    If iD > .ScaleWidth * 0.98 Then
            
            .Left = .Left - iV
            .Width = .Width + iV
            Line1.X1 = 0
            Line1.X2 = .ScaleWidth
            
        End If
        
        Randomize
        
        Inum = Int(3000 * Rnd) + 100   '产生一个界于100和4000之间的随机数
        
        If Inum > iAAlert Then
        
            Image1.Picture = alert.Picture
        Else
            Image1.Picture = ok.Picture
        End If
        
        Picture1.Line (iD, iA)-(i, Inum)
        iA = Inum
        
        
        If .Width > Me.ScaleWidth * 2 Then  '数据清零,防止溢出
            .Width = Me.ScaleWidth
            Line1.X1 = 0
            Line1.X2 = .ScaleWidth
            .Left = 0
            i = 0
        End If
       
    End With
        
     iD = iEnd Sub