📄 slaveedmi.c
字号:
{
if(LCId >= 0x9010 && LCId<=0xb02f)
{
offset=mBinarySearch(LCId&(~0x0400), (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);
}
else
{
offset=mBinarySearch(LCId, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);
}
if(offset>=0)
{
RegAddr = EdmiIdTable[offset].IdAddr;
if((LCId >= 0x9010 && LCId<=0xb02f) && (LCId&0x0400)!=0) //monthly id
{
RegAddr = (RegAddr&(~0x0020L));
}
RegNum = 1;
len=ReadEDMIData(RegAddr, mpProperty, buff);
if(len<=0)
{
return E_NO_SUCH_DATA;
}
c = ByteOrder_l(*(INT32U *)buff);
a = *(float *)&c;
// a=fabs(a);
if(a < 0)
{
a = a*(-1);
}
a/=10;
c=(INT32U )a;
if(a-c>0.5)
c++;
mLongToBcd(c, pBuff+datalen, 4);
datalen += 4;
}
LCId ++;
}
*psize = datalen;
return SUCCESS;
}
}
int EdmiReadDemand(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff,INT16U bufsize, INT16U *psize)
{
int offset;
int i;
INT16U startid;
INT8U buff[100];
INT16U size;
int idsize;
int datalen;
*psize=0;
offset=mBinarySearch(LCId, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);
if(offset<0)
offset=mBinarySearch(LCId-0x0400, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);
if(offset>=0)
{
if((LCId&0x000f)!=0x0f)
{
return EdmiReadDemandOneIdData(mpProperty, LCId, pBuff, psize);
}
else
{
startid = LCId&0xfff0;
datalen = 0;
for(i = 0; i < 5; i++)
{
//idsize = LCGetIDDataSize(startid);
if(EdmiReadDemandOneIdData(mpProperty, startid, buff, &size) == SUCCESS)
{
memcpy(pBuff + datalen, buff, idsize);
}
else
{
memset(pBuff + datalen, 0xff, idsize);
}
datalen += idsize;
startid ++;
}
*psize = datalen;
}
return SUCCESS;
}
else
{
return E_NO_SUCH_DATA;
}
}
int EdmiReadInstantaneousData(MpComProperty *mpProperty,INT16U LCId, INT8U *pBuff, INT16U *pLength)
{
int i;
int idnum;
INT16U size;
INT16U startid;
INT16U idsize;
int datalen;
INT8U buff[100];
if((LCId & 0x000f) != 0x000f)
{
return EdmiReadInstantaneousOneIdData(mpProperty, LCId, pBuff, pLength);
}
else
{
switch(LCId)
{
case 0xb61f:
idnum = 3;
startid = 0xb611 ;
idsize = 2;
break;
case 0xb62f:
idnum = 3;
startid = 0xb621;
idsize = 2;
break;
case 0xb63f:
idnum = 4;
startid = 0xb630;
idsize = 3;
break;
case 0xb64f:
idnum = 4;
startid = 0xb640;
idsize = 2;
break;
case 0xb65f:
idnum = 1;
startid = 0xb650;
idsize = 2;
memset(pBuff + 2, 0xff, 6);
break;
default:
return E_NO_SUCH_DATA;
}
*pLength = 0;
datalen = 0;
for(i = 0; i < idnum; i++)
{
size = 0;
if(EdmiReadInstantaneousOneIdData(mpProperty, startid, buff, &size) == SUCCESS)
{
memcpy(pBuff + datalen, buff, idsize);
}
else
{
memset(pBuff + datalen, 0xff, idsize);
}
datalen += idsize;
startid ++;
}
*pLength = datalen;
}
return SUCCESS;
}
int IsEdmiReadId( INT16U LCId)
{
if((LCId>=0x9010&&LCId<=0x916f)||(LCId>=0xa010&&LCId<=0xb02f)||(LCId>=0xb611&&LCId<=0xb650))
return TRUE;
else
return FALSE;;
}
int IsEdmiWriteId( INT16U LCId)
{
if(LCId==0x1830||LCId==0x1840||(LCId>=0x1854&&LCId<=0x185a)||(LCId>=0x1860&&LCId<=0x1868)||(LCId>=0x18c0&&LCId<=0x18c8)||(LCId>=0x18cc&&LCId<=0x18d4))
return TRUE;
else if((LCId>=0x4009&&LCId<=0x400d)||LCId==0x400f) //?? //
return TRUE;
else
return FALSE;
}
int SlaveEdmiReadData(MpComProperty *mpProperty, INT16U dataId, INT8U *pbuf, INT16U bufsize, INT16U *psize)
{
*psize = 0;
int nRet = -1;
printf("EDMI Get DataID is %x\n",dataId);
if((dataId>=0x9010&&dataId<=0x916f)||(dataId>=0x9410&&dataId<=0x956f))
nRet = EdmiReadEnergy(mpProperty, dataId,pbuf, bufsize,psize);
else if((dataId>=0xa010&&dataId<=0xb02f)||(dataId>=0xa410&&dataId<=0xb42f))
nRet = EdmiReadDemand(mpProperty,dataId,pbuf, bufsize,psize);
else if(dataId>=0xb611&&dataId<=0xb650)
nRet = EdmiReadInstantaneousData(mpProperty,dataId,pbuf,psize);
else if(dataId == 0xc010 || dataId == 0xc011)
nRet = ReadEdmiMeterDateTime(mpProperty,dataId, pbuf, psize);
else
{
nRet = 4;
memset(pbuf,0,nRet);
}
return nRet;
}
int IsSlaveEdmiId(INT16U id)
{
int a;
a = mBinarySearch(id, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);
if(a>=0)
return TRUE;
else
return FALSE;
}
int EdmiReadDemandOneIdData(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff, INT16U *pLength)
{
int offset;
INT32U RegAddr;
INT8U RegNum;
int len;
float a;
INT32U c;
INT8U buff[180];
*pLength=0;
offset=mBinarySearch(LCId, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);
if(offset<0)
offset=mBinarySearch(LCId-0x0400, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);
if(offset>=0)
{
RegAddr = EdmiIdTable[offset].IdAddr;
if((LCId&0x0f00)>=0x0400) //monthly id
{
RegAddr = (RegAddr&0xff0f)|0x0020;
}
if((LCId&0x000f) != 0x0f)
{
RegNum = 1;
len = ReadEDMIData(RegAddr, mpProperty, buff);
if(len<=0)
return E_NO_SUCH_DATA;
}
else
{
return E_NO_SUCH_DATA;
}
if((LCId&0xf000)==0xa000)
{
{
//在下面加入需量数据转换的代码//
c=ByteOrder_l(*(INT32U *)buff);
a=*(float *)&c;
// a=fabs(a);
if(a < 0)
{
a = a*(-1);
}
a *= 10;
c=(INT32U )a;
if(a-c>0.5)
c++;
mLongToBcd(c, pBuff, 3);
*pLength = 3;
}
}
else if((LCId&0xf000)==0xb000)
{
{
//在下面加入需量时间数据转换的代码//
pBuff[0] = mByte2Bcd(buff[4]); //minute
pBuff[1] = mByte2Bcd(buff[3]); //hour
pBuff[2] = mByte2Bcd(buff[0]); //day
pBuff[3] = mByte2Bcd(buff[1]); //month
}
*pLength = 4;
}
return SUCCESS;
}
else
{
return E_NO_SUCH_DATA;
}
}
int EdmiReadInstantaneousOneIdData(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff, INT16U *pLength)
{
int offset;
INT32U RegAddr;
INT8U RegNum;
int len;
float a;
INT32U c;
INT8U buff[200];
*pLength=0;
offset=mBinarySearch(LCId, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);
if(offset>=0)
{
RegAddr = EdmiIdTable[offset].IdAddr;
RegNum = 1;
len = ReadEDMIData(RegAddr,mpProperty, buff);
if(len<=0)
return E_NO_SUCH_DATA;
}
else
{
return E_NO_SUCH_DATA;
}
switch(LCId)
{
case 0xb611:
case 0xb612:
case 0xb613:
c=ByteOrder_l(*(INT32U *)(buff));
a=*(float *)&c;
// a=fabs(a);
if(a < 0)
{
a = a*(-1);
}
c=(INT32U )a;
if(a-c>0.5)
c++;
mLongToBcd(c, pBuff, 2);
*pLength = 2;
break;
case 0xb621: //L10.21
case 0xb622:
case 0xb623:
c=ByteOrder_l(*(INT32U *)(buff));
a=*(float *)&c;
// a=fabs(a);
if(a < 0)
{
a = a*(-1);
}
a*=100; //L10.25
c=(INT32U )a;
if(a-c>0.5)
c++;
mLongToBcd(c, pBuff, 2);
*pLength = 2;
break;
case 0xb630: //active power total //L10.21
case 0xb631: //active powerA
case 0xb632: //active powerB
case 0xb633: //active powerC
c=ByteOrder_l(*(INT32U *)(buff));
a=*(float *)&c;
// a=fabs(a);
if(a < 0)
{
a = a*(-1);
}
a*=10;
c=(INT32U )a;
if(a-c>0.5)
c++;
mLongToBcd(c, pBuff, 3);
*pLength = 3;
break;
case 0xb640: //reactive power total //L10.21
case 0xb641: //reactive powerA
case 0xb642: //reactive powerB
case 0xb643: //reactive powerC
c=ByteOrder_l(*(INT32U *)(buff)); //L10.25
a=*(float *)&c;
// a=fabs(a);
if(a < 0)
{
a = a*(-1);
}
a/=10;
c=(INT32U )a;
if(a-c>0.5)
c++;
mLongToBcd(c, pBuff, 2);
*pLength = 2;
break;
case 0xb650: //power factor
{
c=ByteOrder_l(*(INT32U *)(buff));
a=*(float *)&c;
// a=fabs(a);
if(a < 0)
{
a = a*(-1);
}
a*=1000;
c=(INT32U )a;
if(a-c>0.5)
c++;
mLongToBcd(c, pBuff, 2);
*pLength = 2;
}
break;
default:
break;
}
return SUCCESS;
}
int ReadEdmiMeterDateTime(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff, INT16U *pLength)
{
INT32U RegAddr;
INT8U buff[200];
*pLength = 0;
RegAddr=0xf03d;
if(ReadEDMIData(RegAddr,mpProperty, buff)>0)
{
if(LCId == 0xc010 )
{
pBuff[3] = buff[2];
pBuff[2] = buff[1];
pBuff[1] = buff[0];
pBuff[0] = mGetWeek(mBcd2Byte(buff[2]), mBcd2Byte(buff[1]), mBcd2Byte(buff[0]));
*pLength = 4;
return SUCCESS;
}
else if(LCId == 0xc011)
{
pBuff[0] = buff[5];
pBuff[1] = buff[4];
pBuff[2] = buff[3];
*pLength = 3;
return SUCCESS;
}
else
return E_NO_SUCH_DATA;
}
else
return E_NO_SUCH_DATA;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -