发表于:2005/7/28 12:51:00
#0楼
//void ReadPV(nPort)为读欧姆龙E5EZ温控仪的命令帧
//void OnComm()为端口响应函数.
//现在的问题是:单个执行ReadPV(nPort)可以正常读取数据
//但我需要连续读取40台温控仪的值,下面这种情况就会出错:
//void CPvMonView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
ReadPV(1);//读PV值
ReadPV(2);//出错. 在断点调试过程中,我发现第一个子ReadPV(1)不会引起OnComm()响应.
//但要连续读必须这样做啊?
//我怀疑OnComm()响应处理有问题,但找不到原因.
Invalidate();
UpdateWindow();
CFormView::OnTimer(nIDEvent);
}
CString CPvMonView::ReadPV(int nPort)
{
nflag=1;
char dataframe[25];//命令帧
CByteArray txData;
dataframe[0]=0x02;
dataframe[1]='0'+nPort/10;//Station N.O
dataframe[2]='0'+nPort%10;
dataframe[3]='0';
dataframe[4]='0';
dataframe[5]='0';//
dataframe[6]='0';
dataframe[7]='1';
dataframe[8]='0';
dataframe[9]='1';//
dataframe[10]='C';
dataframe[11]='0';//
dataframe[12]='0';
dataframe[13]='0';
dataframe[14]='0';
dataframe[15]='0';//
dataframe[16]='0';
dataframe[17]='0';//
dataframe[18]='0';
dataframe[19]='0';
dataframe[20]='0';
dataframe[21]='1';
dataframe[22]=0x03;
BYTE bcc=(BYTE)dataframe[1];//计算BCC码
for(int j=2;j<23;j++)
bcc=bcc^dataframe[j];
dataframe[23]=bcc;
dataframe[24]='\0';
txData.RemoveAll();
m_strRXD.Empty();
m_PvCom.GetInput();//清空残留字符
for(int i=0;i<25;i++)
txData.SetAtGrow(i,dataframe[i]);
m_PvCom.SetOutput(COleVariant(txData));
return m_strRXD;
}
void CPvMonView::OnComm()
{
// TODO: Add your control notification handler code here
COleVariant vResponse;
COleSafeArray sfResponse;
LONG k,len;
BYTE rxdata[50];
CString strtemp;
if(m_PvCom.GetCommEvent()==2)
{
vResponse.Attach(m_PvCom.GetInput());
sfResponse=vResponse;
len=sfResponse.GetOneDimSize();
for(k=0;k<len;k++)
{
sfResponse.GetElement(&k,rxdata+k);
}
for(k=0;k<len;k++)
{
int bt=*(char*)(rxdata+k);//存入数组
strtemp.Format("%c",bt);
m_strRXD+=strtemp;
}
}
//提取有效数据
if(m_strRXD.Mid(7,4)=="0101")//
{
//m_strRXD为类成员变量
CString m_strRxdTemp;
m_strRxdTemp=m_strRXD.Right(4);
m_strRxdTemp=m_strRxdTemp.Left(3);
//16进制转换为整型
int num=StrToData(m_strRxdTemp,16);
//以字符串形式显示
m_strRxdTemp.Format("%d",num);
//站号
int nStationNo=StrToData(m_strRXD.Mid(1,2),16);
switch(nflag)
{
//nflag标记为一信号灯,为1时表示读PV值,0时读SV值.
case 0://
m_sarrSvData.SetAt(nStationNo,m_strRxdTemp);
break;
case 1://
m_sarrPvData.SetAt(nStationNo,m_strRxdTemp);
nflag=0;
break;
}
}
}
//void OnComm()为端口响应函数.
//现在的问题是:单个执行ReadPV(nPort)可以正常读取数据
//但我需要连续读取40台温控仪的值,下面这种情况就会出错:
//void CPvMonView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
ReadPV(1);//读PV值
ReadPV(2);//出错. 在断点调试过程中,我发现第一个子ReadPV(1)不会引起OnComm()响应.
//但要连续读必须这样做啊?
//我怀疑OnComm()响应处理有问题,但找不到原因.
Invalidate();
UpdateWindow();
CFormView::OnTimer(nIDEvent);
}
CString CPvMonView::ReadPV(int nPort)
{
nflag=1;
char dataframe[25];//命令帧
CByteArray txData;
dataframe[0]=0x02;
dataframe[1]='0'+nPort/10;//Station N.O
dataframe[2]='0'+nPort%10;
dataframe[3]='0';
dataframe[4]='0';
dataframe[5]='0';//
dataframe[6]='0';
dataframe[7]='1';
dataframe[8]='0';
dataframe[9]='1';//
dataframe[10]='C';
dataframe[11]='0';//
dataframe[12]='0';
dataframe[13]='0';
dataframe[14]='0';
dataframe[15]='0';//
dataframe[16]='0';
dataframe[17]='0';//
dataframe[18]='0';
dataframe[19]='0';
dataframe[20]='0';
dataframe[21]='1';
dataframe[22]=0x03;
BYTE bcc=(BYTE)dataframe[1];//计算BCC码
for(int j=2;j<23;j++)
bcc=bcc^dataframe[j];
dataframe[23]=bcc;
dataframe[24]='\0';
txData.RemoveAll();
m_strRXD.Empty();
m_PvCom.GetInput();//清空残留字符
for(int i=0;i<25;i++)
txData.SetAtGrow(i,dataframe[i]);
m_PvCom.SetOutput(COleVariant(txData));
return m_strRXD;
}
void CPvMonView::OnComm()
{
// TODO: Add your control notification handler code here
COleVariant vResponse;
COleSafeArray sfResponse;
LONG k,len;
BYTE rxdata[50];
CString strtemp;
if(m_PvCom.GetCommEvent()==2)
{
vResponse.Attach(m_PvCom.GetInput());
sfResponse=vResponse;
len=sfResponse.GetOneDimSize();
for(k=0;k<len;k++)
{
sfResponse.GetElement(&k,rxdata+k);
}
for(k=0;k<len;k++)
{
int bt=*(char*)(rxdata+k);//存入数组
strtemp.Format("%c",bt);
m_strRXD+=strtemp;
}
}
//提取有效数据
if(m_strRXD.Mid(7,4)=="0101")//
{
//m_strRXD为类成员变量
CString m_strRxdTemp;
m_strRxdTemp=m_strRXD.Right(4);
m_strRxdTemp=m_strRxdTemp.Left(3);
//16进制转换为整型
int num=StrToData(m_strRxdTemp,16);
//以字符串形式显示
m_strRxdTemp.Format("%d",num);
//站号
int nStationNo=StrToData(m_strRXD.Mid(1,2),16);
switch(nflag)
{
//nflag标记为一信号灯,为1时表示读PV值,0时读SV值.
case 0://
m_sarrSvData.SetAt(nStationNo,m_strRxdTemp);
break;
case 1://
m_sarrPvData.SetAt(nStationNo,m_strRxdTemp);
nflag=0;
break;
}
}
}