新聞中心

        EEPW首頁 > 測試測量 > 設計應用 > labview編程技巧-----如何實現內存空間共享

        labview編程技巧-----如何實現內存空間共享

        作者: 時間:2017-01-09 來源:網絡 收藏
        在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("%sn",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的數組,實際上定義了四個共享內存區

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 耿马| 云梦县| 阿坝县| 望城县| 石屏县| 三穗县| 麻栗坡县| 临颍县| 丰镇市| 突泉县| 南阳市| 扶沟县| 德昌县| 裕民县| 镇坪县| 普定县| 通山县| 庐江县| 兰西县| 延吉市| 冀州市| 临高县| 东阿县| 普兰店市| 潢川县| 宁河县| 通海县| 全南县| 新疆| 长沙市| 嘉荫县| 威远县| 东城区| 白山市| 天等县| 赫章县| 洪洞县| 松溪县| 阜宁县| 金山区| 安溪县|