可二次开发压力校准手操器的研究与实现
2020-05-04高楠
高 楠
(苏州市计量测试院,江苏 苏州 215128)
在工业现场应用中,需要对大量压力仪表进行信息录入、数据采集、计量校准和故障诊断。锂电池供电的手持设备(手操器)是一种较好的解决方案,由于其体积小、硬件接口灵活且支持二次开发,与常规的上位机软件和台式仪表装置比较更具有应用优势。现有的手持设备主要有3种开发模式:基于单片机液晶驱动的底层开发,应用μCOS和EMWIN的界面开发,以及带有嵌入式操作系统的开发(如wince系统、linux系统)。手操器采用第二种方案进行设计开发[1,2]。
1 界面设计
可二次开发的压力校准手操器采用μ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
2 系统设置
为了方便使用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
3 实时时钟
手持设备采用μ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); //更新显示
}
4 逻辑处理
回调函数处理包括:处理触摸屏和按键消息,以及界面初始化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 );
}
}
5 结论
本文阐述了应用EMWIN平台和嵌入式实时操作系统μCOS-II,实现可二次开发压力校准手操器的研发过程。仪表可以实现信息录入、数据采集、实时曲线和历史查询等功能,且具备二次开发接口。经测试,压力校准手操器可以稳定高效地实现压力仪表的计量校准和信息采集,达到了预期的设计效果。