這是特定于USB-1608G 的示例。它使用 Discovery 接口來定位USB-1608G并對其進行編程。不需要運行 InstaCal,但您必須安裝它。該程序是在 Visual Studio 中創建的一個簡單的 32 位控制臺程序。要運行該程序,請創建一個 32 位控制臺項目,將 cbw.h 和 cbw32.dll 文件與代碼文件一起添加到其中,代碼文件附在本文底部。
該程序不僅以連續方式讀取四個模擬輸入,還將前四個數字線編程為輸入,將后四個數字線編程為輸出。在讀取數據的循環中,讀取數字輸入,然后將其寫入四個輸出線。這種方法適用于低速采集,然而,對于高速采集,必須注意確保在讀/寫數字 IO 時不會丟失數據。這是因為數字 IO 是一個瓶頸,最大更新率為每秒 200 次讀取或寫入。
/* 包含文件 */
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "cbw.h"
#define 率 100
#define LowChan 0
#define HighChan 4
#define ChanCount 5
#define 數據包 100
#define COUNT PACKET * ChanCount
#define MAXNUMDEVS 100
無效主()
{
/* 變量聲明 */
整數索引 = 0;
長curCount,curIndex;
int ULStat = 0;
int 增益 = BIP10VOLTS;
長率 = 率;
短狀態;
長半緩沖 = COUNT / 2;
long NumRows = PACKET / 2;
bool NextReadUpper = false;
int numberOfDevices = MAXNUMDEVS;
DaqDeviceDescriptor 庫存[MAXNUMDEVS];
DaqDeviceDescriptor DeviceDescriptor;
int BoardNum = -1;
float Rev = (float)CURRENTREVNUM;
ULStat = cbDeclareRevision(&Rev);
cbErrHandling(打印,停止);
printf("后臺模式下cbAInScan()演示\n\n");
//忽略 InstaCal 設備發現
cbIgnoreInstaCal();
//定位USB設備
ULStat = cbGetDaqDeviceInventory(ANY_IFC, 庫存, &numberOfDevices);
for (int i = 0; i < numberOfDevices; i++)
{
DeviceDescriptor = 庫存[i];
//1608G的產品ID = 0x110
//1608GX 的產品 ID = 0x111
//1608GX-2AO 的產品 ID = 0x112
//產品 ID 可以在位于的 ULProps.txt 中找到
// C:\Program Files (x86)\Measurement Computing\DAQ
if (DeviceDescriptor.ProductID == 0x110)
{
BoardNum = i;
ULStat = cbCreateDaqDevice(BoardNum, DeviceDescriptor);
printf("設備名稱:%s\n", DeviceDescriptor.ProductName);
休息;
}
}
如果(BoardNum < 0)
{
printf("找不到USB設備...按任意鍵退出\n");
獲取();
返回;
}
for (int i = 0; i < 4; i++)
ULStat = cbDConfigBit(BoardNum, AUXPORT, i, DIGITALIN);
for (int i = 4; i < 8; i++)
ULStat = cbDConfigBit(BoardNum, AUXPORT, i, DIGITALOUT);
如果(ULStat!= 0)
printf("%d", ULStat);
ULStat = cbAInputMode(BoardNum, SINGLE_ENDED);
如果(ULStat!= 0)
printf("%d", ULStat);
//分配緩沖區
句柄 MemHandle = 0;
MemHandle = cbScaledWinBufAlloc(COUNT);
雙縮放數據[計數];
unsigned long RawData[COUNT]; //讀取計數
無符號選項 = 背景 + 連續 + SCALEDATA;
ULStat = cbAInputMode(BoardNum, SINGLE_ENDED);
如果(ULStat!= 0)
printf("%d", ULStat);
//開始獲取
ULStat = cbAInScan(BoardNum,
低燦,
高燦,
數數,
&速度,
獲得,
內存句柄,
選項);
如果(ULStat!= 0)
printf("%d", ULStat);
//用于數字io
USHORT bitVal[4] = { 0, 0, 0, 0 };
而 (!_kbhit())
{
//此循環讀取緩沖區的下半部分,然后連續讀取上半部分。
// 它使用 NextReadUpper 標志,以便緩沖區的每一半都被讀取一次
ULStat = cbGetStatus(BoardNum, &Status, &curCount, &curIndex, AIFUNCTION);
如果(ULStat!= 0){
printf("錯誤代碼 %d\n", ULStat);
休息;
}
if ((curIndex > halfbuf) && (NextReadUpper == false))
{
NextReadUpper = true;
指數 = 0;
cbScaledWinBufToArray(MemHandle, ScaledData, 0, halfbuf);
//讀取四個數字輸入線
for (int i = 0; i < 4; i++)
ULStat = cbDBitIn(BoardNum, AUXPORT, i, &bitVal[i]);
for (int j = 0; j< NumRows; j++)
{
for (int i = 0; i<ChanCount; i++)
printf("%2.3f\t", ScaledData[index++]);
for (int i = 0; i<4; i++)
printf("%d\t", bitVal[i]);
printf("\n");
}
//寫入4條數字輸出線
for (int i = 4; i < 8; i++)
ULStat = cbDBitOut(BoardNum, AUXPORT, i, bitVal[i]);
}
else if ((curIndex < halfbuf) && (NextReadUpper == true))
{
NextReadUpper = false;
指數 = 0;
cbScaledWinBufToArray(MemHandle, ScaledData, halfbuf, halfbuf);
//讀取四個數字輸入線
for (int i = 0; i < 4; i++)
ULStat = cbDBitIn(BoardNum, AUXPORT, i, &bitVal[i]);
for (int j = 0; j< NumRows; j++)
{
for (int i = 0; i<ChanCount; i++)
printf("%2.3f\t", ScaledData[index++]);
for (int i = 0; i<4; i++)
printf("%d\t", bitVal[i]);
printf("\n");
}
//寫入4條數字輸出線
for (int i = 4; i < 8; i++)
ULStat = cbDBitOut(BoardNum, AUXPORT, i, bitVal[i]);
}
}
cbStopBackground(BoardNum, AIFUNCTION);
cbWinBufFree(MemHandle);
cbReleaseDaqDevice(BoardNum);
printf("完成...按任意鍵退出\n");
獲取();
}