08-10-2016 07:53 AM
Hello,
I have a cDAQ NI9184: 4 slot chassis with a NI9234: 4channel IEPE Analog Inputs, and NI9421 8 channel Digital sinking input
I am trying to configure an analog input task with a digital start trigger and a digital stop trigger also.
For stop trigger I am using a reference trigger as suggested in this tutorial link. I would like to use the digital pattern reference strigger since I want the stop trigger to happen when two DI lines get.
When I try to do this using a DAQmxCfgDigPatternRefTrig i get the following error:
DAQmx Error: Requested value is not a supported value for this property. The property value may be invalid because it conflicts with another property.
Property: DAQmx_RefTrig_Type
Requested Value: DAQmx_Val_DigPattern
Possible Values: DAQmx_Val_AnlgEdge, DAQmx_Val_AnlgWin, DAQmx_Val_DigEdge, DAQmx_Val_None
Task Name: hw1
Status Code: -200077
in function DAQmxCfgDigPatternRefTrig
I tried to use the Digital Edge Reference trigger and it works fine. However the digital pattern trigger is giving that error.
I am doing all this by calling the nidaqmx c functions from python. I have attached the code for reference.
import numpy
import time
import ctypes
nidaq = ctypes.windll.nicaiu
from ctypes.wintypes import BOOLEAN
int32 = ctypes.c_long
uInt32 = ctypes.c_ulong
uInt64 = ctypes.c_ulonglong
float64 = ctypes.c_double
TaskHandle = uInt32
DAQmx_Val_Cfg_Default = int32(-1)
DAQmx_Val_Volts = 10348
DAQmx_Val_Rising = 10280
DAQmx_Val_FiniteSamps = 10178
DAQmx_Val_GroupByChannel = 0
DAQmx_Val_PatternMatches = 10254
DAQmx_Val_CurrReadPos = 10425
DAQmx_Val_DigPattern= 10398
DAQmx_Val_AnlgEdge = 10099
class MyList(list):
pass
# list where the data are stored
data = MyList()
totD = []
def CHK(err):
"""a simple error checking routine"""
if err < 0:
buf_size = 1000
buf = ctypes.create_string_buffer('\000' * buf_size)
nidaq.DAQmxGetErrorString(err,ctypes.byref(buf),buf_size)
raise RuntimeError('nidaq call failed with error %d: %s'%(err,repr(buf.value)))
taskHandle = TaskHandle(0)
max_num_samples = 1024
data = numpy.zeros((max_num_samples,),dtype=numpy.float64)
read=int32
CHK(nidaq.DAQmxCreateTask("hw1",ctypes.byref(taskHandle)))
CHK(nidaq.DAQmxCreateAIVoltageChan(taskHandle,"cDAQ9184-1B20914Mod1/ai0","",DAQmx_Val_Cfg_Default,float64(-5.0),float64(5.0),DAQmx_Val_Volts,None))
CHK(nidaq.DAQmxCfgInputBuffer(taskHandle, 10240))
CHK(nidaq.DAQmxCfgSampClkTiming(taskHandle,"",float64(1024.0),
DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,uInt64(max_num_samples)))
CHK(nidaq.DAQmxCfgDigEdgeStartTrig(taskHandle,"/cDAQ9184-1B20914Mod2/PFI0", DAQmx_Val_Rising))
CHK(nidaq.DAQmxSetRefTrigType(taskHandle, DAQmx_Val_AnlgEdge))
CHK(nidaq.DAQmxCfgDigPatternRefTrig(taskHandle,"/cDAQ9184-1B20914Mod2/PFI0:7", "11xxxxxx", DAQmx_Val_PatternMatches, 2))
CHK(nidaq.DAQmxSetReadRelativeTo(taskHandle, DAQmx_Val_CurrReadPos))
CHK(nidaq.DAQmxStartTask(taskHandle))
time.sleep(5)
flag=1
while flag:
print 'hi'
CHK(nidaq.DAQmxReadAnalogF64(taskHandle,-1, float64(-1), DAQmx_Val_GroupByChannel,
data.ctypes.data,
max_num_samples,ctypes.byref(read), None))
print"acquiring data"
totD.append(data)
time.sleep(1)
if taskHandle.value != 0:
# DAQmx Stop Code
CHK(nidaq.DAQmxStopTask(taskHandle))
CHK(nidaq.DAQmxClearTask(taskHandle))
print "final data"
nptotD=numpy.array(totD)
print nptotDIs the digital pattern refernece trigger not supported on nidaqmx?
Solved! Go to Solution.
08-10-2016 06:04 PM - edited 08-10-2016 06:05 PM
Not every device supports every trigger type available in the DAQmx API. Specifically, as the error indicates, the NI 9421 does not support digital pattern reference triggers. (Nor does any C Series module in CompactDAQ as far as I can see.)