使用VB与仪器进行串口通信,实现了实时数据采集,由于仪器数据相位角显示的范围是从-180°到180°,超过180°后又到了-180°,小于-180°时又到180°,如此循环。
    但是当数据变化超过180°,就很难准确判断相位的变化方向和大小。
    比如开始仪器显示相位为150°,过了一段较长时间显示的相位为140°,此时相位的变化有多种可能:1、减小10° 2、增大350°
    现在希望能够编写一段程序,实现对前后短时间内(比如0.5秒采集一次,在此时间范围内可以保证数据变化的准确性)采集的两个数据进行比较,比如一旦数值的符号出现变化,程序就自动进行记录,并能够判断相位值变化的方向(从正到负或从负到正)以及变化的次数。本人vb新手,请大老们多多提携,谢谢!

解决方案 »

  1.   

    Dim OldValue As Single '全局变量保存旧值
    '放置一个Timer控件,并必须确保timer的周期要小于相位的最小变化周期
    Private Sub Timer1_Timer()
        Dim NewValue As Single
        NewValue = GetNewData() '读取新的数据
        If OldValue * NewValue < 0 Then '检测符号变化
            SaveData NewValue '在此进行数据保存
        End If
        OldValue = NewValue
    End Sub
    以上只是思路,你自己试试
      

  2.   

    谢谢akunkeji(阿坤),我的数据采集是调用excel来实现的,直接读取显示窗口text1.text的数值,数据采集的时间间隔可以修改,现在问题关键是如何将前后两个数据进行相乘运算,比较完一组后如果新的数据采集进来又进行新的运算
    比如
    1*2 判断完后马上进行
    2*3……
    如此循环
      

  3.   

    数据保存可使用Timer控件,调整Timer控件属性Interval来控制数据比较的周期。代码中的变量大部分应定义为全局变量,以便数据传递。
    数据采集不知是上位机主动还是下位机主动。若上位机主动则应将发送命令的代码置于一Timer控件,Timer控件属性Interval来控制数据采集的周期。整个接收代码可写在MSCOMM控件的ONCOMM事件中。
    保存数据和采集数据宜做在不同窗体。Timer控件属性Interval设置在100-200间,因为Timer控件时间精度不太准。
    如下位机主动,应调整下位机的数据发送周期来满足要求。
    下列代码应在与数据库及数据表连接好情况下使用。Private Sub Timer1_Timer()
    If ztG_dm1 <> ztG_Dm1Old Then '判断数据是否变化
        '写处理数据语句
    Adodc1.Recordset.AddNew '记录一组数据
    Adodc1.Recordset(0) = Mid(Text2, 3, 2) & Mid(Text2, 6, 2) & _
    Mid(Text2, 9, 2) & Mid(Text1, 1, 2) & Mid(Text1, 4, 2) '记录时间
    Adodc1.Recordset(1) = gongyi_sj(0) & "-" & record_rq '记录日期
    Adodc1.Recordset(2) = record_jm(0)  '记录数据
    Adodc1.Recordset(3) = record_jm(1)  '记录数据
    Adodc1.Recordset(4) = record_jm(2)  '记录数据
    Adodc1.Recordset(5) = record_jm(3)  '记录数据
    Adodc1.Recordset(6) = record_jm(4)  '记录数据
    Adodc1.Recordset(7) = record_jm(5)  '记录数据
    Adodc1.Recordset(8) = record_jm(6)  '记录数据
    End If
    ztG_Dm1Old = ztG_dm1
    End Sub
      

  4.   

    如果你直接采集的Text中的数值,那就更好说了:
    Private Sub Text1_Change()
        If Val(Text1.Tag) * Val(Text1) < 0 Then  '检测符号变化
            SaveData Val(Text1)'在此进行数据保存
        End If
        Text1.Tag = Val(Text1)
    End Sub