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

📄 protocolbody.cpp

📁 西门子s7 300系列的通讯程序 vc
💻 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 + -