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