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

📄 m808.cpp

📁 1.使用串口同两块west4170(PID控制温度仪表). 2.可以显示当前温度,并可设定参数(主要是设定温度)
💻 CPP
字号:
// M808.cpp : implementation file
//

#include "stdafx.h"
#include "A808M.h"
#include "M808.h"
#include "A808MDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CM808

CM808::CM808()
{
	commandeName_parameter_list=new CStringList[2];
	

	commandeName_parameter_list[0].AddTail("PV");
	commandeName_parameter_list[1].AddTail("测量值(only read)");
	
	commandeName_parameter_list[0].AddTail("OP");
	commandeName_parameter_list[1].AddTail("输出功率(only read)");

	commandeName_parameter_list[0].AddTail("SP");
	commandeName_parameter_list[1].AddTail("运行目标值(only read)");

	commandeName_parameter_list[0].AddTail("SL");
	commandeName_parameter_list[1].AddTail("基本设定值");

	commandeName_parameter_list[0].AddTail("XP");
	commandeName_parameter_list[1].AddTail("加热比例带");

	commandeName_parameter_list[0].AddTail("TI");
	commandeName_parameter_list[1].AddTail("积分时间");

	commandeName_parameter_list[0].AddTail("TD");
	commandeName_parameter_list[1].AddTail("微分时间");

	commandeName_parameter_list[0].AddTail("DB");
	commandeName_parameter_list[1].AddTail("加热冷却区");

	commandeName_parameter_list[0].AddTail("CH");
	commandeName_parameter_list[1].AddTail("加热动作周期");
	
	commandeName_parameter_list[0].AddTail("CC");
	commandeName_parameter_list[1].AddTail("冷却动作周期");
	
	commandeName_parameter_list[0].AddTail("RG");
	commandeName_parameter_list[1].AddTail("相关冷却系数");
	
	commandeName_parameter_list[0].AddTail("HS");
	commandeName_parameter_list[1].AddTail("设定值上限");
	
	commandeName_parameter_list[0].AddTail("LS");
	commandeName_parameter_list[1].AddTail("设定值下限");
	
	commandeName_parameter_list[0].AddTail("BP");
	commandeName_parameter_list[1].AddTail("故障输出功率");
	
	commandeName_parameter_list[0].AddTail("HO");
	commandeName_parameter_list[1].AddTail("最大输出功率");
	
	commandeName_parameter_list[0].AddTail("SR");
	commandeName_parameter_list[1].AddTail("升降温速率");

	commandeName_parameter_list[0].AddTail("HB");
	commandeName_parameter_list[1].AddTail("自动暂停带");
	
	commandeName_parameter_list[0].AddTail("LC");
	commandeName_parameter_list[1].AddTail("曲线程序循环次数");
	
	commandeName_parameter_list[0].AddTail("r1");
	commandeName_parameter_list[1].AddTail("斜坡1的斜率值");

	commandeName_parameter_list[0].AddTail("l1");
	commandeName_parameter_list[1].AddTail("平台1的设定值");
	
	commandeName_parameter_list[0].AddTail("t1");
	commandeName_parameter_list[1].AddTail("平台1的运行时间");
	
	commandeName_parameter_list[0].AddTail("r2");
	commandeName_parameter_list[1].AddTail("斜坡2的斜率值");

	commandeName_parameter_list[0].AddTail("l2");
	commandeName_parameter_list[1].AddTail("平台2的设定值");

	commandeName_parameter_list[0].AddTail("t2");
	commandeName_parameter_list[1].AddTail("平台2的运行时间");

	m_IsSendData=FALSE;
	m_rxstate=MAIN_NUMBER;
	m_rxstateNew=MAIN_NUMBER;

}

CM808::~CM808()
{
	delete [] commandeName_parameter_list;
}


BEGIN_MESSAGE_MAP(CM808, CHistogramCtrl)
	//{{AFX_MSG_MAP(CM808)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		ON_BN_CLICKED(ID_BUTTON_HIDE_SHOW, OnButtonHideOrShow)
		ON_BN_CLICKED(ID_BUTTON_WRITE,OnButtonWriteParameter)
		ON_BN_CLICKED(ID_BUTTON_READ,OnButtonReadParameter)
		ON_CBN_SELCHANGE(ID_COMBO_READ,OnSelchangeComboParameter)

	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CM808 message handlers

