📄 czx167-145-v2.2.c
字号:
if(Data_Control_sign==0x01) // 读数据处理
{
if((Command_Sign_H==0xC0)&&(Command_Sign_L>=0x40)&&(Command_Sign_L<=0x4F))
{
HW_ZB=0;
if((Addcheck==0)||(Addcheck==0x55))
{
k=Command_Sign_L&0x0F;
HW_Answer_MeterNO(k);
}
}
else if(Addcheck==0)
{
j=Infrared_buf_bak[9]+12;
for(i=0; i<j; i++)
Send_RS485_buf0[i]=Infrared_buf_bak[i];
RS485_Txd_OK='O';
}
else HW_ZB=0;
}
else if(Data_Control_sign==0x04) // 写数据处理
{
HW_ZB=0;
switch(Command_Sign_H)
{
case 0xC0: //写表号
if((Command_Sign_L>=0x40)&&(Command_Sign_L<=0x4F))
{
CS ='X';
for(j=0; j<6; j++)
{
Write_buf[j]=Infrared_buf_bak[(j+16)]-0x33;
CS +=Write_buf[j];
}
Write_buf[6] = CS;
if( Compare_HW_ADD()==0 )
return;
k=Command_Sign_L&0x0F;
Add_FM24=8*k + first_Son_addr;
xiaodou();
i=WR_ADDR(WR_2404,Add_FM24);
Add_FM24=8*k + first_Son_addr_bak;
xiaodou();
j=WR_ADDR(WR_2404,Add_FM24);
if((i=='O')||(j =='O'))
{
HW_Answer_Success();
for(i=0;i<7;i++)
Son_Add_buf[k][i]=Write_buf[i];
HW_auto='H';
start_j_f_meter(); //启动判拆表
}
}
else if(Command_Sign_L==0x32)
{
if(Addcheck==0x99)
{
wp24=1;
write_add_terminal(16);
}
}
break;
default:
break;
}
}
else if((Data_Control_sign==0x0A)&&(Addcheck==0x99)) // 写设备地址
{
wp24=1;
write_add_terminal(10);
}
}
/**************************************************************************************
*
* FUNCTION: Read_ymd_frame
*
* DESCRIPTION: 读年月日 载波规约数据转换成485数据
* 载波规约中C0 12是在645规约中扩展的抄读时钟的标识符,而645规约中只有C0 10抄读
* 年月日,C0 11抄读时分秒两条,故载波须分两次抄读,即先读年月日,再读时分秒
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void Read_ymd_frame() //读取年月日
{
uchar i,j;
Send_RS485_buf0[0]=0x68;
for(i=1; i<7; i++)
Send_RS485_buf0[i]=Add_buf[(i-1)]; //取目的表号
Send_RS485_buf0[7]=0x68;
Send_RS485_buf0[8]=0x01; //功能码
Send_RS485_buf0[9]=0x02; //长度
Send_RS485_buf0[10]=0x43;
Send_RS485_buf0[11]=0xF3;
j=0;
for(i=0; i<12; i++)
j+=Send_RS485_buf0[i];
Send_RS485_buf0[12]=j;
Send_RS485_buf0[13]=0x16;
RS485_Txd_OK='O';
}
/**************************************************************************************
*
* FUNCTION: Read_hms_frame
*
* DESCRIPTION: 读时分秒 载波规约数据转换成485数据
* 载波规约中C0 12是在645规约中扩展的抄读时钟的标识符,而645规约中只有C0 10抄读
* 年月日,C0 11抄读时分秒两条,故载波须分两次抄读,即先读年月日,再读时分秒
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void read_hms_frame()
{
uchar i,j;
for(i=0; i<250; i++) //0.6*250*200+0.8*200=30.16ms
{
WDT_RST=0xa1;
for(j=0; j<250; j++);
}
Send_RS485_buf0[0]=0x68;
for(i=1; i<7; i++)
Send_RS485_buf0[i]=Add_buf[(i-1)]; //取目的表号
Send_RS485_buf0[7]=0x68;
Send_RS485_buf0[8]=0x01;
Send_RS485_buf0[9]=0x02;
Send_RS485_buf0[10]=0x44;
Send_RS485_buf0[11]=0xF3;
j=0;
for(i=0; i<12; i++)
j+=Send_RS485_buf0[i];
Send_RS485_buf0[12]=j;
Send_RS485_buf0[13]=0x16;
RS485_Txd_OK='O';
}
/**************************************************************************************
*
* FUNCTION: ZB_485
*
* DESCRIPTION: 载波规约数据转换成485数据
*
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void ZB_485(uchar Command_Sign_H,uchar Command_Sign_L)
{
uchar i,j,k,m,SN;
uchar RS_CRC=0;
if(Command_Sign_H==0x4E)
{
if(Command_Sign_L==0x4F)
{
for(i=0;i<3;i++)
Send_Carrier_buf[0]=0x99;
Send_Carrier_buf[3]=0x01;
Send_Carrier_buf[4]=0x02;
Send_Carrier_buf[5]=0x4F;
Send_Carrier_buf[6]=0x4E;
ZB_Glob_Len=7;
zb_send_c(); //转为载波广播启动自动寻表
start_j_f_meter(); //启动自动找表
Send_Carrier_buf[0]=ZJ_Add_buf[0];
Send_Carrier_buf[1]=ZJ_Add_buf[1];
Send_Carrier_buf[2]=ZJ_Add_buf[2];
Send_Carrier_buf[3]=0x81;
Send_Carrier_buf[4]=0x05;
Send_Carrier_buf[5]=0x4F;
Send_Carrier_buf[6]=0x4E;
Send_Carrier_buf[7]=Add_buf[0];
Send_Carrier_buf[8]=Add_buf[1];
Send_Carrier_buf[9]=Add_buf[2];
ZB_Glob_Len=10;
zb_send_c();
}
HW_ZB=0;
}
if(Command_Sign_H==0xC0)
{
if(Command_Sign_L==0x12) //读时间
{
ZB_Read_Time='Y'; //置读时间标志
Read_ymd_frame(); //先读年月日
return;
}
if (Command_Sign_L==0x32)
{
SN=Carrier_buf_bak[10];
Send_Carrier_buf[0]=ZJ_Add_buf[0];
Send_Carrier_buf[1]=ZJ_Add_buf[1];
Send_Carrier_buf[2]=ZJ_Add_buf[2];
Send_Carrier_buf[3]=0x81;
Send_Carrier_buf[5]=0x32;
Send_Carrier_buf[6]=0xC0;
Send_Carrier_buf[7]=Add_buf[0];
Send_Carrier_buf[8]=Add_buf[1];
Send_Carrier_buf[9]=Add_buf[2];
k=0;
j=0;
m=0;
if(SN<=5)
{
for(i=0;i<16;i++)
{
if((Son_Add_buf[i][0]!=0)||(Son_Add_buf[i][1]!=0)||(Son_Add_buf[i][2]!=0))
k++;
if(k>3*SN)
{
for(j=0;j<6;j++)
Send_Carrier_buf[11+m*6+j]=Son_Add_buf[i][j];
m++;
}
if(m==3)
break;
}
}
if(m<3)
Send_Carrier_buf[10]=0xFF;
else
Send_Carrier_buf[10]=SN;
Send_Carrier_buf[4]=6+m*6;
ZB_Glob_Len=11+m*6;
zb_send_c();
HW_ZB=0;
}
}
ZB_Read_Time=0;
Send_RS485_buf0[0]=0x68; //填充数据到485发送缓冲区
for(i=1; i<7; i++)
Send_RS485_buf0[i]=Add_buf[(i-1)]; //取目的表号
Send_RS485_buf0[7]=0x68;
Send_RS485_buf0[8]=0x01;
Send_RS485_buf0[9]=0x02;
Send_RS485_buf0[10]=Command_Sign_L+0x33; //
Send_RS485_buf0[11]=Command_Sign_H+0x33; //
for(i=0; i<12; i++) //计算校验和
RS_CRC+=Send_RS485_buf0[i];
Send_RS485_buf0[12]=RS_CRC;
Send_RS485_buf0[13]=0x16;
RS485_Txd_OK='O'; //置485可以发送标志
}
/**************************************************************************************
*
* FUNCTION: write_meter
*
* DESCRIPTION: 对表进行写操作(校时、通断继电器(需根据用户要求修改)、修改密码、
* 欠费显示/清除(需根据用户要求添加或修改)、用户无此要求时应将通断电
* 和欠费显示/清除功能屏蔽
* PARAMETERS: 中继级数K*3=k
*
* RETURNED: none
*
*************************************************************************************/
void write_meter (uchar k)
{
uchar i,RS485_CRC;
if(Carrier_buf_bak[6]==0xC0)
{
if(Carrier_buf_bak[5]==0x12) ///校时,转为广播校时
{
Send_RS485_buf0[0]=0x68;
for(i=1; i<7; i++)
Send_RS485_buf0[i]=0x99;
Send_RS485_buf0[7]=0x68;
Send_RS485_buf0[8]=0x08;
Send_RS485_buf0[9]=0x06;
Send_RS485_buf0[10]=Carrier_buf_bak[10+k]+0x33;
Send_RS485_buf0[11]=Carrier_buf_bak[11+k]+0x33;
Send_RS485_buf0[12]=Carrier_buf_bak[12+k]+0x33;
Send_RS485_buf0[13]=Carrier_buf_bak[14+k]+0x33;
Send_RS485_buf0[14]=Carrier_buf_bak[15+k]+0x33;
Send_RS485_buf0[15]=Carrier_buf_bak[16+k]+0x33;
RS485_CRC=0;
for(i=0; i<16; i++)
RS485_CRC+=Send_RS485_buf0[i];
Send_RS485_buf0[16]=RS485_CRC;
Send_RS485_buf0[17]=0x16;
HW_ZB=0;
RS485_Txd_OK='O';
}
}
if(Carrier_buf_bak[6]==0xC0)
{
if(Carrier_buf_bak[5]==0x35) //通断继电器
{
if(Carrier_buf_bak[14+k]==0x50) //断继电器
{
Send_RS485_buf0[16]=0x88;////0x55+0x33;
Send_RS485_buf0[17]=0x66;//0x33+0x33;
}
if(Carrier_buf_bak[14+k]==0x5F) //合继电器
{
Send_RS485_buf0[16]=0x99;//0x66+0x33;
Send_RS485_buf0[17]=0xCC;//0x99+0x33;
}
Send_RS485_buf0[0]=0x68; //填充数据到485发送缓冲区
for(i=1; i<7; i++)
Send_RS485_buf0[i]=Add_buf[(i-1)]; //取目的表号
Send_RS485_buf0[7]=0x68;
Send_RS485_buf0[8]=0x04;
Send_RS485_buf0[9]=0x08;
Send_RS485_buf0[10]=0x5B;//0x28+0x33;
Send_RS485_buf0[11]=0xF3;//0xC0+0x33; //
for(i=12; i<16; i++)
Send_RS485_buf0[i]=Carrier_buf_bak[i-2]+0x33; //填写密码
RS485_CRC=0;
for(i=0;i<18;i++)
RS485_CRC+=Send_RS485_buf0[i];
Send_RS485_buf0[18]=RS485_CRC;
Send_RS485_buf0[19]=0x16;
RS485_Txd_OK='O';
}
}
}
/**************************************************************************************
*
* FUNCTION: ZB_MOV_RE
*
* DESCRIPTION: 载波读中继下发时,数据移动程序
* j=(下发的中继级数-1)*3
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void ZB_MOV_RE(uchar j)
{
HW_ZB=0;
ZJ_SEND=0x55; // 中继下发标志
Send_Carrier_buf[4]=0x05+j;
Send_Carrier_buf[5]=Carrier_buf_bak[5];
Send_Carrier_buf[6]=Carrier_buf_bak[6];
Send_Carrier_buf[7+j]=Carrier_buf_bak[0];
Send_Carrier_buf[8+j]=Carrier_buf_bak[1];
Send_Carrier_buf[9+j]=Carrier_buf_bak[2];
ZB_Glob_Len=10+j;
}
/**************************************************************************************
*
* FUNCTION: ZB_MOV_WR
*
* DESCRIPTION: 载波写中继下发时,数据移动程序
* i=(接收到的中继级数-1)*3
* j=(下发的中继级数-1)*3
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -