NI-DAQmx

通过本计算机上安装的 NI-DAQmx,每次读取一个样本地读取 National Instruments 数据采集硬件(cDAQ 机箱及其模块、USB 和 PCI Express 设备,以及 NI MAX 的仿真设备):“NI-DAQmx 设备”卡片、点位的物理通道和测量、读取与写入、设备发现,以及一个 cDAQ 机箱的完整示例。

以 Markdown 查看

NI-DAQmx 驱动读写 National Instruments 的数据采集硬件:cDAQ 机箱及其 C 系列模块、USB-6001 或 USB-6211 这样的 USB 设备,以及 PCI Express 设备,经由 National Instruments 为自家硬件免费提供的驱动 NI-DAQmx。这正是 LabVIEW 程序用 DAQmx 函数读取的那些硬件,只是在面板上设置,而不是在程序框图里连线:每个点位是一个物理通道,名字和 NI MAX 里的一样(ai0、port0/line3、ao0、ctr0),再加上这个通道测量或驱动的量;数值也像其他所有点位的数值一样,进入 Logic、仪表板,以及 Process 测试台的运行记录。

本驱动每次读取一个样本:和其他所有驱动一样,在每个点位的轮询间隔到来时取通道的一个值。它适合慢信号(温度、压力、液位、状态、计数),而不是硬件按自己的时钟进行的连续采集;见值得了解的限制。

本驱动的一台设备就是 NI MAX 里的一台设备,按 NI MAX 给它起的名字找到,不管它接在哪里:USB 上、PCI Express 插槽里,或者通过 USB 或以太网连接的 cDAQ 机箱里。NI MAX 能为大多数 NI 硬件免费创建的仿真设备,读起来和真实设备一样,因此可以在硬件到货之前就搭好配置并试运行。仿真设备也可以通过 NI 的配置 API 创建,能访问本计算机的 AI 助手在征得你的同意后即可使用它。设备挂在驱动下面,可以归入文件夹,和任何没有串行线路或 Broker 的驱动一样,即驱动 → 文件夹 → 设备 → 点位。

本计算机上的 NI-DAQmx

本产品不包含 NI-DAQmx,也不安装它的任何文件。驱动通过本计算机上安装的 NI-DAQmx 读取硬件,也就是 NI MAX 和 LabVIEW 使用的那一个。工作站会自己检查它在不在:驱动页面、它的某台设备的页面或智能体第一次询问时检查一次,缺少期间每 30 秒再检查一次。Connector 启动之前,无法知道 NI-DAQmx 是否存在,因此对此不作任何说明。缺少期间:

位置 会发生什么
驱动页面 一条注意提示“本计算机未安装 NI-DAQmx”,附下面的步骤。其中的链接会在计算机的浏览器里打开 NI 的页面。
每台设备的页面 同一条提示。
设备 可以添加和配置,点位也一样;它们保持离线,每台设备的最后一条错误用英文给出同样的步骤,与驱动自身的原因写法一致。
发现设备 什么都不列出,并说明未安装 NI-DAQmx,下载位置和安装步骤见驱动页面上的提示。
智能体 driver_capabilities 在 prerequisite 下给出这些步骤,installed 为 false。

安装步骤:

  1. 打开 NI 的页面 NI-DAQ™mx Download。下载前它会要求用 NI 账户登录。
  2. 在页面的 Version 列表里,选择 readme(View Readme)列出本计算机的 Windows、并在 Device Support 下列出您的设备的最新版本。NI-DAQmx 只能在 64 位 Windows 上运行。
  3. 以管理员身份运行安装程序:它通过 NI Package Manager 安装 NI-DAQmx。安装程序要求时,请重启计算机。

最新的 NI-DAQmx 已不再支持部分旧设备:如果其 readme 没有列出您的设备,请在 Version 列表里选择 readme 列出该设备的较早版本。

安装后 30 秒内,提示会消失,本驱动的设备按现有配置连接,无需重启 Ganter Lab。NI MAX(NI Measurement & Automation Explorer)会显示每台设备的名称,也就是要填进“NI-DAQmx 设备”卡片的名称。

