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

📄 sypbprotocol.cpp

📁 配电变压器负荷监测与控制系统数据监测传输
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					    if(pQueueEle->strData[8+n*3+2] ==  0x10 && pQueueEle->strData[8+n*3+3] ==  0x05)//日统计无功功率值(日统计数据A、B、C三相)
						{
							mTreadBuf->DataBuf[count++] = 0x80;
							mTreadBuf->DataBuf[count++] = 0x12;
						}
					}/*end of (for(n=0;n<pQueueEle->strData[8];n++))*/
					mTreadBuf->DataBuf[count++] = 0x00;               //pw
					mTreadBuf->DataBuf[count++] = 0x00;
					break;
					
				case	0x02:							/*任务启动/停止*/
					mTreadBuf->DataBuf[count++] = 0x04;                //AFN
					mTreadBuf->DataBuf[count++] = 0x60;                     //SEQ

					if(!(pQueueEle->devAddr[5]))          //DA
					{
						mTreadBuf->DataBuf[count++] = 0;
					}
					else
					{
						mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) % 8));
					}
					mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) / 8-1));


					mTreadBuf->DataBuf[count++] = 0x08;               //DT
					mTreadBuf->DataBuf[count++] = 0x08;

					mTreadBuf->DataBuf[count++] = pQueueEle->strData[0];
					mTreadBuf->DataBuf[count++] = 0x00;               //pw
					mTreadBuf->DataBuf[count++] = 0x00;
					break;
					
				case    0x03:                                      //AFN //清除自动任务
 					mTreadBuf->DataBuf[count++] = 0x05;                //AFN //清除自动任务
					mTreadBuf->DataBuf[count++] = 0x60;                     //SEQ
					mTreadBuf->DataBuf[count++] = 0x00;                //p0
					mTreadBuf->DataBuf[count++] = 0x00;                   
					mTreadBuf->DataBuf[count++] = 0x20;                //DT
					mTreadBuf->DataBuf[count++] = 0x00;  
					mTreadBuf->DataBuf[count++] = pQueueEle->strData[0];
					mTreadBuf->DataBuf[count++] = 0x00;               //pw
					mTreadBuf->DataBuf[count++] = 0x00;             

					break;
				}/*end of (switch(pQueueEle->cnCtl[2]))*/
				break;
			case	JCCTL_READSUTOMISSION:                       /*查询自动任务*/
				switch(pQueueEle->cnCtl[2])
				{
				case	0x01:							/*查询自动任务*/
					mTreadBuf->DataBuf[count++] = 0x0A;                //AFN
					mTreadBuf->DataBuf[count++] = 0x60;                     //SEQ


					if(!(pQueueEle->devAddr[5]))
					{
						mTreadBuf->DataBuf[count++] = 0;
					}
					else
					{
						mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) % 8));
					}
					mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) / 8-1));

					mTreadBuf->DataBuf[count++] = 0x02;              //二类终端任务DT
					mTreadBuf->DataBuf[count++] = 0x08;

					break;
					
				}/*end of (switch(pQueueEle->cnCtl[2]))*/
				break;
			case	JCCTL_SETALARM:                            /*设置告警项*/
				switch(pQueueEle->cnCtl[2])
				{
				case	0x01:							/*设置告警项*/
					mTreadBuf->DataBuf[count++] = 0x04;         //AFN
					mTreadBuf->DataBuf[count++] = 0x60;             //SEQ

					mTreadBuf->DataBuf[count++] = 0x00;               //pn
					mTreadBuf->DataBuf[count++] = 0x00;

					mTreadBuf->DataBuf[count++] = 0x80;               //DT
					mTreadBuf->DataBuf[count++] = 0x00;

					mTreadBuf->DataBuf[count++] = 0x00;

					mTreadBuf->DataBuf[count] = 0x00;
					if((pQueueEle->strData[0] & 0x01) == 0x01)				//电压异常
					{
						mTreadBuf->DataBuf[count] |= 0x02;
					}
					if((pQueueEle->strData[0] & 0x02) == 0x02)				//电流异常
					{
						mTreadBuf->DataBuf[count] |= 0x01;
					}
					if((pQueueEle->strData[0] & 0x04) == 0x04)				//相序异常
					{
						mTreadBuf->DataBuf[count] |= 0x04;
					}
					if((pQueueEle->strData[0] & 0x08) == 0x08)				//终端停上电
					{
						mTreadBuf->DataBuf[count] |= 0x20;
					}
					count++;

					mTreadBuf->DataBuf[count] = 0x00;
					if((pQueueEle->strData[0] & 0x10) == 0x10)              //终端故障
					{
						mTreadBuf->DataBuf[count] |= 0x10;
					}
					count++;

					mTreadBuf->DataBuf[count++] = 0x00;
					mTreadBuf->DataBuf[count++] = 0x00;
					mTreadBuf->DataBuf[count++] = 0x00;
					mTreadBuf->DataBuf[count++] = 0x00;
					mTreadBuf->DataBuf[count++] = 0x00;



					mTreadBuf->DataBuf[count++] = 0xFF;
					mTreadBuf->DataBuf[count++] = 0xFF;
					mTreadBuf->DataBuf[count++] = 0xFF;
					mTreadBuf->DataBuf[count++] = 0xFF;
					mTreadBuf->DataBuf[count++] = 0xFF;
					mTreadBuf->DataBuf[count++] = 0xFF;
					mTreadBuf->DataBuf[count++] = 0xFF;
					mTreadBuf->DataBuf[count++] = 0xFF;
					
					break;
					
				case	0x02:							//查询告警事件
					mTreadBuf->DataBuf[count++] = 0x0A;         //AFN
					mTreadBuf->DataBuf[count++] = 0x60;             //SEQ


					mTreadBuf->DataBuf[count++] = 0x00;               //pn
					mTreadBuf->DataBuf[count++] = 0x00;

					mTreadBuf->DataBuf[count++] = 0x80;               //DT
					mTreadBuf->DataBuf[count++] = 0x00;
					break;
				}/*end of (switch(pQueueEle->cnCtl[2]))*/
				break;
			case	JCCTL_SETMETERNO:                            /* 设置表号*/
				int i=0;
				switch(pQueueEle->cnCtl[2])
				{
				case	0x01:							/*设置表号*/
					mTreadBuf->DataBuf[count++] = 0x04;         //AFN
					mTreadBuf->DataBuf[count++] = 0x60;             //SEQ


					mTreadBuf->DataBuf[count++] = 0x00;               //pn
					mTreadBuf->DataBuf[count++] = 0x00;

					mTreadBuf->DataBuf[count++] = 0x02;               //DT
					mTreadBuf->DataBuf[count++] = 0x01;

					memcpy( &mTreadBuf->DataBuf[count], pQueueEle->strData, pQueueEle->nDataLenth );
					for(i=0;i<(unsigned char)pQueueEle->strData[0];i++)
					{
						mTreadBuf->DataBuf[count+i*17+1] = mTreadBuf->DataBuf[count+i*17+2];
						mTreadBuf->DataBuf[count+i*17+3] = 0x01;
						mTreadBuf->DataBuf[count+i*17+4] = 0x01;

						mTreadBuf->DataBuf[count+i*17+11] = 0x00;
						mTreadBuf->DataBuf[count+i*17+12] = 0x00;
						mTreadBuf->DataBuf[count+i*17+13] = 0x00;
						mTreadBuf->DataBuf[count+i*17+14] = 0x00;
						mTreadBuf->DataBuf[count+i*17+15] = 0x00;
						mTreadBuf->DataBuf[count+i*17+16] = 0x00;
						mTreadBuf->DataBuf[count+i*17+17] = 0x10;
					}/*end of (for(i=0;i<(unsigned char)pQueueEle->strData[0];i++))*/
					count+=pQueueEle->nDataLenth;
					mTreadBuf->DataBuf[count++] = 0x00;               //pw
					mTreadBuf->DataBuf[count++] = 0x00;

					break;
					
				case	0x02:                           /*读取表号*/
					mTreadBuf->DataBuf[count++] = 0x0A;         //AFN
					mTreadBuf->DataBuf[count++] = 0x60;             //SEQ


					mTreadBuf->DataBuf[count++] = 0x00;               //pn
					mTreadBuf->DataBuf[count++] = 0x00;

					mTreadBuf->DataBuf[count++] = 0x02;               //DT
					mTreadBuf->DataBuf[count++] = 0x01;
					break;
				}/*end of (switch(pQueueEle->cnCtl[2]))*/
				break;
			}/*end of (switch(pQueueEle->cnCtl[1]))*/
		}/*end of (switch(pQueueEle->cnCtl[0] & 0x0F) )*/
	}/*end of (if(pQueueEle->bAffirm))*/



	if(mTreadBuf->DataBuf[13] & 0x80)      //如需要时间标签,加入时间标签
	{   

		mTreadBuf->DataBuf[count++] = 0x00;
		mTreadBuf->DataBuf[count++] = 0x00;
		mTreadBuf->DataBuf[count++] = 0x00;
		mTreadBuf->DataBuf[count++] = 0x00;
		mTreadBuf->DataBuf[count++] = 0x00;
		mTreadBuf->DataBuf[count++] = 0x00;
	} /*end of (if(mTreadBuf->DataBuf[13] & 0x80))*/                             

	UINT nDataLen=0;
	nDataLen = count-6;
	nDataLen=(nDataLen<<2) + 0x01;
	mTreadBuf->DataBuf[1] = nDataLen & 0x00FF;
	mTreadBuf->DataBuf[2] = (nDataLen & 0xFF00) >>8;
	mTreadBuf->DataBuf[3] = nDataLen & 0x00FF;
	mTreadBuf->DataBuf[4] = (nDataLen & 0xFF00) >>8;

	int i=0;
	unsigned char usChksum=0x00;   //判断校验和
	for(i=6;i<count;i++)
	{
		usChksum+=mTreadBuf->DataBuf[i];
	}
	mTreadBuf->DataBuf[count++] = usChksum;

	mTreadBuf->DataBuf[count++] = 0x16;


	return count;
}





