• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      分散控制系統(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ù)據(jù)掉電容易丟失,缺乏帶掉電保護(hù)裝置,從而影響整個現(xiàn)場控制站的穩(wěn)定性和實時性,因此,在現(xiàn)場控制站的硬件中加入SRAM,能夠保存I/O數(shù)據(jù)和強(qiáng)制信息,并在設(shè)備重啟之后讀取保存的信息。

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

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

      0 引 言

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

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

      1 SRAM簡介

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

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

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

      2 設(shè)計原理

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

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

      在安全控制器實現(xiàn)過程中,主要考慮數(shù)據(jù)結(jié)構(gòu),以及在SRAM中的存儲。安全控制器主要包括兩部分?jǐn)?shù)據(jù)存儲:IO卡件和SAMA組態(tài)的數(shù)據(jù)。存儲到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ù)長度。如表2所列。

      表2 幀頭組成及各部分長度

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

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

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

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

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

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

      為了方便后期驗證設(shè)置:幀尾數(shù)據(jù) = 總數(shù)據(jù)長度|數(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ū)長度

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

      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)存空間大小的時候,采用的機(jī)制是要比頁的大小稍微大點,是遍歷完一個模塊數(shù)據(jù)之后才判斷當(dāng)前數(shù)據(jù)長度是否大于頁的大小,如果開辟太小則有可能會溢出。

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

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

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

      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ù)長度是否超過了剩余空間,超過提示錯誤信息,否則進(jìn)行下一步。

      (2)判斷要寫的數(shù)據(jù)是否大于當(dāng)前頁剩余的空間,如果大于當(dāng)前頁剩余的空間,則先寫當(dāng)前頁,之后再寫剩下的數(shù)據(jù)。因為涉及到頁的操作,所以寫完當(dāng)前頁之后,再計算剩余數(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ù),之后在計算剩余數(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;

      }

      //計算剩余數(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讀寫測試

      在QNX MomenticsIDE 6.5環(huán)境下,利用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。

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

      圖1 SRAM測試

      6 結(jié) 語

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

      參考文獻(xiàn)

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

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

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

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

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

      奉节县| 泸定县| 黑山县| 湘潭县| 大余县| 新昌县| 开江县| 蒲城县| 镇沅| 连山| 延长县| 喀什市| 裕民县| 墨玉县| 藁城市| 海城市| 桐庐县| 砀山县| 井冈山市| 潍坊市| 乐平市| 漳州市| 河曲县| 藁城市| 西林县| 滕州市| 抚顺县| 鄂州市| 龙井市| 泉州市| 白城市| 西安市| 吉水县| 安国市| 蒙山县| 汾阳市| 新干县| 合山市| 盐山县| 冷水江市| 喀喇沁旗|