//处理正常读参数时的正常返回数据
void CM808::ProcessArray(CByteArray &btArray)
{
	
	int len=btArray.GetSize();				//取收到数据的长度
	BYTE bcc=0;						//作校验用
	if(m_rxstate==WRITE_PARAMETER)				//写参数,返回的字节只有一个。
	{
		DisplayParameter(btArray);
	}
	else{
		if(len>9)						//长度达到接收正常返回数据长度时
		{
			for(int i=0;i<len;i++)
			{			
				if(btArray.GetAt(i)==STX[0])		//找到正常返回数据的第一个字(如果它不是在第一个位置)
				{
					if(len>=i+10)			//长度达到接收正常返回数据长度时
					{
						if(btArray.GetAt(i+8)==ETX[0])				//找到长度达到接收正常返回第9个数据
						{
							//i是第一个字的位置
							for(int j=i+1;j<i+9;j++)
								bcc^=btArray.GetAt(j);			//计算异或校验
							if(bcc==btArray.GetAt(i+9))			//完全正常返回数据
							{
								//保存数据并显示在指定的控件内
								//然后清除btArray
								DisplayParameter(btArray);
								
								btArray.RemoveAll();			//工作完成后清除数组的数据
								//清除时间表,重新计时
								
								
							}
							break;		//跳出
						}
					}
				}
			}
			
			
		}
	}
	

	
}

//显示处理:数据从仪表返回后进行的显示处理
void CM808::DisplayParameter(CByteArray& hexdata)
{
	int value;	
	int len=hexdata.GetSize();				//取收到数据的长度
	CString str;
	
	for(int i=0;i<len;i++)
	{			
		if(hexdata.GetAt(i)==STX[0])		//找到正常返回数据的第一个字(如果它不是在第一个位置)
		{
			for(int j=i+1;j<i+8;j++)
			{
				if((j==i+7) && hexdata.GetAt(j)==0x2e)
				{}
				else				
					str+=(char)hexdata.GetAt(j);
				if(j==i+2)
					str+='=';
			}
		}
	}
	switch(m_rxstate)
	{
	case WRITE_PARAMETER:				//在单参数位置显示写参数:成功与否
		if(hexdata.GetAt(0)==ACK[0])
			m_editParameter.SetWindowText("Write OK");
		else if(hexdata.GetAt(0)==NAK[0])
			m_editParameter.SetWindowText("Write false");
		else
			m_editParameter.SetWindowText("question???");
		break;
	case SINGLE_PARAMETER:
		m_editParameter.SetWindowText(str);		//在单参数位置显示一个参数值,以供写参数时参考
		break;
	case LIST_PARAMETER:
		//plist->AddString(str);			//在列表中显示数据
		break;
	default:
		str=str.Mid(3);
		m_mainVale.SetWindowText(str);		//在主显示位置显示数据
		value=atoi((const char*)str);
		if(value<2)
			value=2;
		if(value>100)
			value=100;
		CHistogramCtrl::SetPos(value);
		break;
		
	}

	if(m_rxstate!=m_rxstateNew)
		m_rxstate=m_rxstateNew;
	if(m_rxstateNew!=MAIN_NUMBER)
	m_rxstateNew=MAIN_NUMBER;
	
	m_IsSendData=FALSE;


}

//组织要发送的数据,
void CM808::SendData(CByteArray& hexdata)
{
	hexdata.RemoveAll();

	CString str;
	int index;
	POSITION pos;
	str.Format("%02d",m_nMeterIndex);		//表号

	CString str1;
	CString str2;
	switch(m_rxstate)
	{
	case WRITE_PARAMETER:
		index=m_ListParameter.GetCurSel();
		m_ListParameter.GetLBText(index,str2);	
		str1=GetCommandFromParameter(str2);

		m_editParameter.GetWindowText(str2);
		str1+=str2;
		break;
	case SINGLE_PARAMETER:
		index=m_ListParameter.GetCurSel();
		m_ListParameter.GetLBText(index,str2);	
		str1=GetCommandFromParameter(str2);
		break;
	case LIST_PARAMETER:				//如果正在读参数
//		pcombo->GetLBText(n_parameter+1,str1);	//读取参数字符
//		n_parameter++;				//计数递加
//		if(n_parameter==m_ParameterNumber-1)	//读完所有参数
//		{
//			n_parameter=0;			//静态计数归0
//			m_rxstate=MAIN_NUMBER;		//复位正在读参数标志
//			
//			pButton->SetWindowText("读参数");	//显示已完成读参数过程
//			
//		}
		break;
	default:					//取字符:PV
		pos=commandeName_parameter_list[0].FindIndex(0);
		str1=commandeName_parameter_list[0].GetAt(pos);
		break;
	}

	str+=str1;
	
	hexdata.Add(EOT[0]);
	hexdata.Add(str.GetAt(0));
	hexdata.Add(str.GetAt(0));
	hexdata.Add(str.GetAt(1));
	hexdata.Add(str.GetAt(1));
	if(m_rxstate!=WRITE_PARAMETER)
	{
		hexdata.Add(str.GetAt(2));
		hexdata.Add(str.GetAt(3));
		hexdata.Add(ENQ[0]);
	}
	else if(m_rxstate==WRITE_PARAMETER)
	{
		hexdata.Add(STX[0]);
		for(int i=2;i<str.GetLength();i++)
			hexdata.Add(str.GetAt(i));
		hexdata.Add(ETX[0]);
		CaleBccCode(hexdata);
		
	}

//	m_rxstateNew=MAIN_NUMBER;

}


//读取参数表
void CM808::OnButtonReadParameter() 
{
	m_rxstateNew=LIST_PARAMETER;
}

//写参数按钮动作
void CM808::OnButtonWriteParameter() 
{
	m_rxstateNew=WRITE_PARAMETER;

	
}
//参数选择改变时
void CM808::OnSelchangeComboParameter()
{
	m_rxstateNew=SINGLE_PARAMETER;
}

//计算写参数时的BCC校验码
void CM808::CaleBccCode(CByteArray &hexdata)
{
	
	BYTE bcc=0;
	int len=hexdata.GetSize();
	for(int i=0;i<len;i++)
	{
		
		if(hexdata.GetAt(i)==0x2)
		{
			do{
				bcc^=hexdata.GetAt(i+1);
				i++;					
			}while((i<len) && hexdata.GetAt(i)!=0x3);
			
		}
	}
	
	hexdata.Add(bcc);
}

//显示发送的数据代码
void CM808::DispCodeforSend(CByteArray &hexdata)
{

}

//初始化控件
BOOL CM808::InvalidateCtrl()
{
	CHistogramCtrl::InvalidateCtrl();

	CRect rect;
	rect.top=m_rcClient.top+3;
	rect.bottom=rect.top+30;
	rect.left=m_rcClient.left+10;
	rect.right=rect.left+80;

	//create 读写参数的编辑框
	m_editParameter.Create(WS_CHILD,rect,this,ID_EDIT_RW);		//id=100
	
	rect.OffsetRect(0,40);
	//create 写参数按钮
	BOOL ret=m_btWrite.Create("写参数",WS_CHILD,rect,this,ID_BUTTON_WRITE);	//id=101

	rect.OffsetRect(0,40);
	//create读参数表按钮
	m_btReadParameterList.Create("读参数表",WS_CHILD,rect,this,ID_BUTTON_READ);	//id=102

	rect.OffsetRect(0,40);
	rect.bottom+=200;
	rect.right+=50;
	
	//create读参数表的下拉列表框
	m_ListParameter.Create(0x00010203|WS_CHILD|CBS_AUTOHSCROLL|WS_VSCROLL,	//id=103
		rect,this,ID_COMBO_READ);
	POSITION pos=NULL;
	CString str;
	for(pos=commandeName_parameter_list[1].GetHeadPosition();pos!=NULL;)
	{
		str=commandeName_parameter_list[1].GetNext(pos);
		m_ListParameter.AddString(str);
	}
	m_ListParameter.SetCurSel(3);

	rect.OffsetRect(0,40);
	rect.bottom-=200;
	rect.right-=50;
	//create 标签
	m_Lable1.Create("表号",WS_CHILD,rect,this,ID_STATIC_METER_NUMBER);			//id=104
	
	rect.OffsetRect(0,40);
	rect.bottom+=100;
	//create选择表号的下拉列表框
	m_ListMeterIndex.Create(0x00010203|WS_CHILD|CBS_AUTOHSCROLL|WS_VSCROLL,	//id=105
		rect,this,ID_COMBO_METER_NUMBER);
	
	CString strIndex;
	for(int i=1;i<33;i++)
	{
		strIndex.Format("%d",i);
		m_ListMeterIndex.AddString(strIndex);
	}

	m_ListMeterIndex.SetCurSel(m_nMeterIndex);

	rect.top=m_rcClient.top+3;
	rect.bottom=rect.top+30;
	rect.left=m_rcClient.left+120;
	rect.right=rect.left+80;
	
	//create显示当前值的标签
	m_mainVale.Create(NULL,WS_VISIBLE|WS_CHILD,rect,this,ID_STATIC_MAIN_VALUE);		//ID=106
	

	rect.OffsetRect(90,0);
	m_Lable2.Create("度:设定值:",WS_CHILD|WS_VISIBLE,rect,this,ID_STATIC_SET_VALUE);		//ID=107
	
	rect.OffsetRect(80,0);
	m_editSetTemp.Create(WS_CHILD|WS_VISIBLE,rect,this,ID_EDIT_SET_VALUE);			//ID=108

	rect.OffsetRect(80,0);
	rect.right-=30;
	m_btHideOrShow.Create("显示",WS_VISIBLE|WS_CHILD,rect,this,ID_BUTTON_HIDE_SHOW);	//ID=109	
	
		return ret;
	
}

//显示或隐藏一些控件
void CM808::OnButtonHideOrShow()
{
	CString str;
	m_btHideOrShow.GetWindowText(str);
	if(str=="显示")
	{
		m_btWrite.ShowWindow(SW_SHOW);
		m_btReadParameterList.ShowWindow(SW_SHOW);
		m_ListMeterIndex.ShowWindow(SW_SHOW);
		m_ListParameter.ShowWindow(SW_SHOW);
		m_editParameter.ShowWindow(SW_SHOW);
		m_Lable1.ShowWindow(SW_SHOW);
		m_btHideOrShow.SetWindowText("隐藏");
		
	}
	else
	{
		m_editParameter.ShowWindow(SW_HIDE);
		m_Lable1.ShowWindow(SW_HIDE);
		m_btWrite.ShowWindow(SW_HIDE);
		m_btReadParameterList.ShowWindow(SW_HIDE);
		m_ListMeterIndex.ShowWindow(SW_HIDE);
		m_ListParameter.ShowWindow(SW_HIDE);
		m_Lable1.ShowWindow(SW_HIDE);
		
		m_btHideOrShow.SetWindowText("显示");
	}
}

CString CM808::GetCommandFromParameter(CString field)
{
	POSITION pos=NULL;
	int i;
	for(pos=this->commandeName_parameter_list[1].GetHeadPosition(),i=0;pos!=NULL;i++)
	{
		if(field==this->commandeName_parameter_list[1].GetNext(pos))
		{
			return commandeName_parameter_list[0].GetAt(commandeName_parameter_list[0].FindIndex(i));

		}
	}
	return CString("");

}

CString CM808::GetParamterFromCommand(CString field)
{
	POSITION pos=NULL;
	int i;
	for(pos=this->commandeName_parameter_list[0].GetHeadPosition(),i=0;pos!=NULL;i++)
	{
		if(field==this->commandeName_parameter_list[0].GetNext(pos))
		{
			return commandeName_parameter_list[1].GetAt(commandeName_parameter_list[1].FindIndex(i));
		}
	}
	return CString("");

}

⌨️ 快捷键说明

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