From 842bb64195f958b050867c50db66fc0aa413dafb Mon Sep 17 00:00:00 2001 From: QuakeGod <quakegod@sina.com> Date: 星期六, 27 七月 2024 10:42:56 +0800 Subject: [PATCH] KBus upgrade --- ComLib/Src/KLink.c | 176 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 136 insertions(+), 40 deletions(-) diff --git a/ComLib/Src/KLink.c b/ComLib/Src/KLink.c index 39e0465..5b9381a 100644 --- a/ComLib/Src/KLink.c +++ b/ComLib/Src/KLink.c @@ -16,7 +16,7 @@ #endif //extern stWLRunStat KwRunStat; -unsigned char KLPacketBuf1[256]; +//unsigned char KLPacketBuf1[256]; unsigned char KLPacketBuf2[256]; unsigned char KLBufferIn[16]={0}; @@ -30,6 +30,14 @@ int KLThisuS=0; int KLRecvTimeuS=0; +stPortDef KLinkPortReg1 = {.nPortHardType = 3,.nPortUseType = 2, .bEnable = 1, .bRunning =1, .StationId = 1, .bMaster = 0}; + +int KLinkInit(int n) +{ + + KMRegisterPort(0,&KLinkPortReg1); + return 0; +} unsigned char KLBCC(void const * pData, int nSize) { unsigned char k; @@ -149,6 +157,7 @@ unsigned short nByteAddr=0; unsigned short nBitAddr=0; unsigned short DataLen=0; //p1->LoadLen; + unsigned short nValue=0; //int nSrcAddr=p1->SrcAddr; nKLStatus.nSEQ = ((pKLStat)(&(p1->Stat)))->nSEQ;; @@ -221,8 +230,10 @@ else if (nDataType == KLDataTypeWR) { pData=KMem.WR+nWordAddr; } else if (nDataType == KLDataTypeWLX) { pData=KMem.WLX+nWordAddr; } else if (nDataType == KLDataTypeWLY) { pData=KMem.WLY+nWordAddr; } - else if (nDataType == KLDataTypeSV) { pData=KMem.SV+nWordAddr; } - else if (nDataType == KLDataTypeEV) { pData=KMem.EV+nWordAddr; } +#if (ENABLE_PLC) + else if (nDataType == KLDataTypeSV) { pData=PLCMem.SV+nWordAddr; } + else if (nDataType == KLDataTypeEV) { pData=PLCMem.EV+nWordAddr; } +#endif else if (nDataType == KLDataTypeTest) { pData=KMem.SDT+nWordAddr; } else if (nDataType == KLDataTypeWDT) { pData=KMem.WDT+nWordAddr; } else if (nDataType == KLDataTypeKBD) { pData=(unsigned short *)&KBus1.KBusChnStats +nWordAddr; } @@ -254,8 +265,10 @@ else if (nDataType == KLDataTypeWR) { pData=KMem.WR+nWordAddr; } else if (nDataType == KLDataTypeWLX) { pData=KMem.WLX+nWordAddr; } else if (nDataType == KLDataTypeWLY) { pData=KMem.WLY+nWordAddr; } - else if (nDataType == KLDataTypeSV) { pData=KMem.SV+nWordAddr; DataLen=0;} - else if (nDataType == KLDataTypeEV) { pData=KMem.EV+nWordAddr; DataLen=0;} +#if (ENABLE_PLC) + else if (nDataType == KLDataTypeSV) { pData=PLCMem.SV+nWordAddr; DataLen=0;} + else if (nDataType == KLDataTypeEV) { pData=PLCMem.EV+nWordAddr; DataLen=0;} +#endif else if (nDataType == KLDataTypeTest) { pData=KMem.SDT+nWordAddr; DataLen=0;} else if (nDataType == KLDataTypeWDT) { pData=KMem.WDT+nWordAddr; DataLen=0;} else if (nDataType == KLDataTypeKBD) { pData=(unsigned short *)KBus1.KBusChnStats +nWordAddr; DataLen=0;} @@ -281,8 +294,10 @@ else if (nDataType == KLCoilTypeR) { rData[0] = ((KMem.WR[nBitAddr>>4]&(1<<(nBitAddr&0x0f)))>0);} else if (nDataType == KLCoilTypeLX) { rData[0] = ((KMem.WLX[nBitAddr>>4]&(1<<(nBitAddr&0x0f)))>0);} else if (nDataType == KLCoilTypeLY) { rData[0] = ((KMem.WLY[nBitAddr>>4]&(1<<(nBitAddr&0x0f)))>0);} - else if (nDataType == KLCoilTypeT) { rData[0] = KMem.Timers[nBitAddr].bTon;} - else if (nDataType == KLCoilTypeC) { rData[0] = KMem.Timers[nBitAddr].bTon;} +#if (ENABLE_PLC) + else if (nDataType == KLCoilTypeT) { rData[0] = PLCMem.Timers[nBitAddr].bTon;} + else if (nDataType == KLCoilTypeC) { rData[0] = PLCMem.Timers[nBitAddr].bTon;} +#endif else if (nDataType == KLCoilTypeSR) {rData[0] = ((KMem.WSR[nBitAddr>>4]&(1<<(nBitAddr&0x0f)))>0);} else if (nDataType == KLCoilTypeLR) { rData[0] = 0;} @@ -297,9 +312,10 @@ else if (nDataType == KLCoilTypeR) { SetBitValue( &KMem.WR[nBitAddr>>4],nBitAddr&0x0f,p1->Params[2]);} else if (nDataType == KLCoilTypeLX) {SetBitValue( &KMem.WLX[nBitAddr>>4],nBitAddr&0x0f,p1->Params[2]);} else if (nDataType == KLCoilTypeLY) {SetBitValue( &KMem.WLY[nBitAddr>>4],nBitAddr&0x0f,p1->Params[2]);} - else if (nDataType == KLCoilTypeT) { KMem.Timers[nBitAddr].bTon = p1->Params[2];} - else if (nDataType == KLCoilTypeC) { KMem.Timers[nBitAddr].bTon = p1->Params[2];} - else if (nDataType == KLCoilTypeC) { KMem.Timers[nBitAddr].bTon = p1->Params[2];} +#if (ENABLE_PLC) + else if (nDataType == KLCoilTypeT) { PLCMem.Timers[nBitAddr].bTon = p1->Params[2];} + else if (nDataType == KLCoilTypeC) { PLCMem.Timers[nBitAddr].bTon = p1->Params[2];} +#endif else if (nDataType == KLCoilTypeLR) { SetBitValue( &KMem.WSR[nBitAddr>>4],nBitAddr&0x0f,p1->Params[2]);;} else {rData[0]=0;} DataLen=0; @@ -309,6 +325,12 @@ case KLCmdReadBits: break; case KLCmdWriteBits: + break; +#if (ENABLE_PLC) + case KLCmdGetMode: + rData[0]= PLCMem.bPLCRunning; + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,1,rData); + SendPacket(nChn, p2, PacketLen); break; case KLCmdChgMode: if (nDataType ==0) {StopPLC();} @@ -320,56 +342,75 @@ nWordAddr=p1->Params[0]+ (p1->Params[1]<<8); DataLen= p1->Params[2]; if (nDataType==0){ - pData = (unsigned short *)STORE_PRG_BASE + nWordAddr; + pData = (unsigned short *)(&((stStoredBinProgs *)STORE_PRG_BASE)->BinInstrcns) + nWordAddr; } else if (nDataType==1){ - pData = (unsigned short *)ALT_PRG_BASE + nWordAddr; + pData = (unsigned short *)(&((stStoredBinProgs *)ALT_PRG_BASE)->BinInstrcns) + nWordAddr; } else if (KMRunStat.nBinProgBank == 0) { - pData = (unsigned short *)STORE_PRG_BASE + nWordAddr; + pData = (unsigned short *)(&((stStoredBinProgs *)STORE_PRG_BASE)->BinInstrcns) + nWordAddr; }else { - pData = (unsigned short *)ALT_PRG_BASE + nWordAddr; + pData = (unsigned short *)(&((stStoredBinProgs *)ALT_PRG_BASE)->BinInstrcns) + nWordAddr; } PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData); SendPacket(nChn, p2, PacketLen); break; case KLCmdStartPLCProgram: - DataLen=nDataType; -// KLBufferIn[0]=p1->Params[0]; -// p1->Params[0]=KLBufferOut[0]; - if (PLCMem.bPLCRunning) PLCMem.bPLCRunning=0; - + DataLen=p1->Params[0] + (p1->Params[1] <<8); //Program Size + nValue = p1->Params[2] + (p1->Params[3] <<8); // CRC + //if (PLCMem.bPLCRunning) StopPLC(); + StartPLCProgram(nDataType, DataLen, nValue); PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdStartPLCProgram,0,0); SendPacket(nChn, p2, PacketLen); - + break; case KLCmdWritePLCProgram: if (PLCMem.bPLCRunning) PLCMem.bPLCRunning=0; nWordAddr=p1->Params[0]+ (p1->Params[1]<<8); DataLen= p1->Params[2]; - - //DataLen=16; - for (int i=0;i<DataLen;i++) - {KLPacketBuf2[i]=p1->Params[4+i];} - WriteProgram(nWordAddr, KLPacketBuf2, DataLen,nDataType); + WritePLCProgram(nDataType, nWordAddr, &p1->Params[4], DataLen); DataLen=4; - *((int *)(&rData[0]))=(long)(p1->Params+4); +// *((int *)(&rData[0]))=(long)(p1->Params+4); PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdWritePLCProgram,0,0); SendPacket(nChn, p2, PacketLen); break; case KLCmdFinishPLCProgram: - nWordAddr=p1->Params[0]+ (p1->Params[1]<<8); //Program Size; - DataLen=nDataType; - KMRunStat.nBinProgSize=nWordAddr; - if (KMRunStat.nBinProgBank ==0) {KMRunStat.nBinProgBank=1;} - else {KMRunStat.nBinProgBank=0;} - SaveRunStat(&KMRunStat); - //PLCMem.bPLCRunning=1; -// KLBufferIn[0]=p1->Params[0]; -// p1->Params[0]=KLBufferOut[0]; + DataLen=p1->Params[0]+ (p1->Params[1]<<8); //Program Size; + nValue = p1->Params[2] + (p1->Params[3] <<8); //CRC + FinishiPLCProgram(nDataType, DataLen, nValue); PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdFinishPLCProgram,0,0); SendPacket(nChn, p2, PacketLen); break; - + case KLCmdReadPLCAnno: + nByteAddr=p1->Params[0]+ (p1->Params[1]<<8); + DataLen= p1->Params[2]; + pData = ((stStoredAnno *)STORE_PLC_ANNO_BASE)->Annos + nByteAddr; + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData); + SendPacket(nChn, p2, PacketLen); + break; + case KLCmdStartPLCAnno: + nWordAddr=p1->Params[0]+ (p1->Params[1]<<8); + DataLen= p1->Params[2]; + StartPLCAnno(nDataType, DataLen, nValue); + DataLen=4; +// *((int *)(&rData[0]))=(long)(p1->Params+4); + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdStartPLCAnno,0,0); + SendPacket(nChn, p2, PacketLen); + break; + case KLCmdWritePLCAnno: + nByteAddr=p1->Params[0]+ (p1->Params[1]<<8); ; + DataLen = p1->Params[2]; //CRC + WritePLCAnno(nDataType, nByteAddr, &p1->Params[4], DataLen); + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdWritePLCAnno,0,0); + SendPacket(nChn, p2, PacketLen); + break; + case KLCmdFinishPLCAnno: + DataLen=p1->Params[0]+ (p1->Params[1]<<8); //Program Size; + nValue = p1->Params[2] + (p1->Params[3] <<8); //CRC + FinishiPLCAnno(nDataType, DataLen, nValue); + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdFinishPLCAnno,0,0); + SendPacket(nChn, p2, PacketLen); + break; +#endif // ENABLE_PLC case KLCmdBlinkLED: DataLen=nDataType; KMRunStat.bLEDFlick=DataLen; @@ -453,14 +494,17 @@ PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdClearEventLog,0,0); SendPacket(nChn, p2, PacketLen); - __set_PRIMASK(1); //关闭全局中断 - NVIC_SystemReset(); + KMRunService(ReqReset,0,0,0,0); break; case KLCmdWriteFirmware: nByteAddr=p1->Params[0]+ (p1->Params[1]<<8); //pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr; DataLen = p1->Params[2]; - res = WriteNewApp(nByteAddr,p1->Params+4,DataLen); + pData = p1->Params + 4 ; + res = KMRunService(ReqUpdateFirm,nByteAddr,0,&pData,&DataLen); + +// res = WriteNewApp(nByteAddr,p1->Params+4,DataLen); +// res = 0; if (res) { PacketLen=KLMakeRplyPacket(p2,nKLStationId,nKLStatus.StatByte,KLCmdErrRply,res,rData); }else { @@ -468,14 +512,66 @@ } SendPacket(nChn, p2, PacketLen); + break; case KLCmdWriteFirmInfo: nByteAddr=p1->Params[0]+ (p1->Params[1]<<8); //pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr; DataLen = p1->Params[2]; + pData = p1->Params + 4 ; + res = KMRunService(ReqUpdateFirmInfo,nByteAddr,0,&pData,&DataLen); PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,0,0); SendPacket(nChn, p2, PacketLen); - WriteNewAppInfo(nByteAddr,p1->Params+4,DataLen); +// WriteNewAppInfo(nByteAddr,p1->Params+4,DataLen); + break; + case KLCmdGetPortInfo: + + nByteAddr=p1->Params[0] + (p1->Params[1]<<8); + //pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr; + pData = KMem.pPorts[nDataType]; + DataLen = sizeof(stPortDef); + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData); + SendPacket(nChn, p2, PacketLen); + break; + case KLCmdGetPortChnInfo: + + nByteAddr=p1->Params[0] + (p1->Params[1]<<8); + // nDataType --> port + // nByteAddr --> ChildId + //pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr; + KMPortReqFunc(nDataType,ReqPortChnInfo,nByteAddr,0,&pData,&DataLen); + + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData); + SendPacket(nChn, p2, PacketLen); + break; + + case KLCmdGetPortChildInfo: + nByteAddr=p1->Params[0] + (p1->Params[1]<<8); + // nDataType --> port + // nByteAddr --> ChildId + //pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr; + KMPortReqFunc(nDataType,ReqPortChildInfo,nByteAddr,0,&pData,&DataLen); + + //DataLen = sizeof(stPortDef); + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData); + SendPacket(nChn, p2, PacketLen); + break; + + case KLCmdPortRemoteReq: // 远程服务请求 + //p1->nType1 -> ReqId; + //p1->Params[0] -> Port; + //p1->Params[1] -> Child; + //p1->params[2] -> Param; + //p1->params[3] -> nAddr % 256; + //p1->params[4] -> nAddr / 256; + //p1->params[5] -> nCount; + pData = &p1->Params[3]; + DataLen = p1->Params[5]+3; + + KMPortReqFunc(p1->Params[0],nDataType,p1->Params[1],p1->Params[2],&pData,&DataLen); + DataLen=0; + PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData); + SendPacket(nChn, p2, PacketLen); break; default: //DataLen=1; -- Gitblit v1.9.1