高 楠
(蘇州市計量測試院,江蘇 蘇州 215128)
在工業現場應用中,需要對大量壓力儀表進行信息錄入、數據采集、計量校準和故障診斷。鋰電池供電的手持設備(手操器)是一種較好的解決方案,由于其體積小、硬件接口靈活且支持二次開發,與常規的上位機軟件和臺式儀表裝置比較更具有應用優勢。現有的手持設備主要有3種開發模式:基于單片機液晶驅動的底層開發,應用μCOS和EMWIN的界面開發,以及帶有嵌入式操作系統的開發(如wince系統、linux系統)。手操器采用第二種方案進行設計開發[1,2]。
可二次開發的壓力校準手操器采用μCOS-II實時操作系統和EMWIN界面平臺進行開發,與常規的底層開發方式比較,開發更便捷易于升級和維護。以主界面對話框的初始化函數為例,可以應用GUIBuilder軟件設計出軟件框架,再針對性地修改具體顯示屬性就能完成界面設計[3]。
//壓力計量管理系統對話框資源
const GUI_WIDGET_CREATE_INFO ExampleDialog[] =
{
{ FRAMEWIN_CreateIndirect, "壓力計量管理系統", 1000, 0, 0, 240, 320, 0, 0 },
{ TEXT_CreateIndirect, "程序主界面",
GUI_ID_TEXT0, 0, 10, 234, 30, 0},
{ BUTTON_CreateIndirect, "儀表信息",
GUI_ID_BUTTON0, 10, 50, 90, 60, 0},
{ BUTTON_CreateIndirect, "數據采集",
GUI_ID_BUTTON1, 10,130, 90, 60, 0},
{ BUTTON_CreateIndirect, "實時曲線",
GUI_ID_BUTTON2, 10,210, 90, 60, 0},
{ BUTTON_CreateIndirect, "歷史數據",
GUI_ID_BUTTON3, 130,50, 90, 60, 0},
{ BUTTON_CreateIndirect, "參數設置",
GUI_ID_BUTTON4, 130,130, 90, 60, 0},
{ BUTTON_CreateIndirect, "退出程序",
GUI_ID_BUTTON5, 130,210, 90, 60, 0},
};
由于顯示的內容包含漢字,所以設置字體為GUI_FontHZ16,且注意在Button控件復制粘貼后,需要給后續的Button重新指定不同的ID值,不然會出現顯示錯誤問題[4],具體的設備主界面如圖1所示。壓力校準手持設備,一般需要具備的功能有壓力儀表或傳感器數據的實時采集,通過MBUS、RS485、RS232、TTL或者紅外實現壓力儀器的校準,工業壓力儀表一般通過串口實現多點標定,或者應用HART通用命令在兩線制的基礎上實現零點和滿量程校準。圖形界面往往需要設置壓力顯示的數值精度,如量程變送上限值和小數點位數,再根據現場需要設置顯示單位,如MPa、kPa、Bar等。實時壓力曲線一般以Chart控件形式顯示,X軸是計量時間、Y軸是壓力傳感器數值。為了方便用戶觀察還可以在曲線上設置實時壓力數值顯示區域和標題Label,用于記錄儀功能的壓力采集,往往還需要顯示出采集開始至當前階段的壓力最大值、最小值和平均值。如果采集多個通道的壓力值,就涉及到Y軸坐標軸上限值設定的問題,例如:兩個通道的量程范圍分別為0MPa~6MPa和0MPa~60MPa,通常的設置方法有兩種,第一種方式是操作者根據實際需要手工設置對應通道的量程上限值,如分別設置6MPa和60MPa;第二種方式是操作者無需設置通道的量程上限值,控件的通道上限值設置為默認0,這樣采集的過程中通道曲線上限值根據采集值不斷調整,將之前采集過的壓力最大值作為通道的上限值。從而避免了通道量程上限值相同,有些通道變化幅度過小情況下,曲線波動趨勢不明顯的問題。操作者設置的參數往往具有保持功能,儀表程序退出時將多個參數值都設置在DB數據庫,儀表上電時將DB數據庫的參數值導入內存中,從而避免手持儀表重新上電,并且還需要重新設置參數的問題。

圖1 壓力計量手持設備主界面圖Fig.1 Main interface diagram of pressure metering handheld devices
為了方便使用C或者C++的數據類型,將常用的數據類型定義如下:typedef unsigned int U32;調用鍵盤函數,返回值如下值:#define KEY_NUM0 0x30 //對應鍵盤“0”按鍵,等手操器共24個不同的物理按鍵對應值。手操器當前文件系統文件名長度不能超過31個ASCII字符(中文占兩個ASCII字符位置),超過部分將被截斷。數據庫規定單個記錄最大字段數目為100個,可滿足常規的應用要求。系統可以和多種串口設備通信,串口支持7、8、9位數據位通信。如:#define UART_MODE_8B_NONE_1S 3 //8位數據位,無校驗,一位停止位。
串口設備支持普通串口、低速紅外、高速紅外、條碼掃描、GPRS通訊、CDMA通訊、RS485通訊、RS232通訊等多種應用,并且定義了命令、數據和讀取狀態3種工作模式。手操器開發系統具有強大的輸入法,能夠支持數字、英文、中文輸入,中文輸入法支持拼音輸入和筆畫輸入,漢字庫標配GB2312字庫,可以選用GBK字庫。顯示液晶的坐標系以左上角為零點,橫向為X軸,軸向為Y軸,只有1個象限。彩屏屏幕X軸方向像素數目為240(0~239),彩屏屏幕Y軸方向像素數目為320(0~319)。結構體類型定義主要包括:sFILE文件結構體、sDBF數據庫結構體、sRTC時鐘結構體、sUART串口結構體和sMENU菜單結構體[5]。

圖2 實時顯示時鐘界面Fig.2 Real-time display clock interface
手持設備采用μCOS-II和EMWIN進行開發編程,如圖2所示,在對話框資源頁設置顯示內容:
const GUI_WIDGET BusinessDialog[] =
{
{ FRAMEWIN_CreateIndirect,"實時顯示時間",
1000, 0, 0, 240, 320, 0, 0 }, //標題內容
{ TEXT_CreateIndirect, "當前時間:",
GUI_ID_TEXT0, 0, 20, 234, 30, 0},//文本
{ TEXT_CreateIndirect," ",
GUI_ID_TEXT1, 0, 60, 234, 30, 0},//時鐘
{ BUTTON_CreateIndirect, "退出",
GUI_ID_BUTTON0, 0,220, 90, 60, 0}, //按鈕
};
手持設備采用stm32F407主芯片,其內部具有RTC時鐘硬件,進行實時時鐘獲取時,需調用RtcGetDate和RtcGetDate兩個主函數,然后調用Lib_sprintf函數,將顯示內容進行格式處理,后續將函數供回調函數調用以實現實時時鐘更新[6,7]。
void CheckUpdateTime( WM_HWIN hDlg )
{
WM_HWIN hObj;
char time[40];
U8 year,month,day,hour,minute,second;
RtcGetDate(&year,&month,&day);//日期
RtcGetTime(&hour,&minute,&second);//時鐘
Lib_sprintf(time,"20%02d-%02d-%02d %02d:%02d:%02 d",year,month,day,hour,minute,second);
hObj =WM_GetDialogItem( hDlg,
GUI_ID_TEXT1 );//獲取文本信息
TEXT_SetText( hObj,time); //更新顯示
}
回調函數處理包括:處理觸摸屏和按鍵消息,以及界面初始化3個部分。核心的程序框架如下所示,在手操器彩色觸摸屏上可以根據用戶的動作識別是哪個按鍵被觸發,也可以根據用戶對機械按鍵的操作識別是哪個按鍵被觸發;可以根據不同的觸發事件編寫對應的邏輯處理函數子程序,這樣就能實現手操器的人機交互。與傳統的單片機開發不同,需要在EMWIN下對每個窗口的回調函數進行框架設計[8]。
void ExampleCbFuntion( WM_MESSAGE*pMsg )
{
int NCode, Id;
WM_HWIN hDlg;
hDlg = pMsg->hWin;
switch ( pMsg->MsgId )
{
case WM_INIT_DIALOG:
//創建對話框初始化
break;
case WM_PAINT:
//窗口變為無效并應重繪
break;
case WM_NOTIFY_PARENT:
//告知父窗口子窗口中發生改變-觸摸屏
Id = WM_GetId( pMsg->hWinSrc );
NCode = pMsg->Data.v;
switch ( NCode )
{
caseWM_NOTIFICATION_RELEASED:
//觸摸屏消息
switch ( Id )
{
case GUI_ID_BUTTON1:
//屏上按鈕1觸發的動作
break;
case GUI_ID_BUTTON2:
//屏上按鈕2觸發的動作
break;
}
break;
case WM_KEY:
//按下按鍵后發送到包含焦點的窗口-按鍵 switch ( ( ( WM_KEY_INFO
* )( pMsg->Data.p ) )->Key )
{
case GUI_KEY_NUM1:
//按鍵1觸發的動作
break;
case GUI_KEY_NUM2: //按鍵2觸發的動作 break;
}
break;
default:
WM_DefaultProc( pMsg );
}
}
本文闡述了應用EMWIN平臺和嵌入式實時操作系統μCOS-II,實現可二次開發壓力校準手操器的研發過程。儀表可以實現信息錄入、數據采集、實時曲線和歷史查詢等功能,且具備二次開發接口。經測試,壓力校準手操器可以穩定高效地實現壓力儀表的計量校準和信息采集,達到了預期的設計效果。