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

📄 threadfunc.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);						SYS_Delay(10);				}			}		}		else		{			iError=0;			nLen = Get_DKYLC_Frame(SendBuff, ucAddr);			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				nRecv = Read_Modbus_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_DKYLC_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_MB_Slave(void *iPort){	int nPort = *((int *)iPort);	fd_set COM_Set;	struct timeval timeout;	int m,ret,nRecv;	unsigned short CRCResult,uLen=0;	unsigned short StartAddr,ReqNum;	unsigned char SendBuff[256],RecvBuff[256],TempBuff[256];	unsigned char ucAddr = SubDevice[nPort].SubStations[0].sub_address; 	while(1)	{		timeout.tv_sec  = 0;		timeout.tv_usec = 500000;		FD_ZERO(&COM_Set);		FD_SET(COM[nPort],&COM_Set);		if(select(COM[nPort]+1, &COM_Set, NULL, NULL, &timeout) != 0)		{			if(FD_ISSET(COM[nPort],&COM_Set))			{				nRecv = Read_Modbus_Cmd(nPort,ucAddr,RecvBuff);				if( nRecv>0 )				{					SendBuff[0] = RecvBuff[0];					SendBuff[1] = RecvBuff[1];					StartAddr = RecvBuff[2]*256+RecvBuff[3];					ReqNum = RecvBuff[4]*256+RecvBuff[5];										switch(RecvBuff[1])					{					case 0x03:					case 0x04:						SendBuff[2] = 2*RecvBuff[5];						ret = RequireInvalid(YC_Msg, StartAddr, ReqNum); 						if(ret==0)						{							ret = GetYcResponseFrame(TempBuff,StartAddr,ReqNum);							memcpy(SendBuff+3,TempBuff,ret);							uLen = ret+3;						}						else						{							SendBuff[1] = RecvBuff[1] | 0x80;							SendBuff[2] = ret;							uLen = 3;						}						break;					case 0x01:					case 0x02:						ret = RequireInvalid(YX_Msg, StartAddr, ReqNum); 						if(ret==0)						{							if(ReqNum%8 == 0)								SendBuff[2] = ReqNum/8;							else								SendBuff[2] = ReqNum/8+1;							ret = GetYxResponseFrame(TempBuff,StartAddr,ReqNum);							memcpy(SendBuff+3,TempBuff,ret);							uLen = ret+3;						}						else						{							SendBuff[1] = RecvBuff[1] | 0x80;							SendBuff[2] = ret;							uLen = 3;						}						break;					case 0x05:						case 0x06:						case 0x10:						SaveHMICommand(RecvBuff, nRecv);						memcpy(SendBuff, RecvBuff, 6);						uLen = 6;						break;					}					CRCResult = CRC16(SendBuff,uLen);					SendBuff[uLen] = HIBYTE(CRCResult);					SendBuff[uLen+1] = LOBYTE(CRCResult);					uLen += 2;					COMM_SendBuff(nPort,SendBuff,uLen);				}				else				{					if(nRecv==Error_Recv)					{						COM_Clear(nPort);					}				}			}		}	}}void *Thread_TDSWDXJ(void *iPort){	int nPort = *((int *)iPort);	int ret,i,k,m,uInf_Modbus = -1,uIndex;	int nLen,nRead,nRecv,iRequireNum = 0;	int iCon_Number,iNetGroup,nGroup=0,iError=0;	unsigned char ucVSQ,ucADDR,ucSECT,ucSPI;	unsigned char SendBuff[256],RecvBuff[256];	unsigned char IEC104DataBuf_C[256];	unsigned char IEC104DataBuf_M[256];	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:						if(SubDevice[nPort].SubStations[uIndex].sub_YX_NUM>120 )							SubDevice[nPort].SubStations[uIndex].sub_YX_NUM = 120;						ucVSQ=0x80|SubDevice[nPort].SubStations[uIndex].sub_YX_NUM;						ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,0x02/*扇区号*/,1/*起始信息地址*/,							SubDevice[nPort].SubStations[uIndex].sub_YX_NUM/*要转换的字节数*/,&SubDevice[nPort].SubStations[uIndex].sub_Data[0]);						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_TDS_WDXJ_Frame(SendBuff, nPort , iRequireNum);			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				ucADDR = SubDevice[nPort].SubStations[iRequireNum].sub_address;				nRecv = Read_Modbus_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;					}					if(RecvBuff[1]==0x03) Process_TDS_YC(nPort, RecvBuff);					if(RecvBuff[1]==0x02) Process_TDS_YX(nPort, iRequireNum, RecvBuff);					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);			iRequireNum=(iRequireNum+1)%SubDevice[nPort].SubTotalNum;		}	}}void *Thread_TDSZSXH(void *iPort){	int nPort = *((int *)iPort);	int ret,i,k,m,uInf_Modbus = -1,uIndex;	int nLen,nRead,nRecv,iRequireNum = 0;	int iCon_Number,iNetGroup,nGroup=0,iError=0;	unsigned char ucVSQ,ucADDR,ucSECT,ucSPI;	unsigned char SendBuff[256],RecvBuff[256];	unsigned char IEC104DataBuf_C[256];	unsigned char IEC104DataBuf_M[256];	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:						if(SubDevice[nPort].SubStations[uIndex].sub_YX_NUM>120)							SubDevice[nPort].SubStations[uIndex].sub_YX_NUM = 120 ;						ucVSQ=0x80|SubDevice[nPort].SubStations[uIndex].sub_YX_NUM;						ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,0x02/*扇区号*/,1/*起始信息地址*/,							SubDevice[nPort].SubStations[uIndex].sub_YX_NUM/*要转换的字节数*/,&SubDevice[nPort].SubStations[uIndex].sub_Data[0]);						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_TDS_ZSXH_Frame(SendBuff, nPort , iRequireNum);			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				ucADDR = SubDevice[nPort].SubStations[iRequireNum].sub_address;				nRecv = Read_Modbus_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;					}					if(RecvBuff[1]==0x03) Process_TDS_YC(nPort, RecvBuff);					if(RecvBuff[1]==0x02) Process_TDS_YX(nPort, iRequireNum, RecvBuff);					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);			iRequireNum=(iRequireNum+1)%SubDevice[nPort].SubTotalNum;		}	}}void *Thread_FJKZ(void *iPort){	int nPort = *((int *)iPort);	unsigned short CommandBuff[8];	int ret,i,k,m,uIndex,nYX,YxGroup;	int nLen,nRead,nRecv,iRequireNum = 0;	int iCon_Number,iNetGroup,nGroup=0,iError=0;	unsigned char ucVSQ,ucADDR,ucSECT,ucSPI;	unsigned char SendBuff[256],RecvBuff[256],ModbusBuff[128];	unsigned char IEC104DataBuf_C[256],IEC104DataBuf_M[256];	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);					uIndex = SUB_AddrToIndex(ucADDR);					ret = IEC_PackInspectHead_104( IEC104DataBuf_M, ucADDR, ucSECT );//回答确认命令					CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);					SYS_Delay(10);					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:						nYX = SubDevice[nPort].SubStations[uIndex].sub_YX_NUM;						if(nYX>256) nYX = 256;						YxGroup = nYX/120;						for(k=0;k<YxGroup;k++)						{							ucVSQ=0x80|120;							ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,0x02/*扇区号*/,								1+120*k/*起始信息地址*/, 120/*要转换的字节数*/,&SubDevice[nPort].SubStations[uIndex].sub_Data[120*k]);							CONN_Send104Data(iNetGroup,iCon_Number,IEC104DataBuf_M,ret);							SYS_Delay(10);						}						if(nYX%120)						{							ucVSQ=0x80|(nYX%120);							ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,0x02/*扇区号*/,								1+120*k/*起始信息地址*/, (nYX%120)/*要转换的字节数*/,&SubDevice[nPort].SubStations[uIndex].sub_Data[120*k]);							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				{					ret = IEC_Frame_104ToModbus(ModbusBuff,CommandBuff,IEC104DataBuf_C+1);					if (ret>0)					{						GEPLC_Command_Handle(nPort,iNetGroup,iCon_Number,ModbusBuff,CommandBuff,ret);					}				}			}		}		else		{			iError=0;			nLen = Get_FJKZ_Frame(SendBuff, nPort , iRequireNum);			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				ucADDR = SubDevice[nPort].SubStations[iRequireNum].sub_address;				nRecv = Read_Modbus_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;					}					if(RecvBuff[1]==0x03) Process_FJKZ_YC(nPort, RecvBuff);					if(RecvBuff[1]==0x02) Process_FJKZ_YX(nPort, iRequireNum, RecvBuff);					break;				}				else				{					if(nRecv<=0)		iError++;				}				SYS_Delay(200);			}			if (iError==3)			{				if (SubDevice[nPort].SubStations[iRequireNum].sub_state == SUB_STATE_ONLINE )

⌨️ 快捷键说明

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