5 4 保護設定值資料模型介面

2021-10-05 08:11:29 字數 2986 閱讀 9923

我新換一部智慧型手機後,一般會忍不住將所有設定選單功能體驗一遍,雖然設定層層疊疊,但能將手機設定成自己喜歡的樣子還是頗有成就感的。

類同智慧型手機,微機保護等工業產品隨著各種功能的增加,各種各樣的設定也變得繁雜起來。微機保護產品有很多態別的設定值,如遙測越限值,如裝置通訊狀態等,但其中有一類設定值比較特殊,就是保護功能相關設定值,我們團隊習慣稱之為保護設定值。

保護設定值用於配置保護功能,如過流保護有兩個最基本的設定值:過流設定值iset和時間設定值t,如下圖所示。

當電流ia大於設定值iset,且保持時間超過t時,過流保護觸發,然後驅動出口繼電器跳開電力斷路器,切除故障。

相比於其他設定值,保護設定值有一些特殊性:

保護設定值必須整體修改,如過流保護將iset和t兩個定值分開逐個修改,就有可能導致保護裝置誤動作。保護功能是強實時模組,是通過中斷觸發,而應用模組內定值是乙個個依次寫入的,如在多個寫入之間觸發保護邏輯,就有可能誤動作。

定值修改過程中需要暫時閉鎖保護功能,相當於一段時間內電力裝置在無防護的狀態下執行,因此必須將該過程壓縮到小於裝置帶故障執行時間(一般以ms計)。但不管是通過液晶修改設定值,還是通過維護軟體修改設定值,其過程都比較長。

隨著微機保護整合的功能越來越多,設定值數量也在持續增加,不僅給使用者帶來了使用負擔,規約傳輸時也經常要分多幀傳輸。

設定值對安全性、完整性等要求很高。

為了保證保護設定值能在短時間內整體寫入,必須增加中間緩衝區,且將所有的讀寫操作都基於緩衝區,最後階段,在閉鎖保護功能的前提下將整個緩衝區整體寫入。

假設有一規約物件,需要完成上述功能,大概需要如下幾部分**邏輯:

初始化時刻開闢緩衝區,緩衝區大小可以通過讀取設定值個數apisettingcount()獲取。

dword dwsize = sizeof(float) * apisettingcount() + 4;		/* +4,儲存crc校驗碼 */

float *psettingbuf = (float*)hwmalloc(dwsize, hw_malloc_normal);

遠傳設定值不需要用到緩衝區,可以直接基於序號讀取。

dword dwcount = apisettingcount();

for (i = 0; i < dwcount; i++)

寫操作比較麻煩,可能接受到的定值可能不完整(大部分情況下使用者僅修改部分設定值),也可能因為改寫定值較多需要分多幀傳輸,而且還需要在定值傳輸完畢後,將整個緩衝區寫入。**示例如下:

/* 如果接受是第一幀,首先用預設值填充緩衝區 */

if (bfirst)

/* 將接受到的定值寫入緩衝區相應位置 */

for (;;)

.../* 如果是最後一幀,需要執行定值投入操作 */

if (bend)

如果是液晶設定值修改介面,基本流程同規約物件,也需要構建緩衝區,唯獨讀操作存在差異。規約物件的讀和寫是完全分離的,而通過液晶介面修改定值時,讀和寫操作都必須基於緩衝區,不然會導致剛寫的定值讀不出來。

現在來細細分析上述**示例,我們很容易發現一些不舒服的地方,如:

每個規約和液晶物件都需要分配一塊緩衝區,考慮定值和規約數量都比較多,對於記憶體是稀缺資源的工業嵌入式裝置是奢侈的行為。

各應用模組重複一些列關於緩衝區的操作,**冗餘。

同步問題,規約修改緩衝區過程中,液晶可能在同時修改定值。

緩衝區的管理缺失,如果通訊意外中斷,原有緩衝區中的髒資料如何處理。

很多問題在別處可能已經有了答案。為了進一步提煉優化保護設定值的介面,我們引入了資料庫中的「事務」概念,將對緩衝區的操作全部內化到介面函式內部。此時,關鍵的幾個介面函式如下:

/*

* description: 啟動定值讀寫事務

* input:

* dword dwtimeout: 超時,在超時時間內如沒有讀寫操作,事務自動撤銷。

* return: 成功返回true,否則返回false

* others: 為了防止系統鎖死,超時有最大限制,不允許無窮等待。為了防止事務被取消,需增加讀寫操作。

*/bool apisettingstart(dword dwtimeout);

/* * description: 讀取單個定值

* input:

* dword dwindex: 定值索引

* return: 成功返回定值,否則返回0.0f

* others: 如包含在事務內時,讀取事務內定值,否則讀取真實定值。

*/float apisettingget(dword dwindex);

/* * description: 改寫單個定值

* input:

* dword dwindex: 定值索引

* float fsetting: 改寫定值

* return: 成功返回true,否則返回false

* others: 必須包含在事務內,否則失敗。寫定值內部會進行邊界判斷,失敗返回false。

*/bool apisettingset(dword dwindex, float fsetting);

/* 定值事務提交 */

bool apisettingcommit(void);

/* 定值事務撤銷 */

void apisettingcancel(void);

借助於事務概念介面,各應用程式立馬簡潔了很多,而且事務介面額外提供了一種互斥策略,假如規約正在修改定值,液晶介面想去修改定值,事務請求會直接失敗返回。

在微機保護裝置內部,很多簡單模組的介面提煉過程都非常類似保護設定值,先分析彙總各應用模組相關功能流程,然後「切」出最佳邊界。當然需求可能會持續變化,介面也會持續成長,然後慢慢收斂並穩定下來。

返回目錄

mysql 查詢設定值 MYSQL資料查詢

1.單錶查詢 1.1 選擇表中的若干列 選擇表中的全部或部分列即關係代數中的投影運算。1 查詢指定的列 2 查詢全部列 3 查詢經過計算的值 select子句的 不僅可以是表中的屬性列,也可以是表示式 字串常量 函式等 1.2 選擇表中的若干元組 1 消除取值重複的行 select sno from...

select2 ajax獲取資料設定預設值,初始值

select2是乙個非常好用的select美化外掛程式,但是在最近使用時發現,select2在使用ajax獲取資料內容時設定預設值非常麻煩,官方給出了乙個解決方案就是新增乙個屬性selected的option 如果select的value值和text都已知的情況下,這種解決方案使用起來就非常容易而且...

django之十三 通過pk值手動設定資料表主鍵

通過django框架的model層來新增資料庫表時,如果在需要新增的表字段裡任何乙個表字段都沒設定主鍵,框架會預設新增乙個表字段id並把該表字段id設定為主鍵。那麼,如果我們想自己動手設定其中乙個新增的表字段a為主鍵,需要在這表字段a所對應呼叫的方法裡加個引數primary key且引數primar...