问题标签 [nidaqmx]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 使用 nidaqmx 进行连续采集
我无法在 Python 3 上使用 nidaqxm 从 NI DAQ 获取连续数据。
我已经用类似的代码获取了有限的数据,尽管我不明白我需要改变什么来连续获取数据。
我必须在代码中进行哪些更改才能获取连续数据?
python - 为什么我的 NIDAQ register_signal_event 回调函数没有被调用?
我正在切换 NI-USB6525 上的输入并尝试使用 Python 脚本检测更改。
我能够写出这些行并在写入后成功读取它们,但我没有检测到这些变化。我放了一些打印来证明我可以将输入设置为 True 或 False,然后手动读取输入并获得正确的结果。我需要这个脚本来自动检测更改。
如果一行发生更改,代码应该打印“CHANGE LINE”,但事实并非如此。这是我在运行代码时切换开关时得到的结果:
因此,当我明确读取时,我得到了正确的值,但是没有像我预期的那样检测到更改......
macos - niDAQmx base的下载页面不再列出macos?
每个关于 niDAQmx 基于 macos x 的页面都引用了这个 URL
http://www.ni.com/download/ni-daqmx-base-15.0/5648/en/
它不再提供操作系统弹出窗口来选择 Mac 作为选项。mac 支持消失了,还是页面移动到了另一个 URL?
callback - 回调:DAQmxRegisterDoneEvent() 和 DAQmxEveryNSamplesEvent 之间的区别
试图弄清楚如何专门调用回调包装器。我们的代码处理 aslowTask
和 an onTask
。在 a 期间slowTask
,我处理以下两行(特定于这个问题):
我知道,每次缓冲区填满一个样本时,EveryNCallbackWrapper
都会调用它。
对于一个onTask
,我很难理解回调是如何被调用的。我查阅了 NI 文档,但不太明白。
这个更让我难以置信。我相信每当 onTask 被触发(使用硬件触发)时,DAQ 开始以 ON_RATE 样本/秒进行模拟测量并将其数字化,并且一旦将 100 个样本采集/读取到 DAQ 缓冲区中,DoneCallbackWrapper()
就会调用它。根据这个硬件触发器保持高电平的时间长短,每次 DAQ 读取 100 个样本时都会调用这个包装器(当触发器为高电平时)或者在读取 100 个样本后只调用一次回调?
c++ - CodeBlocks、C++、mingw-w64 编译器、Windows 10、错误:对“DAQmxCreateTask”的未定义引用等
我想知道是否有人可以帮助我。我正在使用 CodeBlocks WxWidgets 在 C++ 中编写一个 NI-DAQmx 应用程序。
我正在使用最新版本的 mingw-w64 编译器和 Windows 10。
编译时,我收到 DAQmx___ 语句的未定义引用错误:
`DAQmxCreateTask',
'DAQmxClearTask',
'DAQmxCreateAIVoltageChan',
和别的。
我在项目中包含了 NIDAQmx.h、NIDAQmx.lib 文件。我已经搜索了几天,并阅读了有关该问题的帖子,阅读了有关包装文件和 NIDAQmx.h 中的黑客攻击,但似乎找不到任何帮助。
代码片段:
任何意见,将不胜感激,
谢谢,
保罗
python-3.x - 使用 nidaqmx 触发符合行为任务的信号
我正在使用 python nidaqmx API 来指示 USB-6009 DAQ 在播放音调时输出模拟信号。我正在尝试使用 API 指南以及之前的 stackoverflow 问题(使用 NIDAQmx 触发输出任务),但仍然需要帮助。
使用基于 python 的行为任务包 Psychopy 设置音调的时间。
其一般格式为:
如果音调 = 开:
trigger_digital_output
我只是无法从 nidaqmx 文档中找出触发模拟输出的代码。此外,我是否需要指定数字输入(USB-6009 将通过 USB 连接到我的计算机)。
谢谢
python - nidaqmx:防止任务在功能更改后关闭
我正在尝试编写一个利用 NI-DAQmx 的 python 包装器的 API,并且需要有一个可以跨模块编辑的任务的全局列表。
这是我到目前为止所尝试的:
1) 创建了一个可导入的任务字典,每当调用 ni-daqmx 时都会更新该字典。函数端点处理来自 HTTPS 请求的数据,我保证它不仅仅是 ni-daqmx 库本身的无意义包装器。
例如,在启动时,会创建以下内容:
然后,用户可以通过调用此端点来创建任务
到这里为止的所有东西都可以正常工作。我可以得到任务列表,并且任务保持打开状态。我也尝试过显式调用task.control(nidaqmx.constants.TaskMode.TASK_RESERVE)
,但无论如何下面的代码都会给我同样的问题。
当我尝试向任务添加通道时,无论我如何设置状态,它都会在函数调用结束时关闭。
这显然是关闭任务。当我api_create_task_endpoint(task_id)
再次调用时,我收到DaqResourceWarning
任务已关闭且不再存在的消息。
我同样尝试使用此处设置 TaskMode task.control
,但无济于事。
我希望能够通过将任务存储在模块范围的TASKS
字典中来对其进行编辑,但不能将任务保持打开足够长的时间来执行此操作。
2) 我还尝试使用 NI-MAX 保存功能来实现这一点。这样做的问题是除非任务已经包含通道,否则无法保存任务,我不一定想在创建任务后立即执行此操作。
我试图通过添加一些默认行为来解决这个问题,该api_create_task_endpoint()
行为只是添加一个随机频道,该频道在用户添加的第一个频道上被删除。问题是,在没有 GUI 的情况下添加通道后,我找不到任何文档来从任务中删除通道(这是在 CENTOS 上运行的,所以 GUI 是非启动器)。
非常感谢您的帮助!
python - 使用 nidaqmx python 包从 National Instruments DAQ 连续模拟读取
受这个问题的答案的启发,我尝试了以下代码:
预期行为:它从一个通道连续读取。我什至还没有尝试让它做一些特定的事情(例如实时绘图),但我希望 python 控制台一直运行到停止它,因为目标是连续读取。
观察到的行为:快速运行此代码并返回控制台提示。
问题:在我看来,这根本不是连续阅读。此外,data
变量并没有像我希望的那样被附加(我知道检索一定数量的数据样本不需要使用 nidaqmx 进行如此复杂的代码;这只是我认为我可以尝试看看是否这样做的一种方法我想要什么,即连续读取并连续将缓冲的样本值附加到data
,这样我就可以查看获得的总数data
)。
任何帮助,将不胜感激。我基本上确定实现这一点的方法是利用这些作为 nidaqmx 一部分的回调,但不知何故我似乎没有很好地管理它们。注意我已经能够通过使用read_many_sample
.
详细信息:插入 NI 9205 模块的 NI cDAQ 9178,在运行 Windows Home 10、python 3.7 和适用于 python 的 nidaqmx 包的联想笔记本电脑上。
编辑:对于任何感兴趣的人,我现在通过以下方式进行这项工作,使用 matplotlib 进行实时视觉反馈,并且 - 还不是 100% 确定 - 即使一个目标是长时间采集(> 10 分钟),似乎也没有缓冲问题)。这是代码(未清理,抱歉):
当然,评论表示赞赏。这可能仍然不是最理想的。
python - 无法从另一个线程停止计时器(使用 nidaqmx-python 和回调的简短示例)
我在这个论坛上看到了有关该主题的其他问题,但没有一个可以帮助我理解如何处理这个问题。在我看来,它们中的大多数也是关于相当复杂和冗长的代码。我相信我正在做一些相当简单的事情/想做一些相当简单的事情。我希望有人能帮帮忙!下面是广泛的解释,然后是我当前的代码。
注意:请不要删除此问题。我对以下内容进行了很多思考,并仔细浏览了相关线程,但无济于事。我也认为发布这个是有道理的,因为它部分与一个更通用的问题有关:如何在后台运行回调的同时实时绘图(参见最后的摘要),可以总结为我的总体目标。
设置和目标: National Instruments 采集模块(这很重要) NI cDAQ9178,通过接口nidaqmx-python
,由 NI 维护的包,文档在此处。那里输入了一些模拟信号,目标是以一定的采样率(大约 1000 Hz)连续采集它(直到我决定停止采集),同时实时绘制信号。绘图不需要经常刷新(10Hz 刷新率甚至可以)。我在 conda 虚拟环境中使用带有 Python 3.7 的 Windows 10,并在 PyCharm 中完成编辑。理想情况下,事情应该在 PyCharm 和任何终端中都有效。
情况: nidaqmx-python
提供允许注册回调(根据自己的意愿定义)的高级函数,每次一定数量的样本(在我的情况下为 100,但这并不严格)填充 PC 缓冲区时都会调用这些回调。这个想法是,下面定义的回调在该点读取缓冲区,并做一些事情(在我的情况下,为了简洁起见,我已经取出了一些低通滤波,一些存储到全局变量data
中,也许还有绘图 - 见以下)。
问题:我一直在胡闹,将实时数据绘制在回调中,但是使用 matplotlib 这是一场噩梦,因为回调使用主线程以外的线程,并且 matplotlib 不喜欢从任何地方调用在主线程之外。我已经用谷歌搜索了其他为实时绘图而优化的库(而且,我在想,希望线程安全)但这并不容易:我无法让 vispy 工作,甚至无法安装 pyqtgraph,只是为了给你一些例子。然后我在网上看到了几篇关于使用 matplotlib 管理相当不错的实时动画的帖子,尽管它的开发考虑了发布而不是这些应用程序;所以我想让我们试一试。
我的看法:由于我无法让 matplotlib 从回调内部完成工作,因此我做了以下操作(这是您在下面看到的代码):在回调之后和任务开始之后task.start()
(特定于nidaqmx-python
),我只是创建绘制全局变量的while
循环buffer
。我认为这是一个不错的技巧:看,buffer
每 0.1 秒左右(没关系)由回调更新(调用它),另一方面,while
循环buffer
一遍又一遍地绘制变量,每次在绘制之前擦除,有效地产生一个实时的情节。
注意:我完全知道绘图部分不如它可以制作的那么好(我可能应该使用 matplotlib 的 ax API 和subplots
,更不用说动画了),但我现在不在乎。我稍后会处理它并对其进行改进以提高效率。
我想要什么:这实际上做了我想要的......除了,为了阻止它,我在循环周围引入了try:
andexcept:
语句while
,正如你在下面的代码中看到的那样。自然,按下CTRL+C
确实会破坏循环......但它也会破坏整个运行脚本并给我留下以下错误:forrtl: error (200): program aborting due to control-C event
在 PyCharm 中,以及从终端运行时的以下精度:
不便之处在于我别无选择,只能关闭 python shell(再次考虑 PyCharm),并且我无法访问我宝贵的变量data
,其中包含......好吧,我的数据。
Guess:显然,回调不喜欢以这种方式停止。该nidaqmx_python
任务应该用 停止task.stop()
。我尝试task.stop()
在 KeyboardInterrupt 之后立即放置except:
,但这无济于事,因为CTRL+C
将脚本停止在顶部 / 而不是中断 while 循环。我相信需要一些更复杂的方法来停止我的任务。这几天我一直在考虑这个问题,但想不出一种同时拥有这两种东西的方法:我可以停止一项任务,同时进行实时绘图。请注意,如果没有绘图,很容易在ENTER
按键时停止任务:只需在最后写
但当然,简单地执行上述操作并不允许我包含实时绘图部分。
摘要:我无法从连续读取数据的回调中调用 matplotlib,因此我while
在单独的块中编写了一个用于实时绘图的循环,但随后我发现没有办法停止该while
循环而不会出现上述错误(它抱怨我认为回调是从另一个线程停止的)。
我希望我很清楚,如果没有,请询问!
代码:我已经清理它以使其尽可能接近显示问题的 MWE,尽管我当然知道你们中的大多数人没有 NI daq 可以玩和连接以便能够运行这个。无论如何......这里是:
任何输入将不胜感激。提前谢谢各位!
编辑:在下面接受的答案之后,我重写了上面的代码并提出了以下内容,现在可以按预期工作(对不起,这次我没有清理它,有些行与当前问题无关):
task.stop()
请注意,我毕竟不需要 a ,因为连续获取任务与此包一起工作的方式是读取任何task.start()
不是 asleep
或类似内容的代码行会使任务停止(至少这是我的理解)。
python - 使用 nidaqmx-python 将模拟电压连续输出到 NI DAQ 模块
这是关于使用由 National Instruments 维护的 nidaqmx-python 包,用于连接其采集模块。
规格:插入 NI 9264 输出卡的 NI cDAQ-9178。在运行 Windows 10 的机器上的 Python 3.7 的 conda 虚拟环境中打包 nidaqmx-python。
总体目标:连续读取输入电压,并在使用 IIR 滤波器对其进行实时低通滤波后,输出一些 PID 计算的模拟电压以连续驱动某些机器(与哪一个无关)。
现在的具体目标:了解如何充分利用 nidaqmx-python 高级函数和回调,以高效的方式通过我的 cDAQ 持续输出电压,同时正确管理 PC 缓冲区,并了解如何有时候是这样的。
知识:我在 python 中还可以,但我只玩了几个星期的 nidaqmx-python 包。我已经成功地使用了内置的回调机制,它允许以某种采样率连续读取模拟信号,并认为编写部分会很简单。似乎不是,我正在努力解决它,虽然我已经阅读了包的(不是很友好?)文档,here。
问题:使用下面的代码,这似乎是尝试了解这些功能的一种很好且简单的方法,我只是尝试增加数组中的值data
,表示要输出的电压,然后使用函数register_every_n_samples_transferred_from_buffer_event
(在此处my_callback
记录)每次设备从 PC 缓冲区读取 10 个样本时,我都会调用回调。该回调做了一些简单的事情:它用于write_many_sample
编写data
到 PC 缓冲区。我想用这个简单的例子来检查,使用这些参数,我是否可以在 5 秒内从 0 到 5V(看到我每 10 毫秒增加 0.01 伏,因为速率是 1000 赫兹并且每 10 次调用一次回调传输的样本,即 100 Hz)。这失败了,我在大约 25 秒内从 0 伏到 5 伏(用万用表检查)。
代码:
笔记:
- 时间似乎取决于 bufsize:将其加倍到 20 会导致在大约 50 秒而不是 25 秒内达到 5 伏。
- 除非我使缓冲区非常大,否则每次回调调用都会收到警告:
- 请注意 counter 变量
counter
以提供一定的灵活性(当前counter_limit
设置为1
以便每次运行时输出数据都会增加)。
底线:我对此有点迷茫。理想情况下,我想了解如何实现,例如在 5 秒内从 0 V 变为 5 V。但这只是一个例子。我想了解不同变量的作用bufsize
,rate_callback
以及rate_outcfg
执行时间的设置。最终,我想达到我的基本理解使我能够以高效且无警告的方式编写如此简单的任务(输出不断增加的电压 - 或其他一些函数,如正弦波)。
非常感谢任何贡献的人!