📄 slavesimens.c
字号:
INT8U buff[20]; char SearchStr[10]; int SearchStrLen; *(pRcvData+len)='\0'; //正向有功总电能// GetZMDEnergy(pRcvData, (INT8U *)"\n20(", (INT8U *)(pSiemensData->E)); //上月正向有功总电能// GetZMDEnergy(pRcvData, (INT8U *)"\n20*", (INT8U *)(pSiemensData->LastMonthE)); //正向有功费率电能// GetZMDEnergy(pRcvData, (INT8U *)"\n8.1(", (INT8U *)(pSiemensData->RateE.FengE)); GetZMDEnergy(pRcvData, (INT8U *)"\n8.2(", (INT8U *)(pSiemensData->RateE.PingE)); GetZMDEnergy(pRcvData, (INT8U *)"\n8.3(", (INT8U *)(pSiemensData->RateE.GuE)); //上月正向有功费率电能// GetZMDEnergy(pRcvData, (INT8U *)"\n8.1*", (INT8U *)(pSiemensData->LastMonthRateE.FengE)); GetZMDEnergy(pRcvData, (INT8U *)"\n8.2*", (INT8U *)(pSiemensData->LastMonthRateE.PingE)); GetZMDEnergy(pRcvData, (INT8U *)"\n8.3*", (INT8U *)(pSiemensData->LastMonthRateE.GuE)); //正向无功总电能// GetZMDEnergy(pRcvData, (INT8U *)"\n22(", (INT8U *)(pSiemensData->NoE)); //上月正向无功总电能// GetZMDEnergy(pRcvData, (INT8U *)"\n22*", (INT8U *)(pSiemensData->LastMonthNoE)); //正向无功费率电能// GetZMDEnergy(pRcvData, (INT8U *)"\n9.1(", (INT8U *)(pSiemensData->RateNoE.FengE)); GetZMDEnergy(pRcvData, (INT8U *)"\n9.2(", (INT8U *)(pSiemensData->RateNoE.PingE)); GetZMDEnergy(pRcvData, (INT8U *)"\n9.3(", (INT8U *)(pSiemensData->RateNoE.GuE)); //上月正向无功费率电能// GetZMDEnergy(pRcvData, (INT8U *)"\n9.1*", (INT8U *)(pSiemensData->LastMonthRateNoE.FengE)); GetZMDEnergy(pRcvData, (INT8U *)"\n9.2*", (INT8U *)(pSiemensData->LastMonthRateNoE.PingE)); GetZMDEnergy(pRcvData, (INT8U *)"\n9.3*", (INT8U *)(pSiemensData->LastMonthRateNoE.GuE)); //------------------------------------------------------------ // 2005.4.9 add //反向有功峰电能// GetZMDEnergy(pRcvData, (INT8U *)"\n38.1(", (INT8U *)(pSiemensData->RateNE.FengE)); //反向有功平电能// GetZMDEnergy(pRcvData, (INT8U *)"\n38.2(", (INT8U *)(pSiemensData->RateNE.PingE)); //反向有功谷电能// GetZMDEnergy(pRcvData, (INT8U *)"\n38.3(", (INT8U *)(pSiemensData->RateNE.GuE)); //反向有功总电能// GetZMDEnergy(pRcvData, (INT8U *)"\n21(", (INT8U *)(pSiemensData->NE)); //------------------------------------------------------------ //反向无功总电能// GetZMDEnergy(pRcvData, (INT8U *)"23(", (INT8U *)(pSiemensData->NNoE)); //上月反向无功总电能// GetZMDEnergy(pRcvData, (INT8U *)"\n23*", (INT8U *)(pSiemensData->LastMonthNNoE)); if(SearchSiemens(pRcvData, (INT8U *)"\n10*")==TRUE) { //上月正向有功总需量 GetMaxRqu(pRcvData, (INT8U *)"\n10*", (INT8U *)(pSiemensData->LastMonthMaxRqu), (INT8U *)(pSiemensData->LastMonthMaxRquT)); } if(SearchSiemens(pRcvData, (INT8U *)"\n6.0(")==TRUE) { //正向有功总需量 GetMaxRqu(pRcvData, (INT8U *)"\n6.0(", (INT8U *)(pSiemensData->MaxRqu), (INT8U *)(pSiemensData->MaxRquT)); //上月正向有功总需量 GetMaxRqu(pRcvData, (INT8U *)"\n6.0*", (INT8U *)(pSiemensData->LastMonthMaxRqu), (INT8U *)(pSiemensData->LastMonthMaxRquT)); } else if(SearchSiemens(pRcvData, (INT8U *)"\n6(")==TRUE) { //正向有功总需量 GetMaxRqu(pRcvData, (INT8U *)"\n6(", (INT8U *)(pSiemensData->MaxRqu), (INT8U *)(pSiemensData->MaxRquT)); //上月正向有功总需量 GetMaxRqu(pRcvData, (INT8U *)"\n6*", (INT8U *)(pSiemensData->LastMonthMaxRqu), (INT8U *)(pSiemensData->LastMonthMaxRquT)); } //正向有功费率需量// GetMaxRqu(pRcvData, (INT8U *)"6.1(", (INT8U *)(pSiemensData->RateMaxRqu.feng), (INT8U *)(pSiemensData->RateMaxRquT.feng)); GetMaxRqu(pRcvData, (INT8U *)"6.2(", (INT8U *)(pSiemensData->RateMaxRqu.ping), (INT8U *)(pSiemensData->RateMaxRquT.ping)); GetMaxRqu(pRcvData, (INT8U *)"6.3(", (INT8U *)(pSiemensData->RateMaxRqu.gu), (INT8U *)(pSiemensData->RateMaxRquT.gu)); //上月正向有功费率需量// GetMaxRqu(pRcvData, (INT8U *)"\n6.1*", (INT8U *)(pSiemensData->LastMonthRateMaxRqu.feng), (INT8U *)(pSiemensData->LastMonthRateMaxRquT.feng)); GetMaxRqu(pRcvData, (INT8U *)"\n6.2*", (INT8U *)(pSiemensData->LastMonthRateMaxRqu.ping), (INT8U *)(pSiemensData->LastMonthRateMaxRquT.ping)); GetMaxRqu(pRcvData, (INT8U *)"\n6.3*", (INT8U *)(pSiemensData->LastMonthRateMaxRqu.gu), (INT8U *)(pSiemensData->LastMonthRateMaxRquT.gu)); //实时电压// if(SearchSiemens(pRcvData, (INT8U *)"\nL1(")==TRUE) { GetVoltage(pRcvData, (INT8U *)"\nL1(", (INT8U *)(pSiemensData->V.a)); GetVoltage(pRcvData, (INT8U *)"\nL2(", (INT8U *)(pSiemensData->V.b)); GetVoltage(pRcvData, (INT8U *)"\nL3(", (INT8U *)(pSiemensData->V.c)); } else { GetVoltage(pRcvData, (INT8U *)"\nL.1(", (INT8U *)(pSiemensData->V.a)); GetVoltage(pRcvData, (INT8U *)"\nL.2(", (INT8U *)(pSiemensData->V.b)); GetVoltage(pRcvData, (INT8U *)"\nL.3(", (INT8U *)(pSiemensData->V.c)); } GetCurrent(pRcvData, (INT8U *)"\nA(", (INT8U *)(pSiemensData->I.a)); GetCurrent(pRcvData, (INT8U *)"\nB(", (INT8U *)(pSiemensData->I.b)); GetCurrent(pRcvData, (INT8U *)"\nC(", (INT8U *)(pSiemensData->I.c)); GetVoltageDeg(pRcvData, (INT8U *)"\n31.1(", (INT8U *)(pSiemensData->Vdeg.a)); GetVoltageDeg(pRcvData, (INT8U *)"\n31.2(", (INT8U *)(pSiemensData->Vdeg.b)); GetVoltageDeg(pRcvData, (INT8U *)"\n31.3(", (INT8U *)(pSiemensData->Vdeg.c)); GetCurrentDeg(pRcvData,(INT8U *) "\n51.1(", (INT8U *)(pSiemensData->Ideg.a)); GetCurrentDeg(pRcvData, (INT8U *)"\n51.2(", (INT8U *)(pSiemensData->Ideg.b)); GetCurrentDeg(pRcvData, (INT8U *)"\n51.3(", (INT8U *)(pSiemensData->Ideg.c)); //时间// strcpy(SearchStr, "\n12("); ptr = (INT8U *)strstr((char *)pRcvData, SearchStr); SearchStrLen = strlen(SearchStr); if(ptr!= NULL) { ptr+=SearchStrLen; pSiemensData->Date[3]=((*ptr-'0')<<4)|(*(ptr+1)-'0'); buff[2]=(*ptr-'0')*10+(*(ptr+1)-'0'); ptr+=3; pSiemensData->Date[2]=((*ptr-'0')<<4)|(*(ptr+1)-'0'); buff[1]=(*ptr-'0')*10+(*(ptr+1)-'0'); ptr+=3; pSiemensData->Date[1]=((*ptr-'0')<<4)|(*(ptr+1)-'0'); buff[0]=(*ptr-'0')*10+(*(ptr+1)-'0'); pSiemensData->Date[0]= mGetWeek(buff[2],buff[1],buff[0]); } else { memset((INT8U *)(pSiemensData->Date), 0xff, 4); } strcpy(SearchStr, "\n11("); ptr = (INT8U *)strstr((char *)pRcvData, SearchStr); SearchStrLen=strlen(SearchStr); if(ptr!= NULL) { ptr+=SearchStrLen; pSiemensData->Time[2]=((*ptr-'0')<<4)|(*(ptr+1)-'0'); ptr+=3; pSiemensData->Time[1]=((*ptr-'0')<<4)|(*(ptr+1)-'0'); ptr+=3; pSiemensData->Time[0]=((*ptr-'0')<<4)|(*(ptr+1)-'0'); } else { memset((INT8U *)(pSiemensData->Time), 0xff, 3); }}int SiemensAddressConvert(MeterAddrType *pMeterAddr,INT8U *pAddress){ INT8U i; INT8U *ptr; INT8U a,b; int addrlen; ptr = (INT8U *)pMeterAddr; addrlen = 0; for(i=0; i<6; i++) { a = ptr[5-i]; b = a>>4; if(!(b == 0 && addrlen == 0)) { if(b<=9) *(pAddress+(addrlen++)) = b+'0'; else return 0; } b = a&0x0f; if(!(b == 0 && addrlen == 0)) { if(b<=9) *(pAddress+(addrlen++)) = b+'0'; else return 0; } } return addrlen;}BOOL IsSiemensDataValid(INT8U *pMeterModleInfo, INT8U *pRcvData, int len){#if SLAVE_DEBUG_EN > 0 printf("IsSiemensDataValid \n");#endif if(memcmp(pMeterModleInfo, (INT8U *)"ZFB", strlen("ZFB"))==0) { return IsSiemensEnergyDataValid(pRcvData, (INT8U *)"20("); } else if(memcmp(pMeterModleInfo, (INT8U *)"ZMB", strlen("ZMB"))==0) { return IsSiemensEnergyDataValid(pRcvData, (INT8U *)"20("); } else if(memcmp(pMeterModleInfo, (INT8U *)"\\2ZMD", strlen("\\2ZMD"))==0 ||memcmp(pMeterModleInfo, (INT8U *)"ZMD", strlen("ZMD"))==0) { return IsSiemensEnergyDataValid(pRcvData, (INT8U *)"\n20("); } else if(memcmp(pMeterModleInfo, (INT8U *)"\\2ZFD", strlen("\\2ZMD"))==0 ||memcmp(pMeterModleInfo, (INT8U *)"ZMD", strlen("ZMD"))==0) { return IsSiemensEnergyDataValid(pRcvData, (INT8U *)"\n20("); } return FALSE;}void DealWithRcvData(INT8U *pMeterModleInfo, INT8U *pRcvData, int len, SiemensDataType *pSiemensData,INT8U *ll) { INT8U lstat;#if SLAVE_DEBUG_EN > 0 /* int i; printf("DealWithRcvData datalen=%d\n",len); pRcvData[len] = 0; for(i=0;i<len;i++) { printf("%c", pRcvData[i]); API_IO_WDI(); }*/#endif // mPrintfHex((int *)ll,2); lstat=*ll;// printf("lstat==");// mPrintfHex((INT8U *)ll,1); memset((INT8U *)pSiemensData, 0xff, sizeof(SiemensDataType)); strcpy((char *)(pSiemensData->MeterModelInfo), (char *)pMeterModleInfo); if(memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"ZFB", strlen("ZFB"))==0) { DealWithSiemensZFB410(pRcvData, len, pSiemensData,lstat); } else if(memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"ZMB", strlen("ZMB"))==0) { DealWithSiemensZFB410(pRcvData, len, pSiemensData,lstat); } else if(memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"\\2ZMD", strlen("\\2ZMD"))==0 ||memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"ZMD", strlen("ZMD"))==0) { DealWithSiemensZFD405(pRcvData, len, pSiemensData); } else if(memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"\\2ZFD", strlen("\\2ZMD"))==0 ||memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"ZMD", strlen("ZMD"))==0) { DealWithSiemensZFD405(pRcvData, len, pSiemensData); } }int SiemensReadDataFromMeter(MpComProperty *mpProperty, SiemensDataType *pSiemensData){ INT16U length; //INT8U lstat; INT8U SiemensAddr[12]; INT8U *ll; SiemensMeterInfoType SiemensMeterInfo; int addrlen; memset((INT8U *)pSiemensData, 0xff, sizeof(SiemensDataType)); MeterAddrType *pMeterAddr = (MeterAddrType*)mpProperty->addr; addrlen = SiemensAddressConvert(pMeterAddr, SiemensAddr);// if(addrlen <= 0)// {// return E_NO_SUCH_DATA;// } memset(gSiemensRxBuff, 0, SIEMENS_FRAME_SIZE); length=SiemensReadMeter( SiemensAddr, addrlen, &SiemensMeterInfo, gSiemensRxBuff, SIEMENS_FRAME_SIZE-1,(INT8U *)ll); if(length>0) { DealWithRcvData((INT8U *)(SiemensMeterInfo.model), gSiemensRxBuff, length, pSiemensData,(INT8U *)ll); return SUCCESS; } return E_NO_SUCH_DATA;}int SlaveSiemensGetDataFromBuff(MpComProperty *mpProperty, INT16U dataId, INT8U *pbuf, INT16U bufsize, INT16U *psize){ INT8U *ptr; int a; SiemensDataType *pSiemensData;#if SLAVE_DEBUG_EN > 0 printf("SlaveSiemensGetDataFromBuff\n");#endif *psize = 0; int mp = mpProperty->nMp; pSiemensData = (SiemensDataType *)&(gSlaveDataBuff[mp].data[0]); ptr = (INT8U *)&(pSiemensData->E[0]);#if SLAVE_DEBUG_EN > 0 printf("Slave Data Buff:\n"); mPrintfHex(ptr, sizeof(SiemensDataType));#endif a = mBinarySearch(dataId, (INT8U *)SiemensIdTable, sizeof(SiemensTableType), SIEMENS_ID_TABLE_SIZE); if(a < 0) { return E_NO_SUCH_DATA; } memcpy(pbuf, ptr + SiemensIdTable[a].offset, SiemensIdTable[a].itemsize); *psize = SiemensIdTable[a].itemsize;#if SLAVE_DEBUG_EN > 0 printf("Slave Data:\n"); mPrintfHex(pbuf, *psize);#endif return SUCCESS;}int SlaveSiemensReadData(MpComProperty *mpProperty, INT16U dataId, INT8U *pbuf, INT16U bufsize, INT16U *psize){ int readflag = 0; INT8U retvalue; int dtime; int timeout = 500; time_t curTime; time(&curTime); int mp = mpProperty->nMp; dtime = difftime(curTime,gSlaveDataBuff[mpProperty->nMp].accessTime); if(dtime < timeout) { readflag = 1; }readflag = 1; if(readflag == 1) { retvalue = SiemensReadDataFromMeter(mpProperty, (SiemensDataType *)&(gSlaveDataBuff[mp].data[0])); if(retvalue != SUCCESS) { return retvalue; } time(&curTime); memcpy((INT8U *)&(gSlaveDataBuff[mp].accessTime), (INT8U *)&curTime, sizeof(time_t)); return SlaveSiemensGetDataFromBuff(mpProperty, dataId, pbuf, bufsize, psize); } //time(&curTime);// memcpy((INT8U *)&(gSlaveDataBuff[mp].accessTime), (INT8U *)&curTime, sizeof(time_t)); retvalue = SlaveSiemensGetDataFromBuff(mpProperty, dataId, pbuf, bufsize, psize); return retvalue;}// DateTimeType dateTime;// DateTimeType bufDateTime; //int readflag = 0;// INT8U retvalue;// time_t startTime,curTime;//// time(&startTime);// time(&curTime);// int dtime;// //difftime 返回精确到秒//SiemensDataType *pSiemensData;// dtime = difftime(curTime,startTime);//// if(dtime >=0)// {// retvalue = SiemensReadDataFromMeter(mpProperty, &pSiemensData);// if(retvalue != SUCCESS)// {// return retvalue;// }// }// else// {// retvalue = SlaveSiemensGetDataFromBuff(mpProperty, dataId, pbuf, bufsize, psize); // }// return retvalue;//}BOOL IsSiemensReadId(INT16U id){ if((id>=0x9010&&id<=0x913f) ||(id>=0x9410&&id<=0x953f) ||(id>=0xa010&&id<=0xa13f) || (id>=0xa410&&id<=0xa53f) ||(id>=0xb010&&id<=0xb13f) ||(id>=0xb410&&id<=0xb53f) || (id>=0xb611&& id<=0xb62f) || (id>=0xb650&&id<=0xb65f)||(id ==0xc010&& id ==0xc011) || (id ==0xb210 || id == 0xb212 || id == 0xb214) || (id >=0xb660 && id<=0xb66f)) { return TRUE; } else { return FALSE; } }////BOOL IsSlaveSiemensId(INT16U id)//{// int a;//// a = BinarySearch(id, (INT8U *)SiemensIdTable, sizeof(SiemensTableType), SIEMENS_ID_TABLE_SIZE);// if(a>=0)// return TRUE;// else // return FALSE;//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -