以下示例使用 DaqInScan 功能同時讀取 USB-1808 子系統。它被配置為讀取四個模擬輸入、四位數字端口和一個編碼器通道。它配置了一個大小為數據包乘以通道計數乘以乘數的 緩沖區 。要使緩沖區變大/變小,請更改multiplier 。采樣率為每秒 3600 個樣本。循環設置為在新的半緩沖區可用時進行讀取。打印例程只打印 前 32 個樣本以防止它消耗可用時間
要訪問 API,請添加對 McDaq 對象的引用。添加引用通常是通過右鍵單擊項目 [在項目資源管理器下并選擇添加引用來完成的。完整的項目附在文章中,是使用 CSharp 使用 Visual Studio 2008 創建的。編譯和執行速度很快,因為 Windows 開銷和相關代碼最少。
為了使代碼更具可讀性,添加了一些方便的函數,例如 IsError、GetBoardNum 和 WaitForKey。IsError 函數檢查 ErrorInfo 對象中的錯誤編號,如果不是零則顯示錯誤消息。GetBoardNum 函數開始從每個數字位置讀取設備字符串,一旦找到包含標識字符串的設備字符串,它就會退出。WaitForKey 就是這樣做的 - 等待某人按下某個鍵。要查看完整的程序項目,請下載下面的附件。
免責聲明:
隨附的代碼或示例按原樣提供。它尚未作為產品進行測試或驗證,未在部署的應用程序或系統中使用,或在危險環境中使用。您承擔使用代碼或示例的所有風險。
使用系統;
使用麥達克;// 同時,向項目添加對 McDaq 的引用
//此程序使用DaqInScan功能同時讀取4x AI、1x DigIn、1x Encoder。它配置了一個
//緩沖區大小為數據包乘以通道計數時間乘數。使緩沖區變大/變小
//改變乘數。采樣率為每秒 3600 個樣本。循環設置為讀取時
//一個新的半緩沖區可用。程序在可用時檢索緩沖區的一半。印刷品
//例程只打印前32個樣本以防止它消耗可用時間
命名空間 CSharp_USB_1808_DaqInScanEncoder
{
靜態類常量
{
public const int ChanCount = 6; //通道數(4x AI,1x DigIn,2x Encoder)
公共常量 int PACKET = 128;
公共常量 int BUFFMULTIPLER = 100;
public const int BUFFSIZE = PACKET * ChanCount * BUFFMULTIPLER;
公共靜態 int bufferSize = BUFFSIZE;
公共靜態 int halfbuf = bufferSize / 2;
公共常量 int 計數器 = 2; //第一個編碼器通道
public static int rows = halfbuf / ChanCount;
公共靜態 MccBoard daq;
公共靜態整數率 = 3600;
公共靜態 int preTrigCount = 0;
}
課程計劃
{
static void Main(string[] args)
{
int BoardNum = 0;
短 daqStatus = 0;
整數計數 = 0;
整數索引 = 0;
short[] ChanArray = new short[Constants.ChanCount]; // 保存通道隊列信息的數組
ChannelType[] ChanTypeArray = new ChannelType[Constants.ChanCount]; // 保存通道類型信息的數組
Range[] GainArray = new Range[Constants.ChanCount]; // 保存增益隊列信息的數組
Console.WriteLine("正在定位設備...請稍候\n");
BoardNum = GetBoardNum("1808");
if (BoardNum == -1)
{
Console.WriteLine("未檢測到設備!");
等待鍵();
返回;
}
別的
{
Constants.daq = new MccDaq.MccBoard(BoardNum);
Constants.daq.AInputMode(AInputMode.SingleEnded);
CounterMode CMODE = CounterMode.Encoder | CounterMode.EncoderModeX1;
IsError(Constants.daq.CConfigScan(2,
模式,
CounterDebounceTime.DebounceNone,
CounterDebounceMode.TriggerAfterStable,
CounterEdgeDetection.RisingEdge,
CounterTickSize.Tick20ns,
0));
int i = 0;
ChanArray[i] = 0;
ChanTypeArray[i] = ChannelType.Analog;
GainArray[i] = Range.Bip10Volts;
我++;
ChanArray[i] = 1;
ChanTypeArray[i] = ChannelType.Analog;
GainArray[i] = Range.Bip10Volts;
我++;
ChanArray[i] = 2;
ChanTypeArray[i] = ChannelType.Analog;
GainArray[i] = Range.Bip10Volts;
我++;
ChanArray[i] = 3;
ChanTypeArray[i] = ChannelType.Analog;
GainArray[i] = Range.Bip10Volts;
我++;
ChanArray[i] = (int)DigitalPortType.AuxPort;
ChanTypeArray[i] = ChannelType.Digital;
GainArray[i] = Range.NotUsed;
我++;
ChanArray[i] = 2; //編碼器通道為 2 & 3
ChanTypeArray[i] = ChannelType.Ctr;
GainArray[i] = Range.NotUsed;
我++;
ScanOptions 選項 = ScanOptions.Default
| ScanOptions.Continuous
| ScanOptions.Background;
//分配緩沖區
int bufferSize = Constants.bufferSize;
IntPtr 緩沖區 = MccService.WinBufAlloc32Ex(Constants.bufferSize);
IsError(Constants.daq.DaqInScan(ChanArray,
ChanTypeArray,
增益陣列,
Constants.ChanCount,
參考 Constants.rate,
參考 Constants.preTrigCount,
參考 Constants.bufferSize,
緩沖,
選項));
System.ConsoleKeyInfo cki = new System.ConsoleKeyInfo();
Console.WriteLine("正在檢索數據\n");
int[] UserBuffer = new int[Constants.halfbuf];
bool ReadLower = true;
做
{
IsError(Constants.daq.GetStatus(out daqStatus, out Count, out Index, FunctionType.DaqiFunction));
if ((Index >= Constants.halfbuf) & ReadLower) //檢查多出50%的數據
{
//獲取緩沖區的下半部分
IsError(MccService.WinBufToArray32(buffer, UserBuffer, 0, Constants.halfbuf));
DisplayData(UserBuffer, Constants.rows);
ReadLower = 假;//控制下一次讀取的標志
}
else if ((Index < Constants.halfbuf) & !ReadLower)
{
//獲取上半部分
IsError(MccService.WinBufToArray32(buffer, UserBuffer, Constants.halfbuf, Constants.halfbuf));
DisplayData(UserBuffer, Constants.rows);
ReadLower = true;//控制下一次讀取的標志
}
} while (!Console.KeyAvailable);
cki = Console.ReadKey();
//停止后臺操作
IsError(Constants.daq.StopBackground(FunctionType.DaqiFunction));
//釋放內存
IsError(MccService.WinBufFreeEx(buffer));
等待鍵();
}
//程序結束
}
/*//////////////////////////////////////////////// ///////////////////////////////////////
public static int GetBoardNum(string dev)
{
McDaq.DaqDeviceManager.IgnoreInstaCal();
MccDaq.DaqDeviceDescriptor[]inventory = MccDaq.DaqDeviceManager.GetDaqDeviceInventory(MccDaq.DaqDeviceInterface.Any);
int DevicesFound =inventory.Length;
如果(設備發現 > 0)
{
for (int boardNum = 0; boardNum < DevicesFound; boardNum++)
{
嘗試
{
if (inventory[boardNum].ProductName.Contains(dev))
{
MccDaq.MccBoard daqBoard = MccDaq.DaqDeviceManager.CreateDaqDevice(boardNum,inventory[boardNum]);
Console.WriteLine("產品名稱:{0}",inventory[boardNum].ProductName);
Console.WriteLine("設備類型# : {0}",inventory[boardNum].ProductID);
Console.WriteLine("Serial # : {0}",inventory[boardNum].UniqueID);
返回板號;
}
}
捕獲(ULException ule)
{
Console.WriteLine("發生錯誤:" + ule.Message);
}
}
}
返回-1;
}
/*//////////////////////////////////////////////// ///////////////////////////////////////
public static void WaitForKey()
{
Console.WriteLine("\n按任意鍵繼續...");
做
{ //空閑循環
System.Threading.Thread.Sleep(10);
} while (!Console.KeyAvailable);
}
/*//////////////////////////////////////////////// ///////////////////////////////////////
public static int IsError(ErrorInfo e)
{
如果 (e.Value != 0)
{
Console.WriteLine(e.Message);
等待鍵();
返回 1;
}
返回0;
}
//**************************************************** **************
public static void DisplayData(int[] datArray, int rows)
{
//將數據寫入屏幕和文件
int i = 0;
雙溫;
如果(行 > 32)行 = 32;
for (int row = 0; row < rows; row++)
{
for (int c = 0; c < Constants.ChanCount; c++)
{
如果 (c < 4)
{
IsError(Constants.daq.ToEngUnits32(Range.Bip10Volts, datArray[i], out temp));
Console.Write("{0}\t", temp.ToString("0.000"));
}
別的
Console.Write("{0}\t", datArray[i].ToString("000000"));
我++;
}
Console.Write("\r\n");
}
Console.WriteLine("\n讀取的數據掃描數{0}\n", Constants.rows);
}
/*//////////////////////////////////////////////// ///////////////////////////////////////
}
}