PhAB为每个控件提供十余种程序调用方式,常用到的有按下调用(Armed)、点击调用(Activated,点击为一个在同一控件上按下然后松开的过程)、热键调用(Hotkey)和鼠标右键按下调用(Menu)等,系统默认它们分别调用Pt_CB_ARM、Pt_CB_ACTIVATE、Pt_CB_HOTKEY和Pt_CB_MENU函数,如果需要调用自定义的函数,可以直接在提供的对话框中输入需调用的函数名和所在文件。当触发的事件是显示一个窗口或对话框时,还可以指定调用是在窗口构建之前还是之后。
2.2 程序设计
QNX Momentics IDE支持C/C++语言对系统进行设计,并且兼容C++标准模板库(STL),熟练的C/C++程序员可以很快地掌握在QNX Momentics IDE中进行程序编写的技巧。值得一提的是,在QNX集成开发环境下对图形界面控制系统的主程序进行编写并不用直接对main()函数进行编辑,而是将编写的程序挂载到main()函数中,并可以选择程序是在图形界面生成前运行还是之后运行。系统主程序的方框图如图2所示。
在程序运行时,预处理命令先于生成图形界面部分执行,它与系统初始化及以后的程序不在同一个编写的函数中,但都是main( )函数的一部分。读取并显示状态信号部分程序在执行中会自动检测信号所标识状态是否达到或超过警报值和危险值,当读取到警报值信号时,系统将自动发出报警;存在危险值信号时,系统将按编写的程序自动处理。
在控制系统运行时,需要同时进行多项运算。如对某个阀发出开阀的控制命令时,系统不仅要显示需更改阀图标的变换(以标识该阀正在进行相关操作),还要进行数据采集、逻辑运算等。若此时某项指标达到警戒值,还要能及时进行相关处理。因此,除了应用中断的方式提高程序运行效率外,还有必要进行多线程编程。
QNX为多线程编程提供了丰富的函数。如线程创建函数pthread_create( )、ThreadCreate_r( )和ThreadCreated( ),线程终止函数pthread_exit( )、ThreadDestroy( )和Thread
Destroy_r( )等。当然,各个函数的使用有差别,以线程创建函数为例,相比于pthread_create( )函数,ThreadCreate_r( )和ThreadCreated( )都是从内核直接创建线程,并且它们的使用方法很相似,ThreadCreate_r( )函数与ThreadCreated( )函数的唯一区别在于创建线程出错时的返回值不同。下面是系统中用pthread_create( )函数创建的一个信号处理线程:
在多线程程序的编写过程中,需要使用互斥体来保护线程的数据访问,以保证公共数据不被其他线程修改破坏。在QNX中,可以使用函数pthread_mutex_init( )来创建一个互斥体,使用函数pthread_mutex_lock( )和pthread_mutex_unlo
ck( )来锁住一个互斥体和为一个互斥体解锁。
本系统运行的硬件平台为一台SBS公司的VP9 6U VME Single Board Computer,一块由Acromag公司生产的AVME9668 VME bus 6U Non-intelligent IP Carrrier Cards和IP408 High Voltage Digital Input/Output信号采集模块,单板机和信号采集卡都插在基于VME64x总线协议的6U标准机箱中运行。长时间的调试运行表明,本文所设计的基于QNX操作系统的图形控制软件运行稳定、可靠,实现了系统功能,达到了既定要求。