问题:
我之前使用NI的数据采集卡,在LabVIEW中调用NI-DAQmx驱动编写了数据采集程序。其中除了数据采集功能以外,还有数据处理和文件操作等功能。后面如果替换其他品牌数据采集卡,是否有办法将数据采集的VI进行迁移,并且保持其它核心功能不变?
回答:
这是可能的。如果要求将数据采集代码进行迁移、而保持其他功能不受影响,主要考虑有两点:一是驱动API函数的逻辑,需要尽量和NI-DAQmx驱动保持一致;二是对外的数据接口尽量保持一致。这样在迁移时能极大减少工作量,并保持其它功能的稳定。
NI-DAQmx的驱动,对数据采集任务进行抽象后,都遵循“创建、配置、开始、读/写、关闭、清除”的状态转移逻辑。

以下面截图中模拟电压连续采集为例,
① 用户选择物理通道后,设置量程的信息即可创建任务。
②③ 生成的任务引用句柄往后传递,可以配置采样速度和外部触发信息(如果有触发的话)。
④ 然后开始任务、启动ADC转换。
⑤ 在While循环中连续读取采集到的数据、至LabVIEW前面板显示。当用户按下停止按钮后,LabVIEW不再继续读取。
⑥ 进而,需要控制采集任务、使其停止采集,避免缓存区溢出。
⑦ 最后,清除任务引用句柄。
⑧ 如果任务出现错误,会弹出错误提示信息,帮助配置信息。

BusDAQ DAQsc数据采集驱动API,也是按照这个流程进行的封装。具体来说,各个功能VI对应的关系是:
任务 | NI DAQmx VIs | BusDAQ DAQsc VIs | 备注 | |
创建任务 |
|
| DAQsc支持的任务类型有限,数量更少 | |
配置任务 | 定时 |
|
| |
触发 |
|
| DAQsc暂不支持某些触发类型。如模拟窗口触发 | |
开始任务 |
|
| ||
读/写 | 读取 |
|
| DAQsc没有对通道数量做区分。统一用数组来捆绑 |
写入 |
|
| DAQsc没有对通道数量做区分。统一用数组来捆绑 | |
停止任务 |
|
| ||
清除任务 |
|
| ||
任务属性节点 |
|
| NI DAQmx按对象、封装了更多属性。 BusDAQ DAQsc按照任务类、封装属性。 | |
快速助手Express |
|
| ||
总体来说,BusDAQ的DAQsc驱动API,将数据采集任务分别抽象成AI、AO、DI、DO、CI、CO六个类。任务的创建、配置、读/写三个操作,用多态来封装各个具体的测量实例;任务开始、停止和清除这三个操作,使用类的动态分配来自适应。
对于模拟输入(AI)来说,下面的程序截图以带缓存的连续采集为例,对比NI-DAQmx的代码截图,和BusDAQ DAQsc的代码截图,可以看到这种采集功能的VIs迁移过程。

对于模拟输出(AO)来说,下面的程序截图以带缓存的连续输出为例(波形可重生成),对比NI-DAQmx的代码截图,和BusDAQ DAQsc的代码截图,可以看到这种连续输出功能的VIs迁移过程。

注:1) NI-DAQmx的DAQmx Write.vi,接收波形数据。如果是多个通道,则接收一维波形数组。单通道/多通道额选择,通过多态来实现;
2)BusDAQ DAQsc的DAQsc Write.vi,接收二维数组的波形数值。如果是单通道,则需要提前将一维数组Build成二维数组再传入;
对于数字输入(DI)来说,下面的程序截图以软件定时的数字输入为例,对比NI-DAQmx的代码截图,和BusDAQ DAQsc的代码截图,可以看到这种数字输入功能的VIs迁移过程。

对于数字输出(DO)来说,下面的程序截图以软件定时的数字输出为例,对比NI-DAQmx的代码截图,和BusDAQ DAQsc的代码截图,可以看到这种数字输出功能的VIs迁移过程。

对于计数器输入(CI)来说,下面的程序截图以脉冲计数为例,对比NI-DAQmx的代码截图,和BusDAQ DAQsc的代码截图,可以看到这种脉冲计数功能的VIs迁移过程。

注:1) NI-DAQmx可以通过通道的属性节点,来灵活改变当前计数器所指向的具体PFI引脚。这在硬件接线时,特别方便。
2)BusDAQ DAQsc无法更改计数器和PFI引脚的对应关系。也就是说,Ctr0和PFI0,Ctr1和PFI1,……,以此类推。关系一一对应,需要注意。
对于计数器输出(CO)来说,下面的程序截图以连续脉冲输出为例,对比NI-DAQmx的代码截图,和BusDAQ DAQsc的代码截图,可以看到这种脉冲输出功能的VIs迁移过程。

注:1) NI-DAQmx和BusDAQ DAQsc在while循环中,调用Write.vi(选择对应的多态),来写入新的脉冲频率和占空比,以实时更新脉冲输出的参数。
在上一部分中,我们重点关注了驱动API的逻辑。这里我们再来看看API的数据接口。
还是以模拟输入连续采集为例,分拆来看各个任务API的数据接口。

在上面的程序截图中,两者都有共同的数据流,即任务引用和错误簇。分任务来看:
共同数据流:任务数据流和错误簇流 | |||
任务 | NI DAQmx VIs | BusDAQ DAQsc VIs | |
创建任务 |
| 1) 物理通道:NI-DAQmx数据类型。 2) 最大、最小值:DBL标量。 3) 接线端配置:I32标量。 4) 其它参数,使用默认值。 | 1) 物理通道:字符串。 2) 量程:簇数组,对应多通道。每个簇分别包含最大、最小值。 3) 耦合方式:枚举自定义(U8)数组,对应多通道。 4) 其它参数,使用默认值。 |
任务配置:定时 |
| 1) 采样模式:枚举(I32) 2) 采样率:DBL标量 3) 采样时钟源:NI-DAQmx数据类型 4) 待读取点数:I32标量 5) 实际采样率:DBL标量 | 1) 采样模式:枚举自定义类型 2) 采样率:DBL标量 3) 实际采样率:DBL标量 4) 采样时钟源和缓存区大小,使用默认值 |
任务配置:触发 |
| 1) 触发源:NI-DAQmx数据类型 2) 触发边沿:枚举(I32) | 1) 触发源:枚举自定义类型(U8) 2) 触发边沿:枚举自定义类型 |
开始任务 |
| 1) 通用的任务流和错误簇流 | 1) 通用的任务流和错误簇流 |
任务读取 |
| 1) 待读取点数:I32标量。 2) 返回的波形数据:一维波形数组。 | 1) 待读取点数:I32标量 2) 返回的波形数据:一维波形数组 |
任务停止和清除 |
| 1) 通用的任务流和错误簇流 | 1) 通用的任务流和错误簇流 |
其它AO等数据采集任务,也基本有类似的数据接口。基于这个对比,可以更完整的实现VIs的迁移。
根据待迁移的VI数量的多少,有下面几种方法,可以参考使用:
如果当前数据采集程序较为简单,也就使用了一个任务,大概7-8个左右的API。并且这些API还很容易定位,那么可以直接在API上右键,选择替换(Replace),找到测量IO选板(Measurement IO)下的DAQsc中的对应API。

替换完成后,可能会有部分API函数的参数类型不匹配,比如量程(最大、最小值)等。可以断开原来的参数接口,直接在新的DAQsc API接线端,右键,选择创建常量或输入/输出控件。完成整个代码的迁移。
如果数据采集程序中,包括的任务较多,比如既有AI任务,还有AO、DO等任务,并且API函数还嵌套得比较深,不太容易定位。那么可以使用LabVIEW自带的查找(Find)和替换(Replace)功能。
在打开的VI界面,按下Crl+F快捷键。在界面的查找(Search for):选择“对象(Objects)”。

在下面,依次选择待搜索的VI,搜索的范围,以及是否要忽略vi.lib中的VI等参数,点击查找(Find)。

窗口中,会罗列出搜索到的所有副本(如果只找到一个副本,则直接定位副本的位置,而不会弹开这个窗口)。在窗口左边Replace with区域,选择DAQsc Timing.vi,点击替换全部(Replace All)。会将搜索到的所有NI DAQmx Timing.vi替换为DAQsc Timing.vi。
其它API,可继续重复这些步骤。
替换完成后,可能会有部分API函数的参数类型不匹配,比如量程(最大、最小值)等。可以断开原来的参数接口,直接在新的DAQsc API接线端,右键,选择创建常量或输入/输出控件。完成整个代码的迁移。
这是利用LabVIEW的高级编程工具,即VI脚本(VI Scripting)技术,来批量搜索所有的VI副本,并进行自动替换。
在使用VI Script技术编程之前,需要先确认打开它。在LabVIEW的工具菜单,选择Option。在VI Server选项卡,勾选VI Script,然后点击确定。

然后关闭LabVIEW,再重启可以生效。
使用VI Script脚本技术,可以查找特定对象(比如某个硬盘路径中,或是某个特定的项目,或是VI中)中是否包含有DAQmx Timing.vi,并可以调用对应的方法节点,进行替换。
感兴趣的用户,可以打开范例查找器,搜索scripting的相关范例,比如Navigation Overview.vi,来进行探索。

如果编程实现有困难,也可以从busdaq.cn网站入口联系我们,获得详细代码。
Copyright © 2025-2026 上海屹莘贸易有限公司 沪ICP备2026037228号-1