大家好!我使用研华的PCI-1712数据采集卡做个程序,通过研华提供的例子现在实现了数据的采集,我的问题主要有以下几个:
1.使用了研华ActiveDAQ Pro这个插件,它里面有一个函数long AcquireBulkDataToMemory(
long dataCount,
VARIANT* dataBuffer,
long timeOut = 0,
boolean cyclic = false,
boolean synchronous = true
);也就是把数据读到内存里。它的第一个参数是采集样点数,程序运行前必须设定,最大可设为4M,当采集样点数达到这个值时,程序就停止。现在想实现不间断的采集,也就是当达到采集样点数时,继续运行这个函数。要怎么实现?
2.输出数据时调用long TransferBulkDataFromMemory(
long dataCount,
VARIANT dataBuffer,
long timeOut = 0,
BOOL cyclic = false,
BOOL synchronous = true
);问题是输出的数据频率和输入的数据频率不一致(对数据并没有做任何处理,等输入输出调通后再考虑对数据),这是什么原因?
3.当改变输入信号,比如从正弦信号改为方波信号时,输出的还是正弦信号而不是方波,输出不能跟着输入的改变而改变,这是什么原因?希望大家帮助。有做过类似程序的高手能否发一个相关的代码,让小弟参考一下。邮箱:fancycup@126.com下面是采集的代码(用的是C#).
private void cmdStart_Click(object sender, System.EventArgs e)
{
int count;
int i;
bool b;
try
{
count = int.Parse(txtCount.Text);
// Set the FAI parameters.
//axAICtrl就是控制数据输入的,下面都是对数据采集考参数的设定。如触发模式,采样频率
axAICtrl.TraceTriggerMode = (AdvAILib.TraceTriggerMode)(cmbTriggerMode.SelectedIndex);
axAICtrl.TraceTriggerEdge = (AdvAILib.TraceTriggerEdge)( cmbTriggerEdge.SelectedIndex);
axAICtrl.TraceTriggerSource =(AdvAILib.TraceTriggerSource)( cmbTriggerSource.SelectedIndex);
axAICtrl.DataPacerSource = (AdvAILib.PacerSource)(cmbPacerSource.SelectedIndex);
axAICtrl.TraceTriggerDelayTime = double.Parse(txtTriggerDelayTime.Text);
axAICtrl.TraceTriggerValue = double.Parse(txtTriggerVoltage.Text);
axAICtrl.DataSampleRate = double.Parse(txtSampleRate.Text);
axAICtrl.ChannelScanStart = int.Parse(txtStartChan.Text);
axAICtrl.ChannelScanCount = int.Parse(txtChanNumber.Text);
axAICtrl.DataReturnType =(AdvAILib.DataReturnType)1;
//Ocx allocate the buffer of DataDigital ,equal to new object!
object DataDigital;
DataDigital = null;
// Engage the FAI with synchronous and noncyclic mode
//主要就是这两句
count = axAICtrl.AcquireBulkDataToMemory(count,outDataDigital,0,false ,true);
b = axAdvAO1.TransferBulkDataFromMemory(count, DataDigital, -1, false, true); Int16[] binary = new Int16[count];
binary = ( Int16[] )DataDigital;
// Stop the FAI with default waitting time
axAICtrl.StopAcquireBulkData(0);
object DataAnalog ;
// Convert the digital data to analog
axAICtrl.ConvertDigitalValueToAnalog(DataDigital,out DataAnalog ,count);
float[] voltage = new float[count];
voltage = (float[])DataAnalog;
frmDisp.AICtrlInit(ref axAICtrl,ref cmdStart,ref cmdStop);
// Display the data
frmDisp.Show();
frmDisp.lstRawData.Items.Clear();
frmDisp.lstVoltage.Items.Clear();
txtCount.Text = count.ToString();
try
{
count = int.Parse(txtCount.Text);
// Set the FAI parameters.
? ? ? ? //axAICtrl就是控制数据输入的,下面都是对数据采集考参数的设定。如触发模式,采样频率
axAICtrl.TraceTriggerMode = (AdvAILib.TraceTriggerMode)(cmbTriggerMode.SelectedIndex);
axAICtrl.TraceTriggerEdge = (AdvAILib.TraceTriggerEdge)( cmbTriggerEdge.SelectedIndex);
axAICtrl.TraceTriggerSource =(AdvAILib.TraceTriggerSource)( cmbTriggerSource.SelectedIndex);
axAICtrl.DataPacerSource = (AdvAILib.PacerSource)(cmbPacerSource.SelectedIndex);
axAICtrl.TraceTriggerDelayTime = double.Parse(txtTriggerDelayTime.Text);
axAICtrl.TraceTriggerValue = double.Parse(txtTriggerVoltage.Text);
axAICtrl.DataSampleRate = double.Parse(txtSampleRate.Text);
axAICtrl.ChannelScanStart = int.Parse(txtStartChan.Text);
axAICtrl.ChannelScanCount = int.Parse(txtChanNumber.Text);
axAICtrl.DataReturnType =(AdvAILib.DataReturnType)1;
//Ocx allocate the buffer of DataDigital ,equal to new object!
object DataDigital;
DataDigital = null;
// Engage the FAI with synchronous and noncyclic mode
? ? ? ? //主要就是这两句
count = axAICtrl.AcquireBulkDataToMemory(count,outDataDigital,0,false ,true);
? ? ? ? b = axAdvAO1.TransferBulkDataFromMemory(count, DataDigital, -1, false, true); Int16[] binary = new Int16[count];
binary = ( Int16[] )DataDigital;
// Stop the FAI with default waitting time
axAICtrl.StopAcquireBulkData(0);
object DataAnalog ;
// Convert the digital data to analog
? ? ? ? axAICtrl.ConvertDigitalValueToAnalog(DataDigital,out DataAnalog ,count);
float[] voltage = new float[count];
voltage = (float[])DataAnalog;