Reddog - many, many thanks for your excellent reply. I hadn't tried the "Control Task" VI.
You are correct that this is a PXI-4461 - sorry, I should have stated that.
A bit of detail...
What I'm trying to do is this - at present we have one PXI-4461. We will be buying more of these cards shortly. I suspect that what I'm trying to do is not quite what these cards were designed for. We are making a unit that, conceptually, is a number of ADCs in, some digital logic, and a number of DACs out. The automated test consists of applying a number of very precise DC voltages to the ADCs using 4461 AO channels, then communicating with the logic to find out that value it is reading, then ramping up the voltage, querying the logic again, etc. On the output side, we will tell the logic to output value x, then measure this voltage using a 4461 AI channel, then increment the logic output value, read the AI again, etc. Pretty simple stuff really.
As the DUT has very high-resolution ADCs and DACs, we need the ATE system to be much more accurate than the DUT. This is why we went for the 4461, as it has 24-bits and BNC connectors for low-noise connection directly to the DUT. Obviously the 4461's 2MHz sample rate is over-kill for us!
I saw straight away that the 4461 is not capable of dealing with single output values - it can only output waveforms (it would be much easier if it could do single values!). I then decided to try outputting a 1D array of minimum length (2 samples) at maximum output rate, and use the AO.IdleOutputBehaviour>>Maintain Existing Value property to make the output stay where I left it. I then set about making subVI's called Open, Write and Close, each of which would deal with a Task containing one channel each. The intention was to open as many instances of these VIs as were required for the number of channels needed. See the attached screenshots from my test harness that deals with the two channels.
I could deal with this by putting both Channels into one Task, but that would make the structure much more complicated. It also makes it difficult to update one channel without the other (as I need to do). I did try the 1 Task approach yesterday, with cacheing for the channel that doesn't need to be updated. This was obviously a pretty complicated way of sticking a DC voltage out of a channel! I did have problems with this approach too, which I won't go into just yet, as I'd prefer to continue trying to work out a way of doing this with multiple Tasks, one Channel per task.
First, the good news: Your excellent suggestion of unreserving almost works! I unreserve the channel in my Open VI, then within each Write I reserve, update the output, then unreserve. I can now update both channels as required, without getting any errors.
Now, the bad news: Updating one channel causes the other to revert to 0V. This is despite the AO.IdleOutputBehaviour>>Maintain Existing Value being set for each Channel/Task. I had my Write VI open, running with execution highlighting and saw that output 0 maintains its value while output 1 is reserved. Then, the instant that the "DAQmx Write" VI runs on AO1, AO0 drops to 0V.
All I'm after is a way of being able to set two outputs to a DC voltage each, independently. I can't believe how difficult this is.
All help gratefully received!