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

📄 threadfunc.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
						OnCommOK(nPort,0);						SubDevice[nPort].SubStations[0].sub_state = SUB_STATE_ONLINE;					}					break;				}			}			if ( i == TotalMeter )			{				if (SubDevice[nPort].SubStations[0].sub_state == SUB_STATE_ONLINE)				{					OnCommError(nPort,0);					SubDevice[nPort].SubStations[0].sub_state = SUB_STATE_OFFLINE;				}			}			if(DevType == 0xF3)				nLen = Get_ZhangZhouDL645_Frame(SendBuff,SerialNum[iRequireNum]);			else				nLen = Get_DL645_Frame(SendBuff,DL645_Meter[nPort].WS_Meter[iRequireNum].SubAddr);			iErrCount = 0;			for (j = 0; j < 4; j++)// read for four useful data			{				SendBuff[10] = ucDI[2 * j + 0] + 0x33;				SendBuff[11] = ucDI[2 * j + 1] + 0x33;				SendBuff[12] = GetByteCheckSum(SendBuff, 12);				SendBuff[13] = 0x16;				COMM_SendBuff(nPort, SendBuff, 14);				if(DevType == 0xF3)					nRecv = Read_ZhangZhou_Frame(nPort,DL645_Meter[nPort].WS_Meter[iRequireNum].SubAddr,RecvBuff);				else					nRecv = Read_DL645_Frame(nPort,DL645_Meter[nPort].WS_Meter[iRequireNum].SubAddr,RecvBuff);				if(nRecv>0)				{					iErrCount  = 0;					if (DL645_Meter[nPort].WS_Meter[iRequireNum].SubState == SUB_STATE_OFFLINE)					{						MeterCommOK(nPort,DeviceAddr,iRequireNum);						DL645_Meter[nPort].WS_Meter[iRequireNum].SubState = SUB_STATE_ONLINE;					}					if (SubDevice[nPort].SubStations[0].sub_state == SUB_STATE_OFFLINE)					{						OnCommOK(nPort,0);						SubDevice[nPort].SubStations[0].sub_state = SUB_STATE_ONLINE;					}					for (k = 0; k < 4; k++)						ucBuff[k] = RecvBuff[12 + k] - 0x33; 	//上送数据减0x33					//DL645规约中上送数据为BCD码,需转换成十六进制数据,经转换后为实际值的10倍					BCD_To_HEX(&DL645_Meter[nPort].WS_Meter[iRequireNum].MeterData[j*4], ucBuff);					ulInf = 0x4001 +  iRequireNum*8 + j*2 ;					uInf_Modbus = FindPointInf(YC_Msg, DeviceAddr, ucSect, ulInf);					if( uInf_Modbus >=0 ) 						RefreshDateData(YC_Msg, uInf_Modbus, &DL645_Meter[nPort].WS_Meter[iRequireNum].MeterData[j*4]);					ulInf = 0x4002 +  iRequireNum*8 + j*2 ;					uInf_Modbus = FindPointInf(YC_Msg, DeviceAddr, ucSect, ulInf);					if( uInf_Modbus >=0 ) 						RefreshDateData(YC_Msg, uInf_Modbus, &DL645_Meter[nPort].WS_Meter[iRequireNum].MeterData[j*4+2]);					memset(RecvBuff, 0 , sizeof(RecvBuff)) ;				}				else				{					iErrCount ++;					if(iErrCount>=3)					{						iErrCount = 0 ;						if (DL645_Meter[nPort].WS_Meter[iRequireNum].SubState == SUB_STATE_ONLINE)						{							MeterCommError(nPort,DeviceAddr,iRequireNum);							DL645_Meter[nPort].WS_Meter[iRequireNum].SubState = SUB_STATE_OFFLINE;						}						break;					}				}				if(DL645_Meter[nPort].WS_Meter[iRequireNum].SubState == SUB_STATE_OFFLINE)		break;			}			if( (RequirePQ) && (DL645_Meter[nPort].WS_Meter[iRequireNum].SubState == SUB_STATE_ONLINE) )//查询模拟量			{				iErrCount = 0 ;				for(j=0;j<10;j++)				{					SendBuff[10] = LOBYTE(ucCMD_IA[j]) + 0x33;					SendBuff[11] = HIBYTE(ucCMD_IA[j]) + 0x33;					SendBuff[12] = GetByteCheckSum(SendBuff, 12);					SendBuff[13] = 0x16;					COMM_SendBuff(nPort, SendBuff, 14);					nRecv = Read_DL645_Frame(nPort, DL645_Meter[nPort].WS_Meter[iRequireNum].SubAddr, RecvBuff);					if(nRecv>0)	//通讯正常					{						iErrCount = 0 ;						if (DL645_Meter[nPort].WS_Meter[iRequireNum].SubState == SUB_STATE_OFFLINE)						{							MeterCommOK(nPort,DeviceAddr,iRequireNum);							DL645_Meter[nPort].WS_Meter[iRequireNum].SubState = SUB_STATE_ONLINE;						}						if(j==6)							TempYC[j] = Get_DL645_YC(RecvBuff+12,3);						else							TempYC[j] = Get_DL645_YC(RecvBuff+12,2);						ConvertBuff[0] = LOBYTE(TempYC[j]);						ConvertBuff[1] = HIBYTE(TempYC[j]);						ConvertBuff[2] = 0;						ulInf = 0x4001 + iRequireNum*10 + j;						ret = IEC_PackFrame_104(IEC104DataBuf_C,9/*类别标识*/,0x81/*可变结构限定词*/,1/*传输原因*/,DeviceAddr/*设备地址*/,							0x01/*扇区号*/,ulInf/*信息地址*/,3/*要转换的字节数*/,&ConvertBuff[0]);						WriteMsgToShareMem(nPort, ret, IEC104DataBuf_C, OperatorStation, YC_Msg);					}					else					{						iErrCount ++;						if(iErrCount>=3)						{							iErrCount = 0 ;							if (DL645_Meter[nPort].WS_Meter[iRequireNum].SubState == SUB_STATE_ONLINE)							{								MeterCommError(nPort,DeviceAddr,iRequireNum);								DL645_Meter[nPort].WS_Meter[iRequireNum].SubState = SUB_STATE_OFFLINE;							}							break;						}					}				}			}			iRequireNum = (iRequireNum+1)%TotalMeter;		}	}}void *Thread_WZCK11(void *iPort){	int nPort = *((int *)iPort);	int ret,i,k,m,uIndex,uInf_Modbus,YX_Num=72;	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],TempYX[72];	unsigned char IEC104DataBuf_M[256],CurYX;	unsigned char ucAddr=SubDevice[nPort].SubStations[iRequireNum].sub_address;	while(1)//首先暂存遥信数据	{		nLen=Get_WZCK11_Frame(SendBuff, ucAddr ,0);		COMM_SendBuff(nPort, SendBuff, nLen);		SYS_Delay(200);		nRecv=Read_WZCK11_Frame(nPort,ucAddr,RecvBuff);		if (nRecv>0)		{			for(i=0;i<YX_Num;i++)			{				TempYX[i]=GetDigital(RecvBuff+10,i)+1;				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 2, i+1);				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|24;						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_WZCK11_Frame(SendBuff, ucAddr, nGroup);			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				nRecv = Read_WZCK11_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[9] == 0x01) 						Process_WZCK11_YC(nPort,RecvBuff,nRecv);					if(RecvBuff[9] == 0x02)						Check_WZCK11_YX(nPort,TempYX,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);			nGroup=(nGroup+1)%6;		}	}}void *Thread_WCK3(void *iPort)//连接一个装置{	int nPort = *((int *)iPort);	int ret,i,k,uIndex,uInf_Modbus,iError=0;	int nLen,nRead,nRecv,iRequireNum = 0;	int iCon_Number,iNetGroup,nGroup=0;	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_WCK3_Frame(SendBuff,ucAddr);		COMM_SendBuff(nPort, SendBuff, nLen);		SYS_Delay(200);		nRecv=Read_WCK3_Frame(nPort,ucAddr,RecvBuff);		if (nRecv>0)		{			for(i=0;i<24;i++)			{				TempYX[i]=GetDigital(RecvBuff+25,i)+1;				uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 2, i+1);				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|24;						ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,							0x02/*扇区号*/,1/*信息地址*/,24/*要转换的字节数*/,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_WCK3_Frame(SendBuff,ucAddr);			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, nLen);				SYS_Delay(200);				nRecv = Read_WCK3_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_WCK3_YX(nPort,TempYX,RecvBuff);					if(nGroup==5) 						Process_WCK3_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)%10;		}	}}void *Thread_SMER_LC(void *iPort)//SMER-D励磁,只是针对一个装置(规约同福州大学励磁){	int ret,k,uIndex,iError=0;	int nPort = *((int *)iPort);	int nLen,nRead,nRecv,iRequireNum = 0;	int iCon_Number,iNetGroup,nGroup=0;	unsigned char ucVSQ,ucADDR,ucSECT,ucSPI;	unsigned char CheckSum, SendBuff[128], RecvBuff[256];	unsigned char IEC104DataBuf_C[256], IEC104DataBuf_M[256];	unsigned char ucAddr=SubDevice[nPort].SubStations[iRequireNum].sub_address;	SendBuff[0] = ucAddr;	SendBuff[1] = 0x03;	SendBuff[2] = 0x00;	CheckSum = GetByteCheckSum(SendBuff,3);	SendBuff[3] = ~CheckSum;	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))				Response_COMState(nPort,iNetGroup,iCon_Number,IEC104DataBuf_C+1);		}		else		{			iError=0;			for(k=0;k<3;k++)			{				COMM_SendBuff(nPort, SendBuff, 4);				SYS_Delay(200);				nRecv = Read_SMER_LC_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_SMER_LC_Recv(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(800);		}	}}void *Thread_YWT_TSQ(void *iPort)//YWT武汉博士容达水电公司{	int nPort = *((int *)iPort);	int ByteRequire = 38 ,iError=0;	int ret,i,k,m,YX_Count=16,uIndex;	int nLen,nRead,nRecv,iRequireNum = 0;	int iCon_Number,iNetGroup,nGroup=0;

⌨️ 快捷键说明

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