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

📄 comfunc.c

📁 泵站系统屏与屏之间的通信
💻 C
字号:
#include    "include/mcuapi.h"void InitSubDevice(void)//初始化装置参数{	int i, j, k, m, fd;	for(k=1;k<=8;k++)	{		COM_Para[k].BaudRate	= MyFlashBuff[5*(k-1)+0];		//串口波特率		COM_Para[k].Parity		= MyFlashBuff[5*(k-1)+1];		//奇偶校验		COM_Para[k].DataBit 	= MyFlashBuff[5*(k-1)+2];		//数据位		COM_Para[k].StopBit 		= MyFlashBuff[5*(k-1)+3];		//停止位		COM_Para[k].Protocol	= MyFlashBuff[5*(k-1)+4];		//所用规约		OpenComPort(k, COM_Para[k].BaudRate, COM_Para[k].DataBit, COM_Para[k].StopBit, COM_Para[k].Parity);				SubDevice[k].iPort = k;		SubDevice[k].SubTotalNum = (unsigned char)(MyFlashBuff[k*100]%256);			if (SubDevice[k].SubTotalNum > SUB_MAX) SubDevice[k].SubTotalNum = SUB_MAX; 		for(j=0;j<SubDevice[k].SubTotalNum;j++)		{			SubDevice[k].SubStations[j].sub_address 		= HIBYTE(MyFlashBuff[5*j+k*100+1]);			SubDevice[k].SubStations[j].sub_type			= LOBYTE(MyFlashBuff[5*j+k*100+1]);			SubDevice[k].SubStations[j].sub_YC_NUM 			= MyFlashBuff[5*j+k*100+2];			SubDevice[k].SubStations[j].sub_YX_NUM 			= MyFlashBuff[5*j+k*100+3];			SubDevice[k].SubStations[j].sub_YC_Addr			= MyFlashBuff[5*j+k*100+4];			SubDevice[k].SubStations[j].sub_YX_Addr			= MyFlashBuff[5*j+k*100+5];			SubDevice[k].SubStations[j].sub_state   		= SUB_STATE_OFFLINE;
			SubDevice[k].SubStations[j].sub_FileType		= 0x85;
			SubDevice[k].SubStations[j].sub_TNS				= 0;			SubDevice[k].SubStations[j].sub_ResetFailNum	= 0;			SubDevice[k].SubStations[j].sub_ResetNum		= 0;			SubDevice[k].SubStations[j].sub_FailNum			= 0;			SubDevice[k].SubStations[j].sub_C_CMDNum		= 0;			SubDevice[k].SubStations[j].sub_M_CMDNum		= 0;			SubDevice[k].SubStations[j].sub_B_CMDNum		= 0;			SubDevice[k].SubStations[j].sub_DgtFlag 		= 0;
			SubDevice[k].SubStations[j].sub_DgtFlag1 		= 0;
			SubDevice[k].SubStations[j].sub_DgtFlag2 		= 0;
			SubDevice[k].SubStations[j].sub_DgtFlag3 		= 0;
			SubDevice[k].SubStations[j].sub_DgtFlag4 		= 0;
			SubDevice[k].SubStations[j].sub_DgtFlag5 		= 0;
			SubDevice[k].SubStations[j].sub_Command			= 0;
			SubDevice[k].SubStations[j].sub_Sequence		= 0;
			SubDevice[k].SubStations[j].sub_SendOrder		= 0;			SubDevice[k].SubStations[j].sub_DGT801 			= 0;			SubDevice[k].SubStations[j].sub_FunOrder 		= 0;							SubDevice[k].SubStations[j].sub_RII          	= 0;       //返回信息标识符					SubDevice[k].SubStations[j].sub_SCN104     		= 0;       //扫描序号			SubDevice[k].SubStations[j].sub_SCNTCP       	= 0;   			SubDevice[k].SubStations[j].sub_YBCtrlFlg    	= 0;			SubDevice[k].SubStations[j].sub_DZCtrlFlg    	= 0;			SubDevice[k].SubStations[j].sub_DZendflag    	= 0;			SubDevice[k].SubStations[j].sub_InspectEnd   	= 0;   		}	}	while ((fd=open("/tmp/share_memory.lock", O_RDONLY | O_CREAT | O_EXCL)) < 0); 	for(m=0;m<10000;m++)		share_memory_write(m,0);	close(fd);	unlink("/tmp/share_memory.lock");	nTransYc = MyFlashBuff[YcTableAddr];	if(nTransYc>MaxTransYc) nTransYc=MaxTransYc;	for(i=0;i<nTransYc;i++)	{		uYcTable[i].uAddr=HIBYTE(MyFlashBuff[YcTableAddr+1+2*i]);		uYcTable[i].uSector=LOBYTE(MyFlashBuff[YcTableAddr+1+2*i]);		uYcTable[i].uInf103=MyFlashBuff[YcTableAddr+2+2*i];		//printf("uYcTable[%d].uAddr=%d,uYcTable[%d].uSector=%d,uYcTable[%d].uInf103=%X\n",i,uYcTable[i].uAddr,i,uYcTable[i].uSector,i,uYcTable[i].uInf103);	}		nTransYx = MyFlashBuff[YxTableAddr];	if(nTransYx>MaxTransYx) nTransYx=MaxTransYx;	for(i=0;i<nTransYx;i++)	{		uYxTable[i].uAddr=HIBYTE(MyFlashBuff[YxTableAddr+1+2*i]);		uYxTable[i].uSector=LOBYTE(MyFlashBuff[YxTableAddr+1+2*i]);		uYxTable[i].uInf103=MyFlashBuff[YxTableAddr+2+2*i];		//printf("uYxTable[%d].uAddr=%d,uYxTable[%d].uSector=%d,uYxTable[%d].uInf103=%X\n", i,uYxTable[i].uAddr,i,uYxTable[i].uSector,i,uYxTable[i].uInf103);	}}int ReadFrame(int iPort, unsigned char ucADDR,unsigned char *pRecv)			//从800保护读取数据{	unsigned char CheckSum;	int k,  iError = 0, len = 0, nRecv = 0;	unsigned char iRead[EveryRead];	if( ComDataCome(iPort, 1000) >0 )	{		while(nRecv<256)		{			len = read(COM[iPort], iRead, sizeof(iRead));			if(len>0)			{				iError = 0 ;				if(nRecv+len>256)	break;				memcpy(pRecv+nRecv,iRead,len);				nRecv += len;				if(pRecv[0]==0x10)				{					if(nRecv>=5)					{						nRecv =5; 						break;					}				}				if(pRecv[0]==0x68)				{					if(nRecv>=pRecv[1]+6)					{						nRecv = pRecv[1]+6; 						break;					}				}			}			else			{				iError ++ ;				if(iError >30) break;				SYS_Delay(10);			}		}	}	if(nRecv>0)	{		PrintDebugInfo(iPort, Recv_Data, pRecv, nRecv);		if(pRecv[0] == 0x10)		{			if((pRecv[2]==ucADDR)&&(pRecv[4]==0x16))					//判断帧头,地址,帧尾是否正确			{					CheckSum = GetByteCheckSum((pRecv+1),2);				//计算校验				if (pRecv[3]==CheckSum)				{					return nRecv;				}				else					return Error_Recv;			}			else				return Error_Recv;		}		else if(pRecv[0] == 0x68)		{			if((pRecv[5]==ucADDR)&&(pRecv[nRecv-1]==0x16))			//判断帧头,地址,帧尾是否正确			{					CheckSum = GetByteCheckSum((pRecv+4),(nRecv-6));		//计算校验				if (pRecv[nRecv-2] == CheckSum)				{					return nRecv;				}				else					return Error_Recv;			}			else				return Error_Recv;		}		else			return Error_Recv;	}	return 0;}int LocalIEC103Cmd(unsigned char ucCMDCode, unsigned char ucAddr, unsigned char *pDest)		{	int	i;	unsigned char *p = NULL,*p1 = NULL,ucFCB;	unsigned char ResetCU[] = {0x10,0x40,1,0,0x16};		 	unsigned char RequireFirstData[] = {0x10,0x5a,1,0,0x16};		 	unsigned char RequireSecondData[] = {0x10,0x5b,1,0,0x16};	ucFCB	=SUB_GetFCB(ucAddr);	switch(ucCMDCode&0x0f)	{		case RESETCU:         					// reset CU 		p  = (unsigned char *)ResetCU;		p1 = pDest;	         		for (i=0; i<5; i++)						// fix frame data		{			*(p1 + i) = *(p + i);		}		*(p1 + 2) = ucAddr;		*(p1+3) = *(p1+1) + *(p1+2);			// calculate check SUM		break;     		case REQUIREFIRSTDATA:         			// RequireFirstData		p  =(unsigned char *)RequireFirstData;		p1 = pDest;	         		for (i=0; i<5; i++)						// fix frame data		{			*(p1 + i) = *(p + i);		}		SUB_SetFCB(p1,ucFCB);		*(p1 + 2) = ucAddr;		*(p1 + 3) = *(p1+1) + *(p1+2);			// calculate check SUM		break;     		case REQUIRESECONDDATA:         		// 		p  =(unsigned char *)RequireSecondData;		p1 = pDest;	         		for (i=0; i<5; i++)						// fix frame data		{			*(p1 + i) = *(p + i);		}		SUB_SetFCB(p1,ucFCB);		*(p1 + 2) = ucAddr;		*(p1 + 3) = *(p1+1) + *(p1+2);			// calculate check SUM		break;     	}		return 5;}int Command_Handle(int iPort,int NetGroup,int iConnect,unsigned char *pucCMD,unsigned char iLen){	int iSend=iLen;	int i,j,m,ret,index;	unsigned char ucCS=0,ucSPI;	SUB_Station	*pSub	=NULL;	unsigned char IEC104DataBuf_M[256],IEC103DataBuf_M[256];	unsigned char ucADDR,ucCPU=0;	unsigned char ucIFormatConfirm=0;	if (pucCMD[0] == START_CODE1)	//START_CODE1=0x10 固定帧长报文	{		ucADDR =pucCMD[2];	}	else	{		ucADDR =pucCMD[IEC103_OFFSET_ADDR];//pucCMD[5]		ucCPU  =pucCMD[IEC103_OFFSET_COMADDR];//pucCMD[9]	}	index = SUB_AddrToIndex(ucADDR);	if ((index >= 0) && (index < SUB_MAX))	{		pSub = &SubDevice[iPort].SubStations[index];	}	if ( CONN_Validate(iConnect) && (!CONN_IsEngStation(NetGroup,iConnect)) //合法的连接,操作员站		&& (pucCMD[IEC103_OFFSET_TI] == IEC103_TI_C_IGI_NA_3)	//总召唤启动		&& (pucCMD[0] == START_CODE2) )		//make general inspect confirm		{		if (pSub != NULL)		{		ret =IEC_PackInspectHead_104(IEC104DataBuf_M,ucADDR,ucCPU);		CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);			if ((ucCPU == 0) || (ucCPU == 0xff))			//for Sect 0 or Sect 0xff		{			if (pSub->sub_state != SUB_STATE_OFFLINE)				ucSPI=0;			else				ucSPI=1;				ret	=IEC_PackNode_104(IEC104DataBuf_M,ucADDR,	IEC104_COT_M_introgen,ucSPI);			CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);			if ( pSub->sub_state != SUB_STATE_ONLINE )			{				SYS_Delay(10);				ret =IEC_PackInspectEnd_104(IEC104DataBuf_M,ucADDR,ucCPU);				CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);					SYS_Delay(10);				return 0;			}		}	}	}	if ( CONN_Validate(iConnect) && CONN_IsEngStation(NetGroup,iConnect) 		&& (pucCMD[IEC103_OFFSET_TI]==IEC103_TI_C_IGI_NA_3) 		&& (pucCMD[0] == START_CODE2) )	//general inspect for engineer station		{		if (pSub != NULL)		{		if ((ucCPU == 0) || (ucCPU == 0xff))	//for sect 0 or sect 0xff		{		if (pSub->sub_state != SUB_STATE_OFFLINE)			ucSPI=1;		else			ucSPI=2;		SYS_Delay(10);		ret =IEC_PackNode_TCP(IEC104DataBuf_M,ucADDR,IEC103_COT_M_totalQUERY,pSub->sub_FUN,ucSPI);		CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);		if (pSub->sub_state != SUB_STATE_ONLINE)		{			SYS_Delay(10);			ret = IEC_PackInspectEnd_TCP(IEC104DataBuf_M,ucADDR,ucCPU,pSub->sub_FUN,pucCMD[IEC103_OFFSET_CONTEXT]);			CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);			SYS_Delay(10);			return 0;		}	}	}	}	if ((pucCMD[IEC103_OFFSET_TI]==IEC103_TI_M_SYN_TA_3) && (pucCMD[0] == START_CODE2))	{		if((pucCMD[IEC103_OFFSET_COMADDR] == 0xfe) && (pucCMD[IEC103_OFFSET_ADDR] == 0xff))		{		return 0;	}		}		if ((ucADDR != BROADCAST_ADDR) && (pSub == NULL))	{		return 0;	}	if(pSub->sub_state != SUB_STATE_ONLINE)	{		return 0;	}	do	{		for (i =0; i< 3 ; i++)		{			COMM_SendBuff(iPort, pucCMD, iSend);			if ((ucADDR == BROADCAST_ADDR) && (pSub != NULL))		//if broadcast command,need no answer			{				pSub->sub_B_CMDNum++;				SYS_Delay(10);				return 1;			}			ret = ReadFrame(iPort,ucADDR,IEC103DataBuf_M);			pSub->sub_C_CMDNum++;			if (ret>0)				{				pSub->sub_M_CMDNum++;				SUB_ResetFCB(pSub);				if (pSub->sub_state == SUB_STATE_OFFLINE)				{					OnCommOK(iPort, index);										ret =IEC_PackNode_TCP(IEC104DataBuf_M,ucADDR,IEC103_COT_M_per,0,1);					WriteMsgToShareMem(iPort, ret, IEC104DataBuf_M, EngineerStation, YX_Msg);										pSub->sub_state = SUB_STATE_ONLINE;				}				switch(IEC103DataBuf_M[0])				{				case	START_CODE1:					ucCS = IEC103DataBuf_M[1] ;						//receive code status					break;				case	START_CODE2:					ucCS = IEC103DataBuf_M[4] ;						//receive code status					pSub->sub_FUN =IEC103DataBuf_M[IEC103_OFFSET_FUN];					CONN_SendDataUp(iPort,NetGroup,iConnect,IEC104DataBuf_M,IEC103DataBuf_M); 									break;				default :					ucCS = 0;					break;					}				if (ucCS & _ACD)	//if has first user data				{					iSend =LocalIEC103Cmd(REQUIREFIRSTDATA, ucADDR, pucCMD);				}				else					//if no first user data				{					pSub->sub_CS =REQUIRESECONDDATA;				}				break;						}			else	//read data fail			{				pSub->sub_FailNum++;				SYS_Delay(200);			}		}		if (i>=3)	//if failed over three times,set the flag to reset CU		{			if (pSub->sub_state == SUB_STATE_ONLINE)			{				pSub->sub_state = SUB_STATE_FAIL;			}			break;		}	}while (ucCS & _ACD);//loop until have no first user data	return 0;}int ResetOneCU(int iPort, int uIndex){	int ret,iRead,iSend;	unsigned char ucADDR;	unsigned char IEC104DataBuf_M[256];	unsigned char IEC103DataBuf_C[256],IEC103DataBuf_M[256];	SUB_Station	*pSub = &SubDevice[iPort].SubStations[uIndex];	ucADDR  = pSub->sub_address;	iSend = LocalIEC103Cmd(RESETCU, ucADDR, IEC103DataBuf_C);	COMM_SendBuff(iPort, IEC103DataBuf_C, iSend);	pSub->sub_C_CMDNum++;	iRead = ReadFrame(iPort,ucADDR,IEC103DataBuf_M);	if(iRead > 0)	{		pSub->sub_ResetNum = 0;		pSub->sub_M_CMDNum++;		if (pSub->sub_state == SUB_STATE_OFFLINE)		{			OnCommOK(iPort, uIndex);
			pSub->sub_DgtFlag=1;//串口转串口方案中装置通讯中断到正常时发送对装置校时命令标志			ret = IEC_PackNode_TCP(IEC104DataBuf_M,ucADDR,	IEC103_COT_M_per,0,1);			WriteMsgToShareMem(iPort, ret, IEC104DataBuf_M, EngineerStation, YX_Msg);
		}		pSub->sub_state	= SUB_STATE_ONLINE;		pSub->sub_CS	= REQUIREFIRSTDATA;		pSub->sub_M_CMDNum++;	}	else	{		pSub->sub_ResetNum++;	}	if( pSub->sub_ResetNum>=3 )	{		pSub->sub_ResetNum = 0;		if(pSub->sub_state == SUB_STATE_FAIL)		{			OnCommError(iPort, uIndex);			ret =IEC_PackNode_TCP(IEC104DataBuf_M, ucADDR, IEC103_COT_M_per, 0, 2);			WriteMsgToShareMem(iPort, ret, IEC104DataBuf_M, EngineerStation, YX_Msg);						pSub->sub_state = SUB_STATE_OFFLINE;		}	}	return 1;}/*FUNCTION:reset CU	if over timeout*/int ResetAllCU(int iPort){	int i,ret=0,OffLineNum = 0;	int SubTotal = SubDevice[iPort].SubTotalNum;	SUB_Station	*pSub = NULL;	for(i=0; i<SubTotal; i++)	{		OffLineNum = SUB_GetNextOffLine(OffLineNum, iPort);		pSub = &SubDevice[iPort].SubStations[OffLineNum];		if(pSub->sub_state != SUB_STATE_ONLINE)		{			ResetOneCU(iPort, OffLineNum);			ret ++ ;		}	}	return ret;}

⌨️ 快捷键说明

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