色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > labview編程技巧-----如何實(shí)現(xiàn)內(nèi)存空間共享

          labview編程技巧-----如何實(shí)現(xiàn)內(nèi)存空間共享

          作者: 時(shí)間:2017-01-09 來源:網(wǎng)絡(luò) 收藏
          在C語(yǔ)言中,可以采用文件映射的方法,開辟一段內(nèi)存空間,各個(gè)進(jìn)程和線程可以利用這段共享內(nèi)存空間進(jìn)行數(shù)據(jù)交換,也就是寫讀操作,這里涉及到一個(gè)控制權(quán)限的問題,任何時(shí)刻,只能允許一個(gè)線程或者進(jìn)程對(duì)內(nèi)存空間進(jìn)行操作,看一段代碼,是通過API實(shí)現(xiàn)的內(nèi)存空間共享.

          #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ù)據(jù)
          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如果想動(dòng)態(tài)申請(qǐng)內(nèi)存只能通過DLL或者CIN來實(shí)現(xiàn),LABVIEW本身又不支持指針操作,實(shí)現(xiàn)非常困難,不過我們可以通過數(shù)組來實(shí)現(xiàn)內(nèi)存的分配.

          共享內(nèi)存同全局變量一樣,同樣存在數(shù)據(jù)競(jìng)爭(zhēng)的問題,我們可以把共享內(nèi)存看成是內(nèi)存數(shù)據(jù)塊全局變量.
          LABVIEW中防止數(shù)據(jù)競(jìng)爭(zhēng)的最好辦法是把讀寫操作在一個(gè)VI里,LABVIEW本身就會(huì)保證任意時(shí)刻只能有一個(gè)讀寫操作.

          對(duì)于全局可讀寫變量,LABVIEW可以用內(nèi)置全局變量也可以用FUNCTION GLOBAL(我前面的文章中專門談到了FUNCTION GLOBAL 和AE的概念,可以參照一下)

          在自動(dòng)化控制領(lǐng)域,內(nèi)存共享應(yīng)用非常廣泛,對(duì)CAN總線控制卡,有雙口RAM的概念,對(duì)PLC有輸入輸出映射區(qū),實(shí)際上指的都是固定的RAM 空間,相對(duì)于計(jì)算機(jī)來說,就是一段內(nèi)存空間.

          熟悉PLC的朋友都非常清楚,PLC是采用循環(huán)掃描的方式來運(yùn)行程序的,掃描開始前,一次性地讀入外部開關(guān)的狀態(tài),存入輸入映射區(qū)中,在一次掃描程序運(yùn)行期間,它的狀態(tài)是不變的.

          我們?cè)贚ABVIEW設(shè)計(jì)控制程序時(shí),也完全可以借用這個(gè)方法,實(shí)際上很多DSC和外部設(shè)備通過OPC通訊都是采用固定間隔更新的方法.

          輸入更新(開關(guān),模擬量)--->寫入共享內(nèi)存------>程序處理------>輸出更新(讀共享內(nèi)存,繼電器,模擬量輸出,寫入硬件設(shè)備)

          LABVIEW的共享內(nèi)存是通過AE結(jié)合FUNCTIN GLOBAL實(shí)現(xiàn)的.
          我們看一下它的實(shí)現(xiàn)過程.



          首先定義了AE的四個(gè)動(dòng)作,INIT READ WRITE READALL
          然后定義的四個(gè)選擇項(xiàng),分別對(duì)應(yīng)離散輸入,線圈,輸入寄存器,保持寄存器(MODBUS定義)




          對(duì)應(yīng)四中數(shù)據(jù),分別在INIT的CASE中定義了長(zhǎng)度為65536的數(shù)組,實(shí)際上定義了四個(gè)共享內(nèi)存區(qū)

          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