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

📄 threadfunc.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
	unsigned char ucVSQ,ucADDR,ucSECT,ucSPI;	unsigned char SendBuff[64], RecvBuff[128], YX_Store[16];	unsigned char IEC104DataBuf_C[256], IEC104DataBuf_M[256];	unsigned char ucAddr=SubDevice[nPort].SubStations[0].sub_address;//该装置为232接口,只能点对点连接	while(1)//第一次通讯正常后首先转存遥信,不上送后台,收到总召命令上送	{		nLen = Get_YWT_TSQ_Frame(SendBuff);		COMM_SendBuff(nPort, SendBuff, nLen);		SYS_Delay(1000);		nRecv = Read_YWT_TSQ_Frame(nPort, ByteRequire, RecvBuff);		if (nRecv>0)		{			Save_YWT_TSQ_YX(RecvBuff,YX_Store);			break;		}	}	while(1)	{		nRead=Read_104Data_From_Memory(nPort,IEC104DataBuf_C);		if(nRead>0)		{			iNetGroup = IEC104DataBuf_C[0]>>4;			iCon_Number = IEC104DataBuf_C[0]&0x0f;			if(!CONN_IsEngStation(iNetGroup,iCon_Number))			{				if(*(IEC104DataBuf_C+IEC104_OFFSET_TI+1)==IEC104_TI_C_IC_NA_1)				{					ucSECT = *(IEC104DataBuf_C+IEC104_OFFSET_SECT+1);					ucADDR = *(IEC104DataBuf_C+IEC104_OFFSET_ADDR+1);					ret = IEC_PackInspectHead_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答确认命令					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);					SYS_Delay(10);					uIndex = SUB_AddrToIndex(ucADDR);					switch(ucSECT)					{					case 0:						ucSPI=(SubDevice[nPort].SubStations[uIndex].sub_state != SUB_STATE_OFFLINE) ? 0 : 1;						ret	=IEC_PackNode_104(IEC104DataBuf_M,ucADDR,IEC104_COT_M_introgen,ucSPI);						CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);						break;					case 1://以前把遥信组在2号扇区不大合理,增加了后台每次总召的次数						ucVSQ=0x80|YX_Count;						ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,							0x01/*扇区号*/,1/*信息地址*/,YX_Count/*要转换的字节数*/,YX_Store);						CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);						break;					}					ret = IEC_PackInspectEnd_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答结束报文					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);				}			}		}		else		{			iError=0;			nLen = Get_YWT_TSQ_Frame(SendBuff);			for(k=0;k<3;k++)//如果通讯不正常,重发三次,三次后报装置中断			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				nRecv = Read_YWT_TSQ_Frame(nPort, ByteRequire, RecvBuff);				if (nRecv>0)				{					if (SubDevice[nPort].SubStations[iRequireNum].sub_state == SUB_STATE_OFFLINE)					{						OnCommOK(nPort,iRequireNum);						SubDevice[nPort].SubStations[iRequireNum].sub_state = SUB_STATE_ONLINE;					}					Process_YWT_TSQ_Recv(nPort, RecvBuff, YX_Store, nGroup);//为了减少网络数据流量,每5个查询周期上送一次遥测					break;				}				else				{					if(nRecv<=0)		iError++;				}				SYS_Delay(500);			}			if(iError==3)			{				if (SubDevice[nPort].SubStations[iRequireNum].sub_state == SUB_STATE_ONLINE )				{					OnCommError(nPort,iRequireNum);					SubDevice[nPort].SubStations[iRequireNum].sub_state = SUB_STATE_OFFLINE;				}			}			nGroup = (nGroup+1)%5;			SYS_Delay(300);		}	}}void *Thread_MB_Master(void *iPort){	int k,nLen,nRecv;	int nPort = *((int *)iPort);	int sOrder=0,nGroup;	unsigned char SendBuff[256], RecvBuff[256];	unsigned char ucAddr=SubDevice[nPort].SubStations[0].sub_address;	if(nTransYc%Every_YC_Frame_Num)		nGroup = nTransYc/Every_YC_Frame_Num+2;	else		nGroup = nTransYc/Every_YC_Frame_Num+1;	while(1)	{		nLen = Get_SendFrame_To_PLC(SendBuff,ucAddr,sOrder);		for(k=0;k<3;k++)		{			COMM_SendBuff(nPort, SendBuff, nLen);			SYS_Delay(500);			nRecv = Read_Modbus_Frame(nPort,ucAddr,RecvBuff);			if (nRecv>0)			{				break;			}			SYS_Delay(200);		}		sOrder = (sOrder+1) %nGroup;	}}void *Thread_GZDW(void *iPort)//连接一个装置{	int nPort = *((int *)iPort);	int ret,i,k,m,uInf_Modbus = -1,YX_Num=16;	int nLen,nRead,nRecv,iRequireNum = 0,iError=0;	int iCon_Number,iNetGroup,nGroup=0,uIndex;	unsigned char ucVSQ,ucADDR,ucSECT,ucSPI;	unsigned char SendBuff[256],RecvBuff[256];	unsigned char IEC104DataBuf_C[256],TempYX[128];	unsigned char IEC104DataBuf_M[256],CurYX;	unsigned char ucAddr=SubDevice[nPort].SubStations[iRequireNum].sub_address;	while(1)//首先暂存遥信数据	{		nLen=Get_GZDW_Frame(SendBuff, ucAddr, 1);		COMM_SendBuff(nPort, SendBuff, nLen);		SYS_Delay(200);		nRecv=Read_GZDW_Frame(nPort,ucAddr,RecvBuff);		if (nRecv>0)		{			for(i=0;i<YX_Num;i++)			{				TempYX[i]=GetDigital(RecvBuff+4,i)+1;				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 2, 1+i);				if( uInf_Modbus >=0 ) 				{					CurYX = TempYX[i] - 1;					RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );				}			}			break;		}		SYS_Delay(500);	}	while(1)	{		nRead=Read_104Data_From_Memory(nPort,IEC104DataBuf_C);		if(nRead>0)		{			iNetGroup = IEC104DataBuf_C[0]>>4;			iCon_Number = IEC104DataBuf_C[0]&0x0f;			if(!CONN_IsEngStation(iNetGroup,iCon_Number))			{				if(*(IEC104DataBuf_C+IEC104_OFFSET_TI+1)==IEC104_TI_C_IC_NA_1)				{					ucSECT = *(IEC104DataBuf_C+IEC104_OFFSET_SECT+1);					ucADDR = *(IEC104DataBuf_C+IEC104_OFFSET_ADDR+1);					ret = IEC_PackInspectHead_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答确认命令					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);					SYS_Delay(10);					uIndex = SUB_AddrToIndex(ucADDR);					switch(ucSECT)					{					case 0:						ucSPI=(SubDevice[nPort].SubStations[uIndex].sub_state != SUB_STATE_OFFLINE) ? 0 : 1;						ret	=IEC_PackNode_104(IEC104DataBuf_M,ucADDR,IEC104_COT_M_introgen,ucSPI);						CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);						break;					case 2:						ucVSQ=0x80|YX_Num;						ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucAddr/*设备地址*/,							0x02/*扇区号*/,1/*信息地址*/,YX_Num/*要转换的字节数*/,TempYX);						CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);						break;					}					ret = IEC_PackInspectEnd_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答结束报文					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);				}			}		}		else		{			iError=0;			nLen = Get_GZDW_Frame(SendBuff, ucAddr, nGroup);			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				nRecv = Read_GZDW_Frame(nPort,ucAddr,RecvBuff);				if (nRecv>0)				{					if (SubDevice[nPort].SubStations[iRequireNum].sub_state == SUB_STATE_OFFLINE)					{						OnCommOK(nPort,iRequireNum);						SubDevice[nPort].SubStations[iRequireNum].sub_state = SUB_STATE_ONLINE;					}					Check_GZDW_YX(nPort,TempYX,RecvBuff);					if(nGroup==0) 						Process_GZDW_YC(nPort,RecvBuff,nRecv);					break;				}				else				{					if(nRecv<=0)		iError++;				}				SYS_Delay(200);			}			if (iError==3)			{				if (SubDevice[nPort].SubStations[iRequireNum].sub_state == SUB_STATE_ONLINE )				{					OnCommError(nPort,iRequireNum);					SubDevice[nPort].SubStations[iRequireNum].sub_state = SUB_STATE_OFFLINE;				}			}				SYS_Delay(200);			nGroup=(nGroup+1)%5;		}	}}void *Thread_CKSTS(void *iPort)//长控所调速器,连接一个装置{	int nPort = *((int *)iPort);	int ret,i,k,m,uInf_Modbus = -1,YX_Num=4;	int nLen,nRead,nRecv,iRequireNum = 0,iError=0;	int iCon_Number,iNetGroup,nGroup=0,uIndex;	unsigned char ucVSQ,ucADDR,ucSECT,ucSPI;	unsigned char SendBuff[256],RecvBuff[256];	unsigned char IEC104DataBuf_C[256],TempYX[128];	unsigned char IEC104DataBuf_M[256],CurYX;	unsigned char ucAddr=SubDevice[nPort].SubStations[iRequireNum].sub_address;	while(1)//首先暂存遥信数据	{		nLen=Get_CKSTS_Frame(SendBuff, ucAddr);		COMM_SendBuff(nPort, SendBuff, nLen);		SYS_Delay(200);		nRecv=Read_CKSTS_Frame(nPort,ucAddr,RecvBuff);		if (nRecv>0)		{			TempYX[0] = GetBYTEFromASCII(RecvBuff[39],RecvBuff[40]) +1;			TempYX[1] = GetBYTEFromASCII(RecvBuff[43],RecvBuff[44]) +1;			TempYX[2] = GetBYTEFromASCII(RecvBuff[47],RecvBuff[48]) +1;			TempYX[3] = GetBYTEFromASCII(RecvBuff[51],RecvBuff[52]) +1;			for(i=0;i<YX_Num;i++)			{				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 2, 1+i);				if( uInf_Modbus >=0 ) 				{					CurYX = TempYX[i] - 1;					RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );				}			}			break;		}		SYS_Delay(500);	}	while(1)	{		nRead=Read_104Data_From_Memory(nPort,IEC104DataBuf_C);		if(nRead>0)		{			iNetGroup = IEC104DataBuf_C[0]>>4;			iCon_Number = IEC104DataBuf_C[0]&0x0f;			if(!CONN_IsEngStation(iNetGroup,iCon_Number))			{				if(*(IEC104DataBuf_C+IEC104_OFFSET_TI+1)==IEC104_TI_C_IC_NA_1)				{					ucSECT = *(IEC104DataBuf_C+IEC104_OFFSET_SECT+1);					ucADDR = *(IEC104DataBuf_C+IEC104_OFFSET_ADDR+1);					ret = IEC_PackInspectHead_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答确认命令					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);					SYS_Delay(10);					uIndex = SUB_AddrToIndex(ucADDR);					switch(ucSECT)					{					case 0:						ucSPI=(SubDevice[nPort].SubStations[uIndex].sub_state != SUB_STATE_OFFLINE) ? 0 : 1;						ret	=IEC_PackNode_104(IEC104DataBuf_M,ucADDR,IEC104_COT_M_introgen,ucSPI);						CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);						break;					case 2:						ucVSQ=0x80|YX_Num;						ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucAddr/*设备地址*/,							0x02/*扇区号*/,1/*信息地址*/,YX_Num/*要转换的字节数*/,TempYX);						CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);						break;					}					ret = IEC_PackInspectEnd_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答结束报文					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);				}			}		}		else		{			iError=0;			nLen = Get_CKSTS_Frame(SendBuff, ucAddr);			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				nRecv = Read_CKSTS_Frame(nPort,ucAddr,RecvBuff);				if (nRecv>0)				{					if (SubDevice[nPort].SubStations[iRequireNum].sub_state == SUB_STATE_OFFLINE)					{						OnCommOK(nPort,iRequireNum);						SubDevice[nPort].SubStations[iRequireNum].sub_state = SUB_STATE_ONLINE;					}					Process_CKSTS_Recv(nPort, RecvBuff, TempYX, nGroup);					break;				}				else				{					if(nRecv<=0)		iError++;				}				SYS_Delay(200);			}			if (iError==3)			{				if (SubDevice[nPort].SubStations[iRequireNum].sub_state == SUB_STATE_ONLINE )				{					OnCommError(nPort,iRequireNum);					SubDevice[nPort].SubStations[iRequireNum].sub_state = SUB_STATE_OFFLINE;				}			}				SYS_Delay(200);			nGroup=(nGroup+1)%5;		}	}}void *Thread_DKYLC(void *iPort)//广州电科院励磁,连接一个装置{	int nPort = *((int *)iPort);	int ret,i,k,m,uInf_Modbus = -1,YX_Num = 48;	int nLen,nRead,nRecv,iRequireNum = 0,iError=0;	int iCon_Number,iNetGroup,nGroup=0,uIndex ;	unsigned char ucVSQ,ucADDR,ucSECT,ucSPI;	unsigned char SendBuff[256],RecvBuff[256];	unsigned char IEC104DataBuf_C[256],TempYX[128];	unsigned char IEC104DataBuf_M[256],CurYX,ucTemp[8];	unsigned char ucAddr=SubDevice[nPort].SubStations[iRequireNum].sub_address;	while(1)//首先暂存遥信数据	{		nLen=Get_DKYLC_Frame(SendBuff, ucAddr);		COMM_SendBuff(nPort, SendBuff, nLen);		SYS_Delay(200);		nRecv=Read_Modbus_Frame(nPort,ucAddr,RecvBuff);		if(nRecv>0)		{			for(i=0;i<3;i++)			{				ucTemp[2*i] = RecvBuff[10+2*i];				ucTemp[2*i+1] = RecvBuff[9+2*i];			}			for(i=0;i<YX_Num;i++)			{				TempYX[i]=GetDigital(ucTemp,i)+1;				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 2, 1+i);				if( uInf_Modbus >=0 ) 				{					CurYX = TempYX[i] - 1;					RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );				}			}			break;		}		SYS_Delay(500);	}	while(1)	{		nRead=Read_104Data_From_Memory(nPort,IEC104DataBuf_C);		if(nRead>0)		{			iNetGroup = IEC104DataBuf_C[0]>>4;			iCon_Number = IEC104DataBuf_C[0]&0x0f;			if(!CONN_IsEngStation(iNetGroup,iCon_Number))			{				if(*(IEC104DataBuf_C+IEC104_OFFSET_TI+1)==IEC104_TI_C_IC_NA_1)				{					ucSECT = *(IEC104DataBuf_C+IEC104_OFFSET_SECT+1);					ucADDR = *(IEC104DataBuf_C+IEC104_OFFSET_ADDR+1);					ret = IEC_PackInspectHead_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答确认命令					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);					SYS_Delay(10);					uIndex = SUB_AddrToIndex(ucADDR);					switch(ucSECT)					{					case 0:						ucSPI=(SubDevice[nPort].SubStations[uIndex].sub_state != SUB_STATE_OFFLINE) ? 0 : 1;						ret	=IEC_PackNode_104(IEC104DataBuf_M,ucADDR,IEC104_COT_M_introgen,ucSPI);						CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);						break;					case 2:						ucVSQ=0x80|YX_Num;						ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucAddr/*设备地址*/,							0x02/*扇区号*/,1/*信息地址*/,YX_Num/*要转换的字节数*/,TempYX);						CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);						break;					}					ret = IEC_PackInspectEnd_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答结束报文

⌨️ 快捷键说明

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