📄 slaveactaris.c
字号:
INT8U PhyAddrhi, PhyAddrlow;
INT8U actarisBuff[MAX_ACTARIS_FRAME_SIZE];
PhyAddrhi = (PhysicalAddr&0xff00)>>8; //Physical Address high byte
PhyAddrlow = PhysicalAddr&0x00ff;
size = 0;
ptr = actarisBuff;
*(ptr++) = 0x7e;
*(ptr++) = 0xa0;
*(ptr++) = 0x0a;
*(ptr++) = 0x00;
*(ptr++) = 0x22;
size+=5;
*(ptr++) = PhyAddrhi;
*(ptr++) = PhyAddrlow;
size+=2;
*(ptr++) = 0x03;
*(ptr++) = 0xB1;
tryfcs16(&actarisBuff[1], 8);
ptr += 2;
*(ptr++) = 0x7e;
size += 5;
SendActarisFrame(port, actarisBuff, size);
if(ReceiveActarisFrame(fd,actarisBuff) == TRUE)
{
#if SLAVE_DEBUG_EN > 0
printf("Slaveactaris finished ok\n");
#endif
}
}
BOOL RequireActaris(INT16U PhysicalAddr)
{
INT8U port = SLAVE_PORT_1;
INT8U commande[80]={0x7e,0xA0,0x46,0x00,0x22,0x00,0x00,0x03,0x10,0x30,0x00,0xe6,0xe6,0x00,0x60,0x35,0xa1,0x09,
0x06,0x07,0x60,0x85,0x74,0x05,0x08,0x01,0x01,0x8a,0x02,0x07,0x80,0x8b,0x07,0x60,0x85,0x74,0x05,0x08,0x02,
0x01,0xac,0x0a,0x80,0x08,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0xbe,0x10,0x04,0x0e,0x01,0x00,0x00,0x00,0x06,
0x5f,0x04,0x00,0x00,0x00,0x14,0x00,0x00};
INT8U PhyAddrhi, PhyAddrlow;
INT8U actarisBuff[MAX_ACTARIS_FRAME_SIZE];
PhyAddrhi = (PhysicalAddr&0xff00)>>8; //Physical Address high byte
PhyAddrlow = PhysicalAddr&0x00ff;
commande[5]=PhyAddrhi;
commande[6]=PhyAddrlow;
tryfcs16(&commande[1],8);
tryfcs16(&commande[1],68);
commande[71]=0x7e;
SendActarisFrame(port,commande,72);
if(ReceiveActarisFrame(fd,actarisBuff)==TRUE)
{
#if SLAVE_DEBUG_EN > 0
printf("Slaveactaris reqapp ok \n");
#endif
return TRUE;
}
else
{
return FALSE;
}
}
INT32U actarisbytetolong(INT8U *bcd,INT8U size)
{
INT32U datalong;
INT8U *ptr;
INT8U i;
ptr = bcd;
datalong = 0;
for(i = 0; i < size; i++)
{
datalong *= 256;
datalong +=*ptr ;
ptr++;
}
return datalong;
}
INT16U actarisbyteto16U(INT8U *bcd,INT8U size)
{
INT16U datalong ;
INT8U *ptr;
int i;
ptr = bcd;
datalong = 0;
for(i = 0; i < size; i++)
{
datalong *= 256;
datalong +=*ptr ;
ptr++;
}
return datalong;
}
void DealWithActarisData(INT8U *pBuff, int len)
{
INT16U DataWord;
INT32U DataLong;
if(len == 4)
{
//mPrintfHex((INT8*)pBuf,4);
DataLong=actarisbytetolong(pBuff,4);
mLongToBcd(DataLong,pBuff,4);
}
else if (len == 2)
{
DataWord=actarisbyteto16U(pBuff,2);
//wordtobcdl(DataWord,pBuff);
}
}
void Adjustactrice(INT16U idnum,INT8U *sbuff,INT8U *dbuff,INT16U lend)
{ INT16U len,i,j,lgth;
INT8U datatype;
INT8U buff1[10];
INT8U buff2[10];
for(i=0;i<10;i++)
{buff1[i]=0;
buff2[i]=0;
}
len = ActarisOBISTab[idnum].datasize;
datatype = ActarisOBISTab[idnum].datatype;
if(len==lend&&datatype==0)
memcpy(dbuff, sbuff, lend);
else
{//printf("cccccccccccccccccccccccc");
for(i=0;i<len;i++)
{buff1[i<<1]=*(sbuff+i)&0x0f;
buff1[(i<<1)+1]=*(sbuff+i)>>4;
}
#if SLAVE_DEBUG_EN > 0
printf("Slave actaris dealData1:\n");
mPrintfHex(buff1,len*2);
#endif
if(datatype)
{ lgth=len*2-datatype;
memcpy(buff2,buff1+datatype,lgth);
//printf("ddddddddddddddddddddd");
}
else
{memcpy(buff2,buff1,len*2);
for(i=0;i<0x03ff;i++) i=i; //delay
// printf("eeeeeeeeeeeeeeeeeeeee");
}
#if SLAVE_DEBUG_EN > 0
printf("Slave actaris dealData2:\n");
mPrintfHex(buff2,len*2);
#endif
for(i=0;i<lend;i++)
{
*(dbuff+i)=buff2[2*i]+buff2[2*i+1]*0x10;
for(j=0;j<0x03ff;j++) j=j; //delay
#if SLAVE_DEBUG_EN > 0
printf("dbuff %d ,buff1%d , buff2 %d\n",*(dbuff+i),buff2[2*i],buff2[2*i+1]*0x10);
#endif
}
#if SLAVE_DEBUG_EN > 0
printf("lend===%d\n",lend);
printf("Slave actaris dealData3:\n");
mPrintfHex(dbuff,len);
#endif
}
}
INT8U ActarisReadOneDataIdFromMeter(INT16U dataId, INT8U *pBuff, INT16U *pLength, INT16U PhysicalAddr)
{
INT8U SendCommand[30] = {0x7e,0xa0,0x1b,0x00,0x22};
INT8U *ptr, i;
INT8U pBuff1[10];
int a;
int len;
INT16U iddatasize;
INT8U datatype = 0;
INT8U retvalue = SUCCESS;
INT8U port = SLAVE_PORT_1;
INT8U PhyAddrhi, PhyAddrlow;
INT8U actarisBuff[MAX_ACTARIS_FRAME_SIZE];
PhyAddrhi = (PhysicalAddr&0xff00)>>8; //Physical Address high byte
PhyAddrlow = PhysicalAddr&0x00ff;
//printf("phyaddrhi==%c,PhyAddrlow==%c\n", PhyAddrhi, PhyAddrlow);
ptr=&SendCommand[5];
for(i=0;i<3;i++)
{
if( LinkActaris(PhysicalAddr) == TRUE)
{
break;
}
}
if(i>=3) return FALSE;
if(RequireActaris(PhysicalAddr) == FALSE)
{
return FALSE;
}
*(ptr++)=PhyAddrhi;
*(ptr++)=PhyAddrlow;
*(ptr++)=0x03;
*(ptr++)=0x32;
tryfcs16(&SendCommand[1],8);
*pLength = 0;
//iddatasize = LCGetIDDataSize(dataId);
a = mBinarySearch(dataId, (unsigned char *)ActarisOBISTab, sizeof(ActarisOBISType), ACTARIS_OBIS_TAB_SIZE);
if(a < 0)
{
memset(pBuff, 0xff, iddatasize);
return SUCCESS;
}
len = ActarisOBISTab[a].datasize;
*pLength=len;
datatype = ActarisOBISTab[a].datatype;
memcpy(&SendCommand[11],COSEM_FIX_FORMAT,5);
SendCommand[16]=0x81;
memcpy(&SendCommand[17], (INT8U *)(ActarisOBISTab[a].classId), 2);
memcpy(&SendCommand[19], (INT8U *)(ActarisOBISTab[a].obis), 6);
SendCommand[25]=0x02;
tryfcs16(&SendCommand[1],25);
SendCommand[28]=0x7e;
SendActarisFrame(port,SendCommand,29);
memset(actarisBuff, 0, MAX_ACTARIS_FRAME_SIZE);
if(ReceiveActarisFrame(fd,actarisBuff) == TRUE)
{
#if SLAVE_DEBUG_EN > 0
printf("Slave actarisdataid:\n");
mPrintfHex((INT8U *)&dataId,2);
#endif
if(actarisBuff[19 + 2 + len] == 0x7e)
{
memset(pBuff1, 0, 10);
memcpy(pBuff1, &actarisBuff[19], len);
#if SLAVE_DEBUG_EN > 0
printf("Slave actaris Data:\n");
mPrintfHex(pBuff1, len);
#endif
DealWithActarisData(pBuff1, len);
#if SLAVE_DEBUG_EN > 0
printf("Slave actaris dealData:\n");
mPrintfHex(pBuff1, len);
#endif
Adjustactrice( a,pBuff1,pBuff,*pLength);
#if SLAVE_DEBUG_EN > 0
printf("Slave actaris Dataend:\n");
mPrintfHex(pBuff,len);
#endif
retvalue=SUCCESS;
}
}
return retvalue;
}
int ActarisReadDataFromMeter(INT16U dataId, INT8U *pBuff, INT16U *pLength, INT16U PhysicalAddr)
{
INT16U startId, idNum, idDataSize;
INT16U i;
INT16U size;
INT8U buff[10];
INT32U value;
INT8U retvalue;
*pLength = 0;
if((dataId & 0x000f) == 0x000f)
{
switch(dataId)
{
case 0x901f:
case 0x902f:
//case 0x911f:
//case 0x912f:
startId = dataId&0xfff0;
idNum = 5;
idDataSize = 4;
break;
case 0xa01f:
case 0xa02f:
//case 0xa11f:
//case 0xa12f:
startId = dataId&0xfff0;
idNum = 5;
idDataSize = 3;
break;
case 0xb61f:
case 0xb62f:
startId = dataId&0xfff1;
idNum = 3;
idDataSize = 2;
break;
case 0xb63f:
startId = 0xb630;
idNum = 4;
idDataSize = 3;
break;
case 0xb64f:
case 0xb65f:
idDataSize = 2;
idNum = 4;
startId = dataId&0xfff0;
break;
case 0xb66f:
startId = 0xb660;
idNum = 6;
idDataSize = 2;
break;
default:
return SUCCESS;
}
*pLength = 0;
for(i = 0; i < idNum; i++)
{
if(ActarisReadOneDataIdFromMeter(startId, pBuff + *pLength, &size, PhysicalAddr) != SUCCESS)
{
memset(pBuff + *pLength, 0xff, idDataSize);
}
startId ++;
*pLength += idDataSize;
}
}
else if(dataId == 0xb640)
{
idDataSize = 2;
*pLength = 0;
startId = 0xb64a;
value = 0;
for(i = 0; i < 2; i++)
{
retvalue = ActarisReadOneDataIdFromMeter(startId, buff, &size, PhysicalAddr);
if(retvalue != SUCCESS)
{
return retvalue;
}
startId ++;
value += mBcdToLong(buff, idDataSize);
}
mLongToBcd(value, pBuff, idDataSize);
*pLength = idDataSize;
}
else
{
retvalue = ActarisReadOneDataIdFromMeter(dataId, pBuff, pLength, PhysicalAddr);
if(retvalue != SUCCESS)
{
return retvalue;
}
}
return SUCCESS;
}
int SlaveActarisReadData(MpComProperty *mpProperty, INT16U id, INT8U *pbuf, INT16U bufsize, INT16U *psize)
{
INT16U Addr;
INT16U PhysicalAddr;
memcpy((INT8U *)&Addr, (INT8U *)mpProperty->addr, 2);//physical Address
Addr = mBcdToWord(Addr);
PhysicalAddr = ActarisPhysicalAddress(Addr);
*psize = 0;
return ActarisReadDataFromMeter(id, pbuf, psize, PhysicalAddr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -