📄 islave.c
字号:
#define ARM_SLAVE_GLOBALS
#include "cfg_ISlave.h"
int SlaveSampleOneIdData(MpComProperty *mpProperty, INT16U id, INT8U *pbuf, INT16U bufsize, INT16U *psize);
int SlaveGetSampleIDTab(INT8U protocol, const SampleIdType **pSampleIdTab, INT16U *pIdNum);
int SlaveInitMPPort(MpComProperty *mpProperty)
{
INT8U uart;
INT32U baud;
INT8U databits;
char parity;
INT8U stopbits;
#if SLAVE_DEBUG_EN > 0
printf("\n SlaveInitMPPort\n");
#endif
stopbits = mpProperty->nStopBit;
parity = mpProperty->parity;
uart = mpProperty->nComPort;
databits = mpProperty->nDataBit;
baud = mpProperty->nBPS;
if(baud > 19200 || baud < 300)
baud = 1200;
if(databits > 8 || databits < 6)
databits = 8;
#if SLAVE_DEBUG_EN > 0
printf("\n API_SetUartAttr uart %d, baud %d", uart, baud);
printf("\n databits %d, stopbits %d, parity %d\n", databits, stopbits, parity);
#endif
switch(mpProperty->nProtocol)
{
case SLAVE_645:
return Init645Com(uart,baud,databits,parity,stopbits);
break;
case SLAVE_SIEMENS_B:
case SLAVE_SIEMENS_D:
return InitSimensCom(uart,baud,databits,parity,stopbits);
}
return E_PROTOCOL_NOEXIST;
}
int SlaveReadData(MpComProperty *mpProperty, INT16U id, INT8U *pbuf, INT16U bufsize, INT16U *psize)
{
switch(mpProperty->nProtocol)
{
case SLAVE_645:
return Slave645ReadData(mpProperty, id, pbuf, bufsize, psize);
break;
case SLAVE_SIEMENS_D:
case SLAVE_SIEMENS_B:
return SlaveSiemensReadData(mpProperty, id, pbuf, bufsize, psize);
break;
default:
break;
}
#if SLAVE_DEBUG_EN > 0
printf("\n SlaveReadData end\n");
#endif
return E_PROTOCOL_NOEXIST;
}
int SlaveSendFrame(int fd, INT8U *pbuf, INT16U bufsize,INT32U nWaitmScnd)
{
if(fd > 0)
{
if(ComSend (fd,pbuf, bufsize, nWaitmScnd) == bufsize)
return SUCCESS;
else
return E_COM_SEND;
}
return E_COM_OTHER;
}
int SlaveRecvFrame(int fd, INT8U *pbuf, INT16U bufsize, INT16U *psize,INT32U nWaitmScnd)
{
if(fd > 0)
{
*psize = ComRecv ( fd,pbuf, bufsize, nWaitmScnd);
if(*psize > 0)
{
#if SLAVE_DEBUG_EN > 0
mPrintfHex(pbuf,*psize);
#endif
}
return SUCCESS;
}
return E_COM_OTHER;
}
int SlaveSampleData(MpComProperty *mpProperty, INT8U *pbuf,INT16U bufsize,INT16U *psize)
{
const SampleIdType *pSampleIdTab;
INT16U idNum;
INT16U i;
INT16U size;
INT16U id;
INT8U iddata[SLAVE_ONEID_DATA_SIZE];
#if SLAVE_DEBUG_EN > 0
printf("\n SlaveSampleData\n");
#endif
#if SLAVE_DEBUG_EN > 0
printf("state is 1\n");
#endif
if(SlaveGetSampleIDTab(mpProperty->nProtocol, &pSampleIdTab, &idNum) == SUCCESS)
{
#if SLAVE_DEBUG_EN > 0
printf("SampleIDTab OK\n");
#endif
for(i = 0; i < idNum; i++)
{
id = pSampleIdTab->id;
#if SLAVE_DEBUG_EN > 0
printf("id is %x\n", id);
#endif
if(SlaveSampleOneIdData(mpProperty, id, iddata, SLAVE_ONEID_DATA_SIZE, &size) != SUCCESS)
{
if(i == 0)
{
#if SLAVE_DEBUG_EN > 0
printf("SlaveSampleOneIdData %x ERROR\n", id);
#endif
break;
}
else
{
memset(iddata, 0xff, pSampleIdTab->size);
}
}
#if SLAVE_DEBUG_EN > 0
printf("IdData %x OK\n", id);
#endif
memcpy(pbuf + pSampleIdTab->offset, iddata, pSampleIdTab->size);
pSampleIdTab ++;
}
if(i >= idNum)
{
#if SLAVE_DEBUG_EN > 0
printf("\n SlaveSampleData OK\n");
#endif
return SUCCESS;
}
}
return FAILED;
}
int SlaveGetSampleIDTab(INT8U protocol, const SampleIdType **pSampleIdTab, INT16U *pIdNum)
{
switch(protocol)
{
case SLAVE_645:
case SLAVE_WS_645:
case SLAVE_HND:
case SLAVE_HUALONG:
case SLAVE_LONGDIAN:
case SLAVE_XUJI:
case SLAVE_KELU:
case SLAVE_SANXING:
case SLAVE_HUALI:
case SLAVE_GB645_PARTS:
case SLAVE_GB645_SINGLE:
*pSampleIdTab = gDL645SampleId;
*pIdNum = DL645_SAMPLE_ID_TABLE_SIZE;
break;
case SLAVE_WS:
*pSampleIdTab = gDL645SampleId;
*pIdNum = DL645_SAMPLE_ID_TABLE_SIZE;
break;
default :
*pSampleIdTab = gDL645SampleId;
*pIdNum = DL645_SAMPLE_ID_TABLE_SIZE;
break;
}
return SUCCESS;
}
int SlaveSampleOneIdData(MpComProperty *mpProperty, INT16U id, INT8U *pbuf, INT16U bufsize, INT16U *psize)
{
int retvalue ;
int fd;
#if SLAVE_DEBUG_EN > 0
printf("\n SlaveSampleOneIdData\n");
printf("\n id %x\n", id);
#endif
fd = SlaveInitMPPort(mpProperty);
retvalue = SlaveReadData(mpProperty, id, pbuf, bufsize, psize);
CloseCom(fd);
return retvalue;
}
/*****************************************************************************************
645协议采样数据ID表
*****************************************************************************************/
const SampleIdType gDL645SampleId[DL645_SAMPLE_ID_TABLE_SIZE] =
{
{0x901f, SAMPLE_METER_DATA_OFFSET+ 0, 20},
{0x902f, SAMPLE_METER_DATA_OFFSET+ 20, 20},
// {0x907f, SAMPLE_METER_DATA_OFFSET+ 40, 12},
// {0x908f, SAMPLE_METER_DATA_OFFSET+ 52, 12},
{0x911f, SAMPLE_METER_DATA_OFFSET+64, 20},
{0x912f, SAMPLE_METER_DATA_OFFSET+84, 20},
{0x913f, SAMPLE_METER_DATA_OFFSET+104, 20},
{0x914f, SAMPLE_METER_DATA_OFFSET+124, 20},
{0x915f, SAMPLE_METER_DATA_OFFSET+144, 20},
{0x916f, SAMPLE_METER_DATA_OFFSET+164, 20},
// {0x917f, SAMPLE_METER_DATA_OFFSET+ 184, 12},
// {0x918f, SAMPLE_METER_DATA_OFFSET+ 196, 12},
{0xa010, SAMPLE_METER_DATA_OFFSET+ 208, 3 },
{0xa020, SAMPLE_METER_DATA_OFFSET+ 211, 3 },
{0xb010, SAMPLE_METER_DATA_OFFSET+ 214, 4 },
{0xb020, SAMPLE_METER_DATA_OFFSET+ 218, 4 },
{0xb210, SAMPLE_METER_DATA_OFFSET+ 222, 4 },
{0xb211, SAMPLE_METER_DATA_OFFSET+ 226, 4 },
{0xb212, SAMPLE_METER_DATA_OFFSET+ 230, 2 },
{0xb213, SAMPLE_METER_DATA_OFFSET+ 232, 2 },
{ 0xb61f, SAMPLE_METER_DATA_OFFSET+234, 6 },
{ 0xb62f, SAMPLE_METER_DATA_OFFSET+240, 6 },
{ 0xb63f, SAMPLE_METER_DATA_OFFSET+246, 12 },
{ 0xb64f, SAMPLE_METER_DATA_OFFSET+258, 8 },
// { 0xb65f, SAMPLE_METER_DATA_OFFSET+266, 8 },
{ 0xc020, SAMPLE_METER_DATA_OFFSET+274, 1},
{ 0xc021, SAMPLE_METER_DATA_OFFSET+275, 1},
{ 0xc022, SAMPLE_METER_DATA_OFFSET+276, 1},
{ 0xc030, SAMPLE_METER_DATA_OFFSET+277, 3 },
{ 0xc031, SAMPLE_METER_DATA_OFFSET+280, 3 },
{ 0xc117, SAMPLE_METER_DATA_OFFSET+283, 2 },
{ 0xc33f, SAMPLE_METER_DATA_OFFSET+285, 24 }
};
const SampleIdType gSlaveSampleExtId[SLAVE_SAMPLE_EXT_ID_TABLE_SIZE] =
{
{0x9410, 0, 4},
{0x9420, 4, 4},
{0x9530, 8, 4},
{0x9540, 12, 4},
{0x9550, 16, 4},
{0x9560, 20, 4},
{0xa410, 24, 3 },
{0xa420, 27, 3 },
{0xb410, 30, 4 },
{0xb420, 34, 4 }
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -