📄 slaveedmi.c
字号:
for(i = 0; i < 5; i++) { 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 + -