您的位置 首页 基础

labview编程技巧—–怎么完成内存空间同享

在C语言中,可以采用文件映射的方法,开辟一段内存空间,各个进程和线程可以利用这段共享内存空间进行数据交换,也就是写读操作,这里涉及到一个

在C语言中,能够选用文件映射的办法,拓荒一段内存空间,各个进程和线程能够使用这段同享内存空间进行数据交换,也便是写读操作,这儿涉及到一个操控权限的问题,任何时间,只能答应一个线程或许进程对内存空间进行操作,看一段代码,是经过API完成的内存空间同享.

#defineFILE_SIZE1024

staticHANDLEhMapFile;
staticLPVOIDlpMapAddress;
staticLPCTSTRg_szEventName=”EventName”;

voidWrite(char*data){
if(lpMapAddress!=NULL){
memset(lpMapAddress,0,FILE_SIZE);
sprintf((char*)lpMapAddress,”%s”,data);
}
}

voidRead(){
if(lpMapAddress!=NULL){
printf(“%s\n”,lpMapAddress);
}
}

voidProcess1(){//写数据
hMapFile=CreateFileMapping(
INVALID_HANDLE_VALUE,//Currentfilehandle.
NULL,//Defaultsecurity.
PAGE_READWRITE,//Read/writepermission.
0,//Max.objectsize.
FILE_SIZE,//SizeofhFile.
“MyFileMappingObject”);//Nameofmappingobject.

if(hMapFile==NULL)
{
printf(“Couldnotcreatefile-mappingobject.”);
return;
}

//
lpMapAddress=MapViewOfFile(hMapFile,//Handletomappingobject.
FILE_MAP_ALL_ACCESS,//Read/writepermission
0,//Max.objectsize.
0,//SizeofhFile.
FILE_SIZE);//Mapentirefile.

if(lpMapAddress==NULL)
{
printf(“Couldnotmapviewoffile.”);
return;
}
::Sleep(10000);
//Writedata
ANDLEhEvent=::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的数组,实际上界说了四个同享内存区

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/211767.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部