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

📄 nz_sf.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
	int ret = pucTCP[1] + 2 ;	memcpy(puc103, pucTCP, ret);	return ret;}int DGT801_Command_Handle(int iPort,int NetGroup,int iConnect,unsigned char *pucCMD,unsigned char iLen){	CurrentTime CurTime;	unsigned long ulInf ;	int m, ret, PER_NUM = 64;	unsigned char ucVSQ, ConLen;	unsigned char CmdBuff[256],IEC104DataBuf_M[256];	unsigned char ucADDR = *(pucCMD+IEC104_OFFSET_ADDR);	int index = SUB_AddrToIndex(ucADDR);	unsigned char ucTI104 = *(pucCMD+IEC104_OFFSET_TI);	SUB_Station *pSub = &SubDevice[iPort].SubStations[index];	switch(ucTI104)	{	case IEC104_TI_C_CS_NA_1:			//clock synchronization command,ASDU_103		CurTime = GetTime();		CmdBuff[0] = 0xFF;		CmdBuff[1] = 0x3E;		CmdBuff[2] = 0x07;		CmdBuff[3] = HEX_TO_BCD(CurTime.year%100) ;		CmdBuff[4] = 0x20 ;		CmdBuff[5] = HEX_TO_BCD(CurTime.month) ;		CmdBuff[6] = HEX_TO_BCD(CurTime.day) ;		CmdBuff[7] = HEX_TO_BCD(CurTime.hour) ;		CmdBuff[8] = HEX_TO_BCD(CurTime.minute) ;		CmdBuff[9] = HEX_TO_BCD(CurTime.second) ;		CmdBuff[10] = HIBYTE(DGT801CRC(CmdBuff, 10));		CmdBuff[11] = LOBYTE(DGT801CRC(CmdBuff, 10));		COMM_SendBuff(iPort, CmdBuff, 12);
		SYS_Delay(600);		break;	case IEC104_TI_C_IC_NA_1:				//interrogation command,general inspect ,ASDU_100		for( m=0; m<256/PER_NUM; m++ )		{			ucVSQ = 0x80 | PER_NUM ;			ConLen = PER_NUM ;			ulInf = PER_NUM*m+1 ;			ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,			0x01/*扇区号*/,ulInf/*信息地址*/,ConLen/*要转换的字节数*/,&pSub->sub_Data[0]);			CONN_Send104Data(NetGroup, iConnect, IEC104DataBuf_M, ret);			SYS_Delay(10);		}		break;		}}int Read_DGT801_Frame(int iPort, unsigned char ucADDR,unsigned char *pRecv)			{	unsigned short CRC_Check;	int k,  iError = 0, len = 0, nRecv = 0;	unsigned char iRead[EveryRead];	if( ComDataCome(iPort, 1000) >0 )	{		while(nRecv<270)		{			len = read(COM[iPort], iRead, sizeof(iRead));			if(len>0)			{				iError = 0 ;				if(nRecv+len>270)	break;				memcpy(pRecv+nRecv,iRead,len);				nRecv += len;				if(pRecv[0]==ucADDR)				{
					if(pRecv[2]==0xff)
					{
						if(nRecv>=pRecv[3]+pRecv[4]*256+7)
						{
							nRecv = pRecv[3]+pRecv[4]*256+7;
							break;
						}
					}					else if(nRecv>=pRecv[2]+5)					{						nRecv = pRecv[2]+5; 						break;					}				}			}			else			{				iError ++ ;				if(iError >30) break;				SYS_Delay(10);			}		}	}	if(nRecv>0)	{		PrintDebugInfo(iPort, Recv_Data, pRecv, nRecv);		CRC_Check = DGT801CRC(pRecv, nRecv-2);				//计算校验		if( (pRecv[nRecv-2]==HIBYTE(CRC_Check)) && (pRecv[nRecv-1]==LOBYTE(CRC_Check)) )		{			return nRecv;		}		else			return Error_Recv;	}	return 0;}void Process_DGT801_Recv(int nPort, int uIndex, unsigned char *pRecv){	CurrentTime CurTime;	int i,ret, k,uInf_Modbus = -1;	unsigned long ulInf = 0x4001;	unsigned short TempMs,TmpValue;	int YC_Num, YX_Num1=160, YX_Num2,number;	unsigned char ucVSQ, ConvertNum, ucSect = 1, ucTempYX;	unsigned char CurYX, TempYc[4], TempDgt[512], TempBuff[16];	unsigned char ConvertBuff[256], IEC104DataBuf_M[256];	unsigned char ucAddr = SubDevice[nPort].SubStations[uIndex].sub_address;	unsigned char FunCode = pRecv[1];	SUB_Station *pSub = &SubDevice[nPort].SubStations[uIndex];	switch(FunCode)	{	case 0xAA:	//保护动作信号、出口、压板、开入量等状态
		if(pRecv[2]==0x38)//48路保护信号,16路保护出口,32路开入量,64路压板
		{
			for(i=0;i<64;i++)
			{
				TempDgt[i] = GetDigital(pRecv+3, i)+1;
			}
			for(i=0;i<8;i++)
			{
				ucTempYX = pRecv[11+i];
				for(k=0;k<4;k++)
				{
					if((ucTempYX&0x03)==0x01)
						TempDgt[64+4*i+k] = 2;
					if((ucTempYX&0x03)==0x02)
						TempDgt[64+4*i+k] = 1;
					ucTempYX >>= 2;
				}
			}
			for(i=0;i<64;i++)
			{
				TempDgt[96+i] = GetDigital(pRecv+19, i)+1;
			}
			if(pSub->sub_DgtFlag==0)
			{
				for(i=0;i<160;i++)
				{
					pSub->sub_Data[i]=TempDgt[i];
					uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i+1);
					if( uInf_Modbus >=0 ) 
					{
						CurYX = TempDgt[i] - 1;
						RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );
					}
				}
				pSub->sub_DgtFlag = 1;
			}
			else
			{
				CurTime = GetTime();
				for(i=0;i<160;i++)
				{
					if(TempDgt[i] != pSub->sub_Data[i]) //如果有遥信变位
					{
						uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i+1);
						if( uInf_Modbus >=0 ) 
						{
							CurYX = TempDgt[i] - 1;
							RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );
						}
						pSub->sub_Data[i] = TempDgt[i];//遥信转存
						if(CONN_COMMU_Enable())
						{
							ConvertBuff[0] = TempDgt[i];
							ConvertBuff[1] = LOBYTE( CurTime.mSecond );
							ConvertBuff[2] = HIBYTE( CurTime.mSecond );
							ConvertBuff[3] = LOBYTE( CurTime.minute );
							ConvertBuff[4] = LOBYTE( CurTime.hour );
							ConvertBuff[5] = LOBYTE( CurTime.day );
							ConvertBuff[6] = LOBYTE( CurTime.month );
							ConvertBuff[7] = LOBYTE( CurTime.year );
							ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/,
								ucSect/*扇区号*/,(i+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff);
							WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg);
						}
					}
				}
			}
		}
		if(pRecv[2]==0x50)//96路保护信号,32路出口,64路开入,128路压板
		{
			for(i=0;i<128;i++)
			{
				TempDgt[i] = GetDigital(pRecv+3, i)+1;
			}
			for(i=0;i<16;i++)
			{
				ucTempYX = pRecv[19+i];
				for(k=0;k<4;k++)
				{
					if((ucTempYX&0x03)==0x01)
						TempDgt[64+4*i+k] = 2;
					if((ucTempYX&0x03)==0x02)
						TempDgt[64+4*i+k] = 1;
					ucTempYX >>= 2;
				}
			}
			for(i=0;i<128;i++)
			{
				TempDgt[192+i] = GetDigital(pRecv+35, i)+1;
			}
			if(pSub->sub_DgtFlag==0)
			{
				for(i=0;i<320;i++)
				{
					pSub->sub_Data[i]=TempDgt[i];
					uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i+1);
					if( uInf_Modbus >=0 ) 
					{
						CurYX = TempDgt[i] - 1;
						RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );
					}
				}
				pSub->sub_DgtFlag = 1;
			}
			else
			{
				CurTime = GetTime();
				for(i=0;i<320;i++)
				{
					if(TempDgt[i] != pSub->sub_Data[i]) //如果有遥信变位
					{
						uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i+1);
						if( uInf_Modbus >=0 ) 
						{
							CurYX = TempDgt[i] - 1;
							RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );
						}
						pSub->sub_Data[i] = TempDgt[i];//遥信转存
						if(CONN_COMMU_Enable())
						{
							ConvertBuff[0] = TempDgt[i];
							ConvertBuff[1] = LOBYTE( CurTime.mSecond );
							ConvertBuff[2] = HIBYTE( CurTime.mSecond );
							ConvertBuff[3] = LOBYTE( CurTime.minute );
							ConvertBuff[4] = LOBYTE( CurTime.hour );
							ConvertBuff[5] = LOBYTE( CurTime.day );
							ConvertBuff[6] = LOBYTE( CurTime.month );
							ConvertBuff[7] = LOBYTE( CurTime.year );
							ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/,
								ucSect/*扇区号*/,(i+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff);
							WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg);
						}
					}
				}
			}
		}		break;	case 0x63:	//模拟通道
		if(pRecv[2]==0xff)
		{
			YC_Num = (pRecv[3]+pRecv[4]*256)/4;
			for (i=0;i<YC_Num;i++) //YC
			{
				TmpValue = (pRecv[5 + 4*i]>>4)*10 + pRecv[5 + 4*i]&0x0F 
					+ ((pRecv[6 + 4*i]>>4)&0x07)*1000 + (pRecv[6 + 4*i]&0x0F)*100;
				TmpValue *=10 ;//扩大10倍上送
				TmpValue += (pRecv[8 + 4*i]>>4);
				TempYc[0] = HIBYTE(TmpValue);
				TempYc[1] = LOBYTE(TmpValue);
				uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i);
				if( uInf_Modbus >=0 ) 
					RefreshDateData(YC_Msg, uInf_Modbus, &TempYc[0]);
				ConvertBuff[3*i+0] = TempYc[1];
				ConvertBuff[3*i+1] = TempYc[0];
				ConvertBuff[3*i+2] = 0;
			}
			ucVSQ = 0x80|YC_Num;//信息字数目
			ConvertNum = YC_Num*3;
			if(CONN_COMMU_Enable())
			{
				ret = IEC_PackFrame_104(IEC104DataBuf_M,9,ucVSQ,1,ucAddr,0x01,ulInf,ConvertNum,ConvertBuff);	
				WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg);
			}
		}
		else
		{
			YC_Num = pRecv[2]/4;
			for (i=0;i<YC_Num;i++) //YC
			{
				TmpValue = (pRecv[3 + 4*i]>>4)*10 + pRecv[3 + 4*i]&0x0F 
					+ ((pRecv[4 + 4*i]>>4)&0x07)*1000 + (pRecv[4 + 4*i]&0x0F)*100;
				TmpValue *=10 ;//扩大10倍上送
				TmpValue += (pRecv[6 + 4*i]>>4);
				TempYc[0] = HIBYTE(TmpValue);
				TempYc[1] = LOBYTE(TmpValue);
				uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i);
				if( uInf_Modbus >=0 ) 
					RefreshDateData(YC_Msg, uInf_Modbus, &TempYc[0]);
				ConvertBuff[3*i+0] = TempYc[1];
				ConvertBuff[3*i+1] = TempYc[0];
				ConvertBuff[3*i+2] = 0;
			}
			ucVSQ = 0x80|YC_Num;//信息字数目
			ConvertNum = YC_Num*3;
			if(CONN_COMMU_Enable())
			{
				ret = IEC_PackFrame_104(IEC104DataBuf_M,9,ucVSQ,1,ucAddr,0x01,ulInf,ConvertNum,ConvertBuff);	
				WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg);
			}
		}		break;	case 0xA7:	//保护事件		TempBuff[0] = 2;	//信息元素(双点)		TempBuff[1] = TempBuff[2] = 0;				//相对时间		TempMs = BCD_2_HEX(pRecv[12])*1000 + ((pRecv[14]*256 + pRecv[13])*10/6)%1000;		TempBuff[3] = (unsigned char)(TempMs&0xff);	//毫秒低		TempBuff[4] = (unsigned char)(TempMs>>8);	//毫秒高		TempBuff[5] = BCD_2_HEX(pRecv[11]);			//分		TempBuff[6] = BCD_2_HEX(pRecv[10]);			//时		TempBuff[7] = BCD_2_HEX(pRecv[9]);			//日		TempBuff[8] = BCD_2_HEX(pRecv[8]);			//月		TempBuff[9] = BCD_2_HEX(pRecv[6]);			//年		ret = IEC_PackFrame_104(IEC104DataBuf_M,38/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/,			0x01/*扇区号*/,pRecv[5]+1/*信息地址*/,10/*要转换的字节数*/,TempBuff);		WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg);		break;	case 0xA0:	//保护投退状态		YX_Num2 = pRecv[2]/3;		if(pSub->sub_DGT801==0)		{			pSub->sub_DGT801 = 1;			for(i=0; i<YX_Num2; i++)			{
				number = pRecv[3+3*i]+pRecv[4+3*i]*256;				TempDgt[number] = pRecv[5+3*i]+1;				pSub->sub_Data[320+number]=TempDgt[number];				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, number+0x1000);				if( uInf_Modbus >=0 ) 				{					CurYX = TempDgt[number] - 1;					RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );				}			}		}		else		{			CurTime = GetTime();			for(i=0; i<YX_Num2; i++)			{
				number = pRecv[3+3*i]+pRecv[4+3*i]*256;				TempDgt[number] = pRecv[5+3*i]+1;				if(TempDgt[number] != pSub->sub_Data[320+number]) //如果有遥信变位				{					uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, number+0x1000);					if( uInf_Modbus >=0 ) 					{						CurYX = TempDgt[number] - 1;						RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );					}					pSub->sub_Data[320+number] = TempDgt[number];//遥信转存					if(CONN_COMMU_Enable())					{						ConvertBuff[0] = TempDgt[number];						ConvertBuff[1] = LOBYTE( CurTime.mSecond );						ConvertBuff[2] = HIBYTE( CurTime.mSecond );						ConvertBuff[3] = LOBYTE( CurTime.minute );						ConvertBuff[4] = LOBYTE( CurTime.hour );						ConvertBuff[5] = LOBYTE( CurTime.day );						ConvertBuff[6] = LOBYTE( CurTime.month );						ConvertBuff[7] = LOBYTE( CurTime.year );						ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/,							ucSect/*扇区号*/,(number+0x1000)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff);						WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg);					}				}			}		}		break;	}}
//南自94规约,云南雷打滩水电站
int	XJ104_To_NZ94(int iPort ,unsigned char *puc103,unsigned char *puc104)
{
	int ret = puc104[1] + 2 ;
	memcpy(puc103, puc104, ret);
	return ret;
}

int NZ94_Command_Handle(int iPort,int NetGroup,int iConnect,unsigned char *pucCMD,
						unsigned char iLen,unsigned char *puc104)

⌨️ 快捷键说明

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