📄 m808.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 + -