⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powerdlg.cpp

📁 一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PowerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestForm.h"
#include "PowerDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define point 2			//一次显示的点数
#define dividerate 0.9	//用于判断过度过程试验中输出转速落在设定范围内的比例

/////////////////////////////////////////////////////////////////////////////
// PowerDlg dialog


PowerDlg::PowerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(PowerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(PowerDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

	m_strPowerSettings = _T("9600,n,8,1");
	
	m_nPowerPort = 2;		//效率仪串口端口号为2

	m_bPowerReceive = FALSE;

	m_bPowerRTflag = TRUE;	//第一次读

	m_nPowerRTime = 0;		//第一组读数据计数初始化为0
	m_nTotalnumber = 0;		//读取的数据总数为0
	m_nNumber = point;		//每组读取的数据个数为512
	m_nRdNumber=0;//每组所读取数据的个数
	m_nReadNumber=1;//记录读数次数,用于判断一定读数次内某个量的平均值变化范围
	m_dReadDatatime_start=0.0;//效率仪开始一次读取数据任务的系统时间
	m_dReadDatatime_end=0.0;//效率仪结束一次读取数据任务的系统时间
	m_bReadDatatime_start=TRUE;//效率仪开始一次读取数据任务的系统时间标志
	m_bReadDatatime_end=TRUE;//效率仪结束一次读取数据任务的系统时间标志

	m_bResepOn=FALSE;//进行过度过程试验
	m_bOutputRate_timef=TRUE;//读取过度过程试验中输出转速上升起点系统时间标志
	m_bOutputRate_timet=TRUE;//读取过度过程试验中输出转速上升终点系统时间标志
	m_bOutputRate_timep=TRUE;//读取过度过程试验中输出转速峰值时的系统时间标志
	m_bOutputRate_times=TRUE;//读取过度过程试验中输出转速稳定起点的系统时间标志
	m_dOutputRate_set=0.0;//用于存放过度过程试验中输出转速的设定值
	m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
	m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
	m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
	m_nOutputRate_redn=1;//用于存放过度过程试验中输出转速的读数次数,
							//用于判断一定读数次内其平均值变化范围	
	m_nOutputRate_addn=0;//在过度过程试验中,达到稳定值之后还需要读取数据的次数
}

void PowerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(PowerDlg)
	DDX_Control(pDX, IDC_LIPOWER_RDATA, m_cPowerRdata);
	DDX_Control(pDX, IDC_POWER_MSCOMM, m_cPowerCom);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(PowerDlg, CDialog)
	//{{AFX_MSG_MAP(PowerDlg)
	ON_BN_CLICKED(IDC_BUPOWER_SET, OnBupowerSet)
	ON_BN_CLICKED(IDC_BUPOWER_RECEIVE, OnBupowerReceive)
	ON_BN_CLICKED(IDC_BUPOWER_STOP, OnBupowerStop)
	ON_BN_CLICKED(IDC_BUPOWER_SAVE, OnBupowerSave)
	ON_BN_CLICKED(IDC_BUPOWER_CLEAR, OnBupowerClear)
	//手动添加,点击效率试验主控窗口开始按钮消息响应函数
	ON_MESSAGE(WM_MOTDLGPORSTART_HIT,OnMotpowstarthit)
	//手动添加,点击超载试验主控窗口开始按钮消息响应函数
	ON_MESSAGE(WM_MOTDLGOVERSTART_HIT,OnMotoverstarthit)
	//手动添加,点击过度过程试验主控窗口开始按钮消息响应函数
	ON_MESSAGE(WM_MOTDLGRESPSTART_HIT,OnMotrespstarthit)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// PowerDlg message handlers

BEGIN_EVENTSINK_MAP(PowerDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(PowerDlg)
	ON_EVENT(PowerDlg, IDC_POWER_MSCOMM, 1 /* OnComm */, OnOnCommPowerMscomm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()


////////////////////////////////////////////
BOOL PowerDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	CRect rect;
	GetClientRect(&rect);
	
	if (m_cPowerRdata.GetSafeHwnd())
	m_cPowerRdata.SetWindowPos(NULL,rect.left,rect.top,344,
		50,SWP_NOMOVE);

	m_cPowerRdata.InsertColumn(0, "输出扭矩", LVCFMT_LEFT,85);
	m_cPowerRdata.InsertColumn(1, "输出转速", LVCFMT_LEFT,85);
	m_cPowerRdata.InsertColumn(2, "输入扭矩", LVCFMT_LEFT,85);
	m_cPowerRdata.InsertColumn(3, "输入转速", LVCFMT_LEFT,85);

	//串口设置
	powsetDlg.m_nEncodsetPort = 2;	//效率仪串口端口号设置为2
	powsetDlg.m_nEncodsetBaud = 3;	//效率仪串口波特率设置为9600
	powsetDlg.m_nEncodsetData = 3;	//效率仪串口数据位设置为8
	powsetDlg.m_nEncodsetStop = 0;	//效率仪串口停止位设置为1
	powsetDlg.m_nEncodsetChek = 2;	//效率仪串口校验位设置为无校验
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

// 打开串口
void PowerDlg::PowerOpenport()
{
	//判断串口是否已打开,并将其关闭
	
	if (m_cPowerCom.GetPortOpen())
		m_cPowerCom.SetPortOpen(false);

	//选择串口m_cPtestCom
	m_cPowerCom.SetCommPort(m_nPowerPort);
	if(!m_cPowerCom.GetPortOpen())
		m_cPowerCom.SetPortOpen(TRUE);
	else
		AfxMessageBox("Can not open com port");

	//设置串口属性
	m_cPowerCom.SetSettings(m_strPowerSettings);  //波特率9600,无校验,8个数据位,1个停止位

		//参数36表示每当串口接收缓冲区中有多于或等于36个字符时将引发
	  //一个接收数据的OnComm事件
	m_cPowerCom.SetRThreshold(35);

	//读取数据的类型为二进制
	m_cPowerCom.SetInputMode(1);

	//“0”表示读取整个缓冲区内的数据
	m_cPowerCom.SetInputLen(0);

	//先预读缓冲区以清除残留数据
	m_cPowerCom.GetInput();
}

//串口设置并打开串口
void PowerDlg::OnBupowerSet() 
{
	// TODO: Add your control notification handler code here
	CString str = _T(",");
	if (powsetDlg.DoModal() == IDOK)
	{
		//获取设置对话框的串口号 
		m_nPowerPort = powsetDlg.m_nEncodsetPort;

		//获取并拼接设置对话框中的属性设置
		m_strPowerSettings=powsetDlg.m_strEncodsetBaud+str+powsetDlg.m_strEncodsetChek+
						str+powsetDlg.m_strEncodsetData+str+powsetDlg.m_strEncodsetStop;
	}
	PowerOpenport();
	
}

//开始接收串口数据
void PowerDlg::OnBupowerReceive() 
{
	// TODO: Add your control notification handler code here
	m_bPowerReceive =TRUE;

	/*///----------测试----------////	
	CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
	pApp->pCTestFormDoc->nPowerNumber = m_nTotalnumber;
	//pApp->pCTestFormDoc->pPowerInRate[0] =0;
	*////----------测试----------////

	//发送消息
	//pApp->pCTestFormView->powerDrawDlg.SendMessage(WM_POWERDAQ_FINISH,0,0);
	//pApp->pCTestFormView->respDrawDlg.SendMessage(WM_POWERDAQ_FINISH,0,0);

	/*//////////////////---测试---///////////////////////
	m_cPowerRdata.DeleteAllItems();
	//将输出扭矩显示在列表控制框中	
			m_cPowerRdata.InsertItem(LVIF_TEXT|LVIF_STATE,
									0, //要插入条目的索引号
									"4.8", //第一栏要插入的字符串
									LVIS_SELECTED|LVIS_FOCUSED, 
									LVIS_SELECTED|LVIS_FOCUSED,
									0,
									0);
//			m_cPowerRdata.SetItemText(0,0,"12345678");
			//将输出转速显示在列表控制框中
			m_cPowerRdata.SetItemText(0,1,"7");//条目的索引号,
		                                             //第几栏(从0开始),要设置的字符串
			
			//将输入扭矩显示在列表控制框中
			m_cPowerRdata.SetItemText(0,2,"0.03");
			//将输入转速显示在列表控制框中
			m_cPowerRdata.SetItemText(0,3,"1200");
		*///////////////////---测试---///////////////////////
	
}

//停止接收
void PowerDlg::OnBupowerStop() 
{
	// TODO: Add your control notification handler code here
	if (m_bPowerReceive == TRUE) //如果串口是接收数据的状态	
		m_bPowerReceive = FALSE;
	
}

//保存数据
void PowerDlg::OnBupowerSave() 
{
	// TODO: Add your control notification handler code here
	CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
	double inrate,outrate;
	double intorque,outtorque;
	double powerdata;

	CString filename;
	CFileDialog m_FileSaveDialog(FALSE,
							  "xls|txt",
							  NULL,
							  OFN_HIDEREADONLY,							  
							  "(*.xls)|*.xls|(*.txt)|*.txt||",							  
							  this);

	if (m_FileSaveDialog.DoModal() == IDOK)
	{
		filename = m_FileSaveDialog.GetFileName();
	FILE *fp;
	fp=fopen(filename,"w");
	fprintf(fp,"输入转速\t输出转速\t输入转矩\t输出转矩\t效率\t\n");
	for(int i=0;i<m_nRdNumber;i++)
		//for(int j=0;j<28;j++)
		{			
			inrate=pApp->pCTestFormDoc->pPowerInRate[i];
			outrate=pApp->pCTestFormDoc->pPowerOutRate[i];
			intorque=pApp->pCTestFormDoc->pPowerInTorque[i];
			outtorque=pApp->pCTestFormDoc->pPowerOutTorque[i];
			powerdata=pApp->pCTestFormDoc->pPowerData[i];
fprintf(fp,"%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t\n",inrate,outrate,intorque,outtorque,powerdata);
		}
	fclose(fp);
	}		
}

//清除效率仪主控串口中数据显示框内的数据
void PowerDlg::OnBupowerClear() 
{
	// TODO: Add your control notification handler code here
	m_cPowerRdata.DeleteAllItems();
	
}

//串口事件响应函数
void PowerDlg::OnOnCommPowerMscomm() 
{
	// TODO: Add your control notification handler code here
	VARIANT variant_inp;
	COleSafeArray safearray_inp;

	long len,len1,k;	
	CString str;
	CString inputRate,outputRate;
	CString inputTorque,outputTorque;

	double dinputRate,doutputRate;
	double dinputTorque,dinputTorque1,dinputTorque2,doutputTorque;
	double dpower;//效率值

	char data2[2048];
	char data3[2048];

	CString strtemp;

	CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
	int hitnumber = pApp->m_nHitNumber;

	if(m_bPowerReceive)
	{
		if(m_cPowerCom.GetCommEvent()==2)//事件值为2表示接收缓冲区内大于或等于
										//SetRThreshold()所设定的字符

			len1=m_cPowerCom.GetInBufferCount();
		if(len1>35)
		{

		 //if(m_bPowerRTflag) //第一次读
		 //{
			 m_nPowerRTime ++;	//计数器加1
		 
			variant_inp = m_cPowerCom.GetInput();   //读缓冲区

			//数据转换
			safearray_inp = variant_inp;

			//获得读取数据的个数
			len = safearray_inp.GetOneDimSize();

			//转换为BYTE型数组
			for(k=0;k<len;k++)
				safearray_inp.GetElement(&k,data2+k);

			//转换为Cstring型数组		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -