📄 slavesimens.c
字号:
{ 0xb613, tf6+14, 2},
{ 0xb61f, tf6+10, 6}, ///175
{ 0xb621, tf6+16, 2},
{ 0xb622, tf6+18, 2},
{ 0xb623, tf6+20, 2},
{ 0xb62f, tf6+16, 6},
{ 0xb650, tf6+22, 2}, ////180,
{ 0xb651, tf6+24, 2},
{ 0xb652, tf6+26, 2},
{ 0xb653, tf6+28, 2},
{ 0xb65f, tf6+22, 8},
{ 0xb660, tf6+30, 2},
{ 0xb661, tf6+32, 2},
{ 0xb662, tf6+34, 2},
{ 0xb663, tf6+36, 2},
{ 0xb664, tf6+38, 2},
{ 0xb665, tf6+40, 2}, // 190
{ 0xb66f, tf6+30, 12},
{ 0xc010, tf6+42, 4 },
{ 0xc011, tf6+46, 3 } ///194
};
#define SIEMENS_ID_TABLE_SIZE (sizeof(SiemensIdTable)/sizeof(SiemensTableType))
INT32U gSiemensBaud = 300;
int fd;
int InitSimensCom(INT8U uart,int nSpeed,int nDataBits,char Parity,int nStopBit)
{
fd = OpenCom(uart);
if(fd > 0)
{
SetComOpt(fd,nSpeed,nDataBits,Parity,nStopBit);
return fd;
}
else
{
printf("Open Com Error\n");
return E_COM_OTHER;
}
}
int ReceiveSiemensFrame(int fd, INT8U *pbuf, INT16U bufsize)
{
int nGetBytes;
INT32U timeout;
INT16U nPosition = 0;
INT16U size = 50;
timeout = 500;
int itimes = 0;
while(1)
{
nGetBytes = SlaveRecvFrame(fd,&pbuf[nPosition],bufsize,&size,timeout);
printf("Simens:nGetBytes is %d\n",nGetBytes);
if(nGetBytes>0)
{
nPosition += nGetBytes;
itimes = 0;
}
else
{
if(itimes>=2 || nPosition >0)
{
break;
}
usleep(10);
itimes++;
}
}
//mPrintStr(gSiemensMeterBuff,20);
// mPrintfHex("%s:ntotoal recv is %d\n",dinfo,nPosition);
return nPosition;
}
#define SIEMENS_ID_BYTE_TIMEOUT 3
int RcvIdentifyFrame(int fd, INT8U *pbuf, INT16U bufsize)
{
int nGetBytes = 0;
int nRecvLen = 23;
int ntimes =0;
INT16U psize;
INT8U tempBuf[512];
while(1)
{
//nGetBytes = ICRecvBytes(cType,cp1107Hd,(BYTE*)&gMeterTmpBuf,Siemens_FIRST_REVLENGTH,Siemens_SLAVE_WAIT_OUT);
SlaveRecvFrame(fd,tempBuf,nRecvLen,&psize,120);
printf("IEC Get %d\n",psize);
if(psize <= 0)
{
if(ntimes>=3)
{
return E_COM_RECV;
}
usleep(10);
ntimes++;
}
else
break;
}
nGetBytes = psize;
//MaskBit7(tempBuf, nGetBytes);
if(nGetBytes>0&&tempBuf[0]== '/'&&
tempBuf[nGetBytes-2]==CR&&tempBuf[nGetBytes-1]==LF)
{
return nGetBytes;
}
return nGetBytes;
}
void GetSiemensMeterInfo(INT8U *pBuff, int len, SiemensMeterInfoType *pSiemensMeterInfo)
{
IdentifyFrameType *pIdFrame;
int length;
pIdFrame=(IdentifyFrameType *) pBuff;
memcpy((INT8U *)(pSiemensMeterInfo->factoryId), (INT8U *)(pIdFrame->factory), 3);
pSiemensMeterInfo->factoryId[3]='\0';
pSiemensMeterInfo->baudrate=pIdFrame->baudRate;
length=len-sizeof(IdentifyFrameType)-2+1;
memcpy((INT8U *)(pSiemensMeterInfo->model), (INT8U *)(pIdFrame->Id), length);
pSiemensMeterInfo->model[length]='\0';
}
void AckBoudRate(INT8U port, INT8U BoudRate, INT8U mode)
{
AckFrameType ackFrame;
ackFrame.Ack=ACK;
ackFrame.V='0';
ackFrame.Z=BoudRate;
ackFrame.Y=mode;
ackFrame.cr=CR;
ackFrame.lf=LF;
// memcpy(gMeterSendBuf, (INT8U *)&ackFrame, sizeof(AckFrameType));
//SlaveDirectSendFrame(port, (INT8U *)&ackFrame, sizeof(AckFrameType));
}
int SiemensDataReadFrame(INT8U port, INT8U *pDataBuff, INT16U bufsize)
{
int size;
// INT8U buff[4]={'!', CR, LF, ETX};
if((size = ReceiveSiemensFrame(port, pDataBuff, bufsize)) > 0)
{
// if(memcmp(pDataBuff+size-4-1, buff, 4)==0 || memcmp(pDataBuff+size-3, buff, 3) == 0)
// {
return size;
// }
// else
// {
// return 0;
// }
}
else
{
return 0;
}
}
/*
INT8U Check(INT8U *pBuff, int len)
{
int i;
int offset;
INT8U check=0;
for(i=0; i<len; i++)
{
check^=*(pBuff+i);
}
return check;
}
*/
void SendSiemensReqFrame(int fd, INT8U *pAddr, int AddrLen)
{
memcpy(gMeterSendBuf, "/?", 2);
memcpy(gMeterSendBuf+2, pAddr, AddrLen);
memcpy(gMeterSendBuf+2+AddrLen, "!\r\n", 3);
SlaveSendFrame(fd,gMeterSendBuf,AddrLen+5,5);
}
INT16U SiemensReadMeter( INT8U *pMeterAddr, int MeterAddrLen, SiemensMeterInfoType *pSiemensMeterInfo, INT8U *pbuf, INT16U bufsize,INT8U *ll)
{
int i;
int len;
INT16U length=0;
INT8U buff[100];
INT8U port = SLAVE_PORT_1;
for(i=0;i<3; i++)
{
SendSiemensReqFrame(fd, pMeterAddr, MeterAddrLen);
gSiemensBaud = 300;
if((len = RcvIdentifyFrame(fd, buff, 100))>0)
{
GetSiemensMeterInfo(buff, len, pSiemensMeterInfo);
#if SLAVE_DEBUG_EN > 0
printf("pSiemensMeterInfo \n");
mPrintfHex((INT8U *)pSiemensMeterInfo,sizeof(SiemensMeterInfoType));
// pbuf[length] = 0;
// printf("%s", pbuf);
#endif
*ll=pSiemensMeterInfo->baudrate;
switch(pSiemensMeterInfo->baudrate)
{
case SIEMENS_MODEC_BAUD_RATE_600:
gSiemensBaud = 600;
break;
case SIEMENS_MODEC_BAUD_RATE_1200:
gSiemensBaud = 1200;
break;
case SIEMENS_MODEC_BAUD_RATE_2400:
gSiemensBaud = 2400;
break;
case SIEMENS_MODEC_BAUD_RATE_4800:
gSiemensBaud = 4800;
break;
case SIEMENS_MODEC_BAUD_RATE_9600:
gSiemensBaud = 9600;
break;
default:
gSiemensBaud =300;
}
if(i < 2)
{
AckBoudRate(port, pSiemensMeterInfo->baudrate, '0');
}
if((length = SiemensDataReadFrame(port, pbuf, bufsize)) > 0)
{
#if SLAVE_DEBUG_EN > 0
// printf("SiemensDataReadFrame %d \n", length);
// pbuf[length] = 0;
// printf("%s", pbuf);
#endif
if(IsSiemensDataValid((INT8U *)&(pSiemensMeterInfo->model[0]), pbuf, length) == TRUE)
{
#if SLAVE_DEBUG_EN > 0
printf("SiemensDataValid\n");
#endif
break;
}
else
{
#if SLAVE_DEBUG_EN > 0
printf("SiemensDataValid ERROR\n");
#endif
}
}
else
{
}
gSiemensBaud = 300;
}
else
{
gSiemensBaud = 300;
}
}
gSiemensBaud = 300;
return length;
}
void DealWithMaxRqu(INT8U *ptr, INT8U *pMaxRqu,INT8U *pMaxRquTime)
{
/* INT8U buff[10];
INT8U *p;
buff[0]='0';
buff[1]=*ptr;
memcpy(buff+2, ptr+2, 3);
buff[5]='0';
if(IsDigitalASCII(buff,6)==0){
pMaxRqu[0]=0xff;
}
else
ASCIIToBCD(buff, 6, pMaxRqu);
p = (INT8U *)strchr((char *)ptr, '(');
if(p!=NULL)
{
pMaxRquTime[0]=((*(p+13)-'0')<<4)|(*(p+14)-'0');
pMaxRquTime[1]=((*(p+10)-'0')<<4)|(*(p+11)-'0');
pMaxRquTime[2]=((*(p+7)-'0')<<4)|(*(p+8)-'0');
pMaxRquTime[3]=((*(p+4)-'0')<<4)|(*(p+5)-'0');
}
else
{
memset(pMaxRqu, 0xff, 3);
memset(pMaxRquTime, 0xff, 4);
}
*/
INT8U buff[10];
INT8U *p;
if(*(ptr + 1) == '.')
{
buff[0]='0';
buff[1]=*ptr;
memcpy(buff+2, ptr+2, 3);
buff[5]='0';
}
else
{
memcpy(buff, ptr, 2);
memcpy(buff+2, ptr+3, 2);
buff[4]='0';buff[5]='0';
}
mASCIIToBCD(buff, 6, pMaxRqu);
p = (INT8U *)strchr((char *)ptr, '(');
if(p!=NULL)
{
pMaxRquTime[0]=((*(p+13)-'0')<<4)|(*(p+14)-'0');
pMaxRquTime[1]=((*(p+10)-'0')<<4)|(*(p+11)-'0');
pMaxRquTime[2]=((*(p+7)-'0')<<4)|(*(p+8)-'0');
pMaxRquTime[3]=((*(p+4)-'0')<<4)|(*(p+5)-'0');
}
else
{
memset(pMaxRqu, 0xff, 3);
memset(pMaxRquTime, 0xff, 4);
}
}
BOOL IsSiemensEnergyDataValid(INT8U *pRcvData, INT8U *pCharacterStr)
{
INT8U *ptr;
ptr = (INT8U *)strstr((char *)pRcvData, (char *)pCharacterStr);
if(ptr!= NULL)
{
return TRUE;
}
else
{
return FALSE;
}
}
void GetZMDEnergy(INT8U *pRcvData, INT8U *pCharacterStr, INT8U *pResult)
{
INT8U *ptr;
INT8U buff[20];
int SearchStrLen;
INT8U a;
ptr = (INT8U *)strstr((char *)pRcvData, (char *)pCharacterStr);
SearchStrLen = strlen((char *)pCharacterStr);
if(ptr!= NULL)
{
ptr+=SearchStrLen;
a = *(ptr-1);
if( a != '(')
{
ptr = (INT8U *)strchr((char *)ptr, '(');
if(ptr== NULL)
{
memcpy(pResult, 0, 4);
return;
}
ptr++;
}
memcpy(buff, ptr, 6);
memcpy(buff+6, ptr+7, 2);
// ASCIIToBCD(buff, 8, pResult);
}
else
{
memset(pResult, 0xff, 4);
}
}
void GetZFBEnergy(INT8U *pRcvData, INT8U *pCharacterStr, INT8U *pResult)
{
INT8U *ptr;
INT8U buff[20];
int SearchStrLen;
INT8U a;
ptr = (INT8U *)strstr((char *)pRcvData, (char *)pCharacterStr);
SearchStrLen=strlen((char *)pCharacterStr);
if(ptr!= NULL)
{
ptr+=SearchStrLen;
a = *(ptr-1);
if( a != '(')
{
ptr = (INT8U *)strchr((char *)ptr, '(');
if(ptr== NULL)
{
memcpy(pResult, 0, 4);
return;
}
ptr++;
}
buff[0]='0';
memcpy(buff+1, ptr, 5);
memcpy(buff+6, ptr+6, 2);
mASCIIToBCD(buff, 8, pResult);
}
else
memset(pResult, 0xff, 4);
}
void GetMaxRqu(INT8U *pRcvData, INT8U *pCharacterStr, INT8U *pMaxRqu, INT8U *pMaxRquTime)
{
INT8U *ptr;
int SearchStrLen;
INT8U a;
ptr = (INT8U *)strstr((char *)pRcvData, (char *)pCharacterStr);
SearchStrLen=strlen((char *)pCharacterStr);
if(ptr!= NULL)
{
ptr+=SearchStrLen;
a = *(ptr-1);
if( a != '(')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -