999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于emwin圖形界面的壓力記錄儀

2020-07-01 06:40:50梁曉雄
儀器儀表用戶 2020年7期
關(guān)鍵詞:數(shù)據(jù)庫功能

黃 莉,顧 全,徐 擎,梁曉雄,范 越

(上海市計量測試技術(shù)研究院,上海 201203)

壓力記錄儀在工業(yè)現(xiàn)場中有著廣泛的應(yīng)用,其可以穩(wěn)定準(zhǔn)確地采集壓力儀表或壓力傳感器的數(shù)據(jù)值。而應(yīng)用emwin 圖形界面開發(fā)平臺與傳統(tǒng)的開發(fā)模式相比,研發(fā)更快捷方便且窗體控件顯示效果更美觀大方,是一種較好的解決方案。壓力記錄儀數(shù)據(jù)采集后需要將記錄保存至數(shù)據(jù)庫文件系統(tǒng),且對儀表自身的執(zhí)行程序進(jìn)行加密,為了便于操作者實現(xiàn)快捷記錄還應(yīng)具有屏幕截屏功能,此外壓力記錄儀可以根據(jù)外置的供電方式進(jìn)行動態(tài)的狀態(tài)顯示[1]。

1 數(shù)據(jù)庫應(yīng)用

1.1 參數(shù)配置

壓力記錄儀需要對運(yùn)行參數(shù)進(jìn)行設(shè)置和保存,為了可靠便捷地實現(xiàn)此功能,需要應(yīng)用儀表的DBF 數(shù)據(jù)庫存儲功能[2]。系統(tǒng)的配置屬性包括device 硬件接口類型,rate串口通訊波特率和check 串口通訊校驗。每一種配置包括不同的選項,硬件接口類型有MBUS、RS232、RS485、BLUETOOTH、IRDA_FAR 和BARCODE。rate 波特率包括600、1200、2400、4800 和9600。check 通訊校驗包括8 數(shù)據(jù)位1 停止位無校驗、8 數(shù)據(jù)位1 停止位奇校驗和8 數(shù)據(jù)位1 停止位偶校驗。

typedef struct {

U8 device; //硬件接口類型

U8 rate; //串口通訊波特

U8 check; //串口通訊校驗

}sSYSPARAM;

系統(tǒng)除了對sSYSPARAM 系統(tǒng)參數(shù)進(jìn)行結(jié)構(gòu)體定義之外,也對sCOMM 串口參數(shù)和sDBF 數(shù)據(jù)庫參數(shù)做了相應(yīng)的定義; 應(yīng)用DbfFieldCount 獲取數(shù)據(jù)庫的字段個數(shù)。返回大于等于0 表示獲取成功,也即指定數(shù)據(jù)庫的字段個數(shù);小于0 表示錯誤。DbfFieldGet 函數(shù)獲取當(dāng)前記錄指定字段的數(shù)據(jù)內(nèi)容。返回OK 表示獲取成功;小于0 表示錯誤。field變量是要獲取內(nèi)容的字段號,0 代表數(shù)據(jù)庫的第1 個字段。數(shù)組data 存放字段內(nèi)容的buffer。pParamDBF 是已打開數(shù)據(jù)庫的指針。data 數(shù)組中的字符串內(nèi)容隨著字段序號循環(huán)不斷地變化更新,需要調(diào)用函數(shù)Lib_atoi 將字符串轉(zhuǎn)換為整數(shù)進(jìn)行后續(xù)判斷和處理,具體的實現(xiàn)方式如下所示[3]。

int field,fieldcount; //字段數(shù)量

char data[100]; //保存數(shù)據(jù)的數(shù)組

fieldcount=DbfFieldCount(pParamDBF);

for(field=0;field

DbfFieldGet(field,data,pParamDBF);

switch(field){

case 0:

Sysparam.device=Lib_atoi(data); break;

case 1:

Sysparam.rate=Lib_atoi(data); break;

case 2:

Sysparam.check=Lib_atoi(data);break;

}

}

上述的配置參數(shù)設(shè)置以后需要進(jìn)行保存,以避免操作者下次使用需要重新設(shè)置的麻煩。壓力記錄儀的操作方式有觸屏操作和機(jī)械按鍵,兩種交互方式都可以實現(xiàn)配置參數(shù)的保存。數(shù)據(jù)庫函數(shù)DbfGotoRecord 可以定位到數(shù)據(jù)庫的某一條記錄。返回DBF_OPER_OK 表示成功,其它值表示失敗(小于0)。其中,第1 個參數(shù)record 是記錄位置,0代表第1 條數(shù)據(jù)庫記錄;第2 個參數(shù)dbf 是已打開數(shù)據(jù)庫的指針。首先,將數(shù)據(jù)庫定位在初始記錄的位置;然后,用Lib_sprintf 函數(shù)將各種數(shù)據(jù)類型的數(shù)據(jù)格式化后輸出到data 字符串中;最后,調(diào)用DbfFieldSet 函數(shù)設(shè)置當(dāng)前記錄指定字段的數(shù)據(jù)內(nèi)容。如下述代碼將不同控件的當(dāng)前的顯示內(nèi)容保存至數(shù)據(jù)庫0 和1 的字段中[4]。

WM_HWIN hObj; //定義句柄

char data[20]; //定義數(shù)據(jù)數(shù)組

DbfGotoRecord(0,pParamDBF); //定位數(shù)據(jù)庫記錄

hObj = WM_GetDialogItem(hDlg,

GUI_ID_DROPDOWN0);

Lib_sprintf(data,"%d",GetSel(hObj)); //格式化

DbfFieldSet(0,data,pParamDBF); //保存字段數(shù)據(jù)

hObj = WM_GetDialogItem(hDlg,

GUI_ID_DROPDOWN1);

Lib_sprintf(data,"%d", GetSel(hObj)); //格式化

DbfFieldSet(1,data,pParamDBF); //保存字段數(shù)據(jù)

1.2 數(shù)據(jù)保存

DbfOpen 函數(shù)打開1 個數(shù)據(jù)庫。當(dāng)成功打開后,當(dāng)前記錄置于第1 條記錄(記錄號為0)。第1 個參數(shù)為數(shù)據(jù)庫名;第2 個參數(shù)用于存放打開數(shù)據(jù)庫的指針。操作時需先聲明DBF 結(jié)構(gòu)并傳遞其地址進(jìn)來,后續(xù)的數(shù)據(jù)庫操作也調(diào)用此指針。如果打開數(shù)據(jù)庫異常,則應(yīng)用DbfCreate 函數(shù)創(chuàng)建給定的名字和字段信息的數(shù)據(jù)庫dbf 文件。保證數(shù)據(jù)庫存在的前提下DbfRecordAppend 函數(shù)在打開的數(shù)據(jù)庫后面新增1 條記錄,并切換記錄位置到新增的記錄。DbfFieldSet函數(shù)是設(shè)置當(dāng)前記錄指定字段的數(shù)據(jù)內(nèi)容[5]。第1 個參數(shù)是要設(shè)置內(nèi)容的字段號,0 代表數(shù)據(jù)庫的第1 個字段。第2個參數(shù)代表存放字段內(nèi)容的buffer;第3 個參數(shù)代表已打開數(shù)據(jù)庫的指針,如下述代碼所示在pParamDBF 數(shù)據(jù)庫的0、1、2 和3 字段內(nèi)分別寫入0、3、0 和1。

pBaseDBF=&BaseDBF; //初始化

pParamDBF=&ParamDBF; //初始化

if(DbfOpen("param.dbf",&ParamDBF)!=0){

DbfCreate("param.dbf",7,(S8**)fieldname,fiel dsize);

DbfOpen("param.dbf",&ParamDBF);

DbfRecordAppend(pParamDBF);

DbfFieldSet(0,"0",pParamDBF);

DbfFieldSet(1,"3",pParamDBF);

DbfFieldSet(2,"0",pParamDBF);

DbfFieldSet(3,"1",pParamDBF);

}

2 通訊與加密

壓力記錄儀需要通過串口(RS232、RS485 或MBUS)采集連接設(shè)備的實時數(shù)據(jù)值,在協(xié)議處理的過程中需要調(diào)用數(shù)據(jù)轉(zhuǎn)換函數(shù)Ascii2Hex(S8 *O_data, U8 *N_data, int len) 和Hex2Ascii(U8 *O_data, S8 *N_data, int len) 以 實現(xiàn)HEX 和ASCII 字符的自由轉(zhuǎn)換,并調(diào)用和校驗函數(shù)CheckPackageSum(U8* data)對數(shù)據(jù)完整性進(jìn)行判斷。而除了通訊采集功能之外,保證設(shè)備的加密運(yùn)行也是關(guān)鍵的儀表功能。ProgramLock 函數(shù)用于加密程序,用戶利用該函數(shù)控制程序可以在某一個或者某一類機(jī)器上運(yùn)行,如果不符合要求,程序?qū)⒉粓?zhí)行,系統(tǒng)將自動重啟。第1 個參數(shù)為程序密碼,可以通過通信軟件設(shè)置在機(jī)器里面,這樣程序可以運(yùn)行在一批相同程序密碼的機(jī)器。為 NULL 空時不檢測,密碼最多30 個字符。通信管理器→系統(tǒng)菜單→切換到管理模式→參數(shù)設(shè)定→設(shè)置機(jī)器密碼下拉選擇“運(yùn)行指定程序密碼”→輸入密碼→點擊“設(shè)置程序密碼”。第2 個參數(shù)如果不為NULL,則必須運(yùn)行在指定的機(jī)器。不為NULL且參數(shù)不對時,屏幕會給出機(jī)器編碼,填入后重新編譯生成程序[6,7]。

int main(void){

U8 key;

LcdClear();

ProgramLock("12345",NULL);

while(1){

LcdPutString("Hello......",0,16);

key = KeyWait();

if(key == KEY_ESC) break;

}

return 0;

}

3 屏幕截圖

壓力記錄儀的屏幕截圖功能,需要進(jìn)行截圖按鍵功能關(guān)聯(lián)和液晶顯示。LcdPutString 在當(dāng)前位置顯示字符串。第1 個參數(shù)是要顯示的字符串;第2 個參數(shù)是顯示模式(0 反顯,1 正常,2 嵌入并反顯,3 嵌入并正常顯示);第3 個參數(shù)是字體大小,可選16、12、8 等大小。

void Bmp24Bit(void){

S8 name[32];

memset(name,0,sizeof(name));

RtcGetTimeString(name);

name[2]='_'; name[5]='_';

strcat(name,".bmp");

LcdSaveToBmp24Bit(name);

//以當(dāng)前時間為文件名,保存當(dāng)前顯示屏

}

RtcGetTimeStrin 獲取時間字符串,返回的時間格式為“13:08:08”,SetKeyFuntion 函數(shù)是設(shè)置F1,F(xiàn)2,F(xiàn)n 按下后默認(rèn)調(diào)用的函數(shù)。F1 系統(tǒng)默認(rèn)為鍵盤背光功能,F(xiàn)2 默認(rèn)為液晶背光調(diào)節(jié)功能,F(xiàn)n 在EDIT,MULTIEDIT 控件在獲取焦點時,按下默認(rèn)調(diào)用中文輸入功能,但是操作者可以針對性調(diào)整上述按鍵對應(yīng)的函數(shù)功能,如下述代碼所示將F1 鍵值設(shè)置為Bmp24Bit()截圖函數(shù)[8]。

int main( void ){

圖1 電池電量手繪效果圖Fig.1 Hand-drawn renderings of battery power

int count=0;

LcdClear();

LcdPutString("截圖功能,按F1 截圖",1,16);

SetKeyFuntion(Bmp24Bit,GUI_KEY_F1);

while(KeyWait()!=KEY_ESC)

{

LcdMoveto(0,20);

LcdPrintf(1,16,"按鍵次數(shù):%d",++count);

}

}

4 電池電量

壓力記錄儀具有220V 交流供電和直流電池供電,交流供電時電量指示為滿格狀態(tài),直流電池供電時根據(jù)電路ADC 測量的電壓值顯示不同的電量狀態(tài)。將電池電壓值分為6 個檔位,分別對應(yīng)6 個數(shù)組并對數(shù)組顯示效果做如圖1 所示的設(shè)置,acFontBatter_16_0 為剩余電池電量最低值,acFontBatter_16_5 為電量最高值,中間的_1、_2、_3 和_4分別對應(yīng)不同的電池電量效果,如下所示:

const GUI_CHARINFO GUI_FontBatter_16_CharInfo[] = {

{ 16, 16, 2, (void GUI_CONST_STORAGE *)&acFontBatter_16_0},/*0*/

{ 16, 16, 2, (void GUI_CONST_STORAGE *)&acFontBatter_16_1},/*1*/

{ 16, 16, 2, (void GUI_CONST_STORAGE *)&acFontBatter_16_2},/*2*/

{ 16, 16, 2, (void GUI_CONST_STORAGE *)&acFontBatter_16_3},/*3*/

{ 16, 16, 2, (void GUI_CONST_STORAGE *)&acFontBatter_16_4},/*4*/

{ 16, 16, 2, (void GUI_CONST_STORAGE

*)&acFontBatter_16_5},/*5*/

};

在獲取窗體上控件的句柄后,根據(jù)實測的電池電壓值顯示不同的數(shù)組圖形,以得到刷新電池電量的效果。

5 結(jié)論

本文闡述了應(yīng)用emwin 平臺實現(xiàn)壓力記錄儀的研發(fā)過程。壓力記錄儀可以實現(xiàn)數(shù)據(jù)庫記錄保存,可執(zhí)行程序加密,屏幕截圖和電池電量動態(tài)顯示等功能,且具備較好的人機(jī)交互效果。經(jīng)測試,壓力記錄儀可以穩(wěn)定高效地實現(xiàn)壓力儀表或壓力傳感器的數(shù)據(jù)采集和參數(shù)設(shè)置,達(dá)到了預(yù)期的設(shè)計效果。

猜你喜歡
數(shù)據(jù)庫功能
也談詩的“功能”
中華詩詞(2022年6期)2022-12-31 06:41:24
關(guān)于非首都功能疏解的幾點思考
數(shù)據(jù)庫
財經(jīng)(2017年15期)2017-07-03 22:40:49
數(shù)據(jù)庫
財經(jīng)(2017年2期)2017-03-10 14:35:35
懷孕了,凝血功能怎么變?
媽媽寶寶(2017年2期)2017-02-21 01:21:24
“簡直”和“幾乎”的表達(dá)功能
數(shù)據(jù)庫
財經(jīng)(2016年15期)2016-06-03 07:38:02
數(shù)據(jù)庫
財經(jīng)(2016年3期)2016-03-07 07:44:46
數(shù)據(jù)庫
財經(jīng)(2016年6期)2016-02-24 07:41:51
中西醫(yī)結(jié)合治療甲狀腺功能亢進(jìn)癥31例
主站蜘蛛池模板: 婷婷久久综合九色综合88| 欧美在线精品一区二区三区| 一级在线毛片| 欧美一区二区福利视频| 99免费视频观看| 中国一级特黄视频| 欧美日韩一区二区三| 999福利激情视频| 欧美色伊人| 99热国产这里只有精品无卡顿" | 国产精品无码在线看| 波多野结衣中文字幕久久| 精品国产毛片| 国产真实乱子伦视频播放| av色爱 天堂网| 区国产精品搜索视频| 亚洲欧州色色免费AV| av无码一区二区三区在线| 久久中文字幕av不卡一区二区| 97精品伊人久久大香线蕉| 亚洲精品爱草草视频在线| 免费在线一区| 2021国产乱人伦在线播放| 日本在线亚洲| 国产成人在线小视频| 久久久91人妻无码精品蜜桃HD| 超碰91免费人妻| 永久毛片在线播| 在线观看热码亚洲av每日更新| 高清亚洲欧美在线看| 久久久久夜色精品波多野结衣| 伊人大杳蕉中文无码| 亚洲综合精品第一页| 亚洲性网站| 国产极品美女在线观看| 国产欧美在线| 国产真实自在自线免费精品| 久久久久久久蜜桃| 欧美人与性动交a欧美精品| 91视频日本| 亚洲综合日韩精品| 一级毛片高清| 新SSS无码手机在线观看| 在线看国产精品| 天天躁夜夜躁狠狠躁躁88| 日韩欧美国产另类| 先锋资源久久| 国产精品私拍99pans大尺度| 免费在线播放毛片| 伊人久久大香线蕉影院| 国产成人91精品| 亚洲三级a| 欧美成人h精品网站| 久久99国产综合精品1| 99久久成人国产精品免费| 午夜成人在线视频| 成年人免费国产视频| a毛片基地免费大全| 777午夜精品电影免费看| 人妻精品全国免费视频| 成人伊人色一区二区三区| 亚洲婷婷六月| 米奇精品一区二区三区| 日韩午夜片| 亚洲欧美在线看片AI| 亚洲国产欧洲精品路线久久| 国产v精品成人免费视频71pao| 制服丝袜在线视频香蕉| 台湾AV国片精品女同性| 日本高清成本人视频一区| 国产一区二区三区在线精品专区| 欧美精品H在线播放| 亚洲成人播放| 日本亚洲欧美在线| 国产极品美女在线| 无码久看视频| 国产农村妇女精品一二区| 欧美日韩一区二区在线免费观看| 亚洲精品自在线拍| 国产99精品久久| 国产精品一区在线观看你懂的| 国产成人精品日本亚洲|