lyfing.loo 2013年6月18日-毕设答辩ppt
TRANSCRIPT
基于 LabWindows/CVI的信号监测系统设计
Lyfing.Loo
http://git.io/fDdzZQ
毕设感想
界面设计软件逻辑
系统功能
系
统
设
计
流
程
图
系统启动界面
经过配置端口
或读取文件后
系统控制项才
可以使用
六路信号监控界面
Tab 标签模式显示单路信号大图
信号分析界面
毕设感想
界面设计软件逻辑
系统功能
思考 : 为什么?
本次信号采集同 有时六路信号上 ,需要传
六个窗口来分 示各路信号,别显
是:问题如何创建六个信号窗口
如何高效地创建六个信号窗口
LabWindows/CVI 提供了“界面编辑器”开发人员可以直接用它来创建六个窗口
用这样的方法重复创建六个窗口
费力没法统一设置属性没法合理布局
LabWindows/CVI提供了另一种支持,开发人员可以用代码编程快速创建六个窗口
而编程,最适合用来做重复的工作了
For(int i=0; i<6; i++){child_Panels[i] = NewPanel(panelHdl, title, TopPosition, LeftPosition, cHeight, cWidth);
}
不用费力一一创建可以统一设置属性可以随意进行布局
用编程实现创建六个窗口
界面复杂度要繁还是要简
现实世界的仪器面板上总是布满各种控制按钮
但在虚拟仪器的面板上,不需要盲从于这种设计。
虚拟仪器的优势它可以捕捉丰富的用户事件
并对其作出反馈
鼠标双击
充分利用鼠标产生的事件来完成物理仪器上的按钮
需要完成的任务
鼠标单击鼠标右击弹出菜单系统菜单
系统控制项简化为 :
毕设感想
界面设计软件逻辑
系统功能
思考 : 怎么办?
为了保证用户
正常使用系统不出错
系统设计逻辑必须要合理
在用户成功载入文件
或配置端口之前
所有控制按钮不可用建创 控制 灰度管理器项 来管理
所有控制按 的可用状钮 态/* 控制项灰度管理器 ( 函数 ) */
void refreshDimmedStat(void){
for(i=0; i<sizeof(Ctrls)/sizeof(int); i++){
if(Ctrls[i] <=0) continue;
SetCtrlAttribute(panelHdl, Ctrls[i],
ATTR_DIMMED, configComFlag);
for(i=1; i<sizeof(menuCtrls)/sizeof(int); i++){
if(menuCtrls[i] <=0 ) continue;
SetMenuBarAttribute(menuCtrls[0], menuCtrls[i],
ATTR_DIMMED, configComFlag);
}
}
/* 加速度计及陀螺仪共六路信号的分离和还原 */for (int j=0; j<6; j++){ if(finddata[7+3*j] > 128) sprtdata[j] = (double)((finddata[7+3*j] - 128)*256 + finddata[6+3*j]) * 5/65535;
else sprtdata[j] = (double)((finddata[7+3*j] + 128)*256 + finddata[6+3*j])*5/65535; resultData[j][resultCounter] = sprtdata[j];}
六路信号分离及解析
信号通过 RS232转 USB串口上传
本系统按功能划分,
可以分为五个模块。
多线程技术
主线程
次线程
系统运行过程中各功能模块的线程分布情况
Thread pools :帮助用户将函数调度到独立的线程中执行。 Thread pools 处理线程缓存来最小化与创建和销毁线程相关的开销。
Thread-safe queues :对线程间的数据传递进行了抽象。一个线程可以在另一个线程向队列写入数据的同时,从队列中读取数据。
Thread-safe variables :高效地将临界代码段和任意的数据类型结合在一起。用户可以调用简单的函数来获取临界代码段,设定变量值,然后释放临界代码段;
Thread locks :提供了一致的 API 并在必要时自动选择合适的机制来简化临界代码段和互斥量的使用;
Thread-local variables :为每个线程提供变量实例操作系统对每个进程可用的线程局部变量的数量进行了限制, LabWindows/CVI 在实现过程中对线程局部变量进行了加强。
多线程技术
Thread pools :帮助用户将函数调度到独立的线程中执行。 Thread pools 处理线程缓存来最小化与创建和销毁线程相关的开销
/*---------------------------------------------------------------------------*/
// 辅助类函数 新建并初始化线程池
/*---------------------------------------------------------------------------*/
static int setupThreadPool (void){
int error = 0;
errChk(CmtNewThreadPool(MAX_THREADS, &poolHandle));
Error:
return error;
}
Thread-safe queues :对线程间的数据传递进行了抽象。一个线程可以在另一个线程向队列写入数据的同时,从队列中读取数据。
/*---------------------------------------------------------------------------*/
// 读、写安全队列的语句 :
/*---------------------------------------------------------------------------*/
CmtWriteTSQData(tsqHdl, &readData, READ_LENGTH, TSQ_INFINITE_TIMEOUT, NULL);
CmtReadTSQData(tsqHdl, data, READ_LENGTH, TSQ_INFINITE_TIMEOUT, 0);
文件读写逻辑
系统涉及文件读写为了数据的安全读写,
在暂停、停止信号采集的时候,存储数据的文件需要关
闭。(如果从文件读取数据,则该文件需要关
闭 )
在开始、恢复信号采集的时候,存储数据的文件需要重
开。(如果从文件读取数据,则该文件需要重
开)
关闭读取数据的文件后,如果是暂停操作,则再次打开该文件时需要定位到上次读取数据的位置,追加数据;
关闭存储数据的文件后,如果是暂停操作,则再次打开该文件时需要定位到上次存储数据的位置,追加数据。
解决方案
filePointerPosition = ftell(filePointer);
fseek(filePointer,filePointerPosition, SEEK_SET);
创建 filePointerPosition 变量准备保存文件指针的位置用 ftell() 函数获取指针位置赋给上述变量,关闭文件
再次打开文件时,用 fseek() 函数将文件指针定位到上次文件关闭的位置
毕设感想
界面设计软件逻辑
系统功能
关于系统编程开发关于毕设说明书
The End!
谢谢!