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

📄 protocol.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
			CurTime = GetTime();			for(i=0;i<8;i++)			{				TempDgt[i] = pData[2*i+4] + 1;				if(TempDgt[i] != SubDevice[iPort].SubStations[uIndex].sub_Data[i]) //如果有遥信变位				{					uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 1, i+1);					if( uInf_Modbus >=0 ) 					{						CurYX = TempDgt[i] - 1;						RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );					}					SubDevice[iPort].SubStations[uIndex].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/*设备地址*/,							1/*扇区号*/,(i+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff);						WriteMsgToShareMem(iPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg);					}				}			}		}	}	else//YC	{		switch(DevType)		{		case 0xF1:	//(如果没有零序电压则符号寄存器字节为:pData[62])			{				for(i=0;i<6;i++)					WriteBuff[i] = pData[3+i];				for(i=0;i<6;i++)					WriteBuff[6+i] = pData[11+i];				for(i=0;i<6;i++)					WriteBuff[12+i] = pData[19+i];								TempYC = pData[33]*256 + pData[34];//有功功率				if(pData[62]&0x08)					TempYC = ~TempYC+1;				WriteBuff[18] = HIBYTE(TempYC);				WriteBuff[19] = LOBYTE(TempYC);							TempYC = pData[41]*256 + pData[42];//无功功率				if(pData[62]&0x80)					TempYC = ~TempYC+1;				WriteBuff[20] = HIBYTE(TempYC);				WriteBuff[21] = LOBYTE(TempYC);								TempYC = pData[49]*256 + pData[50];//功率因数				if(pData[62]&0x08)					TempYC = ~TempYC+1;				WriteBuff[22] = HIBYTE(TempYC);				WriteBuff[23] = LOBYTE(TempYC);								WriteBuff[24] = pData[57];//视在功率				WriteBuff[25] = pData[58];								WriteBuff[26] = pData[59];//频率				WriteBuff[27] = pData[60];			}			break;		case 0xF2:	//(如果没有零序电压则符号寄存器字节为:pData[122])			{				for(i=0;i<3;i++)							//相电压				{					TempYC = Get_GR100_32BITYC(&pData[4*i+3],YXNUM);					WriteBuff[2*i+0] = HIBYTE(TempYC);					WriteBuff[2*i+1] = LOBYTE(TempYC);				}					for(i=0;i<3;i++)							//线电压				{					TempYC = Get_GR100_32BITYC(&pData[4*i+19],YXNUM);					WriteBuff[2*i+6] = HIBYTE(TempYC);					WriteBuff[2*i+7] = LOBYTE(TempYC);				}				for(i=0;i<3;i++)							//相电流				{					TempYC = Get_GR100_32BITYC(&pData[4*i+35],Power)*YCNUM;					WriteBuff[2*i+12] = HIBYTE(TempYC);					WriteBuff[2*i+13] = LOBYTE(TempYC);				}				TempYC = Get_GR100_32BITYC(&pData[63],YXNUM);//有功功率				if(pData[122]&0x08)					TempYC = ~TempYC+1;				WriteBuff[18] = HIBYTE(TempYC);				WriteBuff[19] = LOBYTE(TempYC);								TempYC = Get_GR100_32BITYC(&pData[79],YXNUM);//无功功率				if(pData[122]&0x80)					TempYC = ~TempYC+1;				WriteBuff[20] = HIBYTE(TempYC);				WriteBuff[21] = LOBYTE(TempYC);							TempYC = Get_GR100_32BITYC(&pData[95],1);//功率因数				if(pData[122]&0x08)					TempYC = ~TempYC+1;				WriteBuff[22] = HIBYTE(TempYC);				WriteBuff[23] = LOBYTE(TempYC);				for(i=0;i<2;i++)			//视在功率,频率				{					if(i==1)						TempYC = Get_GR100_32BITYC(&pData[4*i+111],1);//频率原值上送					else						TempYC = Get_GR100_32BITYC(&pData[4*i+111],YXNUM);					WriteBuff[2*i+24] = HIBYTE(TempYC);					WriteBuff[2*i+25] = LOBYTE(TempYC);				}			}			break;		}		if((WriteGR100Data)&&(uIndex==0))			memcpy(GR100_Data+2, WriteBuff, YC_Num*2);		for(i=0; i<YC_Num; i++)		{			uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i);			if( uInf_Modbus >=0 ) 			{				RefreshDateData(YC_Msg, uInf_Modbus, &WriteBuff[2*i]);			}			ConvertBuff[3*i+0] = WriteBuff[2*i+1];			ConvertBuff[3*i+1] = WriteBuff[2*i+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(iPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg);		}	}}void ProcessMasterGR100(int iPort, unsigned char *pData){	int i, YC_Num = 21;	int uInf_Modbus;	unsigned char ucSect = 1;	unsigned long ulInf = 0x4001;	unsigned char ucAddr = pData[0];	for(i=0; i<YC_Num; i++)	{		uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i);		if( uInf_Modbus >=0 ) 		{			RefreshDateData(YC_Msg, uInf_Modbus, &pData[7+2*i]);		}	}}void Refresh_GR100_DD(int iPort, int uIndex, GR100_DD_DATA *pDD_Buff){	int i,j,nRecv,iDd = 7;	unsigned long TempDD,TopWord;	unsigned long HiWord,LoWord;	unsigned short CRC16Check,Temp[2];	unsigned char SendBuff[16], pRecv[256];	unsigned char ucAddr = SubDevice[iPort].SubStations[uIndex].sub_address;//从机地址	unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type;	SendBuff[0] = ucAddr ;	SendBuff[1] = 0x03;	SendBuff[2] = 0;	SendBuff[3] = 41;	SendBuff[4] = 0;	switch(DevType)	{	case 0xF1:		SendBuff[5] = iDd * 2;		break;	case 0xF2:		SendBuff[5] = iDd * 4;		break;	}	CRC16Check = CRC16(SendBuff, 6);	SendBuff[6] = HIBYTE(CRC16Check);	SendBuff[7] = LOBYTE(CRC16Check);	for(i = 0; i < 3; i++)	{		SYS_Delay(50);		COMM_SendBuff(iPort, SendBuff, 8);		nRecv = Read_Modbus_Frame(iPort, ucAddr, pRecv);		if (nRecv > 0)		{			switch(DevType)			{			case 0xF1:				for(j = 0; j < iDd; j++)				{					LoWord = pRecv[3 + 4 * j]*256 + pRecv[4 + 4 * j] ;//modify by scm 06.05.02  高低字颠倒					HiWord = pRecv[5 + 4 * j]*256 + pRecv[6 + 4 * j] ;					TempDD = HiWord*1000 + LoWord ;						Temp[0]=TempDD & 0xFFFF;					Temp[1]=(TempDD >> 16) & 0xFFFF;					pDD_Buff->DD_Buff[0 + j * 5] = LOBYTE(Temp[0]);					pDD_Buff->DD_Buff[1 + j * 5] = HIBYTE(Temp[0]);					pDD_Buff->DD_Buff[2 + j * 5] = LOBYTE(Temp[1]);					pDD_Buff->DD_Buff[3 + j * 5] = HIBYTE(Temp[1]);					pDD_Buff->DD_Buff[4 + j * 5] = j;				}				break;			case 0xF2:				for(j = 0; j < iDd; j++)				{					TopWord = pRecv[9 + 8 * j]*256 + pRecv[10 + 8 * j] ;					HiWord = pRecv[3 + 8 * j]*256 + pRecv[4 + 8 * j] ;					LoWord = pRecv[5 + 8 * j]*256 + pRecv[6 + 8 * j] ;					TempDD = TopWord*1000000 + HiWord*10000 + LoWord ;					Temp[0]=TempDD & 0xFFFF;					Temp[1]=(TempDD >> 16) & 0xFFFF;					pDD_Buff->DD_Buff[0 + j * 5] = LOBYTE(Temp[0]);					pDD_Buff->DD_Buff[1 + j * 5] = HIBYTE(Temp[0]);					pDD_Buff->DD_Buff[2 + j * 5] = LOBYTE(Temp[1]);					pDD_Buff->DD_Buff[3 + j * 5] = HIBYTE(Temp[1]);					pDD_Buff->DD_Buff[4 + j * 5] = j;				}				break;			}			break;		}		if(SubDevice[iPort].SubStations[uIndex].sub_state != SUB_STATE_ONLINE)		break;	}}void Refresh_GR100ZGD_DD(int iPort, int uIndex, GR100_DD_DATA *pDD_Buff){	int i,j,nRecv,iDd = 7;	unsigned long TempDD,TopWord;	unsigned long HiWord,LoWord;	unsigned short CRC16Check,Temp[2];	unsigned char SendBuff[16], pRecv[256];	unsigned char ucAddr = SubDevice[iPort].SubStations[uIndex].sub_address;//从机地址	unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type;	SendBuff[0] = ucAddr ;	SendBuff[1] = 0x03;	SendBuff[2] = 0;	SendBuff[3] = 50;	SendBuff[4] = 0;	switch(DevType)	{	case 0xF1:		SendBuff[5] = 22;		break;	case 0xF2:		SendBuff[5] = 44;		break;	}	CRC16Check = CRC16(SendBuff, 6);	SendBuff[6] = HIBYTE(CRC16Check);	SendBuff[7] = LOBYTE(CRC16Check);	for(i = 0; i < 3; i++)	{		SYS_Delay(50);		COMM_SendBuff(iPort, SendBuff, 8);		nRecv = Read_Modbus_Frame(iPort, ucAddr, pRecv);		if (nRecv > 0)		{			switch(DevType)			{			case 0xF1:				for(j = 0; j < iDd; j++)				{					LoWord = pRecv[3 + 4 * j]*256 + pRecv[4 + 4 * j] ;//modify by scm 06.05.02  高低字颠倒					HiWord = pRecv[5 + 4 * j]*256 + pRecv[6 + 4 * j] ;					TempDD = HiWord*1000 + LoWord ;						Temp[0]=TempDD & 0xFFFF;					Temp[1]=(TempDD >> 16) & 0xFFFF;					pDD_Buff->DD_Buff[0 + j * 5] = LOBYTE(Temp[0]);					pDD_Buff->DD_Buff[1 + j * 5] = HIBYTE(Temp[0]);					pDD_Buff->DD_Buff[2 + j * 5] = LOBYTE(Temp[1]);					pDD_Buff->DD_Buff[3 + j * 5] = HIBYTE(Temp[1]);					pDD_Buff->DD_Buff[4 + j * 5] = j;				}				break;			case 0xF2:				for(j = 0; j < iDd; j++)				{					TopWord = pRecv[9 + 8 * j]*256 + pRecv[10 + 8 * j] ;					HiWord = pRecv[3 + 8 * j]*256 + pRecv[4 + 8 * j] ;					LoWord = pRecv[5 + 8 * j]*256 + pRecv[6 + 8 * j] ;					TempDD = TopWord*1000000 + HiWord*10000 + LoWord ;					Temp[0]=TempDD & 0xFFFF;					Temp[1]=(TempDD >> 16) & 0xFFFF;					pDD_Buff->DD_Buff[0 + j * 5] = LOBYTE(Temp[0]);					pDD_Buff->DD_Buff[1 + j * 5] = HIBYTE(Temp[0]);					pDD_Buff->DD_Buff[2 + j * 5] = LOBYTE(Temp[1]);					pDD_Buff->DD_Buff[3 + j * 5] = HIBYTE(Temp[1]);					pDD_Buff->DD_Buff[4 + j * 5] = j;				}				break;			}			break;		}		if(SubDevice[iPort].SubStations[uIndex].sub_state != SUB_STATE_ONLINE)		break;	}}void GR100_Response_DD(int iPort, int iNetGroup, int iConnect, unsigned char *IEC104DataBuff, GR100_DD_DATA *pDD_Buff){	unsigned char uSPI,ucVSQ,ucLen;	int ret, i, k, nGroup, uIndex, DdCount = 7, SubDgtNum = 8;	unsigned long ulInf;	unsigned char ucTI104, ucSect, ucADDR, ucContent;	unsigned char *p104c = IEC104DataBuff;	unsigned char IEC104DataBuf_M[256], ModbusBuff[16], COM_Recv[256], RetFlag[2];	unsigned short CRCValue, usYCAddr;		ucTI104	= *(p104c + IEC104_OFFSET_TI);	ucADDR = *(p104c + IEC104_OFFSET_ADDR);	ucSect = *(p104c + IEC104_OFFSET_SECT);	ulInf = *(p104c + IEC104_OFFSET_INF) + *(p104c + IEC104_OFFSET_INF + 1)*256;	ucContent = *(p104c + IEC104_OFFSET_CONTEXT);	uIndex = SUB_AddrToIndex( ucADDR );	usYCAddr = SubDevice[iPort].SubStations[uIndex].sub_YC_Addr;	switch (ucTI104)	{	case IEC104_TI_C_DC_NA_1:	//46:遥控,直控方式		ModbusBuff[0] = ucADDR;		ModbusBuff[1] = 0x10;		ModbusBuff[2] = (ulInf+904)/256;//起始地址		ModbusBuff[3] = (ulInf+904)%256;		ModbusBuff[4] = 0x00;//寄存器数目		ModbusBuff[5] = 0x01;		ModbusBuff[6] = 0x02;//字节数		ModbusBuff[7] = 0x00;		ModbusBuff[8] = ucContent-1;		CRCValue = CRC16(ModbusBuff,9);		ModbusBuff[9] = HIBYTE(CRCValue);		ModbusBuff[10] = LOBYTE(CRCValue);		for (k=0;k<3;k++)		{			COMM_SendBuff(iPort,ModbusBuff, 11);			SYS_Delay(200);			ret =  Read_Modbus_Frame(iPort,ucADDR,COM_Recv);			if ( ret>0 )			{				//直控执行结束,返回确认报文				RetFlag[0]=ucContent;				ret=IEC_PackFrame_104(IEC104DataBuf_M,46/*类别标识*/,1/*可变结构限定词*/,7/*传输原因*/,ucADDR/*设备地址*/,					0x01/*扇区号*/,ulInf/*信息地址*/,1/*要转换的字节数*/,RetFlag/*要转换的字节的起始地址*/ );				CONN_Send104Data(iNetGroup,iConnect,IEC104DataBuf_M,ret);				SYS_Delay(10);				//直控过程结束,返回报文//				ret=IEC_PackFrame_104(IEC104DataBuf_M,46/*类别标识*/,1/*可变结构限定词*/,10/*传输原因*/,ucADDR/*设备地址*/,//					0x01/*扇区号*/,ulInf/*信息地址*/,1/*要转换的字节数*/,RetFlag/*要转换的字节的起始地址*/ );//				CONN_Send104Data(iNetGroup,iConnect,IEC104DataBuf_M,ret);//				SYS_Delay(10);				break;			}			SYS_Delay(200);		}		break;	case IEC104_TI_C_CI_NA_1:	//101电度量冻结		if(ucSect == 1)		{			ret = IEC_PackPowerHead_104( IEC104DataBuf_M, ucADDR, ucSect, 5);//回答电度量冻结确认			CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret );			SYS_Delay(10);			if(SubDevice[iPort].SubStations[uIndex].sub_state != SUB_STATE_ONLINE)//装置通讯已中断			{				for( i = 0; i < DdCount ; i++ )					pDD_Buff->DD_Buff[5*i+4] = i | 0x80;			}			else			{				if (usYCAddr == 63)				{					Refresh_GR100_DD(iPort, uIndex, pDD_Buff);				}				else if (usYCAddr == 64)				{					Refresh_GR100ZGD_DD(iPort, uIndex, pDD_Buff);				}			}			ucVSQ = 0x80 | DdCount;			ucLen = DdCount * 5;			ret = IEC_PackFrame_104(IEC104DataBuf_M, 15, ucVSQ, 37, ucADDR, 1, 0x0C01, ucLen, pDD_Buff->DD_Buff);			CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret );			SYS_Delay(10);			ret = IEC_PackPowerEnd_104( IEC104DataBuf_M, ucADDR, ucSect, 5); //回答电度量数据结束			CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret );				SYS_Delay(10);		}		break;	case IEC104_TI_C_IC_NA_1:      //100:总召唤		ret = IEC_PackInspectHead_104( IEC104DataBuf_M, ucADDR, ucSect );//回答确认命令		CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret );			SYS_Delay(10);		if(ucSect == 0)		{			uSPI = (SubDevice[iPort].SubStations[uIndex].sub_state==SUB_STATE_ONLINE) ? 0 : 1 ;			ret = IEC_PackNode_104(IEC104DataBuf_M, ucADDR,IEC104_COT_M_introgen,uSPI);//装置通讯状态上送主站			CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret);				SYS_Delay(10);		}		else if(ucSect == 1)		{			if (SubDevice[iPort].SubStations[uIndex].sub_state == SUB_STATE_ONLINE )			{				ucVSQ = 0x80| SubDgtNum;				ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,					ucSect/*扇区号*/,1/*起始信息地址*/, SubDgtNum/*要转换的字节数*/,&SubDevice[iPort].SubStations[uIndex].sub_Data[0]);				CONN_Send104Data(iNetGroup,iConnect,IEC104DataBuf_M,ret);				SYS_Delay(10);			}		}		ret = IEC_PackInspectEnd_104( IEC104DataBuf_M, ucADDR, ucSect );//回答结束报文		CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret);		SYS_Delay(10);		break;	}}int Get_TCWDXJ_Frame(unsigned char *pFrame,int iPort,int iIndex,int nGroup)	//天辰温度巡检

⌨️ 快捷键说明

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