zoukankan      html  css  js  c++  java
  • 基于VB和研华1710lL采集卡的摩擦温度采集

    近一段时间,应一研究生的要求帮忙做个采集温度和计算摩擦系数的数据采集系统,系统采用研华的PCI采集卡1710lL。在这方面研华的资料比较少,研究了几个晚上终于弄成了一个采集数据的程序。没有使用研华的控件。

    首先是初始化通道,设置程序显示界面及曲线图初始化,导入研华驱动公共文件。

     1  GainArray(0) = 0
     2  GainArray(1) = 0
     3  GainArray(2) = 0
     4  GainArray(3) = 0
     5  Call tabinit '初始化表格
     6  For i = 1 To 60
     7      cbotime.AddItem (i)
     8  Next
     9  Picture1.BackColor = QBColor(15)
    10  Picture1.Scale (-5, 2000)-(6000, -2000) '定义坐标系
    11  Picture1.DrawWidth = 2
    12  Picture1.CurrentX = -2
    13  Picture1.CurrentY = -1
    14  Picture1.Print 0
    15  Picture1.Line (0, 2000)-(0, -2000), QBColor(1) '画竖轴
    16  Picture1.Line (-5, 0)-(6000, 0), QBColor(1) '画横轴
    17  
    18   drawtype = 1                                 '初始绘制连续的曲线图
    19   Mindata = 0: Maxdata = 3                   '下限、上限温度报警初始值
    20 
    21   baohuzhi(0).Text = Mindata '显示下限
    22   baohuzhi(1).Text = Maxdata '上限温度值
    23   'alarm1.FillColor = QBColor(10)               '报警指示灯初始颜色
    24   'alarm2.FillColor = QBColor(10)
    25   num = 1
    26 
    27  '----------------多通道设置1-------------------
    28  ErrCde = DRV_DeviceOpen(1, DriverHandle1)      '打开模拟量输入端口 设备号0(为安装在系统中的板卡号000,001) 打开第0个采集卡
    29  If (ErrCde <> 0) Then
    30   DRV_GetErrorMessage ErrCde, szErrMsg
    31   Response = MsgBox("通道1:" + szErrMsg, vbOKOnly, "Error!!")
    32   Exit Sub
    33  End If
    34 
    35  ErrCde = DRV_DeviceOpen(1, DriverHandle2)      '打开数字量输出端口
    36  If (ErrCde <> 0) Then
    37     DRV_GetErrorMessage ErrCde, szErrMsg
    38     Response = MsgBox("通道1:" + szErrMsg, vbOKOnly, "Error!!")
    39     Exit Sub
    40  End If
    41 '-------------------
    42 With MAIConfig_T
    43     .NumChan = 4 '4通道
    44     .StartChan = 0 '从0 通道开始
    45     .GainArray = DRV_GetAddress(GainArray(0))  'Array(0, 0, 0,0) '各通道增益值(0为+-5V)
    46 End With
    47 ErrCde = DRV_MAIConfig(DriverHandle1, MAIConfig_T)
    48 If (ErrCde <> 0) Then
    49     DRV_GetErrorMessage ErrCde, szErrMsg
    50     Response = MsgBox("多通道设置错误:" + szErrMsg, vbOKOnly, "Error!!")
    51     Exit Sub
    52 End If
    53 
    54 MAIVoltageIn.NumChan = MAIConfig_T.NumChan
    55 MAIVoltageIn.StartChan = MAIConfig_T.StartChan
    56 MAIVoltageIn.GainArray = DRV_GetAddress(GainArray(0))  '得到值0
    57 MAIVoltageIn.TrigMode = 0

    使用单通道和多通道的初始化有点不同,本以为初始化多个单通道就能实现多通道的但是不行,获取的数据根本不是实际的数据。所以只能设置多通道的方法来获取数据。
    画曲线子程序

     1 '画连续曲线/间断散点图
     2 Sub DrawCurve()
     3 On Error GoTo hh
     4   If num = 0 Or num = 1 Then Exit Sub
     5   'Picture1.Cls
     6   Picture1.DrawWidth = 1
     7   
     8   '0黑,1蓝,2绿,3青,4红,5洋红,6黄,7白
     9   
    10   gX0 = (num - 1) * 6: gX1 = num * 6   '
    11   wY0 = T_Data(num - 1) * 3: wY1 = T_Data(num) * 3
    12   mY0 = M_Data(num - 1) * 3: mY1 = M_Data(num) * 3
    13   Select Case drawtype
    14      Case 1
    15 
    16          Picture1.Line (gX0, wY0)-(gX1, wY1), QBColor(4) '温度值
    17          
    18          Picture1.Line (gX0, mY0)-(gX1, mY1), QBColor(1) '摩擦值
    19      
    20      Case 2
    21      
    22          Picture1.PSet (gX1, wY1), QBColor(4) '温度描点
    23          
    24          Picture1.PSet (gX1, mY1), QBColor(1) '温度描点
    25   
    26   End Select
    27   
    28 hh:  Exit Sub
    29 End Sub

    采集数据使用一个定时器定时读取PCI上内存地址的数据。在界面上增加选择采集时间,时间越短,采样数据越准确,可根据采样率要求自行选择采集周期。使用一个Timer定时器。

      1 Private Sub Tim_Reader_Timer()
      2   Dim u As String
      3   If num > 1000 Then
      4   
      5      '到显示不下时先保存数据,然后重新画
      6      If ChkSave.value = 1 Then
      7          Tim_Reader.Enabled = False
      8          '-----------------
      9          Randomize
     10          filesName = App.Path + "\DataSaves\" + Format(Now, "YYYYMMDDHHMMSS") & Int(Rnd(100) * 100) & ".txt"
     11          If (fs.FileExists(filesName)) Then
     12             '存在就另外随机创建文件
     13              filesName = App.Path + "\DataSaves\" + Format(Now, "YYYYMMDDHHMMSS") & Int(Rnd(100) * 100) & ".txt"
     14              fs.CreateTextFile (filesName)
     15          Else
     16              fs.CreateTextFile (filesName)
     17          End If
     18          F3 = FreeFile
     19          Open filesName For Output As #F3
     20              Print #F3, "压力值" & "," & "温度值" & "," & "摩擦系数", " & "; 高温度值; " "
     21              For j = 1 To num - 1
     22                  Print #F3, F_Data(j) & "," & T_Data(j) & "," & M_Data(j), " & T1_Data(j)"
     23              Next
     24          Close #F3
     25          
     26          Tim_Reader.Enabled = True
     27      End If
     28      
     29      Call renew
     30   
     31   End If
     32 'T_Data(1200) As Single ' 温度收集数据
     33 'M_Data(1200) As Single '摩擦系数数据
     34 'F_Data(1200) As Single '压力数据
     35 '----------------------
     36         MAIVoltageIn.VoltageArray = DRV_GetAddress(volval(0))
     37         ErrCde = DRV_MAIVoltageIn(DriverHandle1, MAIVoltageIn) '获取多通道数据
     38         If (ErrCde <> 0) Then
     39            DRV_GetErrorMessage ErrCde, szErrMsg
     40            Response = MsgBox("1:" + szErrMsg, vbOKOnly, "Error!!")
     41            Exit Sub
     42         End If
     43         T_Data(num) = Val(volval(0)) ' (Val(voltage) - 1) * 50             '标度变换(温度值)
     44         wendu(0).Text = Format$(T_Data(num), "0.0")
     45 '----------------------
     46         MAIVoltageIn.VoltageArray = DRV_GetAddress(volval(0))
     47         ErrCde = DRV_MAIVoltageIn(DriverHandle1, MAIVoltageIn) '获取多通道数据
     48         If (ErrCde <> 0) Then
     49            DRV_GetErrorMessage ErrCde, szErrMsg
     50            Response = MsgBox("2:" + szErrMsg, vbOKOnly, "Error!!")
     51            Exit Sub
     52         End If
     53         M_Data(num) = Val(volval(1)) '  (Val(voltage_m) - 1) * 50             '标度变换(摩擦值)
     54         mochaxishu(0).Text = Format$(M_Data(num), "0.0")
     55  '---------------------------
     56         MAIVoltageIn.VoltageArray = DRV_GetAddress(volval(0))
     57         ErrCde = DRV_MAIVoltageIn(DriverHandle1, MAIVoltageIn) '获取多通道数据
     58         If (ErrCde <> 0) Then
     59            DRV_GetErrorMessage ErrCde, szErrMsg
     60            Response = MsgBox("3:" + szErrMsg, vbOKOnly, "Error!!")
     61            Exit Sub
     62         End If
     63         F_Data(num) = Val(volval(2)) ' (Val(voltage_f) - 1) * 50             '标度变换(压力值)
     64         force.Text = Format$(F_Data(num), "0.0")
     65 '----------------------
     66         MAIVoltageIn.VoltageArray = DRV_GetAddress(volval(0))
     67         ErrCde = DRV_MAIVoltageIn(DriverHandle1, MAIVoltageIn) '获取多通道数据
     68         If (ErrCde <> 0) Then
     69            DRV_GetErrorMessage ErrCde, szErrMsg
     70            Response = MsgBox("3:" + szErrMsg, vbOKOnly, "Error!!")
     71            Exit Sub
     72         End If
     73         T1_Data(num) = Val(volval(3)) ' (Val(voltage_f) - 1) * 50             '标度变换(压力值)
     74         gaowen(4).Text = Format$(F_Data(num), "0.0")
     75 '----------------------
     76 
     77         'ErrCde = DRV_AIVoltageIn(DriverHandle5, AIVoltageIn_F)  '获取AI3通道数据(实型电压值)
     78         'If (ErrCde <> 0) Then
     79            'DRV_GetErrorMessage ErrCde, szErrMsg
     80            'Response = MsgBox(szErrMsg, vbOKOnly, "Error!!")
     81            'Exit Sub
     82         'End If
     83         'F_Data(num) = (Val(voltage_f) - 1) * 50             '标度变换(压力值)
     84         'force.Text = Format$(F_Data(num), "0.0")
     85 '----------------------
     86         msgrd_show.Row = num
     87         msgrd_show.Col = 1
     88         msgrd_show.CellAlignment = vbCenter
     89         msgrd_show.Text = Now()
     90         msgrd_show.Col = 2
     91         msgrd_show.CellAlignment = vbCenter
     92         msgrd_show.Text = T_Data(num) 'filedata(num - 2) 温度值
     93         msgrd_show.Col = 3
     94         msgrd_show.CellAlignment = vbCenter
     95         msgrd_show.Text = M_Data(num) 'filedata(num - 1) 摩擦系数值
     96         msgrd_show.Col = 4
     97         msgrd_show.CellAlignment = vbCenter
     98         msgrd_show.Text = T1_Data(num) 'filedata(num - 1) 摩擦系数值
     99 
    100 
    101         'Call alarm '不做报警提示
    102     Call Calculates                           '调用计算极值、平均值子程序
    103     Call DrawCurve                                 '调用绘图子程序
    104     num = num + 1
    105 End Sub

    注,文章属于原创,如转载请联系作者:QQ:416824825
  • 相关阅读:
    UVa12093
    UVa1631
    vue路由跳转的三种方式
    vue中的钩子函数(判断是否跳转页面)beforeEach
    vue中子组件向父组件传值方法?
    vue中对数组,对象的操作如下
    vue-router的beforeEach的使用?
    vue拦截器使用?
    vue中父子组件以及兄弟组件的传值情况?
    前端模块化?
  • 原文地址:https://www.cnblogs.com/kingkie/p/4698550.html
Copyright © 2011-2022 走看看