驱动页面

页面上有和任何驱动一样的设备表(见设备表),用标题右侧的添加设备来增加;为空时显示“还没有设备。”驱动的工具栏上有发现设备,页面上没有“扫描范围”卡片,因为扫描只询问 NI-DAQmx,不问别处。

设备

“NI-DAQmx 设备”卡片

本驱动的设备没有“连接”卡片:NI-DAQmx 按名称找到设备,所以没有主机、端口或路由可填。取而代之的是 NI-DAQmx 设备卡片,说明它读取 NI MAX 里的哪一台设备。

字段 含义 默认值
设备名称 “NI MAX 为设备起的名称,例如 Dev1,cDAQ 机箱中的模块则如 cDAQ1Mod1。在 NI MAX 中重命名的设备,把新名称填写到这里后即可重新读取。” 空
产品 只读:“NI-DAQmx 报告的设备型号,例如 NI 9211,每次工作站连接到它时读取。”设备连接之前显示“尚未读取”,不再连接时又会这样显示。它的内容不会保存。

cDAQ 机箱本身就是 NI MAX 里的一台设备(cDAQ1),它的每个模块也各是一台(cDAQ1Mod1、cDAQ1Mod2)。模块的通道在模块的设备上读取;机箱的计数器(_ctr0 到 _ctr3)在机箱的设备上读取。“设备”卡片上的轮询间隔(ms)和任何驱动一样起作用,每个点位都可以覆盖它。

新设备还没有名称,在有名称之前工作站不会尝试连接它:它的行显示“尚未填写 NI-DAQmx 设备”,它的点位读作空档,它的页面上有这条通知:“在这台设备填写 NI-DAQmx 设备名称之前,工作站不会尝试连接它,因此暂时不从它读取任何数据,也没有错误可显示。在下面的‘NI-DAQmx 设备’卡片里填写 NI MAX 为设备起的名称,工作站就会连接它。”在没有 NI-DAQmx 的计算机上,这里显示的是 NI-DAQmx 未安装的通知。

NI-DAQmx 永远读不了的名称会在框下面被拒绝:“设备名称中不能有‘/’‘,’或‘:’。请按 NI MAX 显示的样子填写名称,例如 Dev1 或 cDAQ1Mod1。”斜杠用来分隔设备和它的通道,所以 Dev1/ai0 是点位的通道,而不是设备。NI MAX 是否认识这个名称,由 NI-DAQmx 自己在工作站连接时回答:NI MAX 不认识的设备保持离线,最近错误就是 NI-DAQmx 的原话。

标题栏显示的基础 URI 就是驱动的协议名后面跟上设备名称:nidaqmx://cDAQ1Mod1。本驱动的两台设备可以读取 NI MAX 里的同一台设备,例如用两个不同的轮询间隔读取同一个模块;名称不必唯一。

点位寻址

物理通道

本驱动的点位读取或驱动其设备的一个通道。点位的“信号源”卡片上有物理通道框,框下的提示随测量而变:“模拟输入通道,例如 ai0 或 cDAQ1Mod1/ai0”、“数字线,例如 port0/line3 或 Dev1/port0/line3”、“模拟输出通道,例如 ao0 或 Dev1/ao0”或“计数器,例如 ctr0,在 cDAQ 机箱上为 _ctr0”。

通道按相对于设备的名称保存(ai0),因此在 NI MAX 里重命名设备只改一个字段,也就是设备的那个。按 NI MAX 的写法整个写出的通道(cDAQ1Mod1/ai0),指向点位自己的设备时按相对名称保存,指向别的设备时被拒绝:“此通道属于设备 Dev1,而不是 cDAQ1Mod1。请填写本设备的通道,或只填写通道,例如 ai0。”

测量

通道下面的测量说明这个通道测量或驱动什么。测量决定点位按什么数据类型读取、允许什么访问方式、单位是什么,以及下面画出哪些字段。

