labview编程技巧-----如何实现内存空间共享

发布者:sheng44最新更新时间:2015-08-21 来源: eefocus关键字:labview  编程技巧-  内存空间 手机看文章 扫描二维码
随时随地手机看文章
  在C语言中,可以采用文件映射的方法,开辟一段内存空间,各个进程和线程可以利用这段共享内存空间进行数据交换,也就是写读操作,这里涉及到一个控制权限的问题,任何时刻,只能允许一个线程或者进程对内存空间进行操作,看一段代码,是通过API实现的内存空间共享.

#define FILE_SIZE 1024 

static HANDLE hMapFile; 
static LPVOID lpMapAddress; 
static LPCTSTR g_szEventName="EventName"; 
 
void Write(char* data){ 
    if(lpMapAddress!=NULL){ 
        memset(lpMapAddress,0,FILE_SIZE); 
        sprintf((char*)lpMapAddress,"%s",data); 
    } 

 
void Read(){ 
    if(lpMapAddress!=NULL){ 
        printf("%s\n",lpMapAddress); 
    } 



void Process1(){//写数据 
hMapFile = CreateFileMapping( 
    INVALID_HANDLE_VALUE,               // Current file handle.  
    NULL,                              // Default security.  
    PAGE_READWRITE,                    // Read/write permission.  
    0,                                 // Max. object size.  
    FILE_SIZE,                         // Size of hFile.  
    "MyFileMappingObject");            // Name of mapping object.  
  
if (hMapFile == NULL)  
{  
    printf("Could not create file-mapping object.");  
    return ; 
}  

// 
lpMapAddress = MapViewOfFile(hMapFile, // Handle to mapping object.  
    FILE_MAP_ALL_ACCESS,               // Read/write permission  
    0,                                 // Max. object size.  
    0,                                 // Size of hFile.  
    FILE_SIZE);                                // Map entire file.  
  
if (lpMapAddress == NULL)  
{  
    printf("Could not map view of file.");  
    return ; 
}  
::Sleep(10000); 
//Write data 
ANDLE hEvent=::OpenEvent( 
        EVENT_MODIFY_STATE, 
        FALSE, 
        g_szEventName); 

while(hEvent!=NULL){ 
        scanf("%s",lpMapAddress); 
        ::SetEvent(hEvent); 

::CloseHandle(hEvent); 
hEvent=INVALID_HANDLE_VALUE; 




在LABVIEW如果想动态申请内存只能通过DLL或者CIN来实现,LABVIEW本身又不支持指针操作,实现非常困难,不过我们可以通过数组来实现内存的分配.

共享内存同全局变量一样,同样存在数据竞争的问题,我们可以把共享内存看成是内存数据块全局变量.
LABVIEW中防止数据竞争的最好办法是把读写操作在一个VI里,LABVIEW本身就会保证任意时刻只能有一个读写操作.

对于全局可读写变量,LABVIEW可以用内置全局变量也可以用FUNCTION GLOBAL(我前面的文章中专门谈到了FUNCTION GLOBAL 和AE的概念,可以参照一下)

在自动化控制领域,内存共享应用非常广泛,对CAN总线控制卡,有双口RAM的概念,对PLC有输入输出映射区,实际上指的都是固定的RAM 空间,相对于计算机来说,就是一段内存空间.

熟悉PLC的朋友都非常清楚,PLC是采用循环扫描的方式来运行程序的,扫描开始前,一次性地读入外部开关的状态,存入输入映射区中,在一次扫描程序运行期间,它的状态是不变的.

我们在LABVIEW设计控制程序时,也完全可以借用这个方法,实际上很多DSC和外部设备通过OPC通讯都是采用固定间隔更新的方法.

输入更新(开关,模拟量)--->写入共享内存------>程序处理------>输出更新(读共享内存,继电器,模拟量输出,写入硬件设备)

LABVIEW的共享内存是通过AE结合FUNCTIN GLOBAL实现的.
我们看一下它的实现过程.

     

首先定义了AE的四个动作,INIT READ WRITE READALL
然后定义的四个选择项,分别对应离散输入,线圈,输入寄存器,保持寄存器(MODBUS定义)




对应四中数据,分别在INIT的CASE中定义了长度为65536的数组,实际上定义了四个共享内存区[page]





上图是读离散性输入的CASE,其他分别是读COILS,INPUT REG,HOLDING REG


其它写的CASE类似.

这样,我们在LABVIEW中任何位置,包括子VI,对这四个共享内存空间进行读写操作,实现的数据交换的功能.
关键字:labview  编程技巧-  内存空间 引用地址: labview编程技巧-----如何实现内存空间共享

上一篇:labview编程技巧-----如何实现内存空间共享
下一篇:labview编程技巧-----令人无奈的IF ELSE

推荐阅读最新更新时间:2024-03-30 23:03

我对虚拟仪器技术的理解
  从事 虚拟仪器 技术已经有好多年了,虽然这两年从事其他方面的工作,但还一直在关注该领域的变化。从上研究生开始就一直从事虚拟仪器方面的工作,我本人主要做硬件方面的事情,但是一直在考虑虚拟仪器方面的几个重要问题:什么是虚拟仪器技术?虚拟仪器技术研究内容是什么?在此,我想谈谈我对上述问题的一些想法。   首先,什么是虚拟仪器技术?提到这个问题很多朋友可能脱口而出:“虚拟仪器是不是一种 模拟 仿真 的仪器?”,“虚拟仪器技术就是用Labview进行测试测量的开发”,“虚拟仪器技术就是基于 计算机 的测控系统”。从google中搜索“虚拟仪器”关键字,可能得到最多的是NI公司的咨讯,然后是铺天盖地的Labview信息,再者就是NI推
[测试测量]
LabVIEW系列——合并错误(VI)的用法
Merge Errors.vi的功能:1、按顺序搜索错误输入1,2,3,以及错误数组输入中的错误,输出第一个错误。 2、如果没有错误,也就是错误状态都为FALSE(勾),按顺序搜索第一个警告,也就是返回第一个code不为零的警告。 3、如果既没有错误,也没有警告,输出错误输入1。
[测试测量]
简述虚拟仪器技术及LabVIEW编程课程的认识和理解
   虚拟仪器 --软件就是仪器    虚拟仪器 ,虚拟示波器, 虚拟仪器 技术, 虚拟仪器 软件, 虚拟仪器 开发, 虚拟仪器 组成   一、引言   当前多媒体计算机、信息高速公路和计算机网络是计算机信息科学的三个重要发展方向。它们相互联系、相互促进、共同发展,已经渗透到人们日常工作、生活、学习、娱乐的各个方面,逐步地由办公室、实验室走向家庭。   虚拟现实是多媒体计算机的一个重要应用领域,多媒体技术是虚拟现实的技术基础。虚拟现实(VirtualReality)是利用多媒体计算机技术生成的一个具有逼真的视觉、听觉、触觉及嗅觉的模拟现实环境。用户可以用人的自然技能对这一虚拟的现实进行交互体验,而用户体验到的结果--该虚拟
[测试测量]
NI携其最新LabVIEW通信系统设计套件亮相2015 EDI CON
新闻发布 2015年4月14日,美国国家仪器有限公司(National Instruments, 简称NI)亮相2015第三届电子设计创新会议(EDI CON),这是NI连续第三年参与该行业盛会,并在此次会议上隆重介绍最新结合软件无线电(SDR)硬件和全方位软件设计流程的LabVIEW通信系统设计套件(LabVIEW Communications System Design Suite)。 在移动互联网与物联网(loT,Internet of Things)两大趋势的推动下,5G的需求与应用也随之而来,其所带来的革命性影响将颠覆我们的生活。NI始终致力于为工程师和科学家提供解决方案来应对全球严峻的工程挑战。面对5G即
[网络通信]
Labview中定时函数之间的区别
第一个定时函数(时间延迟):在VI中插入时间延迟,指定在运行调用VI之前延时的秒数。默认值为1.000。 第一个定时函数(等待(ms)):等待指定长度的毫秒数,并返回毫秒计时器的值。该函数进行异步系统调用,但函数节点却是同步操作的。所以,直至指定时间结束,函数才停止执行;LabVIEW调用VI时,如毫秒计时值为112毫秒,等待时间(毫秒)为10毫秒,则毫秒计时值为122毫秒时,VI执行结束。 等待直至毫秒计时器的值为毫秒倍数中指定值的整数倍。该函数用于同步各操作。在循环中调用该函数可控制循环执行的速率。但此时第一个循环周期可能很短。 例如LabVIEW调用了一个VI,如毫秒倍数为10毫秒,毫秒计时值为112毫秒。VI将
[测试测量]
基于NI LabWindows/CVI, LabVIEW和PXI开发集成的航空电子
  挑战:   利用商业现成可用(commercial off-the-shelf, COTS)的硬件,开发一款集成的 航空电子 测试系统,配有若干非标准视频接口和一个专属的串口通信总线,以减少开发成本和开发时间。   解决方案:   使用 NI LabWindows ™/ CVI 和 Labview FPGA模块,利用一个 PXI 机箱和一个集成的 NI 控制器, 两个 NI 可重配置的I/O(RIO)模块来处理非标准的视频声画同步、管理私有串口协议,另外使用两个模块生成非标准的视频和一些信号路由矩阵信息。   军用 航空电子 设备的生产需要经过一些特殊的步骤,如产品验收,项目认证以及对交付后的产品进行单元测试等
[测试测量]
基于NI LabWindows/CVI, <font color='red'>LabVIEW</font>和PXI开发集成的航空电子
使用NI LabVIEW FPGA 与智能 DAQ的自动高电压电击测试
  构成自动化的高电压 (HV) 电击器测试系统,以个别测试 12 组 HV 电击器模块,并可测试不同的产品类型,缩短整体测试时间。   The Solution:   使用 NI LabVIEW FPGA 软件与 NI 智能数据采集 ( DAQ ) 硬件,建立非同步化的环境;所有的 12 个模块均具有独立通讯埠,并可自动执行作业。 测试执行系统为主控制器,可提供使用者界面、主导测试模块的负载与卸载程度,并让测试管理者针对实际装置或装载于测试模块的装置,进行 HV 电击器测试。   "新的自动化系统可透过 FPGA 数位 I/O 通讯功能,非同步执行 12 个模块,并于 48 分钟内测试最多 4 种不同类型的共 12
[测试测量]
使用NI <font color='red'>LabVIEW</font> FPGA 与智能 DAQ的自动高电压电击测试
LabVIEW机器人模块-机器人选板中的特殊算法
  概览   本教程对LabVIEW机器人模块软件自带的机器人算法进行介绍。从传感器直至路径规划,您都可以使用这个产品来设计新一代的复杂的自动化系统。   LabVIEW机器人模块带有全新的功能完备的“机器人”选板,其中包含了设计下一代机器人控制器所需的全新算法。这个全新的函数选板包含了从传感器驱动程序直至反向运动学的所有功能。详情请参考LabVIEW帮助(见下面的链接),了解关于机器人VI的更多信息。   •利用连接VI与其他机器人软件一起工作,包括例如Cogmation、MobileRobotics、Skilligent以及Microsoft的第三方产品。   •使用回避障碍物VI,实现移动机器人车辆的回避障碍物功能。
[测试测量]
<font color='red'>LabVIEW</font>机器人模块-机器人选板中的特殊算法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
最新测试测量文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved