此示例演示如何對USB-QUAD08 進行編程。它將一個通道配置為從正交編碼器讀取位置,將另一個通道配置為使用模數(shù)運算符對事件進行計數(shù)。為此,它使用 CConfigScan 配置計數(shù)器輸入,并使用 CLoad32 函數(shù)加載事件計數(shù)器的模數(shù)值。程序連續(xù)讀取輸入。這是使用 CInScan 功能和背景連續(xù)掃描選項設置的。數(shù)據(jù)保存為與 DASYLab 讀取模塊兼容的 ASCII 文件。
該程序還使用發(fā)現(xiàn)接口來定位和創(chuàng)建設備對象。使用發(fā)現(xiàn)界面,必須安裝 InstaCal 程序,但最終用戶不需要運行它。
該程序是一個 32 位 C# 控制臺應用程序。如果您開始一個新項目,您必須首先添加對 McDaq 對象的 Dot Net 引用。InstaCal 安裝我們的 Dot Net UL 對象。添加引用通常是通過右鍵單擊項目 [在項目瀏覽器下] 并選擇添加引用來完成的。
完整的項目作為 zip 文件附在本文末尾。
免責聲明:
隨附的代碼或示例按原樣提供。它尚未作為產(chǎn)品進行測試或驗證,未在部署的應用程序或系統(tǒng)中使用,或在危險環(huán)境中使用。您承擔使用代碼或示例的所有風險。
使用系統(tǒng);
使用麥達克;
使用 System.IO;
命名空間 Quad08
{
課程計劃
{
公共常量 int CHANCOUNT = 2;
公共常量 int FIRSTCHANNEL = 0;
public const int LASTCHANNEL = CHANCOUNT-1;
公共常量 int FREQ = 100;
公共常量 int NUMOFPACKETS = 100;
公共常量 int PACKETSIZE = 100;
public const int BUFFERSIZE = PACKETSIZE * CHANCOUNT;
public const int HALFBUFFSIZE = BUFFERSIZE / 2;
public const string DEVICE = " USB-QUAD08 ";
公共靜態(tài) StreamWriter fStream;
公共靜態(tài) MccBoard daq;
公共靜態(tài)MccDaq.CounterMode 模式;
公共靜態(tài) McDaq.ScanOptions 選項;
static void Main(string[] args)
{
McDaq.ErrorInfo RetVal;
整數(shù)速率 = 頻率;
bool ReadLower = true;
daq = 發(fā)現(xiàn)(設備);
如果(daq == null)
{
Console.WriteLine("未檢測到{0}!", DEVICE);
等待鍵();
返回;
}
IntPtr 緩沖區(qū) = MccService.WinBufAlloc32Ex(BUFFERSIZE);
if (buffer == IntPtr.Zero)
{
Console.WriteLine("壞句柄");
返回;
}
//將計數(shù)器0設置為編碼器模式
mode = CounterMode.Encoder|CounterMode.EncoderModeBit32|CounterMode.EncoderModeX1;
IsError( daq.CConfigScan( 0,
模式,
CounterDebounceTime.Debounce500ns,
CounterDebounceMode.TriggerAfterStable,
CounterEdgeDetection.RisingEdge,
CounterTickSize.Tick208pt3ns,
0));
//將計數(shù)器 1 設置為帶模數(shù)運算的累加模式
mode = CounterMode.Totalize|CounterMode.Bit32|CounterMode.ModuloNOn;
IsError( daq.CConfigScan( 1,
模式,
CounterDebounceTime.Debounce500ns,
CounterDebounceMode.TriggerAfterStable,
CounterEdgeDetection.RisingEdge,
CounterTickSize.Tick20pt83ns,
1));
//用模數(shù)加載寄存器1
IsError(daq.CLoad32(CounterRegister.MaxLimitReg1, 2000));
//開始讀取計數(shù)器通道
opts = ScanOptions.Continuous|ScanOptions.Ctr32Bit|ScanOptions.Background;
IsError(daq.CInScan(FIRSTCHANNEL, LASTCHANNEL, BUFFERSIZE, ref Rate, buffer, opts));
//定時器0輸出(DIO6)用作計數(shù)器1的測試信號
雙 tmrRate = 100;
雙 tmrDuty = 0.5;
雙 tmrDelay = 0.0;
daq.PulseOutStart( 0,
參考 tmrRate,
參考 tmrDuty,
0,
參考 tmrDelay,
0,
PulseOutOptions.Default);
fStream = new StreamWriter(@"C:\Users\Public\Documents\DataFile.asc");
創(chuàng)建文件頭();//將基本信息寫入文件的開頭
整數(shù)計數(shù) = 0;
整數(shù)索引 = 0;
短數(shù)據(jù)狀態(tài);
int[] intArray = new int[BUFFERSIZE];
//循環(huán)直到按鍵
做
{
RetVal = daq.GetStatus(out daqStatus, out Count, out Index, FunctionType.CtrFunction);
if ((Index >= HALFBUFFSIZE) & ReadLower) //檢查 50% 以上的數(shù)據(jù)
{
//獲取緩沖區(qū)的下半部分
IsError(MccService.WinBufToArray32(buffer, intArray, 0, HALFBUFFSIZE));
DisplayData(intArray, HALFBUFFSIZE / CHANCOUNT);
ReadLower = 假;//控制下一次讀取的標志
}
否則 if ((Index < HALFBUFFSIZE) & !ReadLower)
{
//獲取上半部分
IsError(MccService.WinBufToArray32(buffer, intArray, HALFBUFFSIZE, HALFBUFFSIZE));
DisplayData(intArray, HALFBUFFSIZE / CHANCOUNT);
ReadLower = true;//控制下一次讀取的標志
}
if (Console.KeyAvailable == true) 中斷;
} while ((Count < (PACKETSIZE * NUMOFPACKETS)) || Console.KeyAvailable);
//將所有緩沖數(shù)據(jù)刷新到磁盤
fStream.Close();
//停止獲取
RetVal = daq.StopBackground(FunctionType.AiFunction);
//釋放內(nèi)存
MccService.WinBufFreeEx(buffer);
daq.PulseOutStop(0);
等待鍵();
}
public static int IsError(ErrorInfo e)
{
如果 (e.Value != 0)
{
Console.WriteLine(e.Message);
等待鍵();
返回 1;
}
返回0;
}
/*//////////////////////////////////////////////// ///////////////////////////////////////
public static MccDaq.MccBoard Discover(string dev)
{
//這會忽略 InstaCal 實用程序中列出的設備
McDaq.DaqDeviceManager.IgnoreInstaCal();
//獲取MCC USB設備清單
MccDaq.DaqDeviceDescriptor[]inventory = MccDaq.DaqDeviceManager.GetDaqDeviceInventory(MccDaq.DaqDeviceInterface.Usb);
int numDevDiscovered =inventory.Length;
if (numDevDiscovered > 0)
{ // 遍歷庫存以尋找 USB-1808
for (int boardNum = 0; boardNum < numDevDiscovered; boardNum++)
{
嘗試
{
if (inventory[boardNum].DevString.Contains(dev))
{
MccDaq.MccBoard daqBoard = MccDaq.DaqDeviceManager.CreateDaqDevice(boardNum,inventory[boardNum]);
返回daqBoard;
}
}
捕獲(ULException ule)
{
Console.WriteLine("發(fā)生錯誤:" + ule.Message);
}
}
}
返回空;
}
/*//////////////////////////////////////////////// ///////////////////////////////////////
public static void WaitForKey()
{
Console.WriteLine("\n按任意鍵繼續(xù)...");
做
{
System.Threading.Thread.Sleep(20);
} while (!Console.KeyAvailable);
ConsoleKeyInfo cki = Console.ReadKey();
}
public static void DisplayData(int[] datArray, int rows)
{
int i = 0;
for (int row = 0; row < rows; row++)
{
for (int c = 0; c < CHANCOUNT; c++)
{
Console.Write("{0}\t", Convert.ToInt32(datArray[i]).ToString("D").PadLeft(10));
fStream.Write("{0}\t", Convert.ToInt32(datArray[i]).ToString("D"));
我++;
}
Console.Write("\r\n");
fStream.Write("\r\n");
}
fStream.Flush();
}
/*//////////////////////////////////////////////// ///////////////////////////////////////
public static void CreateFileHeaders()
{
Console.WriteLine("讀取通道 {0} 到 {1}\n", FIRSTCHANNEL, LASTCHANNEL);
//'''''''''''''''''''''創(chuàng)建文本文件頭字符串''''''''''''''''
字符串[] hdr = 新字符串[7];
hdr[0] = "錄制日期:{0}";
hdr[1] = "塊長度:{0}";
hdr[2] = "數(shù)據(jù)包數(shù)量:{0}";
hdr[3] = "增量:{0} 秒。";
hdr[4] = "運行時間:{0} 秒。";
hdr[5] = "通道數(shù):{0}";
//'''''''''''''''''''''' 構(gòu)建列標題字符串'''''''''''''''''''
for (int j = FIRSTCHANNEL; j < CHANCOUNT; j++)
{
hdr[6] = hdr[6] + String.Format("In{0} [V]", j);
hdr[6] = hdr[6] + "\t";
}
hdr[4].Trim('\t');
//'''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''
DateTime MyDate = DateTime.Now;
fStream.WriteLine(hdr[0], MyDate);
fStream.WriteLine(hdr[1], PACKETSIZE);
fStream.WriteLine(hdr[2], NUMOFACKETS);
fStream.WriteLine(hdr[3], (1.0f / FREQ).ToString("0.000"));
fStream.WriteLine(hdr[4], (NUMOFPACKETS * PACKETSIZE) / FREQ);
fStream.WriteLine(hdr[5], CHANCOUNT);
fStream.WriteLine(hdr[6]);
Console.WriteLine(hdr[0], MyDate);
Console.WriteLine(hdr[1], PACKETSIZE);
Console.WriteLine(hdr[2], NUMOFPACKETS);
Console.WriteLine(hdr[3], (1.0f / FREQ).ToString("0.000"));
Console.WriteLine(hdr[4], (NUMOFPACKETS * PACKETSIZE) / FREQ);
Console.WriteLine(hdr[5], CHANCOUNT);
Console.WriteLine(hdr[6]);
}
}
}