测量 通道 数据类型 访问 单位
电压输入 模拟输入,ai0 Double 或 Float 只读 伏特
电流输入 模拟输入,ai0 Double 或 Float 只读 毫安
热电偶 模拟输入,ai0 Double 或 Float 只读 摄氏度
数字输入线 数字线,port0/line3 Boolean 只读
数字输出线 数字线,port0/line3 Boolean 读写(默认)、只写或只读
电压输出 模拟输出,ao0 Double 或 Float 只写 伏特
边沿计数 计数器,ctr0(cDAQ 机箱上为 _ctr0) Int64 或 Double 只读 计数

新点位是电压输入,按 Double 读取。填入当前测量不读取的那类通道时,会换成这个通道最自然的测量:模拟输入换成电压输入,数字线换成数字输入线,模拟输出换成电压输出,计数器换成边沿计数。选择另一种测量会带来那种测量的量程,它不允许的数据类型或访问方式会换成它采用的那一种,因此“数据类型”和“访问”列表只提供测量允许的选项。电流按毫安读取(NI-DAQmx 读的是安培,驱动乘以 1000),所以 4-20 mA 回路怎么说就怎么写。

每种测量都在其选择框下面说明自己做什么:

测量 下面的那一行
电压输入 “每次读取一个以伏特为单位的样本。”
电流输入 “每次读取一个以毫安为单位的样本。”
热电偶 “每次读取一个以摄氏度为单位的样本,并补偿冷端。”
数字输入线 “将该线读为 true(高)或 false(低)。”
数字输出线 “按写入的值驱动该线,并回读它保持的状态。”
电压输出 “按写入的电压驱动输出。NI-DAQmx 不回读模拟输出,因此该点位只写。”
边沿计数 “从工作站连接到设备的那一刻起计数边沿,每次读取时读出计数。重新连接后从初始计数重新开始。”

测量的字段

测量不读取的字段不会画出来,也不随点位保存。

字段 测量 含义 默认值
量程 (V)、量程 (mA) 或 量程 (°C) 电压输入、电流输入、热电偶、电压输出 两个框,最小值和最大值,以测量的单位表示。在输入上:“NI-DAQmx 会选择能容纳此量程的设备输入量程,因此量程越窄,小信号读得越精细。”在电压输出上:“输出只接受此量程内的值;超出量程的写入在到达设备之前就会被拒绝。” -10 到 10 V;0 到 20 mA;0 到 100 °C
端子配置 电压输入、电流输入 通道默认、差分、参考单端 (RSE)、非参考单端 (NRSE) 或 伪差分:“输入的接线方式:差分输入测量通道两个端子之间的电压,单端输入相对公共参考点测量。通道默认是 NI-DAQmx 为此通道选择的配置。” 通道默认
分流电阻 电流输入 通道默认、内部 或 外部:“电流为被测量而流经的电阻:设备内置的电阻,或接在输入端的外部电阻,外部电阻的阻值填写在这里。” 通道默认
分流电阻阻值 (Ω) 电流输入,分流电阻为外部时 外部电阻的阻值,单位欧姆。 249
热电偶类型 热电偶 J 型、K 型、N 型、R 型、S 型、T 型、B 型 或 E 型。 K 型
冷端补偿 (CJC) 热电偶 内置传感器 或 固定温度:“热电偶冷端的温度:由设备或其接线盒内置的传感器测量;若冷端保持在已知温度,则在这里填写该固定温度。” 内置传感器
CJC 温度 (°C) 热电偶,选固定温度时 冷端的温度,单位摄氏度。 25
计数边沿 边沿计数 上升沿 或 下降沿。 上升沿
计数方向 边沿计数 递增计数 或 递减计数。 递增计数
初始计数 边沿计数 每次设备连接时计数器开始的数值,0 到 4294967295。 0
输入端子 边沿计数 “对其脉冲计数的端子,例如 /Dev1/PFI8。留空时,计数器在其自身默认的输入端子上计数。”留空时框里显示“计数器默认”。不带设备写的端子(PFI8)按点位自己的设备读取。cDAQ 机箱的计数器(_ctr0)没有自己的输入端子,框里不显示默认值,说明为“对其脉冲计数的端子,例如 /cDAQ1Mod2/PFI0。cDAQ 机箱的计数器没有自己的输入端子,因此此项为必填。” 空

