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