📄 protocolbody.cpp
字号:
// ProtocolBody.cpp: implementation of the CProtocolBody class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Protocol1.h"
#include "ProtocolBody.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CProtocolBody::CProtocolBody()
{
//Start=true;
m_SendTimes=0;
ActiLink=-1;
fun=0;
addr=0;
}
CProtocolBody::~CProtocolBody()
{
unload_tool();
}
void CProtocolBody::s_zc()
{
int dbno,dwno,amount,error;
int DataNum=MAX_MEM_NUM; /*根据实际情况提供,不能小于实际数据字节数,本程序中
遥信起地址DB1.DBB0
长度80byte(0~79),其中:
I区0~11byte(遥信,按位解包)
Q区起开始地址DB1.DBB12,12~19byte(遥信)
M区起始地址DB1.DBB20,20~79byte(遥信)
遥测起始地址DB1.DBB80,长度64byte
AI区80~140byte(遥测,按双字解包)
*/
static bool bStart=true;
addr=prtu->AddrNo;
n=0;
dbno=1; /*操作的DB块号为1*/
dwno=0; /*从第0个字(DW0)开始读取*/
amount=DataNum/2; /*读取长度为2个数据字*/
WORD buffer[MAX_MEM_NUM]; /*buffer中的数据字节数*/
memset(buffer,0,MAX_MEM_NUM*2);
byte *buf=(byte*)&buffer[0];
if(bStart)
{
bStart=false;
adr_table_type plc_adr_table[4] = { {2,0,2,0},{3,0,2,0},{4,0,2,0},
{0,0,2,0} };
int LinkResult=load_tool (1,"S7ONLINE",plc_adr_table);
if(LinkResult!=0) {bStart=true; return;}
}
if(fun==ZC_FLAG)//读数据
{
amount=MAX_MEM_NUM/2;
ActiLink=-1;
if(addr==2)ActiLink=new_ss(1);//跟不同地址的plc激活不同的连接
else if(addr==3)ActiLink=new_ss(2);
else ActiLink=new_ss(3);
if(ActiLink!=0) return;
error = db_read(dbno,dwno,&amount,buffer); /*将从DB块读取的数据字存放到缓冲数组buffer*/
if(error==0)
{
parse_yx(1000,1);
PacketProc(buf,DataNum);
}
else
parse_yx(1000,0);//添加一个固定点1000来监视通讯情况
}
else//读遥控反较
{
byte suf[2];
memset(suf,0,2);
dwno=2;
dbno=YK_REC_ADDR;
fun=0;
ActiLink=-1;
if(addr==2)ActiLink=new_ss(1);//跟不同地址的plc激活不同的连接
else if(addr==3)ActiLink=new_ss(2);
else ActiLink=new_ss(3);
if(ActiLink!=0) return;
error = m_field_read(dbno,dwno,suf); /*将从MW块读取的数据字存放到缓冲数组buffer*/
WORD result=suf[0]<<8 | suf[1];
if(result==240) parse_result(true);
else if(result==15) parse_result(false);
}
add_r_show(buf,DataNum);
};
void CProtocolBody::PacketProc(byte *start ,short len)
{
///////前80字节为遥信后64个字节为遥测(双字)
RecYxProc(start,80);
RecYcProc(start,64);
}
void CProtocolBody::RecYcProc(byte *start, WORD len) //遥测解包
{
int YcNum=len/4;
start+=80;
float temp;
for(int i=0;i<YcNum;i++)
{
temp=GetDd((byte*)start);
parse_yc(i,(int)temp,temp,1);
start+=4;
}
}
void CProtocolBody::RecYxProc(byte *start, WORD len) //遥信解包
{
int m_nCode = 0;
int m_nYxDot=0;
for(int k = 0; k < (int)len; k++)
{
for(int nYx = 0; nYx < 8; nYx++)
{
int oi=(BYTE)pow(2,nYx);
m_nCode = (start[k] & (BYTE)pow(2,nYx)) >> nYx;
parse_yx(m_nYxDot++,m_nCode);
}
}
}
void CProtocolBody::s_yk_sel()
{
ActiLink=-1;
addr=prtu->AddrNo;
if(addr==2)ActiLink=new_ss(1);//跟不同地址的plc激活不同的连接
else if(addr==3)ActiLink=new_ss(2);
else ActiLink=new_ss(3);
if(ActiLink!=0) return;
byte buffer[2];
memset(buffer,0,2);
int DotN0=0x6000+s_info.Dot_no;
int MemNo=YK_SEL_ADDR;
int MemSize=2;
buffer[0]=DotN0/256;
buffer[1]=DotN0%256;
int a=m_field_write(MemNo,MemSize,buffer);
if(s_info.val==0)
DotN0=85;//分代码
else DotN0=170;//合代码
MemNo=YK_SEL1_ADDR;
MemSize=2;
buffer[0]=DotN0/256;
buffer[1]=DotN0%256;
a=m_field_write(MemNo,MemSize,buffer);
fun=YK_EXC_FLAG;
}
void CProtocolBody::s_yk_exc()
{
ActiLink=-1;
addr=prtu->AddrNo;
if(addr==2)ActiLink=new_ss(1);//跟不同地址的plc激活不同的连接
else if(addr==3)ActiLink=new_ss(2);
else ActiLink=new_ss(3);
if(ActiLink!=0) return;
byte buffer[2];
memset(buffer,0,2);
int DotN0=128;//执行代码
int MemNo=YK_EXC_ADDR;
int MemSize=2;
buffer[0]=DotN0/256;
buffer[1]=DotN0%256;
m_field_write(MemNo,MemSize,buffer);
parse_msg_opt((char*)(&s_info));
}
void CProtocolBody::s_yk_cnc()
{
ActiLink=-1;
addr=prtu->AddrNo;
if(addr==2)ActiLink=new_ss(1);//跟不同地址的plc激活不同的连接
else if(addr==3)ActiLink=new_ss(2);
else ActiLink=new_ss(3);
if(ActiLink!=0) return;
byte buffer[2];
memset(buffer,0,2);
int DotN0=160;//撤消代码
int MemNo=YK_EXC_ADDR;
int MemSize=2;
buffer[0]=DotN0/256;
buffer[1]=DotN0%256;
m_field_write(MemNo,MemSize,buffer);
fun=YK_EXC_FLAG;
}
void CProtocolBody::s_yk_exc1()
{
ActiLink=-1;
addr=prtu->AddrNo;
if(addr==2)ActiLink=new_ss(1);//跟不同地址的plc激活不同的连接
else if(addr==3)ActiLink=new_ss(2);
else ActiLink=new_ss(3);
if(ActiLink!=0) return;
byte buf[2];
memset(buf,0,2);
int DotN0=0x6300+s_info.Dot_no;
int MemNo=YK_EXC1_ADDR;
int MemSize=2;
buf[0]=DotN0/256;
buf[1]=DotN0%256;
int e=m_field_write(MemNo,MemSize,buf);
MemNo=116;
MemSize=2;
buf[0]=0;
buf[1]=1;
e=m_field_write(MemNo,MemSize,buf);
}
float CProtocolBody::GetDd(void* code)
{
// return (float)0;
if(code == NULL )
{
// AfxMessageBox( "Pass BinaryToBcd invalidate pointer!" , MB_OK , 0 );
return (float)0;
}
byte *start=(byte *)code;
int temp ;//= *( (int*)code );
temp=*start<<24 | *(start+1)<<16 | *(start+2)<<8 | *(start+3);
int temp1,temp2,temp3,temp4;
float temp5 = 1.0;
int i = 1;
int j = -1;
temp1 = ( temp & 0x80000000 ) >> 31; //符号位
temp2 = ( temp & 0x7f800000 ) >> 23; //指数位
temp3 = ( temp & 0x007fffff ) ; //有效位
if(temp1 == 0) temp1 = 1;
else temp1 = -1;
float temp_2 = (float)ldexp(1,( temp2 - ldexp(1,7) + 1 ));
i = i<<22;
while(i!=0)
{
temp4 = temp3 & i ;
if(temp4!=0) temp4 = 1;
i = i>>1;
temp5 += (float)ldexp(temp4 , j);
j--;
}
temp5 = temp1 * temp_2 * temp5;
return temp5 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -