亚洲免费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 | 粉嫩小泬无遮挡久久久久久| 国产女人乱码一区二区三区| 精品亚洲国产成人蜜臀av| 67194熟妇在线永久免费观看| 国产精品 精品国内自产拍| 国产精品午夜福利亚洲综合网| 色欲色香天天天综合网www| 国产精品无码av一区二区三区| 无码av免费永久免费永久专区| 亚洲码无人客一区二区三区| 午夜秒播久久精品麻豆| 性一交一乱一乱一视频| 久久这里只精品国产2| 好看的中文字幕中文在线| 欧洲成人一区二区三区| 亚洲精品国产福利一二区| 精品一区二区三区影片| 国产精品亚洲综合久久系列| 亚洲国产成人精品无码区在线秒播| 亚洲精品无码人妻无码| 精品久久久无码不卡| 伊人久久大香线蕉av色婷婷色| 亚洲熟妇av日韩熟妇在线| 亚洲AV伊人久久综合密臀性色| 日本免费三片在线播放| 视频一区视频二区制服丝袜| 国产在线精品一区二区三区不卡| 亚洲AV无码一区二区一二区教师| 久久精品中文字幕有码| 亚洲熟女乱综合一区二区| 久久久亚洲欧洲日产国产成人无码| 国产一区二区三区不卡在线播放 | 精品十八禁免费观看| 成人短篇在线视频夫妻刺激自拍| 欧美xxxxx高潮喷水| 中出内射颜射骚妇|