使用“共享库”或“DLL”生成可调用的 C 代码
这是最常用、最推荐的方法,它的核心思想是:将你的 LabVIEW 程序(VI)编译成一个标准的动态链接库文件(.dll 在 Windows 上,或 .so/.dylib 在 Linux/macOS 上),然后这个 DLL 内部包含了标准的 C 语言函数接口,可以被任何其他 C/C++ 项目调用。

(图片来源网络,侵删)
工作流程:
-
在 LabVIEW 中设计你的程序:创建一个 VI,这个 VI 将是你希望被外部 C 程序调用的功能模块,一个数据处理函数、一个设备驱动函数等。
-
配置“导出 VI”:
- 右键点击前面板或程序框图,选择“导出 >> 共享库 (.dll)”。
- LabVIEW 会打开一个配置向导。
- 指定库的名称和路径:
MyDataProcessor.dll。 - 选择要导出的 VI:在向导中,你可以选择将哪些 VI 作为 C 函数导出,每个被导出的 VI 都会对应一个 C 函数。
- 配置函数签名:这是最关键的一步,LabVIEW 会自动将你 VI 的输入和输出控件/指示器映射为 C 函数的参数,你需要为每个参数选择对应的 C 数据类型(如
int,double,float,char*,void*等)。- 数据类型映射:LabVIEW 的数据类型需要手动转换为 C 的数据类型。
- LabVIEW
I32(32-bit Integer) -> Cint或long - LabVIEW
DBL(Double Precision) -> Cdouble - LabVIEW
String-> Cchar*(注意:需要调用者或被调用者来管理内存) - LabVIEW
Array-> Cvoid*(通常是一个指向 LabVIEW 内部数据结构的指针,处理起来比较复杂)
- LabVIEW
- 数据类型映射:LabVIEW 的数据类型需要手动转换为 C 的数据类型。
- 生成代码和库文件:完成配置后,点击“生成”,LabVIEW 会在你指定的路径下生成:
.dll文件:包含你 VI 的编译后代码。.h文件:C 语言的头文件,包含了函数声明、数据结构定义和必要的宏定义。.lib文件(仅 Windows):用于链接的导入库文件。
-
在 C/C++ 项目中调用:
(图片来源网络,侵删)- 将生成的
.h文件和.lib文件(以及.dll文件)复制到你的 C/C++ 项目中。 - 在你的 C 代码中
#include "生成的.h"文件。 - 在你的 C 代码中像调用普通 C 函数一样调用 LabVIEW 导出的函数。
- 注意:运行你的 C 程序时,必须确保
MyDataProcessor.dll文件在系统的路径中(和你的.exe文件放在同一目录下)。
- 将生成的
优点:
- 解耦:LabVIEW 和 C/C++ 程序是两个独立的应用,通过标准接口通信,互不干扰。
- 灵活性高:任何支持调用 DLL 的语言(如 C++, C#, Python, Java 等)都可以使用你用 LabVIEW 编写的功能。
- 性能:对于计算密集型任务,在 LabVIEW 中实现并通过 DLL 调用,通常比其他方法(如 Datasocket)性能更好。
- 最佳实践:这是 LabVIEW 与其他语言集成的工业标准做法。
缺点:
- 数据类型转换复杂:处理 LabVIEW 的数组、簇和字符串在 C 中的表示比较繁琐,容易出错。
- 需要额外配置:需要在 C 项目中进行正确的链接设置。
使用“NI 代码生成器”生成嵌入式 C 代码
这种方法完全不同,它不是用于桌面应用程序集成,而是用于嵌入式系统开发,它的核心思想是:将 LabVIEW 图形化代码“翻译”成高效、可移植的 ANSI C 代码,以便在微控制器、FPGA 或其他嵌入式硬件上运行。
工作流程:
- 使用“NI LabVIEW 模块”:此功能是 LabVIEW 模块的一部分,需要单独购买和安装。
- 编写“目标硬件兼容”的代码:你不能使用所有 LabVIEW 的功能,你必须使用 NI 预先定义的一组函数和编程结构,这些结构可以被映射到嵌入式硬件上,你不能使用 Windows 专属的文件 I/O 函数,但可以使用 GPIO、定时器、UART、I2C、SPI 等硬件相关的函数。
- 配置代码生成器:
- 在 LabVIEW 中,选择“工具 >> 代码生成器”。
- 选择你的目标硬件(如 NI myRIO, sbRIO, 或自定义的 ARM Cortex-M 处理器)。
- 配置生成的 C 项目的细节,如输出目录、编译器选项等。
- 生成 C 代码和项目:
- 点击生成,LabVIEW 会创建一个完整的嵌入式 C 项目。
- 生成的项目通常包含:
.c和.h文件:将你的 LabVIEW 逻辑转换成的 C 代码。- 一个标准的嵌入式项目文件:一个 Keil MDK (
.uvprojx) 或 IAR (.eww) 项目文件,可以直接在这些集成开发环境中打开和编译。 - 启动代码和驱动:为目标硬件提供必要的底层驱动和启动文件。
- 在嵌入式 IDE 中编译和部署:
- 打开生成的 C 项目(例如在 Keil 或 IAR 中)。
- 编译代码,生成可执行文件(如
.hex或.bin文件)。 - 通过 JTAG/SWD 或其他编程接口,将可执行文件烧录到目标硬件上运行。
优点:
- 图形化开发嵌入式系统:让不熟悉 C 语言或嵌入式开发的工程师也能快速实现复杂的控制逻辑。
- 高效的 C 代码:生成的代码是经过优化的 ANSI C,可以直接在目标硬件上高效运行。
- 硬件抽象:通过 LabVIEW 的函数节点,可以方便地操作底层硬件,而无需关心复杂的寄存器配置。
缺点:
- 成本高昂:需要购买昂贵的 LabVIEW 模块。
- 功能受限:不能使用所有 LabVIEW 功能,只能使用代码生成器支持的部分。
- 学习曲线:需要学习“目标硬件兼容”的编程范式。
- 与桌面应用无关:此方法生成的代码不能被桌面 C 程序作为 DLL 调用。
总结与选择指南
| 特性 | 生成共享库 | 生成嵌入式 C 代码 |
|---|---|---|
| 主要用途 | 桌面/服务器应用集成,将 LabVIEW 功能提供给 C/C++ 等语言调用。 | 嵌入式系统开发,在微控制器等硬件上运行 LabVIEW 逻辑。 |
| 输出产物 | .dll, .h, .lib (Windows) |
.c, .h, 嵌入式项目文件 (Keil, IAR等) |
| 调用方式 | C/C++ 程序运行时动态加载 DLL 并调用其函数。 | C 代码被编译成固件,然后烧录到硬件上独立运行。 |
| 数据类型 | 需要手动映射 LabVIEW 类型到 C 类型,处理复杂(尤其数组)。 | 生成器自动处理类型映射,代码针对目标硬件优化。 |
| 硬件依赖 | 依赖 Windows 操作系统。 | 依赖特定的嵌入式硬件平台。 |
| 成本 | 包含在标准 LabVIEW 专业版/开发版中。 | 需要购买额外的 LabVIEW 模块。 |
| 类比 | 像制作一个“插件”(Plugin),供其他软件使用。 | 像把“设计图纸”直接变成“机器”的内部指令。 |
如何选择?
-
如果你想在你的 C++ 桌面应用程序中使用一个用 LabVIEW 编写的复杂算法或设备驱动,你应该选择【方法一:生成共享库】。
- 例如:你的主程序是 C++ 开发的,但你需要使用一个只有 LabVIEW 才能实现的、复杂的信号处理库,你可以将这个信号处理 VI 编译成 DLL,然后在 C++ 中调用。
-
如果你正在为一块 ARM Cortex-M 开发板编写固件,希望用图形化的方式来实现控制逻辑,你应该选择【方法二:生成嵌入式 C 代码】。
- 例如:你需要为一块 STM32 开发板编写一个电机控制程序,你可以在 LabVIEW 中用图形化的方式搭建控制算法,然后使用代码生成器生成 C 代码,编译后烧录到 STM32 中运行。
希望这个详细的解释能帮助你理解 LabVIEW 生成 C 代码的两种不同路径,并为你选择正确的工具提供指导!
