# NI-DAQmx

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

**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](process) 测试台的运行记录。

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

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

## 本计算机上的 NI-DAQmx {#ni-daqmx-on-this-computer}

本产品不包含 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](https://www.ni.com/en/support/downloads/drivers/download.ni-daq-mx.html)。下载前它会要求用 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 设备”卡片](#the-ni-daqmx-device-card)的名称。

## 驱动页面 {#the-drivers-page}

页面上有和任何驱动一样的**设备**表（见[设备表](connector-drivers#the-device-table)），用标题右侧的**添加设备**来增加；为空时显示“还没有设备。”驱动的工具栏上有**发现设备**，页面上没有“扫描范围”卡片，因为扫描只询问 NI-DAQmx，不问别处。

## 设备 {#device}

### “NI-DAQmx 设备”卡片 {#the-ni-daqmx-device-card}

本驱动的设备没有“连接”卡片：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 里的同一台设备，例如用两个不同的轮询间隔读取同一个模块；名称不必唯一。

## 点位寻址 {#tag-addressing}

### 物理通道 {#the-physical-channel}

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

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

### 测量 {#measurements}

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

| 测量 | 通道 | 数据类型 | 访问 | 单位 |
| --- | --- | --- | --- | --- |
| **电压输入** | 模拟输入，`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 不回读模拟输出，因此该点位只写。” |
| **边沿计数** | “从工作站连接到设备的那一刻起计数边沿，每次读取时读出计数。重新连接后从初始计数重新开始。” |

### 测量的字段 {#the-measurements-fields}

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

| 字段 | 测量 | 含义 | 默认值 |
| --- | --- | --- | --- |
| **量程 (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`。

## 读取 {#reading}

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

| 点位 | 怎么读取 |
| --- | --- |
| 模拟输入（电压、电流、热电偶） | 一台设备的所有模拟输入共用一个任务，每次读取时启动它，每个通道取一个样本，然后停止。一台设备只有一个模拟定时引擎，一个 cDAQ 机箱的所有模块总共只有三个，所以一直启动着的任务会让别的模块读不了。读取时如果发现引擎被别的任务（NI MAX、LabVIEW）占用，会再问两次，间隔 25 ms。一个样本供设备的所有模拟点位使用，有效期是它们之中最短轮询间隔的一半，因此转换较慢的热电偶模块每一轮只转换一次。 |
| NI-DAQmx 拒绝的通道 | 每个模拟通道都先单独试一次：NI-DAQmx 拒绝的通道（模块没有的量程、在不读热电偶的通道上设热电偶）只让它自己的点位失败，不连累设备的所有模拟点位。 |
| 数字线、电压输出、计数器 | 每个点位一个任务，在设备连接时启动。计数器从那时开始计数，设备重新连接时从初始计数重新开始。 |

| NI-DAQmx 的回答 | 读取怎么处理 |
| --- | --- |
| 一个值，或一条警告 | 这个值，以测量的单位表示，在点位自己的环节转换它之前。 |
| 设备被移除、无法访问或被复位 | 连接丢失：设备重新连接，任务重新创建。 |
| 10 秒内没有回答 | 无应答：设备重新连接，显示什么由点位对[设备没有回答](connector-value-pipeline#the-device-did-not-answer)的策略决定。 |
| 其他任何错误 | 该点位读取失败，附上 NI-DAQmx 自己的文字和错误代码；设备继续读取它的其他点位。 |

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

## 写入 {#writing}

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

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

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

## 设备发现 {#discovery}

驱动工具栏上的**发现设备**向 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` 上添加点位，并填写脉冲到达的**输入端子**，因为机箱的计数器没有自己的输入端子。 |

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

已经有的设备可以在自己的页面上重新读它的通道：“点位”卡片标题栏里的**发现点位**只向 NI-DAQmx 询问这一台设备，只列出它还没有点位的通道，采用各自测量的默认设置（见[发现一台设备的点位](connector-discovery#discovering-a-devices-tags)）。

## 示例：cDAQ 机箱 {#example-a-cdaq-chassis}

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"
```

## 智能体工具 {#agent-tools}

`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 认识的每一台设备，并把它的通道作为候选点位。其他工具见[智能体工具](agent-tools)。

## 值得了解的限制 {#limits-worth-knowing}

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