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

📄 protocol.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
{	int YC_Num = *(pData+2)/2;	int i, ret, nGroup, Yc_Group, uInf_Modbus;	unsigned char ucAddr = *pData;	unsigned char ucSect=1, ucVSQ, ConvertNum;	unsigned char ConvertBuff[512], IEC104DataBuf_M[256];	SUB_Station *pSub = &SubDevice[iPort].SubStations[0];	int SubYC = pSub->sub_YC_NUM+1 ;//modify for soe	int RequierOrder = pSub->sub_FunOrder;	unsigned long ulInf = 0x4000 + RequierOrder*120;	if(SubYC%120)		Yc_Group = SubYC/120 + 1 ;	else		Yc_Group = SubYC/120 ;	if(pSub->sub_FunOrder==0)//modify for soe	{		Check_SOEInfo(iPort,pData[3]*256+pData[4]);	}	for(i=0;i<YC_Num;i++)	{		ConvertBuff[3*i+0] = pData[4+2*i];		ConvertBuff[3*i+1] = pData[3+2*i];		ConvertBuff[3*i+2] = 0;				uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i);		if( uInf_Modbus >=0 ) 		{			RefreshDateData(YC_Msg, uInf_Modbus, &pData[3+2*i]);		}	}	pSub->sub_FunOrder = (pSub->sub_FunOrder+1)%Yc_Group;	if( CONN_COMMU_Enable() )	{		nGroup = YC_Num/60;		for(i=0; i<nGroup; i++)		{			ulInf += i*60;			ucVSQ = 0x80|60;			ConvertNum = 60*3;			ret = IEC_PackFrame_104(IEC104DataBuf_M,9,ucVSQ,1,ucAddr,0x01,ulInf,ConvertNum,&ConvertBuff[i*3*60]);			WriteMsgToShareMem(iPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg);		}		if(YC_Num%60)		{			ulInf += i*60;			ucVSQ = 0x80|(YC_Num%60);			ConvertNum = (YC_Num%60)*3;			ret = IEC_PackFrame_104(IEC104DataBuf_M,9,ucVSQ,1,ucAddr,0x01,ulInf,ConvertNum,&ConvertBuff[i*3*60]);			WriteMsgToShareMem(iPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg);		}	}}void CheckYXChange(int nPort,unsigned char *DgtStore,unsigned char *pRecv){	int i,ret, uInf_Modbus;	unsigned long uInf;	unsigned char ucSect,CurYX,TempDgt;	unsigned char ConvertBuff[8],IEC104DataBuf_M[256];	unsigned char ucAddr = pRecv[0];	int YX_Num = 512 + SubDevice[nPort].SubStations[0].sub_YX_NUM;	CurrentTime CurTime = GetTime();	if(SubDevice[nPort].SubStations[0].sub_DgtFlag==0)	{		SubDevice[nPort].SubStations[0].sub_DgtFlag = 1;		for(i=0; i<YX_Num; i++)		{			DgtStore[i] = GetDigital(pRecv+3, i)+1;			if (i<512)			{				ucSect = 2;				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i  + 1);			}			else			{				ucSect = 3;				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i - 512 + 1);			}			if( uInf_Modbus >=0 ) 			{				CurYX = DgtStore[i] - 1;				RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );			}		}	}	else	{		for(i=0;i<YX_Num;i++)		{			TempDgt = GetDigital(pRecv+3, i)+1;			if(TempDgt != DgtStore[i]) //如果有遥信变位			{				DgtStore[i] = TempDgt;//遥信转存				ConvertBuff[0] = TempDgt;				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 );				if (i<512)				{					ucSect = 2;					uInf = i+1;					ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/,						0x02/*扇区号*/,(i+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff);				}				else				{					ucSect = 3;					uInf = i - 512 + 1;					ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/,						0x03/*扇区号*/,(i-512+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff);				}				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, uInf);				if( uInf_Modbus >=0 ) 				{					CurYX = TempDgt - 1;					RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );				}				if(CONN_COMMU_Enable())				{					WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg);				}			}		}	}}int Get_GR100_Frame(unsigned char *pFrame,int iPort , int uIndex)	//珠海格瑞{	unsigned short CRCResult;	unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type;	unsigned char ucAddr= SubDevice[iPort].SubStations[uIndex].sub_address;	pFrame[0] = ucAddr ;	pFrame[1] = 0x03 ;	pFrame[4] = 0x00 ;	switch(SubDevice[iPort].SubStations[uIndex].sub_FunOrder)	{	case 0://YC		pFrame[2] = 0x00 ;		pFrame[3] = 0x0A ;	//从40011开始		switch(DevType)		{		case 0xF1:			pFrame[5] = 31 ;	//读取31个寄存器			break;		case 0xF2:			pFrame[5] = 62 ;	//读取62个寄存器			break;		}		break;	case 1://YX		pFrame[2] = 0x03 ;		pFrame[3] = 0x85 ;	//从40902开始		pFrame[5] = 8 ;	//读取8个寄存器		break;	}	SubDevice[iPort].SubStations[uIndex].sub_FunOrder = (SubDevice[iPort].SubStations[uIndex].sub_FunOrder+1)%2;	CRCResult = CRC16(pFrame,6);	pFrame[6] = HIBYTE(CRCResult); 	pFrame[7] = LOBYTE(CRCResult); 	return 8 ;		}int Get_GR100ZGD_Frame(unsigned char *pFrame,int iPort , int uIndex)	//珠海格瑞,针对竹格多{	unsigned short CRCResult;	unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type;	unsigned char ucAddr= SubDevice[iPort].SubStations[uIndex].sub_address;	pFrame[0] = ucAddr ;	pFrame[1] = 0x03 ;	pFrame[4] = 0x00 ;	switch(SubDevice[iPort].SubStations[uIndex].sub_FunOrder)	{	case 0://YC		pFrame[2] = 0x00 ;		pFrame[3] = 0x0A ;	//从40011开始		switch(DevType)		{		case 0xF1:			pFrame[5] = 40 ;	//读取40个寄存器			break;		case 0xF2:			pFrame[5] = 80 ;	//读取80个寄存器			break;		}		break;	case 1://YX		pFrame[2] = 0x03 ;		pFrame[3] = 0x85 ;	//从40902开始		pFrame[5] = 8 ;	//读取8个寄存器		break;	}	SubDevice[iPort].SubStations[uIndex].sub_FunOrder = (SubDevice[iPort].SubStations[uIndex].sub_FunOrder+1)%2;	CRCResult = CRC16(pFrame,6);	pFrame[6] = HIBYTE(CRCResult); 	pFrame[7] = LOBYTE(CRCResult); 	return 8 ;		}unsigned short Get_GR100_32BITYC(unsigned char *pData, int Power){	unsigned long LongYC;	unsigned short HIREG, LOREG, RetValue;	HIREG = (unsigned short)pData[0]*256 + (unsigned short)pData[1];	LOREG = (unsigned short)pData[2]*256 + (unsigned short)pData[3];	LongYC = (unsigned long)HIREG*10000 + (unsigned long)LOREG;	RetValue = (unsigned short)(LongYC/Power);	return RetValue;}void Process_GR100_Recv(int iPort, unsigned char *pData, int uIndex){	int i,k,YC_Num =15, Power = 1;	int ret,uInf_Modbus = -1;	unsigned short TempYC;	unsigned long ulInf = 0x4001;	unsigned char ucVSQ, ConvertNum, CurYX, ucSect=1;	unsigned char WriteBuff[64],ConvertBuff[256],IEC104DataBuf_M[256],TempDgt[32];	unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type;	unsigned short YXNUM = SubDevice[iPort].SubStations[uIndex].sub_YX_NUM;	unsigned short YCNUM = SubDevice[iPort].SubStations[uIndex].sub_YC_NUM;	CurrentTime CurTime = GetTime();	unsigned char ucAddr = pData[0];	if(pData[2] == 0x10)//YX	{		if(SubDevice[iPort].SubStations[uIndex].sub_DgtFlag==0)		{			SubDevice[iPort].SubStations[uIndex].sub_DgtFlag = 1;			for(i=0;i<8;i++)			{				TempDgt[i] = pData[2*i+4] + 1;				SubDevice[iPort].SubStations[uIndex].sub_Data[i]=TempDgt[i];				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 1, i+1);				if( uInf_Modbus >=0 ) 				{					CurYX = TempDgt[i] - 1;					RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );				}			}		}		else		{			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[64]&0x08)					TempYC = ~TempYC+1;				WriteBuff[18] = HIBYTE(TempYC);				WriteBuff[19] = LOBYTE(TempYC);							TempYC = pData[41]*256 + pData[42];//无功功率				if(pData[64]&0x80)					TempYC = ~TempYC+1;				WriteBuff[20] = HIBYTE(TempYC);				WriteBuff[21] = LOBYTE(TempYC);								TempYC = pData[49]*256 + pData[50];//功率因数				if(pData[64]&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];								WriteBuff[28] = pData[61];//频率				WriteBuff[29] = pData[62];			}			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[126]&0x08)					TempYC = ~TempYC+1;				WriteBuff[18] = HIBYTE(TempYC);				WriteBuff[19] = LOBYTE(TempYC);								TempYC = Get_GR100_32BITYC(&pData[79],YXNUM);//无功功率				if(pData[126]&0x80)					TempYC = ~TempYC+1;				WriteBuff[20] = HIBYTE(TempYC);				WriteBuff[21] = LOBYTE(TempYC);							TempYC = Get_GR100_32BITYC(&pData[95],1);//功率因数				if(pData[126]&0x08)					TempYC = ~TempYC+1;				WriteBuff[22] = HIBYTE(TempYC);				WriteBuff[23] = LOBYTE(TempYC);				for(i=0;i<3;i++)			//视在功率,零序电压,频率				{					if(i==2)						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 Process_GR100ZGD_Recv(int iPort, unsigned char *pData, int uIndex)//针对竹格多电站{	int i,k,YC_Num =14, Power = 1;	int ret,uInf_Modbus = -1;	unsigned short TempYC;	unsigned long ulInf = 0x4001;	unsigned char ucVSQ, ConvertNum, CurYX, ucSect=1;	unsigned char WriteBuff[64],ConvertBuff[256],IEC104DataBuf_M[256],TempDgt[32];	unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type;	unsigned short YXNUM = SubDevice[iPort].SubStations[uIndex].sub_YX_NUM;	unsigned short YCNUM = SubDevice[iPort].SubStations[uIndex].sub_YC_NUM;	CurrentTime CurTime = GetTime();	unsigned char ucAddr = pData[0];	if(pData[2] == 0x10)//YX	{		if(SubDevice[iPort].SubStations[uIndex].sub_DgtFlag==0)		{			SubDevice[iPort].SubStations[uIndex].sub_DgtFlag = 1;			for(i=0;i<8;i++)			{				TempDgt[i] = pData[2*i+4] + 1;				SubDevice[iPort].SubStations[uIndex].sub_Data[i]=TempDgt[i];				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 1, i+1);				if( uInf_Modbus >=0 ) 				{					CurYX = TempDgt[i] - 1;					RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );				}			}		}		else		{

⌨️ 快捷键说明

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