LabVIEW调用.so文件的方法
(一)为什么需要用LabVIEW调用.so文件
(1.1)背景
- NI的CompactRIO平台(硬件由运行 RT Linux的终端 + FPGA背板 + C系列I/O插件)具有良好的软件和硬件支持,利用LabVIEW软件及其LabVIEW Real Time 和LabVIEW FPGA软件模块,可以方便的编写在硬件上运行的实时程序,利用LabVIEW可以直接将程序下载到运行RT Linux的终端上,并且利用背板FPGA可以方便与C系列IO进行快速交互,总体上而言十分适合利用CompactRIO平台建立自定义硬件在环仿真平台。
- 基于以上认识,在RT Linux上运行的VI程序将是其中的重要的一环。考虑如果能够将simulink的模型文件转化为.so文件,然后在VI程序中调用,然后下载到RT Linux终端运行,那么simulink模型将在RT Linux中运行,实时性得到了保证,同时利用背板FPGA对C系列IO的交互,同时实现了与外界的物理交互,硬件在环平台即可实现。
(1.2)使用.so文件的优势
- Simulink能够建立的模型十分丰富,其模型是.mdl或者.slx格式,RT Linux和LabVIEW 并不能调用。可利用Embeded Coder模块将Simulink模型转化为.c和.h文件,然后编译为.so文件,则可以被RT Linux和LabVIEW调用。结合Simulink建立模型的优势以及CompactRIO平台物理交互的优势的关键点在于在.so文件的生成和调用。
(1.3)调用.so文件示例
- 需要运行的程序VI在主机host上编写,VI放置在工程文件的终端下(如图中的NI-VMware7-1-74、NI-cRIO-9040)。
- 点击VI运行按钮可以直接下载到终端运行。如图是在simulink中搭建了储能电站模型,编译为.so文件后在RT Linux上调用运行,时间周期为10us级别,极大的保证了运行的实时性。
(二).so文件是什么
- .so文件是Linux环境下的动态链接库,需要在Linux环境下编译生成。
- .dll文件是Windows环境下的动态链接库,需要在Windows环境下编译生成。
- Windows下的LabVIEW可以调用.dll在Windows环境下运行。也可以在Windows下编写终端VI程序,终端VI程序调用.so文件,然后将终端VI下载到RT Linux 终端上运行。
- LabVIEW调用.dll文件和调用.so文件采用不同的方式。
(三).so文件生成
- 以下举例说明在Linux下如何生成.so文件。需要的文件为:add.c 、 add.h 、makefile。
(3.1)add.c文件
#include "add.h"
int add(int x ,int y){
return x+y ;
}
(3.2)add.h文件
int add(int x, int y);
(3.3)makefile文件
TARGET = libadd.so
SRC = $(wildcard ./*.c )
OBJS = $(patsubst %.c,%.o, $(SRC))
CC = gcc
CFLAGS += -c -g -Wall -fPIC
INC = -I.
LIB = -L. -shared
$(TARGET):$(OBJS)
$(CC) $^ -o $@ $(LIB)
%.o:%.c
$(CC) $^ -o $@ $(INC) $(CFLAGS)
clean:
rm $(OBJS) $(TARGET) -rf
(3.3)编译生成.so文件
- 生成了 libadd.so 文件
(四).so文件如何在linux中常规调用?
- Linux选用Ubuntu 2004。
(4.1)将.so、.h文件拷贝到目标文件夹
(4.2)编写main.c文件
#include "add.h"
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
for (int i = 0; i < 5; i++)
{
printf("add(test0,test1)=%d\n", add(i, i + 1));
}
return 0;
}
(4.3)编写makefile
TARGET = app
SRC = $(wildcard ./*.c )
OBJS = $(patsubst %.c,%.o, $(SRC))
CC = gcc
CFLAGS += -c -g -Wall
INC = -I. -fPIC
LIB = -L./ -ladd
$(TARGET):$(OBJS)
$(CC) $^ -o $@ $(LIB)
%.o:%.c
$(CC) $^ -o $@ $(INC) $(CFLAGS)
clean:
rm $(OBJS) $(TARGET) -rf
(4.4)运行
(4.5)可能存在的问题
(4.5.1)找不到GCC等软件
sudo apt update
sudo apt upgrade
(4.5.2)找不到动态库.so文件
参考文献: Ubuntu linux设置从当前目录下加载动态库so文件
1、利用 ldd libadd.so //查看依赖的动态库
通过设置环境变量LD_LIBRARY_PATH,可加载当前目录的动态库。
2、临时修改,Log Out之后失效。在terminal中执行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
3、让当前帐号以后都优先加载当前目录的动态库,修改~/.bash_profile,在文件末尾加上两行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
然后在terminal中运行
source .bashrc
4、让所有帐号从此都优先加载当前目录的动态库,修改/etc/profile在文件末尾如2中同样修改 。
5、修改ld.so.conf不能达到目的,因为ld.so.conf只支持绝对路径。
(五).so文件如何在RT Linux中常规调用?
- 在RT Linux调用.so文件和在常规Linux下调用.so一致。
(六).so文件如何通过LabVIEW RealTime模块在RT linux中调用?
- 通过LabVIEW RealTime模块在RT linux中调用.so与在RT Linux上常规调用不同,按照NI的说明文档需要做相关配置。
(6.1)在RT linux中放置.so文件的位置
- 按照官方文档,应放在/usr/local/lib 里面
(6.2)重新启动RT Linux来使能.so文件
sudo reboot
(七)在RT_linux labview_host界面及so文件调用
(7.1)使用MoveBlock函数
(7.1.1)输入、输出使用值传递的简单函数的.so调用
(7.1.2)输入、输出使用结构体指针传递的复杂函数的.so
(a).so函数原型
typedef struct {
real_T P_set;
real_T Q_set;
} ExtU;
typedef struct {
real_T PQ_meas[2];
} ExtY;
ExtY *my_rt_OneStep(ExtU *Input_Pointer);
(b)CLN函数调用.so文件配置
(c)MoveBlock函数配置
(d)调用效果
(7.2)使用GetValueByPointer.xnode函数
- 暂未尝试,先留空。
(八)总结与展望
- 将simulink模型转化为.so文件,然后在LabVIEW中调用可以实现实时仿真系统的运行,结合CompactRIO平台的FPGA和C系列IO,可以实现与外接交互,实现硬件在环平台。其中的难点在于.so文件的调用与生成,尤其是在LabVIEW中的CLN中配置.so文件的调用格式以及MoveBlock模块的调用格式需要特别注意。
- 后续博文将结合目前的工作与实际硬件实现物理交互,真实建立硬件在环平台。