📄 threadfunc.c
字号:
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 + -