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