在大多數工控應用中,由于各種復雜的環境因素,使工控設備不可避免的會面臨供電突然斷掉的情況。在許多應用場合,需要保存一部分現場數據,以保證工控設備在供電回復后能繼續正常運行。為了保證保存數據的實時性,除了已保存的數據不受掉電影響的基本特性外,現場數據的存儲頻率還會非常高,因此還要求數據保存的速度應足夠快,從而不影響應用程序的正常運行。本文的主要目的是分析現場數據保護的若干手段,并重點介紹英創工控主板特有的小數據高速存儲方案,以支持關鍵現場數據的備份。
本文所指的英創工控主板包括EM9160、EM9260、EM9360以及EM9161這4個產品線的所有型號的產品。這些主板均帶有大容量的NandFlash存儲器,作為非易失性存儲器,NandFlash主要用于存儲應用程序、歷史數據備份等內容。盡管NandFlash也可以作為現場數據保護的存儲介質,但考慮到NandFlash介質有一定的擦寫壽命限制,且數據是按扇區(512字節或2K字節)為單位寫入,因此還存在寫入效率較低的問題,因此基于NandFlash的文件系統存儲不是作為現場數據保護的最佳方案。
對幾十到幾百個字節的現場數據的保存,一個比較好的辦法是外擴一片NVRAM,典型的芯片可以考慮鐵電存儲器。有關鐵電存儲器的具體應用,客戶可以參考《工控主板支持鐵電存儲器的簡易方案》一文。在英創工控主板,鐵電存儲器的寫入速度為56KB/s,即寫入一個字節的時間在18us的水平。采用鐵電存儲器或其它NVRAM的優點是存儲的數據量沒有限制,但前提是需要增加一定的硬件成本,這可能成為一些大批量應用,對成本極其敏感的設備的障礙。
針對需要保存的現場數據通常很少這一特點,同時又能避免客戶設備為了現場數據保存功能而增加額外的成本開銷,我們通過優化工控主板的內核,為應用程序提供了最大6個字節、帶掉電保護功能的高速存儲空間,用于對關鍵現場數據的備份。由于這6個字節在系統內部,其寫入速度高達1.5MB/s以上,即寫入一個字節的時間在0.6us水平,6個字節的寫入時間為3.6us。幾微秒的存儲時間可完全保證系統應用線程的正常運行。應用程序可通過3個系統調用來實現現場數據的讀寫,它們是:
1、檢查當前存儲的數據是否有效
//
// return = TRUE: data stored in NVRAM is valid
// = FALSE: data stored in NVRAM is corrupted or data is unavailable
//
BOOL NVRAMQuery()
{
BOOL bGoodData;
DWORD dwOutBufSize;
DWORD dwReturnBytes = 0;
BOOL bRet;
bGoodData = FALSE;
dwOutBufSize = sizeof(BOOL);
bRet = KernelIoControl(IOCTL_EM9X60_NVRAM_BYTE_QUERY, NULL, 0, (LPVOID)&bGoodData, dwOutBufSize, &dwReturnBytes);
if(bRet)
{
if(!bGoodData)
{
bRet = FALSE;
}
}
return bRet;
}
2、從系統讀出1-6個字節
//
// input dwMaxLength: buffer length in byte
// output pOutBuffer: output data buffer
// return 》= 0: number of byte read from NVRAM 《= dwmaxLength
// 《 0: read failed
int NVRAMRead(LPVOID pOutBuffer, DWORD dwMaxLength)
{
DWORD dwReturnBytes = 0;
BOOL bRet;
bRet = KernelIoControl(IOCTL_EM9X60_NVRAM_BYTE_READ, NULL, 0, (LPVOID)pOutBuffer, dwMaxLength, &dwReturnBytes);
if(!bRet)
{
return -1;
}
return (int)dwReturnBytes;
}
3、向系統寫入1-6個字節
//
// input pInBuffer: input data buffer
// dwDataLength: number of byte need to write 《= 6
// return 》= 0: number of byte written into NVRAM
// 《 0: write failed
//
int NVRAMWrite(LPVOID pInBuffer, DWORD dwDataLength)
{
DWORD dwReturnBytes = 0;
BOOL bRet;
bRet = KernelIoControl(IOCTL_EM9X60_NVRAM_BYTE_WRITE, (LPVOID)pInBuffer, dwDataLength, NULL, 0, &dwReturnBytes);
if(!bRet)
{
return -1;
}
return dwReturnBytes;
}
在后續出貨的相關工控主板中,都將加上6字節掉電保護高速存儲功能。對已購買英創公司的主板產品,若需要進行關鍵現場數據保存功能的客戶,可將主板寄回英創公司進行免費更新并索取相關操作的完整源代碼。
-
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35296
發布評論請先 登錄
相關推薦
評論