📄 threadfunc.c
字号:
{ OnCommError(nPort,iRequireNum); SubDevice[nPort].SubStations[iRequireNum].sub_state = SUB_STATE_OFFLINE; } } iRequireNum = (iRequireNum+1)%SubDevice[nPort].SubTotalNum; } }}void *Thread_PP41(void *iPort){ int ret,i,k,m; int nPort = *((int *)iPort); int iCon_Number,iNetGroup,iError=0; int nLen,nRead,nRecv,iRequireNum = 0; unsigned char SendBuff[256],RecvBuff[256]; unsigned char ucAddr,IEC104DataBuf_C[256]; int SubTotal = SubDevice[nPort].SubTotalNum; 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; ucAddr = SubDevice[nPort].SubStations[iRequireNum].sub_address; for(k=0;k<3;k++) { nLen = Get_PP41_Frame(SendBuff,ucAddr); COMM_SendBuff(nPort, SendBuff, nLen); SYS_Delay(200); nRecv = Read_PP41_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_PP41_YC(nPort,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(500); iRequireNum = (iRequireNum+1)%SubTotal; } }}void *Thread_103COM(void *iPort)//sub_DgtFlag/sub_DgtFlag1作为校时标志{ int nPort = *((int *)iPort); int ret, i, m, nOrder = 0; int iRequireNum = 0, OffLineIndex = 0; unsigned char IEC103DataBuf_C[256]; SUB_Station *pSub = NULL; GetUseSect(nPort); ResetAllCU(nPort); while(1) { ret = 0; GPS2000(nPort); pSub = &SubDevice[nPort].SubStations[iRequireNum]; if( pSub->sub_state == SUB_STATE_ONLINE ) { ret = LocalIEC103Cmd(pSub->sub_CS, pSub->sub_address, IEC103DataBuf_C); if(ret>0) { Command_Func(nPort, iRequireNum, IEC103DataBuf_C, ret); } } if(nOrder==0) ZongZhao(nPort); if((nOrder>0)&&(nOrder%50==0)) { OffLineIndex = SUB_GetNextOffLine(OffLineIndex, nPort); pSub = &SubDevice[nPort].SubStations[OffLineIndex]; if( pSub->sub_state != SUB_STATE_ONLINE ) { ResetOneCU(nPort, OffLineIndex); } } nOrder = (nOrder+1)%4000; iRequireNum = SUB_GetNextOnline(iRequireNum,nPort); }}void *Thread_GEC2(void *iPort){ int nPort = *((int *)iPort); int YX_Num = 24,iError=0; int ret,i,k,m,uInf_Modbus = -1,uIndex; 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]; 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: ucVSQ=0x80|YX_Num; ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,0x02/*扇区号*/,1/*起始信息地址*/, 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_GEC2_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]==0x04) Process_GEC2_YC(nPort, RecvBuff); if(RecvBuff[1]==0x02) Process_GEC2_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_STDLC(void *iPort) //2005.9.6 scm modify{ int nPort = *((int *)iPort); int YX_Num = 19,iError=0; int ret,i,k,m,uIndex; int nLen,nRead,nRecv,iRequireNum = 0; int iCon_Number,iNetGroup; 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: ucVSQ=0x80|YX_Num; ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,0x02/*扇区号*/,1/*起始信息地址*/, 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; ucADDR =1;// SubDevice[nPort].SubStations[iRequireNum].sub_address; nLen = Get_STDLC_Frame(SendBuff, ucADDR); for(k=0;k<3;k++) { COMM_SendBuff(nPort, SendBuff, nLen); SYS_Delay(200); nRecv = Read_STDLC_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_STDLC_YXYC(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); } }}void *Thread_STDTS(void *iPort){ int nPort = *((int *)iPort); int YX_Num = 24,iError=0; int ret,i,k,m,uInf_Modbus = -1,uIndex; 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]; 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: ucVSQ=0x80|YX_Num; ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/,0x02/*扇区号*/,1/*起始信息地址*/, 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_STDTS_Frame(SendBuff); for(k=0;k<3;k++) { COMM_SendBuff(nPort, SendBuff, nLen); SYS_Delay(200); ucADDR = SubDevice[nPort].SubStations[iRequireNum].sub_address; nRecv = Read_STDTS_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_STDTS_YX(nPort, iRequireNum, RecvBuff); if(nGroup==0) Process_STDTS_YC(nPort, iRequireNum, RecvBuff); break; } else { if(nRecv<=0) iError++; } SYS_Delay(800); } 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); nGroup = (nGroup+1)%5; } }}void *Thread_SWL2(void *iPort){ int nPort = *((int *)iPort); int YX_Num = 24,iError=0; int ret,i,k,m,uInf_Modbus = -1,uIndex; int nLen,nRead,nRecv,iRequireNum = 0; int iCon_Number,iNetGroup; unsigned char ucVSQ,ucADDR,ucSECT,ucSPI; unsigned char SendBuff[256],RecvBuff[256]; unsigned char IEC104DataBuf_C[256]; unsigned char IEC104DataBuf_M[256]; SWL2_DevAddr = 0xF1; 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -