📄 form1.frm
字号:
Left = 5985
List = "Form1.frx":03E8
Style = 2 'Dropdown List
TabIndex = 14
Top = 862
Width = 2205
End
Begin VB.ComboBox cobADrange
Height = 345
ItemData = "Form1.frx":0408
Left = 2100
List = "Form1.frx":0412
Style = 2 'Dropdown List
TabIndex = 7
Top = 405
Width = 2205
End
Begin VB.ComboBox cobShowMode
Height = 345
ItemData = "Form1.frx":042D
Left = 5985
List = "Form1.frx":043D
Style = 2 'Dropdown List
TabIndex = 6
Top = 405
Width = 2205
End
Begin VB.ComboBox cobSFIFOsize
Height = 345
ItemData = "Form1.frx":0483
Left = 9780
List = "Form1.frx":0490
TabIndex = 4
Text = "cobSFIFOsize"
Top = 405
Width = 2205
End
Begin VB.ComboBox cobPsMode
Height = 345
ItemData = "Form1.frx":04AA
Left = 2100
List = "Form1.frx":04B4
Style = 2 'Dropdown List
TabIndex = 3
Top = 1320
Width = 2205
End
Begin VB.ComboBox cobADfreq
Height = 345
ItemData = "Form1.frx":04DA
Left = 2100
List = "Form1.frx":04DC
TabIndex = 5
Text = "cobADfreq"
Top = 862
Width = 2205
End
Begin VB.Label lblPSNO
Alignment = 1 'Right Justify
Caption = "AD板通道号:"
Height = 225
Left = 4380
TabIndex = 81
Top = 1380
Width = 1485
End
Begin VB.Label lblStatic
AutoSize = -1 'True
Caption = "板卡增益:"
Height = 225
Index = 0
Left = 4845
TabIndex = 13
Top = 915
Width = 1020
End
Begin VB.Label lblStatic
AutoSize = -1 'True
Caption = "量程选择:"
Height = 225
Index = 2
Left = 960
TabIndex = 12
Top = 465
Width = 1020
End
Begin VB.Label lblStatic
AutoSize = -1 'True
Caption = "显示方式:"
Height = 225
Index = 3
Left = 4860
TabIndex = 11
Top = 465
Width = 1020
End
Begin VB.Label lblStatic
AutoSize = -1 'True
Caption = "AD板通道方式:"
Height = 225
Index = 4
Left = 495
TabIndex = 10
Top = 1380
Width = 1485
End
Begin VB.Label lblStatic
AutoSize = -1 'True
Caption = "频率:"
Height = 225
Index = 5
Left = 1410
TabIndex = 9
Top = 945
Width = 570
End
Begin VB.Label lblStatic
AutoSize = -1 'True
Caption = "SFIFO大小:"
Height = 225
Index = 6
Left = 8520
TabIndex = 8
Top = 465
Width = 1170
End
End
Begin VB.Timer timerAD
Enabled = 0 'False
Interval = 10
Left = 11430
Top = 165
End
Begin VB.Label lblBaseAddr
BorderStyle = 1 'Fixed Single
Caption = "板卡基地址"
Height = 360
Left = 1620
TabIndex = 1
Top = 120
Width = 1560
End
Begin VB.Label lblStatic
AutoSize = -1 'True
Caption = "板卡基地址:"
Height = 225
Index = 1
Left = 255
TabIndex = 0
Top = 195
Width = 1245
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Public m_timerADFinish As Boolean
Public m_timerCTFinish As Boolean
Public m_timerShowFinish As Boolean
Public m_timerDIFinish As Boolean
Dim m_amp As Long
Dim m_AIrange As Long '当前AD量程
Dim m_showMode As Long '显示方式
Const m_MaxADchCnt As Long = 8
Const m_MaxPSchCnt As Long = 16
Dim m_ADchNO As Long
Dim m_ADfreq As Long
Const m_timerCTNO As Long = 1
Const m_CTchCount As Long = 3 '计数通道数
Const m_DIchCount As Long = 16 'DI通道数
Const m_DOchCount As Long = 16 'DI通道数
Const m_PsDIchCount As Long = 4 'DI通道数
Const m_PsDOchCount As Long = 4 'DI通道数
Const m_cardInClock As Double = 2000000# '板卡内部时钟
Dim m_stop As Boolean
'Dim m_zeroVal As Single, m_fullVal As Single
Const DEF_BUFSIZE As Long = 1024000 '缓冲区大小
'Const DEF_WANTCNT_PERCH As Long = 10000 '每次每通道需要读出的数据个数
'Const DEF_CH_CNT As Long = 2 '通道数
'Dim m_readArr(DEF_WANTCNT_PERCH * DEF_CH_CNT - 1) As Integer '用于每次读数
Dim m_dataBuf(DEF_BUFSIZE - 1) As Single '申请足够大的缓冲区
Dim m_readPos As Long '缓冲区读指针,针对单通道
Dim m_writePos As Long '缓冲区写指针,针对单通道
Dim m_drawCnt As Long '每次画多少点
Private Sub DrawStr(ByRef picObj As PictureBox, _
ByRef rowDataStr() As String, _
ByVal cols As Long)
'写一行
With picObj
If picObj Is Nothing Then MsgBox "对象不能为空": Exit Sub
Dim arrSize As Long
arrSize = UBound(rowDataStr) - LBound(rowDataStr) + 1
If arrSize <= 0 Then MsgBox "数组不能为空": Exit Sub
If cols <= 0 Then MsgBox "列数不能为0": Exit Sub
.Cls '清屏
.ForeColor = vbBlack
Const DEF_ROWS As Long = 11 '18
Const DEF_COLS As Long = 8
Dim k As Long, i As Long
'Static lastData(DEF_ROWS * DEF_COLS - 1) As Single
Static lastArrSize As Long
Static lastData() As String
If lastArrSize <> (DEF_ROWS * cols) Then
lastArrSize = DEF_ROWS * cols
ReDim lastData(lastArrSize - 1)
End If
'把后面向前移DEF_COLS个数
For k = 0 To lastArrSize - cols - 1
lastData(k) = lastData(k + cols)
Next k
For k = 0 To cols - 1
lastData(k + lastArrSize - cols) = rowDataStr(k)
Next k
'MsgBox Screen.TwipsPerPixelX & " , " & Screen.TwipsPerPixelY
For k = 0 To DEF_ROWS - 1
For i = 0 To cols - 1
'.CurrentX = (i) * 1100 + 200
'.CurrentY = k * 200
.CurrentX = (i) * 73 + 13
.CurrentY = k * 15
Dim tempStr As String
tempStr = lastData(k * cols + i) 'Format(lastData(k * cols + i), "0.00")
tempStr = Space(Len("+10000.00") - Len(tempStr)) & tempStr
picObj.Print tempStr 'Format(lastData(k * 8 + i), "0.00") '"10000.00"
Next i
Next k
End With
End Sub
Private Sub MakeADfreq(ByVal cardInClock As Long, _
ByVal minDivisor As Long, _
ByVal maxDivisor As Long)
'求所有整数的采样频率
'cardInClock 板卡内部时钟
'minDivisor 最小分频系数
'maxDivisor 最大分频系数
cobADfreq.Clear
Dim tempStr As String
Dim i As Long
For i = minDivisor To maxDivisor
If (cardInClock / (i + 1)) = CLng(cardInClock / (i + 1)) Then
tempStr = Format(cardInClock / (i + 1) / 1000, "0.###")
tempStr = IIf(Right(tempStr, 1) = ".", Left(tempStr, Len(tempStr) - 1), tempStr)
cobADfreq.AddItem tempStr & "KHz"
End If
Next i
End Sub
Private Sub cmdCT_Click(Index As Integer)
'停止或启动计数器
'把initVal As Double,防止用户输入很大的数造成溢出
Dim initVal As Double, CTMode As Long
initVal = Val(txtInitCTval(Index).Text)
CTMode = Val(Right(cobCTmode(Index).Text, 1))
If initVal < 0 Or initVal > 65535 Then
MsgBox "计数器初值不能 < 0 或 > 65535"
Exit Sub
End If
If cmdCT(Index).Caption = "启动" Then
'设置计数通道1工作方式及初值
ZT8361_CTStart m_cardNO, Index + 1, CTMode, initVal
m_timerCTFinish = True
timerCT.Interval = 100
timerCT.Enabled = True
txtInitCTval(Index).Enabled = False
cobCTmode(Index).Enabled = False
cmdCT(Index).Caption = "停止"
Else
ZT8361_CTStop m_cardNO, Index + 1, 0
txtInitCTval(Index).Enabled = True
cobCTmode(Index).Enabled = True
cmdCT(Index).Caption = "启动"
End If
Me.Caption = "PCI8361AN测试(错误号: " & ZT8361_GetLastErr & ")" '返回函数执行的状态
End Sub
Private Sub cmdPStimerAD_Click()
'开始PS端子板定时采集
If cmdPStimerAD.Caption Like "*开始PS端子*" Then
If cobPsMode.ListIndex = 1 _
And cobPSNO.ListIndex > 0 _
And Val(cobADfreq.Text) > 100 Then
MsgBox "多通道循环采集时,总采样速率应该小于等于50K。"
End If
'定时AD准备工作
Call ZT8361_CloseIRQ(m_cardNO) '关闭中断
Call ZT8361_DisableAD(m_cardNO) '停止定时AD
Call ZT8361_ClearHFifo(m_cardNO, 1) '清空硬件FIFO(HFIFO)
Call ZT8361_ClearSFifo(m_cardNO, 1) '清空AD软件FIFO(SFIFO)
If ZT8361_GetSFifoSize(m_cardNO, 1) <> Val(cobSFIFOsize.Text) Then
If ZT8361_SetSFifoSize(m_cardNO, 1, Val(cobSFIFOsize.Text)) <> Val(cobSFIFOsize.Text) Then
MsgBox "未申请到足够的缓冲区"
Exit Sub
End If
End If
Dim chCnt As Long
chCnt = Val(cobPSNO.Text)
'Picture1.AutoRedraw = True
If cobShowMode.ListIndex <> 3 Then
Dim outStrArr(8 - 1) As String
Dim k As Long
For k = 0 To 8 - 1
outStrArr(k) = "< CH" & k + 1 & " >" '-------"
Next k
DrawStr Picture1, outStrArr, chCnt
'MsgBox ZT8361_GetLastErr '"r"
End If
'打开中断,注意HFIFO超过半满时打开中断会死机
ZT8361_OpenIRQ m_cardNO, 0, 0, 0, 0, 0 '打开中断
Dim ADfreq As Long, AIrange As Long
ADfreq = m_cardInClock / (Val(cobADfreq.Text) * 1000) - 1
AIrange = cobADrange.ItemData(cobADrange.ListIndex)
Call ZT8361_InitIRQ(m_cardNO, 1)
'每个通道有不同的增益
Dim amp(8 - 1) As Long
For k = 0 To 8 - 1
amp(k) = cobAmp.ListIndex
Next k
Call ZT8361_AIinit(m_cardNO, cobPsMode.ListIndex, 1 * &H100 + Val(cobPSNO.Text), AIrange, amp(0), 5, ADfreq, 0, 0)
Call ZT8361_EnableAD(m_cardNO) '允许定时AD
m_readPos = 0
m_writePos = 0
m_timerADFinish = True
timerAD.Interval = 100
timerAD.Enabled = True
m_timerShowFinish = True
timerShowWave.Enabled = True
cmdPStimerAD.Caption = " 停止PS端子 板定时采集"
Else
Call ZT8361_CloseIRQ(m_cardNO) '关闭中断
timerAD.Enabled = False
m_timerShowFinish = False
timerShowWave.Enabled = False
cmdPStimerAD.Caption = " 开始PS端子 板定时采集"
End If
If ZT8361_GetLastErr <> 0 Then Me.Caption = "PCI8361AN测试程序(错误号: " & ZT8361_GetLastErr & ")" '返回函数执行的状态
End Sub
Private Sub cobADfreq_Click()
'
Dim tempVal As Double, tempStr As String
tempVal =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -