📄 protocol.c
字号:
DI1DI0 = _SlvsReadProcB3xx_addr[di0_h];
FrameBuffer[FRM_DATALEN] = 4*_SlvsReadProcB3xx_len[di0_h];
return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A);
}
}
else if( di0_h <= 0x03 )
{
if( di0_l <= 0x03 )
{
DI1DI0 = _SlvsReadProcB3xx_addr[di0_h]+di0_l*4;
FrameBuffer[FRM_DATALEN] = _SlvsReadProcB3xx_len[di0_h];
return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A);
}
else if( di0_l == 0x0F )
{
FramRead( _SlvsReadProcB3xx_addr[di0_h], &FrameBuffer[FRM_DATA+2], 16 );
FrameBuffer[FRM_DATA+18] = 0xAA;
FrameBuffer[FRM_DATALEN] = 17;
return(RET_SEND_RIGHT_RESPONSION);
}
}
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
static unsigned char __SlvsReadProcB6_12_x(void)
{
unsigned short temp;
unsigned char di0_h=DI0_H-1,dl0_l=DI0_L-1;
unsigned char i;
if( di0_h <= 1 )
{
if( dl0_l < 3 )
{
if( di0_h == 0 )
{
temp = (unsigned short)( CurrentVI[dl0_l]/10 );
temp = Hex2BcdShort(temp);
}
else
{
temp = Hex2BcdShort( CurrentVI[dl0_l+di0_h*3] );
}
FrameBuffer[FRM_DATA+2] = (unsigned char)(temp);
FrameBuffer[FRM_DATA+3] = (unsigned char)(temp>>8);
FrameBuffer[FRM_DATALEN] = 2;
return(RET_SEND_RIGHT_RESPONSION);
}
else if( dl0_l == 0x0E )
{
if( di0_h == 0 )
{
for( i = 0; i < 3; i++ )
{
temp = (unsigned short)( CurrentVI[i]/10 );
temp = Hex2BcdShort(temp);
FrameBuffer[FRM_DATA+2+i*2] = (unsigned char)(temp);
FrameBuffer[FRM_DATA+3+i*2] = (unsigned char)(temp>>8);
}
}
else
{
for( i = 0; i < 3; i++ )
{
temp = Hex2BcdShort( CurrentVI[3+i] );
FrameBuffer[FRM_DATA+2+i*2] = (unsigned char)(temp);
FrameBuffer[FRM_DATA+3+i*2] = (unsigned char)(temp>>8);
}
}
FrameBuffer[FRM_DATA+8] = 0xAA;
FrameBuffer[FRM_DATALEN] = 7;
return(RET_SEND_RIGHT_RESPONSION);
}
}
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
/*************************************************
* 读数据处理(B63X)
* ------------------------------------------------
* 0xB630 ---- 瞬时有功功率-3字节
* 0xB631 ---- A相有功功率-3字节
* 0xB632 ---- B相有功功率-3字节
* 0xB633 ---- C相有功功率-3字节
* 0xB634 ---- 正向有功功率上限值-2字节
* 0xB635 ---- 反向有功功率上限值-2字节
* 0xB636 ---- 瞬时有功功率相位-1字节
*************************************************/
static unsigned char __SlvsReadProcB63x(void)
{
unsigned char di0_l=DI0_L, i;
if( di0_l <= 3 )
{
CalcInstantPower((unsigned char *)&FrameBuffer[FRM_DATA+2],di0_l);
FrameBuffer[FRM_DATALEN]=3;
}
else if( di0_l <= 5 )
{
FrameBuffer[FRM_DATALEN]=2;
DI1DI0=ADDR_OF_AP_UPPER_LIMIT+(di0_l-4)*2;
return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A|RET_WRITE_E2PROM_A);
}
else if( di0_l == 6 )
{
FrameBuffer[FRM_DATALEN]=1;
FrameBuffer[FRM_DATA+2]=PhaseActive;
}
else if( di0_l == 0x0F )
{
for( i = 0; i < 4; i++ )
{
CalcInstantPower( (unsigned char *)&FrameBuffer[FRM_DATA+2+i*3], i );
}
for( i = 0; i < 2; i++ )
{
FramRead( ADDR_OF_AP_UPPER_LIMIT+i*2, &FrameBuffer[FRM_DATA+14+i*2], 2 );
}
FrameBuffer[FRM_DATA+18] = 0xAA;
FrameBuffer[FRM_DATALEN]=17;
}
else
{
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
return(RET_SEND_RIGHT_RESPONSION);
}
/*************************************************
* 读数据处理(B64X)
* ------------------------------------------------
* 0xB640 ---- 瞬时无功功率-2字节
* 0xB641 ---- A相无功功率-2字节
* 0xB642 ---- B相无功功率-2字节
* 0xB643 ---- C相无功功率-2字节
* 0xB644 ---- 瞬时无功功率相位-1字节
*************************************************/
static unsigned char __SlvsReadProcB64x(void)
{
unsigned char i,temp[16];
if(DI0_L<=3)
{
CalcInstantPower((unsigned char *)&FrameBuffer[FRM_DATA+2],DI0_L+4);
FrameBuffer[FRM_DATA+2]=FrameBuffer[FRM_DATA+3];
FrameBuffer[FRM_DATA+3]=FrameBuffer[FRM_DATA+4];
FrameBuffer[FRM_DATALEN]=2;
}
else if(DI0_L==4)
{
FrameBuffer[FRM_DATALEN]=1;
FrameBuffer[FRM_DATA+2]=PhaseReactive;
}
else if( DI0_L == 0x0F )
{
for( i = 0; i < 4; i++ )
{
CalcInstantPower((unsigned char *)&temp[i*4], i+4);
FrameBuffer[FRM_DATA+2+i*2] = temp[1+i*4];
FrameBuffer[FRM_DATA+3+i*2] = temp[2+i*4];
}
FrameBuffer[FRM_DATA+10] = 0xAA;
FrameBuffer[FRM_DATALEN] = 9;
}
else
{
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
return(RET_SEND_RIGHT_RESPONSION);
}
/*************************************************
* 读数据处理(B65X)
* ------------------------------------------------
* 0xB650 ---- 总功率因数-2字节
* 0xB651 ---- A相功率因数-2字节
* 0xB652 ---- B相功率因数-2字节
* 0xB653 ---- C相功率因数-2字节
*************************************************/
static unsigned char __SlvsReadProcB65x(void)
{
unsigned short pcoe;
unsigned char di0l=DI0_L,i;
if(di0l<=3)
{
pcoe=GetPowerFactor(di0l);
memcpy((unsigned char *)&FrameBuffer[FRM_DATA+2],(unsigned char *)&pcoe,2);
FrameBuffer[FRM_DATALEN]=2;
return(RET_SEND_RIGHT_RESPONSION);
}
else if( di0l == 0x0F )
{
for( i = 0; i < 4; i++ )
{
pcoe=GetPowerFactor(i);
memcpy( &FrameBuffer[FRM_DATA+2+2*i], (unsigned char *)&pcoe, 2 );
}
FrameBuffer[FRM_DATA+10] = 0xAA;
FrameBuffer[FRM_DATALEN] = 9;
return(RET_SEND_RIGHT_RESPONSION);
}
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
static unsigned char __SlvsReadProcB66x(void)
{
unsigned long instp;
if(DI0_L<=3)
{
CalcInstantPower((unsigned char *)&FrameBuffer[FRM_DATA+2],DI0_L+8);
FrameBuffer[FRM_DATALEN]=3;
return(RET_SEND_RIGHT_RESPONSION);
}
else if(DI0_L==4)
{
GetFreq();
instp=CurrentFreq;
FrameBuffer[FRM_DATA+2]=(unsigned char)instp;
FrameBuffer[FRM_DATA+3]=(unsigned char)(instp>>8);
FrameBuffer[FRM_DATALEN]=2;
return(RET_SEND_RIGHT_RESPONSION);
}
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
/*************************************************
* 读数据处理(B67X)
* ------------------------------------------------
* 0xB670 ---- 电表类型-2字节
* 0xB671 ---- 内部参数(电表运行状态)-1字节
* 0xB672 ---- 内部参数(测试参数)-1字节
* 0xB673 ---- 3.6V电池电压-1字节
* 0xB674 ---- 公共假日状态-1字节
* 0xB675 ---- 时区,时段表表号,时段,费率-4字节
* 0xB676 ---- 6V停电电池状态-1字节
* 0xB677 ---- 内部参数(失压失流状态字)-3字节
*************************************************/
static unsigned char __SlvsReadProcB67x(void)
{
if(DI0_L==0)
{
FrameBuffer[FRM_DATA+2]=0x00;
}
else if(DI0_L==1)
{
FrameBuffer[FRM_DATA+2]=MeterRunningState&0x7F;
}
else if(DI0_L==2)
{
FrameBuffer[FRM_DATA+2]=AlarmCtlWord1;
}
else if(DI0_L==3)
{
FrameBuffer[FRM_DATA+2]=0;
}
else if(DI0_L==4)
{
FrameBuffer[FRM_DATA+2]=_SysPotInfo.pubvacstate;
}
else if(DI0_L==5)
{
FrameBuffer[FRM_DATA+2]=Hex2BcdChar(_SysPotInfo.zonenum+1);//时区
FrameBuffer[FRM_DATA+3]=Hex2BcdChar(_SysPotInfo.pottblnum);//时段表号
FrameBuffer[FRM_DATA+4]=Hex2BcdChar(CurrentPotNum);//时段
FrameBuffer[FRM_DATA+5]=Tariff&0x03;//费率
}
else if( DI0_L == 6 )
{
FrameBuffer[FRM_DATA+2] = 0;
}
else if( DI0_L == 7 )
{
FrameBuffer[FRM_DATA+2] = LowVIStateWord;
}
else if( DI0_L == 8 )
{
FrameBuffer[FRM_DATA+2] = AlarmCtlWord2;
}
else if( DI0_L == 9 )
{
FrameBuffer[FRM_DATA+2] = AlarmCtlWord3;
}
else
{
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
if( DI0_L == 5 )
{
FrameBuffer[FRM_DATALEN] = 4;
}
else
{
FrameBuffer[FRM_DATALEN] = 1;
}
return(RET_SEND_RIGHT_RESPONSION);
}
static unsigned char __SlvsReadProcB69x(void)
{
unsigned char ii;
if( DI0_L < 3 )
{
CalcVoltageAngle( (unsigned char *)&FrameBuffer[FRM_DATA+2], DI0_L );
FrameBuffer[FRM_DATALEN] = 3;
return RET_SEND_RIGHT_RESPONSION;
}
else if( DI0_L == 0x0F )
{
for( ii = 0; ii < 3; ii++ )
{
CalcVoltageAngle( (unsigned char *)&FrameBuffer[FRM_DATA+2+ii*3], ii );
}
FrameBuffer[FRM_DATALEN] = 9;
return RET_SEND_RIGHT_RESPONSION;
}
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
static unsigned char __SlvsReadProcB6Ax(void)
{
if( DI0_L < 3 )
{
CalcVoltageAngle( (unsigned char *)&FrameBuffer[FRM_DATA+2], DI0_L+3 );
FrameBuffer[FRM_DATALEN] = 3;
return RET_SEND_RIGHT_RESPONSION;
}
else if( DI0_L == 0x0F )
{
FrameBuffer[FRM_DATALEN] = 9;
return RET_SEND_RIGHT_RESPONSION;
}
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
static unsigned char __SlvsReadProcB6Bx(void)
{
if( DI0_L == 0 )
{
FrameBuffer[FRM_DATALEN] = 2;
FrameBuffer[FRM_DATA+2] = 0;
FrameBuffer[FRM_DATA+3] = 0;
return RET_SEND_RIGHT_RESPONSION;
}
else if( DI0_L == 1 )
{
FrameBuffer[FRM_DATALEN] = 3;
FrameBuffer[FRM_DATA+2] = 0;
FrameBuffer[FRM_DATA+3] = 0;
FrameBuffer[FRM_DATA+4] = 0;
return RET_SEND_RIGHT_RESPONSION;
}
FrameBuffer[FRM_DATA] = RET_ERR_ID;
return RET_SEND_ERROR_RESPONSION;
}
const unsigned char __slvs_rd_b6xx_di0_h_[]=
{
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x09,0x0A,0x0B,
ERROR
};
const COMM_PROC_PTR __slvs_rd_proc_b6xx_di0_h_[]=
{
__SlvsReadProcB6_12_x,
__SlvsReadProcB6_12_x,
__SlvsReadProcB63x,
__SlvsReadProcB64x,
__SlvsReadProcB65x,
__SlvsReadProcB66x,
__SlvsReadProcB67x,
__SlvsReadProcB69x,
__SlvsReadProcB6Ax,
__SlvsReadProcB6Bx
};
static unsigned char _SlvsWRProcB6xx(void)
{
unsigned char idx;
idx=FindCmdItem(__slvs_rd_b6xx_di0_h_,DI0_H);
if(idx!=ERROR)
{
return(__slvs_rd_proc_b6xx_di0_h_[idx]());
}
return RET_NO_RESPONSION;
}
void CopySystemTime(unsigned char *data1,unsigned char *data2)
{
FrameBuffer[FRM_DATALEN]=3+(unsigned char)(DI1DI0);
memcpy(data1,data2, FrameBuffer[FRM_DATALEN]);
}
static unsigned char __SlvsReadProcC01x(void)
{
if( DI0_L < 2 )
{
DI1DI0=~((unsigned short)(FrameBuffer[DI0]|0xFFFE));
CopySystemTime(&FrameBuffer[FRM_DATA+2],SystemTime+(unsigned char)(3*DI1DI0));
return(RET_SEND_RIGHT_RESPONSION);
}
else if( DI0_L == 0x0F )
{
FrameBuffer[FRM_DATA+2] = SystemTime[SPACE_OF_WEEKDAY];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -