亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        分散控制系統(tǒng)中SRAM應(yīng)用

        2015-07-21 09:45:22盛華劉書剛葛樹俊
        物聯(lián)網(wǎng)技術(shù) 2015年7期

        盛華+劉書剛+葛樹俊

        摘 要:當(dāng)前DCS廣泛應(yīng)用于發(fā)電廠,但由于實(shí)時(shí)數(shù)據(jù)掉電容易丟失,缺乏帶掉電保護(hù)裝置,從而影響整個(gè)現(xiàn)場(chǎng)控制站的穩(wěn)定性和實(shí)時(shí)性,因此,在現(xiàn)場(chǎng)控制站的硬件中加入SRAM,能夠保存I/O數(shù)據(jù)和強(qiáng)制信息,并在設(shè)備重啟之后讀取保存的信息。

        關(guān)鍵詞:現(xiàn)場(chǎng)控制站;DCS;SRAM;保存信息

        中圖分類號(hào):TM72 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):2095-1302(2015)07-00-03

        0 引 言

        目前DCS廣泛應(yīng)用于電廠。它和通用的DCS系統(tǒng)一樣,按電廠運(yùn)行邏輯根據(jù)各種模擬數(shù)據(jù)量,經(jīng)過電廠運(yùn)行的邏輯實(shí)現(xiàn)對(duì)各種執(zhí)行部件的控制。不僅要實(shí)現(xiàn)準(zhǔn)確采集各種數(shù)據(jù)和正確發(fā)出控制指令等基本功能,最重要的是能對(duì)各種數(shù)據(jù)進(jìn)行分析和判斷,并執(zhí)行相應(yīng)操作。DCS在火力發(fā)電廠中的廣泛采用,大大提高了機(jī)組運(yùn)行的可靠性和經(jīng)濟(jì)性。

        但是,意外情況會(huì)導(dǎo)致現(xiàn)場(chǎng)控制站不能正常工作。DPU停止工作時(shí),而實(shí)時(shí)數(shù)據(jù)不能獲取,現(xiàn)場(chǎng)控制站重啟后,實(shí)時(shí)數(shù)據(jù)和上位機(jī)下發(fā)的強(qiáng)制信息都清零。針對(duì)這一問題,可對(duì)現(xiàn)有分散控制系統(tǒng)DCS進(jìn)行改進(jìn),在其控制板中加入SRAM。這樣當(dāng)現(xiàn)場(chǎng)控制站重啟時(shí),讀取掉電前的數(shù)據(jù)和指令既可。

        1 SRAM簡(jiǎn)介

        SRAM(Static Random Access Memory),即靜態(tài)隨機(jī)存取存儲(chǔ)器。它是一種具有靜止存取功能的內(nèi)存,不需要刷新電路即能保存它內(nèi)部存儲(chǔ)的數(shù)據(jù)。因此,在存儲(chǔ)數(shù)據(jù)方面能防止數(shù)據(jù)丟失。另外,SRAM具有較高的性能,較低的功耗,主要用于二級(jí)高速緩存,利用晶體管來存儲(chǔ)數(shù)據(jù)。對(duì)稱的電路結(jié)構(gòu)以及SRAM可以一次接收所有的地址位,使得SRAM的訪問速度要快于DRAM,DRAM采用的是行地址和列地址復(fù)用的結(jié)構(gòu)?,F(xiàn)將它的特點(diǎn)歸納如下:

        (1)優(yōu)點(diǎn):速度快,不必配合內(nèi)存刷新電路,可提高整體的工作效率。

        (2)缺點(diǎn):集成度低,掉電能保存數(shù)據(jù),功耗較大,相同的容量體積較大,而且價(jià)格較高,少量用于關(guān)鍵性系統(tǒng)以提高效率。

        2 設(shè)計(jì)原理

        昭營(yíng)主板VDX-6358RD的SRAM是掛載到ISA總線上的,地址總線占據(jù)A0~A14,尋址空間為32 K,通過GP3口的高四位尋址A15~A18。這樣就可以實(shí)現(xiàn)尋址512 K大小的SRAM。ISA總線通過配置GPCS1,配置ISA的空間地址0Xd8000。

        3 安全控制器的實(shí)現(xiàn)

        在安全控制器實(shí)現(xiàn)過程中,主要考慮數(shù)據(jù)結(jié)構(gòu),以及在SRAM中的存儲(chǔ)。安全控制器主要包括兩部分?jǐn)?shù)據(jù)存儲(chǔ):IO卡件和SAMA組態(tài)的數(shù)據(jù)。存儲(chǔ)到SRAM中采用的數(shù)據(jù)結(jié)構(gòu)分為三部分:幀頭、數(shù)據(jù)、幀尾。如表1所列。

        表 1 數(shù)據(jù)結(jié)構(gòu)

        幀頭 數(shù)據(jù) 幀尾

        16字節(jié) N字節(jié) 4字節(jié)

        幀頭包含類型、保留、模塊總數(shù)、總數(shù)據(jù)長(zhǎng)度。如表2所列。

        表2 幀頭組成及各部分長(zhǎng)度

        類型 保留 模塊總數(shù) 總數(shù)據(jù)長(zhǎng)度

        4字節(jié) 4字節(jié) 4字節(jié) 4字節(jié)

        數(shù)據(jù)部分包含四部分:模塊類型、模塊ID、模塊長(zhǎng)度、模塊數(shù)據(jù)。在模塊類型中,2015代表IO卡件,2014代表SAMA組態(tài)。如表3所列。

        表 3 數(shù)據(jù)部分的構(gòu)成

        模塊類型 模塊ID 模塊長(zhǎng)度 模塊數(shù)據(jù)

        2字節(jié) 4字節(jié) 2字節(jié) N字節(jié)

        為了方便后期驗(yàn)證設(shè)置:幀尾數(shù)據(jù) = 總數(shù)據(jù)長(zhǎng)度|數(shù)據(jù)類型。

        4 SRAM讀寫操作

        需要定義的變量如下:

        void *Sram_Data_Buffer; //Sram數(shù)據(jù)緩沖區(qū)

        void *Sram_Data_Pointer; //Sram數(shù)據(jù)指針

        short Sram_point_type; //Sram數(shù)據(jù)類型

        unsigned int Sram_buf_len; //Sram數(shù)據(jù)緩沖區(qū)長(zhǎng)度

        unsigned int sram_data_len; //Sram數(shù)據(jù)長(zhǎng)度

        unsigned char sram_cur_page; //Sram當(dāng)前頁

        unsigned int sram_page_cur_offset; //Sram當(dāng)前頁的偏移量

        4.1 SRAM寫操作

        為了節(jié)省內(nèi)存空間,又要考慮整體的效率,所以,一般按照頁大小來開辟內(nèi)存空間,而開辟內(nèi)存空間大小的時(shí)候,采用的機(jī)制是要比頁的大小稍微大點(diǎn),是遍歷完一個(gè)模塊數(shù)據(jù)之后才判斷當(dāng)前數(shù)據(jù)長(zhǎng)度是否大于頁的大小,如果開辟太小則有可能會(huì)溢出。

        比如在遍歷下一個(gè)模塊的時(shí)候,Sram_buf_len 已經(jīng)是接近頁的大小,但還是小于頁的大小,此時(shí)在遍歷下一個(gè)模塊的時(shí)候,Sram_buf_len已經(jīng)是大于頁的大小了,如果開辟的空間太小,進(jìn)程就會(huì)崩潰。因此在寫操作的時(shí)候,要時(shí)刻注意當(dāng)前頁,及當(dāng)前頁的偏移量。

        寫數(shù)據(jù)的流程如下:

        (1)判斷數(shù)據(jù)長(zhǎng)度是否超過剩余空間的大小。

        sram_addr = sram_cur_page*SRAM_PAGE_SIZE +sram_page_cur_offset+buff_len;

        page = sram_addr/SRAM_PAGE_SIZE;

        offset = sram_addr%SRAM_PAGE_SIZE;

        if((page>15)||((page== 15)&&(offset>0)))

        {

        page = 0;

        sram_page_cur_offset = 16;

        sram_cur_page = 0;

        return 1;

        }

        當(dāng)前地址+要寫的數(shù)據(jù)長(zhǎng)度是否超過了剩余空間,超過提示錯(cuò)誤信息,否則進(jìn)行下一步。

        (2)判斷要寫的數(shù)據(jù)是否大于當(dāng)前頁剩余的空間,如果大于當(dāng)前頁剩余的空間,則先寫當(dāng)前頁,之后再寫剩下的數(shù)據(jù)。因?yàn)樯婕暗巾摰牟僮?,所以寫完?dāng)前頁之后,再計(jì)算剩余數(shù)據(jù)需要占用的空間,先寫頁,再寫小于頁的數(shù)據(jù)。

        if(buff_len > offset) //判斷要寫的數(shù)據(jù)是否大于當(dāng)前頁剩余空間

        {

        //當(dāng)前頁剩余量

        or(j = 0;j

        {

        pointer = MK_FP(base,sram_page_cur_offset);

        *pointer = *((unsigned char *)Sram_Data_Pointer);

        Sram_Data_Pointer= (unsigned char *)Sram_Data_Pointer+1;

        sram_page_cur_offset=sram_page_cur_offset+1;

        }

        //指向下一頁

        sram_page_cur_offset = 0;

        sram_cur_page =sram_cur_page+1;

        sram_set_page(sram_cur_page);

        buff_len = buff_len - offset;

        page = buff_len/SRAM_PAGE_SIZE;

        offset = buff_len%SRAM_PAGE_SIZE;

        //寫頁

        for(i = 0;i

        {

        for(j = 0;j

        {

        pointer= MK_FP(base, sram_page_cur_offset);

        *pointer = *((unsigned char *)Sram_Data_Pointer);

        Sram_Data_Pointer=(unsigned char*)sram_Data_Pointer+1;

        sram_page_cur_offset=sram_page_cur_offset+1;

        }

        sram_page_cur_offset = 0;

        sram_cur_page =sram_cur_page+1;

        sram_set_page(sram_cur_page);

        {

        //寫剩余的字節(jié)

        for(j = 0;j

        {

        pointer = MK_FP(base,sram_page_cur_offset);

        *pointer = *((unsigned char *)Sram_Data_Pointer);

        Sram_Data_Pointer= (unsigned char *)Sram_Data_Pointer+1;

        sram_page_cur_offset=sram_page_cur_offset+1;

        }

        }

        如果要寫的數(shù)據(jù)小于或者等于當(dāng)前頁,則直接寫數(shù)據(jù)。

        for(j = 0;j

        {

        pointer = MK_FP(base,sram_page_cur_offset);

        *pointer = *((unsigned char *)Sram_Data_Pointer);

        Sram_Data_Pointer=(unsigned char *)Sram_Data_Pointer+1;

        sram_page_cur_offset=sram_page_cur_offset+1;

        }

        4.2 SRAM讀操作

        (1)根據(jù)讀取數(shù)據(jù)大小開辟內(nèi)存空間。

        Sram_Read_Buffer= (char *)malloc(DataLen);//one page size

        if(Sram_Read_Buffer == NULL)

        {

        printf("Ana_Sram:sama Unable to malloc Sram_Data_Buffer\n");

        return 1;

        }

        RecvPointer = (char *)Sram_Read_Buffer;

        cur_page = (sram_sama_starter_addr+16)/SRAM_PAGE_SIZE;

        cur_offset = (sram_sama_starter_addr+16)%SRAM_PAGE_SIZE;

        sram_set_page(cur_page);

        (2)如果讀取數(shù)據(jù)小于當(dāng)前頁剩余數(shù)據(jù),則直接讀取。

        for(i = 0;i

        {

        Sram_read_pointer_char = MK_FP(sram_base, cur_offset);

        *(char *)RecvPointer = *Sram_read_pointer_char;

        RecvPointer=(char *)RecvPointer+ sizeof(char);

        cur_offset =cur_offset+1;

        }

        (3)如果讀取數(shù)據(jù)大于當(dāng)前頁剩余數(shù)據(jù),則讀取當(dāng)前頁剩余數(shù)據(jù),之后在計(jì)算剩余數(shù)據(jù)占據(jù)的空間大小,分頁讀取。

        if(DataLen>offset)

        {

        //讀取當(dāng)前頁剩余數(shù)據(jù)

        for(i = 0;i

        {

        Sram_read_pointer_char = MK_FP(sram_base, cur_offset);

        *(char *)RecvPointer = *Sram_read_pointer_char;

        RecvPointer=(char *)RecvPointer+ sizeof(char);

        cur_offset =cur_offset+1;

        }

        //計(jì)算剩余數(shù)據(jù)占用空間

        cur_page = cur_page+1;

        cur_offset = 0;

        sram_set_page(cur_page);

        page = (DataLen -offset )/SRAM_PAGE_SIZE;

        offset = (DataLen-offset)%SRAM_PAGE_SIZE;

        //分頁讀取數(shù)據(jù)

        for( i = 0;i

        {

        for(j = 0;j

        {

        Sram_read_pointer_char = MK_FP(sram_base, cur_offset);

        *(char *)RecvPointer = *Sram_read_pointer_char;

        RecvPointer=(char *)RecvPointer+ sizeof(char);

        cur_offset =cur_offset+1;

        }

        cur_page = cur_page +1;

        cur_offset = 0;

        sram_set_page(cur_page);

        }

        for(i = 0;i

        {

        Sram_read_pointer_char = MK_FP(sram_base, cur_offset);

        *(char *)RecvPointer = *Sram_read_pointer_char;

        RecvPointer=(char *)RecvPointer+ sizeof(char);

        cur_offset = cur_offset+1;

        }

        }

        5 SRAM讀寫測(cè)試

        在QNX MomenticsIDE 6.5環(huán)境下,利用C語言編寫測(cè)試程序,測(cè)試如下:

        (1)讀操作,讀取地址458 752,讀標(biāo)志位(0),讀取數(shù)據(jù)為00 00 ff 00 ff ff 00 ff ff ff 00 ff ff ff ff 00。

        (2)寫操作,向地址458 752寫入數(shù)據(jù),寫標(biāo)志位(1),寫入數(shù)據(jù)為aa 55 aa 55 aa 55 aa 55 aa55 00 00 00 00 00 00。

        (3)斷電讀取數(shù)據(jù),讀取地址458 752,讀標(biāo)志位(0),讀取數(shù)據(jù)為aa 55 aa 55 aa 55 aa 55 aa55 00 00 00 00 00 00。

        通過測(cè)試,可對(duì)SRAM進(jìn)行正常的讀寫操作,掉電后仍能正確讀取數(shù)據(jù),達(dá)到設(shè)計(jì)的最終目的。測(cè)試結(jié)果如圖1所示。

        圖1 SRAM測(cè)試

        6 結(jié) 語

        在分散控制系統(tǒng)DCS中加入SRAM,防止現(xiàn)場(chǎng)控制站由于意外情況而停止工作,因而造成數(shù)據(jù)的丟失。設(shè)備重啟之后,上次的操作信息會(huì)重啟讀取,各個(gè)模塊的I/O數(shù)據(jù)及其SAMA組態(tài)信息都將保存在SRAM中,不會(huì)因?yàn)閿嚯姸鴣G失,減少了操作人員的工作量,有利于工作人員對(duì)設(shè)備進(jìn)行維護(hù)。

        參考文獻(xiàn)

        [1]姚其爽,張昭勇,張盛兵.嵌入式靜態(tài)隨機(jī)存儲(chǔ)器的低功耗設(shè)計(jì)[J].科學(xué)技術(shù)與工程,2007,7(8):1781-1785.

        [2]方海濤.高速低功耗嵌入式SRAM的設(shè)計(jì)[D].武漢:華中科技大學(xué),2012.

        [3]周全.高速低功耗SRAM的設(shè)計(jì)與實(shí)現(xiàn)[D].長(zhǎng)沙:國(guó)防科學(xué)技術(shù)大學(xué),2013.

        [4]周清軍,劉紅俠,吳笑峰,等.嵌入式SRAM的優(yōu)化修復(fù)方法及應(yīng)用[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2008,20(10):1276-1281.

        [5]吳殿紅.基于8086的SRAM讀寫控制仿真實(shí)現(xiàn)[J].信息通信,2014(2):65-66.

        亚洲国产综合久久天堂| 久久久久一| 女同av免费在线播放| 东北熟妇露脸25分钟| 亚洲精品国偷拍自产在线观看| 麻豆乱码国产一区二区三区| 国产精品欧美视频另类专区| 精品国产一区二区三区a| 亚洲av午夜福利精品一区| 亚洲熟妇无码av另类vr影视| 99成人无码精品视频| 国产在线观看一区二区三区av| 亚洲精品成人无限看| 久久精品国产亚洲一区二区| 亚洲日本在线va中文字幕| 亚洲最大不卡av网站| 成人免费看aa片| 欧美性猛交xxxx黑人| 国产在线观看精品一区二区三区 | 牛仔裤人妻痴汉电车中文字幕| 亚洲国产精品无码一线岛国| 色欲av自慰一区二区三区| 麻豆密入视频在线观看| 日韩激情视频一区在线观看| 国产av无码国产av毛片| 曰本女人与公拘交酡免费视频| AV在线毛片| 与漂亮的女邻居少妇好爽| 男女上下猛烈啪啪免费看| 夜夜被公侵犯的美人妻| 久久精品国产亚洲av沈先生| 国产私人尤物无码不卡| 亚洲碰碰人人av熟女天堂| 久久国产亚洲中文字幕| 亚洲悠悠色综合中文字幕| 国产97在线 | 中文| 在线成人tv天堂中文字幕| 青青久在线视频免费视频| 亚洲精品www久久久| 亚洲男人的天堂精品一区二区| 久久国产精品精品国产色|