extern "C" _declspec(dllexport) BOOL YHIsRcvedFrameDll(ThreadBuf *mTreadBuf, UINT nLenth )						 //负责检验终端上报数据是否正确
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	int i,count=0;

	if(mTreadBuf->DataBuf[count]!=0x68)        //判断数据头
	{
		return 0;
	}
    count++;

	if(mTreadBuf->DataBuf[count]!=mTreadBuf->DataBuf[count+2])//判断两数据长度是否相同
	{
		return 0;
	}
	if(mTreadBuf->DataBuf[count+1]!=mTreadBuf->DataBuf[count+3])
	{
		return 0;
	}
	UINT Lenth = 0;    //定义数据长度
    unsigned char L1,L2;	
 	L1=(mTreadBuf->DataBuf[count+1]<<6 & 0xC0) | mTreadBuf->DataBuf[count]>>2 & 0x3F;
    L2=mTreadBuf->DataBuf[count+1]>>2 &0x3F;
	Lenth=L1+L2*256;
	if((Lenth+8)!=nLenth)
	{
		return 0;
	}
	count+=4;

 	if(mTreadBuf->DataBuf[count]!=0x68)        //判断区间同步字
	{
		return 0;
	}
	count++;
    	
    unsigned char usChksum=0x00;   //判断校验和
    for(i=0;i<int(Lenth);i++)
	{
		usChksum+=mTreadBuf->DataBuf[count++];
	}

	if(mTreadBuf->DataBuf[count]!=usChksum)
	{
		return 0;
	}
	count++;                             //判断数据尾
    if(mTreadBuf->DataBuf[count]!=0x16)   
	{
		return 0;
	}
	return true;
}
extern "C" _declspec(dllexport) UINT YHProtocolToQueueDll(QUEUEELEMENT *pQueueEle, ThreadBuf *mTreadBuf)       //负责把厂家协议转化为内部规约
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	UINT count=0;
	UINT lenth=0;
	int nTemp=0;
	int nFlag=0;
	
	if(mTreadBuf->DataBuf[count] != 0x68)    //判断帧头
	{
		return 0;
	}
	lenth = ((((mTreadBuf->DataBuf[count+2])<<8) + mTreadBuf->DataBuf[count+1]) & 0xFFFC) >> 2;
	count+=6;

	int nTerAddr=0;
	nTerAddr = (mTreadBuf->DataBuf[count+4] << 8) + mTreadBuf->DataBuf[count+3];
	CString strAddr;
	strAddr.Format("%d",nTerAddr);
	CUtilities::StrToBcd( (char *)pQueueEle->TerAddr, strAddr, 2, TRUE );  //区域代码
	pQueueEle->TerAddr[2] = mTreadBuf->DataBuf[count+1];  //终端地址
	pQueueEle->TerAddr[3] = mTreadBuf->DataBuf[count+2];
	pQueueEle->TerAddr[4] = 0x00;
	pQueueEle->TerAddr[5] = 0x00;

	pQueueEle->cnCtl[0] = 0x00;

	UINT nRedLen = 12;     //除数据以外的其他数据长度
	if(mTreadBuf->DataBuf[count] & 0x20)//存在EC(控制码比较)
	{
		nRedLen +=2;
	}

	if(mTreadBuf->DataBuf[count+7] & 0x80)//存在TPV(SEQ比较)
	{
		nRedLen +=6;
	}
	switch(mTreadBuf->DataBuf[count] & 0x0f)     //银河规约控制码
	{
	case	0:    //返回确认
		count+=10;
		if(mTreadBuf->DataBuf[count] == 0x01 && mTreadBuf->DataBuf[count+1] == 0x00)  /*返回正确*/
		{
			pQueueEle->cnCtl[0] = 0x03;
			pQueueEle->nDataLenth =1;
			pQueueEle->strData = new char[pQueueEle->nDataLenth];
			pQueueEle->strData[0] = 14;
			nFlag = 1;
		}
		if(mTreadBuf->DataBuf[count] == 0x02 && mTreadBuf->DataBuf[count+1] == 0x00)  /*返回错误*/
		{
			pQueueEle->cnCtl[0] = 0x04;
			pQueueEle->nDataLenth =1;
			pQueueEle->strData = new char[pQueueEle->nDataLenth];
			pQueueEle->strData[0] = 1;
			nFlag = 1;
		}
		count+=2;
		break;
	case	8:                                  //返回数据

		switch(mTreadBuf->DataBuf[count] & 0xC0)
		{
		case    0x80:
			switch(mTreadBuf->DataBuf[count+6])          //AFN
			{
			case	YHAFN_AFFIRM:                                      //确认∕否认
				switch((mTreadBuf->DataBuf[count+7]&0x60) >> 5)        //SEQ判断是否有后续帧
				{
				case	0:
					pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x10;          //多帧标志上行数据
					pQueueEle->bGetCTData = true;
					break;
				case	1:
					pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x00;          //多帧最后一帧标志上行数据
					pQueueEle->bGetCTData = false;
					break;
				case	2:
					pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x10;          //多帧标志上行数据
					pQueueEle->bGetCTData = true;
					break;
				case	3:
					pQueueEle->cnCtl[0] = pQueueEle->cnCtl[0] | 0x00;          //单帧标志上行数据
					pQueueEle->bGetCTData = false;
					break;
				}                                              /*end of 有无后续帧判断*/
				if(mTreadBuf->DataBuf[count] & 0x40 >>6)      //表示是自动任务上报
				{
					pQueueEle->autoTaskInfo.chAutoTask = 1;
					pQueueEle->nCountRTU = mTreadBuf->DataBuf[count] & 0x0f;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -