我无法按我希望的方式运行代码。该代码应该从传感器获取数据,并将其存储在带有时间戳的文件中。使用其中一个传感器值控制直线电机。我将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]
感谢您对我的代码的任何建议、帮助和改进。如果有任何信息丢失,我很抱歉(这是我的第一篇帖子),以防万一,请询问
谢谢
我自己找到了解决办法。我只需要在task.read()方法中添加一个参数。参数“每个通道的样本数=nidaqmx.constants.READ\u ALL\u AVAILABLE”确保立即读取保存到intern缓冲区的所有数据,因此数据总是“新鲜”的
相关问题 更多 >
编程相关推荐