使用python和nidaqmx延迟或溢出数据采集

2024-04-29 22:17:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法按我希望的方式运行代码。该代码应该从传感器获取数据,并将其存储在带有时间戳的文件中。使用其中一个传感器值控制直线电机。我将NI cDAQ 9184和Python与nidaqmx包一起使用。出现的第一个问题是数据传输延迟。因此,发动机的控制过程非常缓慢。我创建了一个nidaqmx.task,并在一个循环中通过task.read()请求当前传感器值。此方法有几秒钟的延迟。在我看来,cDAQ和task.read()方法一直在记录数据,缓存数据,并在请求时弹出缓存的数据(如在队列中)。但是,我只希望在请求时看到一个值,而不希望存储任何数据,因为它将保存到csv文件中。如果每次调用task方法时都重新创建任务,则会得到适当的非延迟值。然而,创建一个新任务需要大约20毫秒的时间,在我看来,这并不是我的请求的预期解决方案。当然,这也会减慢数据记录的速度,我希望避免这种情况

请参阅以下两段代码片段,它们描述了我为数据采集编写的过程:

def DAQ_Monitoring(c,condition,ExChange,sample_rate):        

with nidaqmx.Task() as task:
    task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai0")
    task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai1")
    task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai2")
    task.timing.cfg_samp_clk_timing(1000)
    
    sample_RateSeconds = (sample_rate)*(10**(-3))    #convert sampleRate from [ms] to [s]
    startTime = datetime.now().timestamp()
    oldTime = 0
    while condition.value == 3:
        while ((datetime.now().timestamp()-startTime)-oldTime) < sample_RateSeconds:
            pass
        timeData = datetime.now().timestamp()-startTime
        oldTime = timeData
        pressureIn,pressureVessel,volumeFlow = task.read()
        position, force = pullData(c)
        accousticEmission1 = 999
        vibration = 999
        pressureIn = (1000000/16)*(pressureIn-0.004)
        pressureVessel = (200000/16)*(pressureVessel-0.004)
        volumeFlow = 3250*volumeFlow            
        ExChange[:] = [timeData,pressureIn,pressureVessel,volumeFlow,accousticEmission1,vibration,position,force]
    

def DAQ_Monitoring(c,condition,ExChange,sample_rate):        
    
sample_RateSeconds = (sample_rate)*(10**(-3))    #convert sampleRate from [ms] to [s] 
startTime = datetime.now().timestamp()
oldTime = 0
while condition.value == 3:
    while ((datetime.now().timestamp()-startTime)-oldTime) < sample_RateSeconds:
        pass
    timeData = datetime.now().timestamp()-startTime
    oldTime = timeData
    with nidaqmx.Task() as task:
        task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai0")
        task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai1")
        task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai2")
        task.timing.cfg_samp_clk_timing(1000)
        pressureIn,pressureVessel,volumeFlow = task.read()
    position, force = pullData(c)
    accousticEmission1 = 999
    vibration = 999
    pressureIn = (1000000/16)*(pressureIn-0.004)
    pressureVessel = (200000/16)*(pressureVessel-0.004)
    volumeFlow = 3250*volumeFlow            
    ExChange[:] = [timeData,pressureIn,pressureVessel,volumeFlow,accousticEmission1,vibration,position,force]

我读过很多论坛帖子,并试图挖掘nidaqmx的文档。我遇到了流方法。我对此发现很少,但我也尝试实现这个方法。传感器值正确无延迟地传输。但在这里,缓冲区会溢出,根据采样率,迟早会弹出以下错误:

