Measurement Studio for .NET Languages

cancel
Showing results for 
Search instead for 
Did you mean: 

Simultanious start of DO, DI, AO and AI

I am using the M-Series Card NI PCI-6251 with Measurement Studio 8.0.1 and Visual Studio 2005 C# and I want to start a DI, a DO, an AI and an AO - Task simultaneously. Therefore I tried to trigger the DI, DO and the AO on the ai/StartTrigger. With the AO this works fine - but with the DI and DO it gives me error message "Specified property is not supported by the device or is not applicable to the task." with the Status Code: -200452.
The NI Support in Germany suggested me to use ai/SampleClock but the same error accurs. After that I tried to trigger the DO with any other source - and every source gave the error. So how to trigger digital channels.
 
Here is a part of the Source Code:
 
DOutTask = new Task("DOutTask");
AOutTask = new Task("AOutTask");
DInTask = new Task("DInTask");
AInTask = new Task("AInTask");
 
DOutTask.DOChannels.CreateChannel("Dev1/port0/line2:4", "", ChannelLineGrouping.OneChannelForAllLines);
AOutTask.AOChannels.CreateVoltageChannel("Dev1/ao0", "", -10, 10, AOVoltageUnits.Volts);
DInTask.DIChannels.CreateChannel("Dev1/port0/line0:1", "", ChannelLineGrouping.OneChannelForAllLines);
AInTask.AIChannels.CreateVoltageChannel("Dev1/ai0:8", "", AITerminalConfiguration.Rse, -5, 5, AIVoltageUnits.Volts);
 
DOutTask.Timing.ConfigureSampleClock("100kHzTimebase", rate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, (int)(MeasurementTimeEdit.Value / 1000 * rate + 1));
AOutTask.Timing.ConfigureSampleClock("100kHzTimebase", rate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, (int)(MeasurementTimeEdit.Value / 1000 * rate + 1));
DInTask.Timing.ConfigureSampleClock("100kHzTimebase", rate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, (int)(MeasurementTimeEdit.Value / 1000 * rate + 1));
AInTask.Timing.ConfigureSampleClock("100kHzTimebase", rate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, (int)(MeasurementTimeEdit.Value / 1000 * rate + 1));
 
DOutTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("ai/StartTrigger", DigitalEdgeStartTriggerEdge.Rising);
DInTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("ai/StartTrigger", DigitalEdgeStartTriggerEdge.Rising);
AOutTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("ai/StartTrigger", DigitalEdgeStartTriggerEdge.Rising);
//AInTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("/Dev1/PFI0", DigitalEdgeStartTriggerEdge.Rising);
 
DOutTask.Control(TaskAction.Verify);
AOutTask.Control(TaskAction.Verify);
DInTask.Control(TaskAction.Verify);
AInTask.Control(TaskAction.Verify);
 
byte[] DOwavebarray = new byte[(int)(MeasurementTimeEdit.Value / 1000 * rate + 1)];
for (int i = 0; i < (int)(MeasurementTimeEdit.Value / 1000 * rate); i++)
{
    DOwavebarray[i] = 4;
}
DigitalWaveform DOwave = new DigitalWaveform((int)(MeasurementTimeEdit.Value / 1000 * rate), 1, DigitalState.ForceDown);
DOwave = NationalInstruments.DigitalWaveform.FromPort(DOwavebarray,4+8+16);
DigitalSingleChannelWriter DOwriter = new DigitalSingleChannelWriter(DOutTask.Stream);
DOwriter.WriteWaveform(false, DOwave);
FunctionGenerator fGen;
if (ExcComboBox.SelectedIndex == (int)IndForms.EldecLockIn )
    fGen = new FunctionGenerator(AOutTask.Timing, FrequencyEdit.Value, WaveformType.SineWave, PowerEdit.Value);
else
    fGen = new FunctionGenerator(AOutTask.Timing,PowerEdit.Value);
AnalogSingleChannelWriter AOwriter = new AnalogSingleChannelWriter(AOutTask.Stream);
AOwriter.WriteMultiSample(false, fGen.Data);
 
DOutTask.Start();
DInTask.Start();
AOutTask.Start();
AInTask.Start();
 
DIreader = new DigitalSingleChannelReader(DInTask.Stream);
AIreader = new AnalogMultiChannelReader(AInTask.Stream);
AnalogWaveform<double>[] data = new AnalogWaveform<double>[9];
data = AIreader.ReadWaveform((int)(MeasurementTimeEdit.Value / 1000 * rate));
DigitalWaveform DIwave = new DigitalWaveform((int)(MeasurementTimeEdit.Value / 1000 * rate), 1, DigitalState.ForceDown);
DIwave = DIreader.ReadWaveform((int)(MeasurementTimeEdit.Value / 1000 * rate));
 
//DOutTask.WaitUntilDone();
 
DOutTask.Stop();
AOutTask.Stop();
DInTask.Stop();
AInTask.Stop();
 
AInTask.Dispose();
DInTask.Dispose();
AOutTask.Dispose();
DOutTask.Dispose();
 
waveformGraph1.PlotWaveforms(data);
waveformGraphPower.PlotWaveform(data[1]);
digitalWaveformGraph1.PlotWaveform(DIwave);
0 Kudos
Message 1 of 4
(4,856 Views)
Johannes,

please take a look into that KB. i think it will answer your question.

Norbert B.
NI Germany
Norbert
----------------------------------------------------------------------------------------------------
CEO: What exactly is stopping us from doing this?
Expert: Geometry
Marketing Manager: Just ignore it.
0 Kudos
Message 2 of 4
(4,842 Views)

Hi.

I have a similar application in that I want to do acquisition on Digital Input lines, but only while another Digital Input line is HIGH.

i.e. I need a Start Trigger and a Stop Trigger.

I would be interested to hear from you Johannes to see if you managed to solve your problem.

I am programming a NI USB-6259 using Visual Studio 2005 Professional. I am NOT using any other software i.e. LabWindows e.t.c.

The link in the previous post does not carry any examples or sample code, and as I am a newbie with DAQmx, I don't know where else to go.

 

0 Kudos
Message 3 of 4
(4,634 Views)
I found a sample here

HTH, Cz.

Message Edited by czerwinski1977 on 01-10-2007 09:22 AM

0 Kudos
Message 4 of 4
(4,509 Views)