Lyfing.loo 2013年6月18日-毕设答辩ppt

32
基于 LabWindows/CVI 信号监测系统设计 Lyfing.Loo http://git.io/fDdzZQ

Transcript of Lyfing.loo 2013年6月18日-毕设答辩ppt

Page 1: Lyfing.loo 2013年6月18日-毕设答辩ppt

基于 LabWindows/CVI的信号监测系统设计

Lyfing.Loo

http://git.io/fDdzZQ

Page 2: Lyfing.loo 2013年6月18日-毕设答辩ppt

毕设感想

界面设计软件逻辑

系统功能

Page 3: Lyfing.loo 2013年6月18日-毕设答辩ppt

Page 4: Lyfing.loo 2013年6月18日-毕设答辩ppt

系统启动界面

Page 5: Lyfing.loo 2013年6月18日-毕设答辩ppt

经过配置端口

或读取文件后

系统控制项才

可以使用

Page 6: Lyfing.loo 2013年6月18日-毕设答辩ppt

六路信号监控界面

Page 7: Lyfing.loo 2013年6月18日-毕设答辩ppt

Tab 标签模式显示单路信号大图

Page 8: Lyfing.loo 2013年6月18日-毕设答辩ppt

信号分析界面

Page 9: Lyfing.loo 2013年6月18日-毕设答辩ppt

毕设感想

界面设计软件逻辑

系统功能

思考 : 为什么?

Page 10: Lyfing.loo 2013年6月18日-毕设答辩ppt
Page 11: Lyfing.loo 2013年6月18日-毕设答辩ppt

本次信号采集同 有时六路信号上 ,需要传

六个窗口来分 示各路信号,别显

是:问题如何创建六个信号窗口

如何高效地创建六个信号窗口

Page 12: Lyfing.loo 2013年6月18日-毕设答辩ppt

LabWindows/CVI 提供了“界面编辑器”开发人员可以直接用它来创建六个窗口

Page 13: Lyfing.loo 2013年6月18日-毕设答辩ppt

用这样的方法重复创建六个窗口

费力没法统一设置属性没法合理布局

Page 14: Lyfing.loo 2013年6月18日-毕设答辩ppt

LabWindows/CVI提供了另一种支持,开发人员可以用代码编程快速创建六个窗口

而编程,最适合用来做重复的工作了

For(int i=0; i<6; i++){child_Panels[i] = NewPanel(panelHdl, title, TopPosition, LeftPosition, cHeight, cWidth);

}

Page 15: Lyfing.loo 2013年6月18日-毕设答辩ppt

不用费力一一创建可以统一设置属性可以随意进行布局

用编程实现创建六个窗口

Page 16: Lyfing.loo 2013年6月18日-毕设答辩ppt

界面复杂度要繁还是要简

Page 17: Lyfing.loo 2013年6月18日-毕设答辩ppt
Page 18: Lyfing.loo 2013年6月18日-毕设答辩ppt

现实世界的仪器面板上总是布满各种控制按钮

但在虚拟仪器的面板上,不需要盲从于这种设计。

虚拟仪器的优势它可以捕捉丰富的用户事件

并对其作出反馈

Page 19: Lyfing.loo 2013年6月18日-毕设答辩ppt

鼠标双击

充分利用鼠标产生的事件来完成物理仪器上的按钮

需要完成的任务

鼠标单击鼠标右击弹出菜单系统菜单

Page 20: Lyfing.loo 2013年6月18日-毕设答辩ppt

系统控制项简化为 :

Page 21: Lyfing.loo 2013年6月18日-毕设答辩ppt

毕设感想

界面设计软件逻辑

系统功能

思考 : 怎么办?

Page 22: Lyfing.loo 2013年6月18日-毕设答辩ppt

为了保证用户

正常使用系统不出错

系统设计逻辑必须要合理

Page 23: Lyfing.loo 2013年6月18日-毕设答辩ppt

在用户成功载入文件

或配置端口之前

所有控制按钮不可用建创 控制 灰度管理器项 来管理

所有控制按 的可用状钮 态/* 控制项灰度管理器 ( 函数 ) */

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);

}

}

Page 24: Lyfing.loo 2013年6月18日-毕设答辩ppt

/* 加速度计及陀螺仪共六路信号的分离和还原 */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串口上传

Page 25: Lyfing.loo 2013年6月18日-毕设答辩ppt

本系统按功能划分,

可以分为五个模块。

多线程技术

主线程

次线程

Page 26: Lyfing.loo 2013年6月18日-毕设答辩ppt

系统运行过程中各功能模块的线程分布情况

Page 27: Lyfing.loo 2013年6月18日-毕设答辩ppt

Thread pools :帮助用户将函数调度到独立的线程中执行。 Thread pools 处理线程缓存来最小化与创建和销毁线程相关的开销。

Thread-safe queues :对线程间的数据传递进行了抽象。一个线程可以在另一个线程向队列写入数据的同时,从队列中读取数据。

Thread-safe variables :高效地将临界代码段和任意的数据类型结合在一起。用户可以调用简单的函数来获取临界代码段,设定变量值,然后释放临界代码段;

Thread locks :提供了一致的 API 并在必要时自动选择合适的机制来简化临界代码段和互斥量的使用;

Thread-local variables :为每个线程提供变量实例操作系统对每个进程可用的线程局部变量的数量进行了限制, LabWindows/CVI 在实现过程中对线程局部变量进行了加强。

多线程技术

Page 28: Lyfing.loo 2013年6月18日-毕设答辩ppt

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);

Page 29: Lyfing.loo 2013年6月18日-毕设答辩ppt

文件读写逻辑

系统涉及文件读写为了数据的安全读写,

在暂停、停止信号采集的时候,存储数据的文件需要关

闭。(如果从文件读取数据,则该文件需要关

闭 )

在开始、恢复信号采集的时候,存储数据的文件需要重

开。(如果从文件读取数据,则该文件需要重

开)

Page 30: Lyfing.loo 2013年6月18日-毕设答辩ppt

关闭读取数据的文件后,如果是暂停操作,则再次打开该文件时需要定位到上次读取数据的位置,追加数据;

关闭存储数据的文件后,如果是暂停操作,则再次打开该文件时需要定位到上次存储数据的位置,追加数据。

解决方案

filePointerPosition = ftell(filePointer);

fseek(filePointer,filePointerPosition, SEEK_SET);

创建 filePointerPosition 变量准备保存文件指针的位置用 ftell() 函数获取指针位置赋给上述变量,关闭文件

再次打开文件时,用 fseek() 函数将文件指针定位到上次文件关闭的位置

Page 31: Lyfing.loo 2013年6月18日-毕设答辩ppt

毕设感想

界面设计软件逻辑

系统功能

关于系统编程开发关于毕设说明书

Page 32: Lyfing.loo 2013年6月18日-毕设答辩ppt

The End!

谢谢!