(基本)PS C:\Users\Jetting\Desktop\Robert\SCT\U试用不同类型>;python SCT_18.02.2021_v1.0_stream.py SCT_18.02.2021_v1.0_stream.py:290:UserWarning:试图设置相同的bottom==top==0.0会导致奇异转换;自动扩展。 ax.set_ylim(np.amin(dataPlot),np.amax(dataPlot)) SCT_18.02.2021_v1.0_stream.py:291:UserWarning:试图设置相同的left==right==0.0会导致奇异变换;自动扩展。 ax.set_xlim(np.amin(时间图),np.amax(时间图)) SCT_18.02.2021_v1.0_stream.py:290:UserWarning:试图设置相同的bottom==top==0.1696257065000006会导致奇异转换;自动扩展。 ax.set_ylim(np.amin(dataPlot),np.amax(dataPlot)) SCT_18.02.2021_v1.0_stream.py:291:UserWarning:试图设置相同的left==right==1.4031758308410645会导致奇异变换;自动扩展。 ax.set_xlim(np.amin(时间图),np.amax(时间图)) 过程-1: 回溯(最近一次呼叫最后一次): 文件“C:\Users\Jetting\anaconda3\lib\multiprocessing\process.py”,第315行,在_bootstrap中 self.run() 文件“C:\Users\Jetting\anaconda3\lib\multiprocessing\process.py”,第108行,正在运行 自我目标(*自我参数,**自我参数) 文件“C:\Users\Jetting\Desktop\Robert\SCT\u TryOut\u differentitacqtypes\SCT\u 18.02.2021\u v1.0\u stream.py”,第105行,在DAQ\u监控中 读卡器。读取一个样本(读取值) 文件“C:\Users\Jetting\anaconda3\lib\site packages\nidaqmx\stream\u readers.py”,第370行,在read\u one\u示例中 _读取模拟信号64(自身句柄,数据,1,超时) 文件“C:\Users\Jetting\anaconda3\lib\site packages\nidaqmx\u task\u modules\read\u functions.py”,第35行,在模拟64中 检查是否存在错误(错误代码) 文件“C:\Users\Jetting\anaconda3\lib\site packages\nidaqmx\errors.py”,第127行,用于检查错误 raise DaqError(错误缓冲区值解码(“utf-8”),错误代码) nidaqmx.errors.DaqError:应用程序无法跟上硬件采集。 增加缓冲区大小、更频繁地读取数据或指定要读取的固定数量的样本(而不是读取所有可用样本)可能会解决此问题。 属性:DAQmx_Read_RelativeTo 对应值:DAQmx\u Val\u CurrReadPos 属性:DAQmx_读取_偏移量 对应值:0

任务名称:_unnamedTask<;0>

状态代码:-200279

在这里,在我看来,流不断地将数据存储到内存中,这导致了溢出(错误-200279:无法跟上DAQmx中的采集-国家仪器)。但我不知道如何覆盖数据,而不是将其附加到内存中。老实说,我不得不承认,我没有完全理解task.read()和stream方法是如何完成它们的工作的

以下是拖缆的代码:

def DAQ_Monitoring(c,condition,ExChange,sample_rate):        
with nidaqmx.Task() as task:
    task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai0")
    task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai1")
    task.ai_channels.add_ai_current_chan("cDAQ9184-1B901BFMod1/ai2")
    task.timing.cfg_samp_clk_timing(rate=1000,sample_mode=nidaqmx.constants.AcquisitionType.CONTINUOUS,samps_per_chan=2)
    reader = AnalogMultiChannelReader(task.in_stream)
    task.start()
    values_read = np.zeros((3,), dtype=np.float)
    sample_RateSeconds = (sample_rate)*(10**(-3))    #convert sampleRate from [ms] to [s]
    startTime = datetime.now().timestamp()
    oldTime = 0
    while condition.value == 3:
        while ((datetime.now().timestamp()-startTime)-oldTime) < sample_RateSeconds:
            pass
        timeData = datetime.now().timestamp()-startTime
        oldTime = timeData
        reader.read_one_sample(values_read)
        pressureIn,pressureVessel,volumeFlow = values_read
        position, force = pullData(c)
        accousticEmission1 = 999
        vibration = 999
        pressureIn = (1000000/16)*(pressureIn-0.004)
        pressureVessel = (200000/16)*(pressureVessel-0.004)
        volumeFlow = 3250*volumeFlow            
        ExChange[:] = [timeData,pressureIn,pressureVessel,volumeFlow,accousticEmission1,vibration,position,force]
    

感谢您对我的代码的任何建议、帮助和改进。如果有任何信息丢失,我很抱歉(这是我的第一篇帖子),以防万一,请询问

谢谢


Tags: samplepyaddtaskreadnpcurrentai
1条回答
网友
1楼 · 发布于 2024-04-29 22:17:34

我自己找到了解决办法。我只需要在task.read()方法中添加一个参数。参数“每个通道的样本数=nidaqmx.constants.READ\u ALL\u AVAILABLE”确保立即读取保存到intern缓冲区的所有数据,因此数据总是“新鲜”的

相关问题 更多 >