Multifunction DAQ

cancel
Showing results for 
Search instead for 
Did you mean: 

Gating Counter Channel Python

Solved!
Go to solution

Hello,

I am attempting to gate a counter channel that counts edges by using an input terminal. Essentially, I need it so that edges are only counted when that input terminal's signal is high. 

I did this by setting up a counter input channel which takes an input connected physically to a counter output so I can count pulses from it. That part works on its own. However, when I tried to set up the gating it gave me the error that:
" DaqError: Specified property is not supported by the device or is not applicable to the task"

Status Code: -200452

Property: DAQmx_CI_CountEdges_Gate_Enable

 

This is the property in question which seems to provide this functionality:

https://www.ni.com/docs/en-US/bundle/ni-daqmx-20.7-properties/page/daqmxprop/attr30ed.html#d980e29

 

I am working on a NI PCIe-6384 device on Windows 10. I suspect perhaps the solution is not to enable gating on that channel. Could this be a working approach with a minor error is there some other method?

 

Here is my code:

 

 

 

def gen_and_collect(self, testlow, testhigh, ctr=0):
        # Testlow & Testhigh are used for the counter generation to create custom pulse lengths.

        #Defining output counter
        output_counter = nidaqmx.Task()
        output_counter.co_channels.add_co_pulse_chan_time("Dev1/ctr"+str(ctr))
        output_counter.timing.cfg_implicit_timing(
            samps_per_chan=len(low),
            sample_mode=AcquisitionType.FINITE
        )

        # Defining counter for counting edges
        count_edge = nidaqmx.Task()
        ch = count_edge.ci_channels.add_ci_count_edges_chan(
            counter='Dev1/ctr1',
            edge=Edge.RISING
        )
        # These two lines cause it to error (setting up the gating)
        ch.ci_count_edges_gate_enable = True
        ch.ci_count_edges_gate_term = 'Dev1/port1/line7'

        # Counter for generation setup
        sw = nidaqmx.stream_writers.CounterWriter(output_counter.out_stream)
        sw.write_many_sample_pulse_time(testhigh, testlow)

        # Running
        count_edge.start()
        output_counter.start()
        
        output_counter.wait_until_done(timeout=(sum(low)+sum(high)+initial_delay)*2)
        print(count_edge.read())
        count_edge.stop()
        count_edge.close()

        output_counter.stop()
        output_counter.close()

 

 

 

 

0 Kudos
Message 1 of 2
(734 Views)
Solution
Accepted by topic author whiz.eram0

I don't know any of the Python syntax, but in LabVIEW calls to DAQmx functions this is typically done by configuring a "Pause Trigger" for the task instead of setting up "gating."

 

I don't know why it has to be done this way -- the gating config functions sure *look* like they should be available to do the same job.  But for whatever reason, DAQmx isn't allowing it.  Anyway, configuring a Pause Trigger will give you the behavior you want -- counting proceeds while the pause trigger terminal is in one digital state, it pauses when in the other state.

 

 

-Kevin P

CAUTION! New LabVIEW adopters -- it's too late for me, but you *can* save yourself. The new subscription policy for LabVIEW puts NI's hand in your wallet for the rest of your working life. Are you sure you're *that* dedicated to LabVIEW? (Summary of my reasons in this post, part of a voluminous thread of mostly complaints starting here).
Message 2 of 2
(711 Views)