您现在所在的是:

欧姆龙OMRON

回帖:1个,阅读:1794 [上一页] [1] [下一页]
1054
exJeffhn
文章数:39
年度积分:50
历史总积分:1054
注册时间:2004/3/23
发站内信
发表于: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;
}
}

}
1054
exJeffhn
文章数:39
年度积分:50
历史总积分:1054
注册时间:2004/3/23
发站内信
发表于:2005/7/28 12:53:00
#1楼
ReadPV(1);//读PV值
ReadPV(2);//出错. 在断点调试过程中,我发现第一个子ReadPV(1)不会引起OnComm()响应.
                  //但要连续读必须这样做啊?
                  //我怀疑OnComm()响应处理有问题,但找不到原因.

我的串口是这样初始化的.
//³õʼ»¯´®¿Ú
//##ModelId=42E78ECB00B6
void CPvMonView::InitCom()
{
m_PvCom.SetCommPort(1);
m_PvCom.SetInputMode(1);
m_PvCom.SetSettings("9600,e,7,2");
m_PvCom.SetRThreshold(22);//
m_PvCom.SetInputLen(0);
if(!m_PvCom.GetPortOpen())
m_PvCom.SetPortOpen(TRUE);
ASSERT(m_PvCom.GetPortOpen());
}
请陈老师和利昌兄多加指点,现在这一步调不通,严重影我的工作情绪
表情表情
[此贴子已经被作者于2005-7-28 12:58:18编辑过]

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003