字段无法工作的点位不会保存,点位页面会说明缺什么:

你输入 点位页面显示
没有通道 “请填写物理通道,例如 ai0 或 Dev1/ai0。”
与测量所读类型不符的通道,例如热电偶下的 ao0 “此测量读取模拟输入通道,例如 ai0。”、“电压输出驱动模拟输出通道,例如 ao0。”、“数字线按端口和线号书写,例如 port0/line3。”或“边沿计数读取计数器,例如 ctr0。”
不小于最大值的最小值 “最小值必须小于最大值。”
没有大于零阻值的外部分流电阻 “外部分流电阻需要大于零的阻值(欧姆)。”
等于或低于绝对零度的冷端固定温度 “CJC 温度必须是高于绝对零度的摄氏温度。”
超出 32 位计数器容量的初始计数 “初始计数是 0 到 4294967295 之间的整数。”
含有空格或逗号的输入端子 “请按 NI-DAQmx 的命名填写输入端子,例如 /Dev1/PFI8,不要有空格或逗号。”
没有输入端子的 cDAQ 机箱计数器(_ctr0)上的边沿计数 “cDAQ 机箱的计数器没有自己的输入端子:请填写脉冲到达的端子,例如 /cDAQ1Mod2/PFI0。”
测量不允许的数据类型或访问方式 “此测量按 Double, Float 读取。”,访问方式则是列出测量所允许访问方式的那句话

保存时遵守和面板相同的规则,拒绝时操作记录条会这样说:“设备‘Module voltages’指向驱动无法读取的 NI-DAQmx 设备。请打开它,改正面板标出的设备名称。”或“点位‘Pressure’有一项 NI-DAQmx 驱动无法使用的设置。请打开它,改正点位面板标出的字段。”

只读的源地址(总线)一行显示驱动收到的内容:按 NI-DAQmx 命名的通道,以及测量的每一项设置,例如 cDAQ1Mod1/ai0?measurement=voltageInput&terminal=diff&min=0&max=10、cDAQ1Mod2/ai0?measurement=thermocouple&type=K&cjc=builtIn&min=0&max=400、Dev1/port0/line3?measurement=digitalOutput 或 cDAQ1/_ctr0?measurement=edgeCount&edge=rising&direction=up&initial=0&input=%2FcDAQ1Mod3%2FPFI0。

读取

驱动在工作站连接到设备时创建该设备的 NI-DAQmx 任务,一直保留到断开连接。一次读取做什么,以及 NI-DAQmx 怎么回答,决定点位显示什么(见数值转换链):

点位 怎么读取
模拟输入(电压、电流、热电偶) 一台设备的所有模拟输入共用一个任务,每次读取时启动它,每个通道取一个样本,然后停止。一台设备只有一个模拟定时引擎,一个 cDAQ 机箱的所有模块总共只有三个,所以一直启动着的任务会让别的模块读不了。读取时如果发现引擎被别的任务(NI MAX、LabVIEW)占用,会再问两次,间隔 25 ms。一个样本供设备的所有模拟点位使用,有效期是它们之中最短轮询间隔的一半,因此转换较慢的热电偶模块每一轮只转换一次。
NI-DAQmx 拒绝的通道 每个模拟通道都先单独试一次:NI-DAQmx 拒绝的通道(模块没有的量程、在不读热电偶的通道上设热电偶)只让它自己的点位失败,不连累设备的所有模拟点位。
数字线、电压输出、计数器 每个点位一个任务,在设备连接时启动。计数器从那时开始计数,设备重新连接时从初始计数重新开始。
NI-DAQmx 的回答 读取怎么处理
一个值,或一条警告 这个值,以测量的单位表示,在点位自己的环节转换它之前。
设备被移除、无法访问或被复位 连接丢失:设备重新连接,任务重新创建。
10 秒内没有回答 无应答:设备重新连接,显示什么由点位对设备没有回答的策略决定。
其他任何错误 该点位读取失败,附上 NI-DAQmx 自己的文字和错误代码;设备继续读取它的其他点位。

