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)调用效果

使用虚拟机跑RT linux

(7.2)使用GetValueByPointer.xnode函数

  • 暂未尝试,先留空。

(八)总结与展望

  • 将simulink模型转化为.so文件,然后在LabVIEW中调用可以实现实时仿真系统的运行,结合CompactRIO平台的FPGA和C系列IO,可以实现与外接交互,实现硬件在环平台。其中的难点在于.so文件的调用与生成,尤其是在LabVIEW中的CLN中配置.so文件的调用格式以及MoveBlock模块的调用格式需要特别注意。
  • 后续博文将结合目前的工作与实际硬件实现物理交互,真实建立硬件在环平台。
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值