labview編程技巧-----如何實現(xiàn)內存空間共享
#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("%sn",lpMapAddress);
}
}
voidProcess1(){//寫數(shù)據
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如果想動態(tài)申請內存只能通過DLL或者CIN來實現(xiàn),LABVIEW本身又不支持指針操作,實現(xiàn)非常困難,不過我們可以通過數(shù)組來實現(xiàn)內存的分配.
共享內存同全局變量一樣,同樣存在數(shù)據競爭的問題,我們可以把共享內存看成是內存數(shù)據塊全局變量.
LABVIEW中防止數(shù)據競爭的最好辦法是把讀寫操作在一個VI里,LABVIEW本身就會保證任意時刻只能有一個讀寫操作.
對于全局可讀寫變量,LABVIEW可以用內置全局變量也可以用FUNCTION GLOBAL(我前面的文章中專門談到了FUNCTION GLOBAL 和AE的概念,可以參照一下)
在自動化控制領域,內存共享應用非常廣泛,對CAN總線控制卡,有雙口RAM的概念,對PLC有輸入輸出映射區(qū),實際上指的都是固定的RAM 空間,相對于計算機來說,就是一段內存空間.
熟悉PLC的朋友都非常清楚,PLC是采用循環(huán)掃描的方式來運行程序的,掃描開始前,一次性地讀入外部開關的狀態(tài),存入輸入映射區(qū)中,在一次掃描程序運行期間,它的狀態(tài)是不變的.
我們在LABVIEW設計控制程序時,也完全可以借用這個方法,實際上很多DSC和外部設備通過OPC通訊都是采用固定間隔更新的方法.
輸入更新(開關,模擬量)--->寫入共享內存------>程序處理------>輸出更新(讀共享內存,繼電器,模擬量輸出,寫入硬件設備)
LABVIEW的共享內存是通過AE結合FUNCTIN GLOBAL實現(xiàn)的.
我們看一下它的實現(xiàn)過程.
首先定義了AE的四個動作,INIT READ WRITE READALL
然后定義的四個選擇項,分別對應離散輸入,線圈,輸入寄存器,保持寄存器(MODBUS定義)
對應四中數(shù)據,分別在INIT的CASE中定義了長度為65536的數(shù)組,實際上定義了四個共享內存區(qū)
評論