缩放由点位自己的转换链负责:驱动交出伏特、毫安或摄氏度,量程换算和校准环节再把它们变成工程值(0 到 10 V 变成 0 到 16 bar)。NI MAX 的自定义缩放既不创建也不读取。

写入

可写的是数字输出线和电压输出;其他测量都是只读。写入和任何其他驱动走同一条通道:写入框接收工程值,在发送原始值之前把转换环节反过来走一遍(见 Connector)。

测量 写入做什么
数字输出线 写 true 把该线拉高,写 false 拉低。只要点位不是只写,就回读该线保持的状态。
电压输出 按写入的电压驱动输出。超出点位量程的值在任何东西到达设备之前就被拒绝。NI-DAQmx 不回读模拟输出,因此点位是只写,不显示自己的值。

NI-DAQmx 拒绝的值会以“现场设备拒绝了写入:<原因>。”返回,原因是 NI-DAQmx 的错误号(NI-DAQmx -200561),在任何语言里读起来都一样,NI-DAQmx 自己的说法则留在诊断日志里;10 秒内没有回答则显示“写入未得到确认:现场设备没有及时应答。”写入会等待同一台设备上正在进行的读取结束。

设备发现

驱动工具栏上的发现设备向 NI-DAQmx 询问 NI MAX 认识的每一台设备,包括仿真设备,不向硬件发送任何东西。它不接受地址。运行期间,进度行会写出正在读取的设备:“正在从 NI-DAQmx 读取 cDAQ1Mod1…”。没有 NI-DAQmx 时,它什么都不列出,并显示“本计算机未安装 NI-DAQmx,因此无法列出任何设备。下载位置和安装步骤见此驱动面板上的提示。”

每台设备成为一个候选项,以它的名称和产品命名(cDAQ1Mod1 (NI 9205)),它的通道作为候选点位,各自取其测量的默认值:

通道 提供为
模拟输入 在热电偶模块上(只读毫伏、并报告能读热电偶的设备,例如 NI 9211)提供为热电偶,K 型、内置传感器、0 到 100 °C。否则能读电压的通道提供为电压输入,量程为 -10 到 10 V,设备自身的量程更窄时取设备的量程;NI-DAQmx 报告该通道不读电压时,提供为电流输入或热电偶。既能读真实电压又能读热电偶的通用模块提供为电压输入:添加之后在点位上选择测量。
数字线 数字输入线;只能驱动的线提供为数字输出线。
模拟输出 电压输出,只写。
计数器 边沿计数。NI-DAQmx 不列出 cDAQ 机箱的计数器,因此机箱提供时不带点位:请手动在 _ctr0 上添加点位,并填写脉冲到达的输入端子,因为机箱的计数器没有自己的输入端子。

本驱动已有设备在读取其名称的候选项会被标为已经配置过,并提供“打开”而不是“添加”。扫描的其余行为见设备发现。

已经有的设备可以在自己的页面上重新读它的通道:“点位”卡片标题栏里的发现点位只向 NI-DAQmx 询问这一台设备,只列出它还没有点位的通道,采用各自测量的默认设置(见发现一台设备的点位)。

示例:cDAQ 机箱

NI MAX 命名为 cDAQ1 的 cDAQ-9178 机箱,1 号插槽里是 NI 9205 电压模块,第一个通道以差分方式接着一台 0-10 V 压力变送器;2 号插槽里是 NI 9211 热电偶模块,接着炉子里的一支 K 型热电偶。两者都读取:

  1. 在驱动页面上点添加设备;命名为 Module voltages,在设备名称里填写 cDAQ1Mod1。连接后,产品显示 NI 9205。
  2. 点添加点位;命名为 Pressure,物理通道填 ai0,保留电压输入,把量程设为 0 和 10,把端子配置设为差分。在“转换”卡片上,以系数 1.6 打开量程换算环节,并把点位的单位设为 bar:0 到 10 V 读作 0 到 16 bar。
  3. 再点一次添加设备;命名为 Oven thermocouples,设备名称填 cDAQ1Mod2。
  4. 点添加点位 Zone1,物理通道填 ai0,测量选热电偶,保留 K 型和内置传感器,把量程设为 0 和 400。
  5. 要在机箱上计数脉冲,由设备名称为 cDAQ1 的设备承担计数器:_ctr0 上的点位是一个边沿计数,输入端子填脉冲到达的端子,例如 /cDAQ1Mod3/PFI0。

Pressure 点位的总线地址是 cDAQ1Mod1/ai0?measurement=voltageInput&terminal=diff&min=0&max=10。代理用工具做同样的事;热电偶要写明测量,因为单写 ai0 会按电压输入读取:

device_upsert name="Module voltages" driver="NiDaqmx" daqmxDevice="cDAQ1Mod1"
tag_upsert device="Module voltages" name="Pressure" address="ai0" daqmxMinimum=0 daqmxMaximum=10 daqmxTerminal="Differential"
device_upsert name="Oven thermocouples" driver="NiDaqmx" daqmxDevice="cDAQ1Mod2"
tag_upsert device="Oven thermocouples" name="Zone1" address="ai0" daqmxMeasurement="Thermocouple" daqmxThermocouple="K" daqmxMaximum=400
device_upsert name="Chassis counters" driver="NiDaqmx" daqmxDevice="cDAQ1"
tag_upsert device="Chassis counters" name="Pulses" address="_ctr0" daqmxCounterTerminal="/cDAQ1Mod3/PFI0"

智能体工具

driver_capabilities 在 niDaqmx 下描述本驱动:设备名称,以及每种测量的示例通道、单位、字段、允许的数据类型和访问方式,每个字段的可选值,读取和写入的行为,以及设备发现提供什么。device_upsert driver=NiDaqmx 接受 daqmxDevice,即 NI MAX 为设备起的名称('' 清空它,设备随即等待名称)。tag_upsert 接受作为 address 的通道,以及其测量的字段:daqmxMeasurement(VoltageInput、CurrentInput、Thermocouple、DigitalInput、DigitalOutput、VoltageOutput 或 EdgeCount;省略时由通道带来自己的测量)、daqmxMinimum 和 daqmxMaximum、daqmxTerminal(Default、Differential、ReferencedSingleEnded、NonReferencedSingleEnded 或 PseudoDifferential)、daqmxShunt(Default、Internal 或 External)和 daqmxShuntOhms、daqmxThermocouple(J、K、N、R、S、T、B 或 E)、daqmxCjcSource(BuiltIn 或 ConstantValue)和 daqmxCjcTemperature、daqmxEdge(Rising 或 Falling)、daqmxCountDirection(Up 或 Down)、daqmxInitialCount 和 daqmxCounterTerminal。测量不读取的字段会被拒绝,因此调用里只写适用的字段。工具返回的设备和点位带有 niDaqmx:设备名称、连接后的产品,以及 NI-DAQmx 是否已安装。device_discover driver=NiDaqmx 列出 NI MAX 认识的每一台设备,并把它的通道作为候选点位。其他工具见智能体工具。

值得了解的限制

  • 不做连续采集。硬件能按自己的时钟每秒向缓冲区采集数千个点;本驱动每次读取一个样本,因此适合慢信号,读不了波形或振动。
  • 本产品不包含 NI-DAQmx:本计算机上没有它时,设备保持离线,驱动页面会说明如何安装(本计算机上的 NI-DAQmx)。安装后工作站无需重启就会用上它。
  • 热电偶的冷端温度来自模块的内置传感器或固定温度;不提供从另一个通道读取冷端温度。
  • 模拟输出不回读:电压输出点位是只写。
  • NI MAX 里保存的任务、全局通道或自定义缩放都不使用:每个点位指定一个物理通道,驱动自己建立任务,缩放由点位的转换链负责。