在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

            作者: 時間:2017-01-09 來源:網(wǎng)絡(luò) 收藏
            在C語言中,可以采用文件映射的方法,開辟一段內(nèi)存空間,各個進程和線程可以利用這段共享內(nèi)存空間進行數(shù)據(jù)交換,也就是寫讀操作,這里涉及到一個控制權(quán)限的問題,任何時刻,只能允許一個線程或者進程對內(nèi)存空間進行操作,看一段代碼,是通過API實現(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如果想動態(tài)申請內(nèi)存只能通過DLL或者CIN來實現(xiàn),LABVIEW本身又不支持指針操作,實現(xiàn)非常困難,不過我們可以通過數(shù)組來實現(xiàn)內(nèi)存的分配.

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

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

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

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

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

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

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



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




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

            上一頁 1 2 下一頁

            評論


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

            關(guān)閉