📄 comfunc.c
字号:
#include "include/mcuapi.h"void InitSubDevice(void)//初始化装置参数{ int i, j, k, m, fd; for(k=1;k<=8;k++) { COM_Para[k].BaudRate = MyFlashBuff[5*(k-1)+0]; //串口波特率 COM_Para[k].Parity = MyFlashBuff[5*(k-1)+1]; //奇偶校验 COM_Para[k].DataBit = MyFlashBuff[5*(k-1)+2]; //数据位 COM_Para[k].StopBit = MyFlashBuff[5*(k-1)+3]; //停止位 COM_Para[k].Protocol = MyFlashBuff[5*(k-1)+4]; //所用规约 OpenComPort(k, COM_Para[k].BaudRate, COM_Para[k].DataBit, COM_Para[k].StopBit, COM_Para[k].Parity); SubDevice[k].iPort = k; SubDevice[k].SubTotalNum = (unsigned char)(MyFlashBuff[k*100]%256); if (SubDevice[k].SubTotalNum > SUB_MAX) SubDevice[k].SubTotalNum = SUB_MAX; for(j=0;j<SubDevice[k].SubTotalNum;j++) { SubDevice[k].SubStations[j].sub_address = HIBYTE(MyFlashBuff[5*j+k*100+1]); SubDevice[k].SubStations[j].sub_type = LOBYTE(MyFlashBuff[5*j+k*100+1]); SubDevice[k].SubStations[j].sub_YC_NUM = MyFlashBuff[5*j+k*100+2]; SubDevice[k].SubStations[j].sub_YX_NUM = MyFlashBuff[5*j+k*100+3]; SubDevice[k].SubStations[j].sub_YC_Addr = MyFlashBuff[5*j+k*100+4]; SubDevice[k].SubStations[j].sub_YX_Addr = MyFlashBuff[5*j+k*100+5]; SubDevice[k].SubStations[j].sub_state = SUB_STATE_OFFLINE;
SubDevice[k].SubStations[j].sub_FileType = 0x85;
SubDevice[k].SubStations[j].sub_TNS = 0; SubDevice[k].SubStations[j].sub_ResetFailNum = 0; SubDevice[k].SubStations[j].sub_ResetNum = 0; SubDevice[k].SubStations[j].sub_FailNum = 0; SubDevice[k].SubStations[j].sub_C_CMDNum = 0; SubDevice[k].SubStations[j].sub_M_CMDNum = 0; SubDevice[k].SubStations[j].sub_B_CMDNum = 0; SubDevice[k].SubStations[j].sub_DgtFlag = 0;
SubDevice[k].SubStations[j].sub_DgtFlag1 = 0;
SubDevice[k].SubStations[j].sub_DgtFlag2 = 0;
SubDevice[k].SubStations[j].sub_DgtFlag3 = 0;
SubDevice[k].SubStations[j].sub_DgtFlag4 = 0;
SubDevice[k].SubStations[j].sub_DgtFlag5 = 0;
SubDevice[k].SubStations[j].sub_Command = 0;
SubDevice[k].SubStations[j].sub_Sequence = 0;
SubDevice[k].SubStations[j].sub_SendOrder = 0; SubDevice[k].SubStations[j].sub_DGT801 = 0; SubDevice[k].SubStations[j].sub_FunOrder = 0; SubDevice[k].SubStations[j].sub_RII = 0; //返回信息标识符 SubDevice[k].SubStations[j].sub_SCN104 = 0; //扫描序号 SubDevice[k].SubStations[j].sub_SCNTCP = 0; SubDevice[k].SubStations[j].sub_YBCtrlFlg = 0; SubDevice[k].SubStations[j].sub_DZCtrlFlg = 0; SubDevice[k].SubStations[j].sub_DZendflag = 0; SubDevice[k].SubStations[j].sub_InspectEnd = 0; } } while ((fd=open("/tmp/share_memory.lock", O_RDONLY | O_CREAT | O_EXCL)) < 0); for(m=0;m<10000;m++) share_memory_write(m,0); close(fd); unlink("/tmp/share_memory.lock"); nTransYc = MyFlashBuff[YcTableAddr]; if(nTransYc>MaxTransYc) nTransYc=MaxTransYc; for(i=0;i<nTransYc;i++) { uYcTable[i].uAddr=HIBYTE(MyFlashBuff[YcTableAddr+1+2*i]); uYcTable[i].uSector=LOBYTE(MyFlashBuff[YcTableAddr+1+2*i]); uYcTable[i].uInf103=MyFlashBuff[YcTableAddr+2+2*i]; //printf("uYcTable[%d].uAddr=%d,uYcTable[%d].uSector=%d,uYcTable[%d].uInf103=%X\n",i,uYcTable[i].uAddr,i,uYcTable[i].uSector,i,uYcTable[i].uInf103); } nTransYx = MyFlashBuff[YxTableAddr]; if(nTransYx>MaxTransYx) nTransYx=MaxTransYx; for(i=0;i<nTransYx;i++) { uYxTable[i].uAddr=HIBYTE(MyFlashBuff[YxTableAddr+1+2*i]); uYxTable[i].uSector=LOBYTE(MyFlashBuff[YxTableAddr+1+2*i]); uYxTable[i].uInf103=MyFlashBuff[YxTableAddr+2+2*i]; //printf("uYxTable[%d].uAddr=%d,uYxTable[%d].uSector=%d,uYxTable[%d].uInf103=%X\n", i,uYxTable[i].uAddr,i,uYxTable[i].uSector,i,uYxTable[i].uInf103); }}int ReadFrame(int iPort, unsigned char ucADDR,unsigned char *pRecv) //从800保护读取数据{ unsigned char CheckSum; int k, iError = 0, len = 0, nRecv = 0; unsigned char iRead[EveryRead]; if( ComDataCome(iPort, 1000) >0 ) { while(nRecv<256) { len = read(COM[iPort], iRead, sizeof(iRead)); if(len>0) { iError = 0 ; if(nRecv+len>256) break; memcpy(pRecv+nRecv,iRead,len); nRecv += len; if(pRecv[0]==0x10) { if(nRecv>=5) { nRecv =5; break; } } if(pRecv[0]==0x68) { if(nRecv>=pRecv[1]+6) { nRecv = pRecv[1]+6; break; } } } else { iError ++ ; if(iError >30) break; SYS_Delay(10); } } } if(nRecv>0) { PrintDebugInfo(iPort, Recv_Data, pRecv, nRecv); if(pRecv[0] == 0x10) { if((pRecv[2]==ucADDR)&&(pRecv[4]==0x16)) //判断帧头,地址,帧尾是否正确 { CheckSum = GetByteCheckSum((pRecv+1),2); //计算校验 if (pRecv[3]==CheckSum) { return nRecv; } else return Error_Recv; } else return Error_Recv; } else if(pRecv[0] == 0x68) { if((pRecv[5]==ucADDR)&&(pRecv[nRecv-1]==0x16)) //判断帧头,地址,帧尾是否正确 { CheckSum = GetByteCheckSum((pRecv+4),(nRecv-6)); //计算校验 if (pRecv[nRecv-2] == CheckSum) { return nRecv; } else return Error_Recv; } else return Error_Recv; } else return Error_Recv; } return 0;}int LocalIEC103Cmd(unsigned char ucCMDCode, unsigned char ucAddr, unsigned char *pDest) { int i; unsigned char *p = NULL,*p1 = NULL,ucFCB; unsigned char ResetCU[] = {0x10,0x40,1,0,0x16}; unsigned char RequireFirstData[] = {0x10,0x5a,1,0,0x16}; unsigned char RequireSecondData[] = {0x10,0x5b,1,0,0x16}; ucFCB =SUB_GetFCB(ucAddr); switch(ucCMDCode&0x0f) { case RESETCU: // reset CU p = (unsigned char *)ResetCU; p1 = pDest; for (i=0; i<5; i++) // fix frame data { *(p1 + i) = *(p + i); } *(p1 + 2) = ucAddr; *(p1+3) = *(p1+1) + *(p1+2); // calculate check SUM break; case REQUIREFIRSTDATA: // RequireFirstData p =(unsigned char *)RequireFirstData; p1 = pDest; for (i=0; i<5; i++) // fix frame data { *(p1 + i) = *(p + i); } SUB_SetFCB(p1,ucFCB); *(p1 + 2) = ucAddr; *(p1 + 3) = *(p1+1) + *(p1+2); // calculate check SUM break; case REQUIRESECONDDATA: // p =(unsigned char *)RequireSecondData; p1 = pDest; for (i=0; i<5; i++) // fix frame data { *(p1 + i) = *(p + i); } SUB_SetFCB(p1,ucFCB); *(p1 + 2) = ucAddr; *(p1 + 3) = *(p1+1) + *(p1+2); // calculate check SUM break; } return 5;}int Command_Handle(int iPort,int NetGroup,int iConnect,unsigned char *pucCMD,unsigned char iLen){ int iSend=iLen; int i,j,m,ret,index; unsigned char ucCS=0,ucSPI; SUB_Station *pSub =NULL; unsigned char IEC104DataBuf_M[256],IEC103DataBuf_M[256]; unsigned char ucADDR,ucCPU=0; unsigned char ucIFormatConfirm=0; if (pucCMD[0] == START_CODE1) //START_CODE1=0x10 固定帧长报文 { ucADDR =pucCMD[2]; } else { ucADDR =pucCMD[IEC103_OFFSET_ADDR];//pucCMD[5] ucCPU =pucCMD[IEC103_OFFSET_COMADDR];//pucCMD[9] } index = SUB_AddrToIndex(ucADDR); if ((index >= 0) && (index < SUB_MAX)) { pSub = &SubDevice[iPort].SubStations[index]; } if ( CONN_Validate(iConnect) && (!CONN_IsEngStation(NetGroup,iConnect)) //合法的连接,操作员站 && (pucCMD[IEC103_OFFSET_TI] == IEC103_TI_C_IGI_NA_3) //总召唤启动 && (pucCMD[0] == START_CODE2) ) //make general inspect confirm { if (pSub != NULL) { ret =IEC_PackInspectHead_104(IEC104DataBuf_M,ucADDR,ucCPU); CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret); if ((ucCPU == 0) || (ucCPU == 0xff)) //for Sect 0 or Sect 0xff { if (pSub->sub_state != SUB_STATE_OFFLINE) ucSPI=0; else ucSPI=1; ret =IEC_PackNode_104(IEC104DataBuf_M,ucADDR, IEC104_COT_M_introgen,ucSPI); CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret); if ( pSub->sub_state != SUB_STATE_ONLINE ) { SYS_Delay(10); ret =IEC_PackInspectEnd_104(IEC104DataBuf_M,ucADDR,ucCPU); CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret); SYS_Delay(10); return 0; } } } } if ( CONN_Validate(iConnect) && CONN_IsEngStation(NetGroup,iConnect) && (pucCMD[IEC103_OFFSET_TI]==IEC103_TI_C_IGI_NA_3) && (pucCMD[0] == START_CODE2) ) //general inspect for engineer station { if (pSub != NULL) { if ((ucCPU == 0) || (ucCPU == 0xff)) //for sect 0 or sect 0xff { if (pSub->sub_state != SUB_STATE_OFFLINE) ucSPI=1; else ucSPI=2; SYS_Delay(10); ret =IEC_PackNode_TCP(IEC104DataBuf_M,ucADDR,IEC103_COT_M_totalQUERY,pSub->sub_FUN,ucSPI); CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret); if (pSub->sub_state != SUB_STATE_ONLINE) { SYS_Delay(10); ret = IEC_PackInspectEnd_TCP(IEC104DataBuf_M,ucADDR,ucCPU,pSub->sub_FUN,pucCMD[IEC103_OFFSET_CONTEXT]); CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret); SYS_Delay(10); return 0; } } } } if ((pucCMD[IEC103_OFFSET_TI]==IEC103_TI_M_SYN_TA_3) && (pucCMD[0] == START_CODE2)) { if((pucCMD[IEC103_OFFSET_COMADDR] == 0xfe) && (pucCMD[IEC103_OFFSET_ADDR] == 0xff)) { return 0; } } if ((ucADDR != BROADCAST_ADDR) && (pSub == NULL)) { return 0; } if(pSub->sub_state != SUB_STATE_ONLINE) { return 0; } do { for (i =0; i< 3 ; i++) { COMM_SendBuff(iPort, pucCMD, iSend); if ((ucADDR == BROADCAST_ADDR) && (pSub != NULL)) //if broadcast command,need no answer { pSub->sub_B_CMDNum++; SYS_Delay(10); return 1; } ret = ReadFrame(iPort,ucADDR,IEC103DataBuf_M); pSub->sub_C_CMDNum++; if (ret>0) { pSub->sub_M_CMDNum++; SUB_ResetFCB(pSub); if (pSub->sub_state == SUB_STATE_OFFLINE) { OnCommOK(iPort, index); ret =IEC_PackNode_TCP(IEC104DataBuf_M,ucADDR,IEC103_COT_M_per,0,1); WriteMsgToShareMem(iPort, ret, IEC104DataBuf_M, EngineerStation, YX_Msg); pSub->sub_state = SUB_STATE_ONLINE; } switch(IEC103DataBuf_M[0]) { case START_CODE1: ucCS = IEC103DataBuf_M[1] ; //receive code status break; case START_CODE2: ucCS = IEC103DataBuf_M[4] ; //receive code status pSub->sub_FUN =IEC103DataBuf_M[IEC103_OFFSET_FUN]; CONN_SendDataUp(iPort,NetGroup,iConnect,IEC104DataBuf_M,IEC103DataBuf_M); break; default : ucCS = 0; break; } if (ucCS & _ACD) //if has first user data { iSend =LocalIEC103Cmd(REQUIREFIRSTDATA, ucADDR, pucCMD); } else //if no first user data { pSub->sub_CS =REQUIRESECONDDATA; } break; } else //read data fail { pSub->sub_FailNum++; SYS_Delay(200); } } if (i>=3) //if failed over three times,set the flag to reset CU { if (pSub->sub_state == SUB_STATE_ONLINE) { pSub->sub_state = SUB_STATE_FAIL; } break; } }while (ucCS & _ACD);//loop until have no first user data return 0;}int ResetOneCU(int iPort, int uIndex){ int ret,iRead,iSend; unsigned char ucADDR; unsigned char IEC104DataBuf_M[256]; unsigned char IEC103DataBuf_C[256],IEC103DataBuf_M[256]; SUB_Station *pSub = &SubDevice[iPort].SubStations[uIndex]; ucADDR = pSub->sub_address; iSend = LocalIEC103Cmd(RESETCU, ucADDR, IEC103DataBuf_C); COMM_SendBuff(iPort, IEC103DataBuf_C, iSend); pSub->sub_C_CMDNum++; iRead = ReadFrame(iPort,ucADDR,IEC103DataBuf_M); if(iRead > 0) { pSub->sub_ResetNum = 0; pSub->sub_M_CMDNum++; if (pSub->sub_state == SUB_STATE_OFFLINE) { OnCommOK(iPort, uIndex);
pSub->sub_DgtFlag=1;//串口转串口方案中装置通讯中断到正常时发送对装置校时命令标志 ret = IEC_PackNode_TCP(IEC104DataBuf_M,ucADDR, IEC103_COT_M_per,0,1); WriteMsgToShareMem(iPort, ret, IEC104DataBuf_M, EngineerStation, YX_Msg);
} pSub->sub_state = SUB_STATE_ONLINE; pSub->sub_CS = REQUIREFIRSTDATA; pSub->sub_M_CMDNum++; } else { pSub->sub_ResetNum++; } if( pSub->sub_ResetNum>=3 ) { pSub->sub_ResetNum = 0; if(pSub->sub_state == SUB_STATE_FAIL) { OnCommError(iPort, uIndex); ret =IEC_PackNode_TCP(IEC104DataBuf_M, ucADDR, IEC103_COT_M_per, 0, 2); WriteMsgToShareMem(iPort, ret, IEC104DataBuf_M, EngineerStation, YX_Msg); pSub->sub_state = SUB_STATE_OFFLINE; } } return 1;}/*FUNCTION:reset CU if over timeout*/int ResetAllCU(int iPort){ int i,ret=0,OffLineNum = 0; int SubTotal = SubDevice[iPort].SubTotalNum; SUB_Station *pSub = NULL; for(i=0; i<SubTotal; i++) { OffLineNum = SUB_GetNextOffLine(OffLineNum, iPort); pSub = &SubDevice[iPort].SubStations[OffLineNum]; if(pSub->sub_state != SUB_STATE_ONLINE) { ResetOneCU(iPort, OffLineNum); ret ++ ; } } return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -