📄 czx167-145-v2.2.c
字号:
void ZB_MOV_WR(uchar i,uchar j)
{
HW_ZB=0;
ZJ_SEND=0x55; // 中继下发标志
Send_Carrier_buf[4]=0x0A+j; //长度为5个字节
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];
Send_Carrier_buf[10+j]=Carrier_buf_bak[13+i];
Send_Carrier_buf[11+j]=Carrier_buf_bak[14+i];
Send_Carrier_buf[12+j]=Carrier_buf_bak[15+i];
Send_Carrier_buf[13+j]=Carrier_buf_bak[16+i];
Send_Carrier_buf[14+j]=Carrier_buf_bak[17+i];
ZB_Glob_Len=15+j;
}
void ZJ_addr_bak(uchar j) //j=接收到的中继级数*3
{
ZJ_Add_buf[0]=Carrier_buf_bak[7+j]; // 备份上传地址
ZJ_Add_buf[1]=Carrier_buf_bak[8+j];
ZJ_Add_buf[2]=Carrier_buf_bak[9+j];
}
void ZB_down_frame(uchar j) //填写下行表地址;
{
Send_Carrier_buf[0]=Carrier_buf_bak[7+j];
Send_Carrier_buf[1]=Carrier_buf_bak[8+j];
Send_Carrier_buf[2]=Carrier_buf_bak[9+j];
}
void ZB_ZJ1_frame(uchar j) //1级中继中继表地址填写
{
Send_Carrier_buf[7]=Carrier_buf_bak[10+j];
Send_Carrier_buf[8]=Carrier_buf_bak[11+j];
Send_Carrier_buf[9]=Carrier_buf_bak[12+j];
}
void ZB_ZJ2_frame(uchar j) //2级中继中继表地址填写
{
ZB_ZJ1_frame(j);
Send_Carrier_buf[10]=Carrier_buf_bak[13+j];
Send_Carrier_buf[11]=Carrier_buf_bak[14+j];
Send_Carrier_buf[12]=Carrier_buf_bak[15+j];
}
void ZB_ZJ3_frame() //3级中继中继表地址填写
{
ZB_ZJ2_frame(0);
Send_Carrier_buf[13]=Carrier_buf_bak[16];
Send_Carrier_buf[14]=Carrier_buf_bak[17];
Send_Carrier_buf[15]=Carrier_buf_bak[18];
}
/**************************************************************************************
*
* FUNCTION: ZB_Design_Prog
*
* DESCRIPTION: 载波规约数据处理
*
*
* PARAMETERS: addr_type:地址类型
*
* RETURNED: none
*
*************************************************************************************/
void ZB_Design_Prog( )
{
uchar Data_Control_sign; // 控制码( "0x01" or "0x04" or "0x51")
uchar Command_Sign_H; // 0x90
uchar Command_Sign_L; // 0x1F
uchar i;
Data_Control_sign=Carrier_buf_bak[3]; //控制码
Command_Sign_H=Carrier_buf_bak[6]; //功能码
Command_Sign_L=Carrier_buf_bak[5]; //功能码
if(Data_Control_sign==0x01) // 无中继的读数据处理
{
ZJ_addr_bak(0);
ZB_485(Command_Sign_H,Command_Sign_L);
}
else if(Data_Control_sign==0x41) //有中继1
{
ZJ_addr_bak(3); // 备份中继上传地址
if(Check_ZB_ZJ_ADD(7)==0) //判断目标地址在16中否?
ZB_485(Command_Sign_H,Command_Sign_L);
else
{
ZB_down_frame(0); //无中继下行数据组帧,填写下行表地址
Send_Carrier_buf[3]=0x01; //命令为读命令
ZB_MOV_RE(0);
zb_send_c();
}
}
else if(Data_Control_sign==0x51) //2级中继
{
ZJ_addr_bak(6); // 备份上传地址
if(Check_ZB_ZJ_ADD(10)==0) //目的地址在16个中
ZB_485(Command_Sign_H,Command_Sign_L);
else
{
if(Check_ZB_ZJ_ADD(7)==0) //2级地址在16个中
{
ZB_down_frame(3); //无中继下行数据组帧,填写下行表地址
Send_Carrier_buf[3]=0x01;
ZB_MOV_RE(0);
zb_send_c();
}
else //2级地址不在16个中
{
ZB_down_frame(0); //1级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x41;
ZB_ZJ1_frame(0); //1级中继下行数据组帧,填写中继表地址;
ZB_MOV_RE(3);
zb_send_c();
}
}
}
else if(Data_Control_sign==0x61) //3级
{
ZJ_addr_bak(9); // 备份上传地址
if(Check_ZB_ZJ_ADD(13)==0)
ZB_485(Command_Sign_H,Command_Sign_L);
else
{
if(Check_ZB_ZJ_ADD(10)==0)
{
ZB_down_frame(6); //无级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x01;
ZB_MOV_RE(0);
zb_send_c();
}
else
{
if(Check_ZB_ZJ_ADD(7)==0)
{
ZB_down_frame(3); //1级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x41;
ZB_ZJ1_frame(3); //1级中继下行数据组帧,填写中继表地址;
ZB_MOV_RE(3);
zb_send_c();
}
else
{
ZB_down_frame(0); //2级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x51;
ZB_ZJ2_frame(0); //2级中继下行数据组帧,填写中继表地址;
ZB_MOV_RE(6);
zb_send_c();
}
}
}
}
else if(Data_Control_sign==0x71) // 四级中继
{
ZJ_addr_bak(12); // 备份上传地址
if(Check_ZB_ZJ_ADD(16)==0) // 目的表为本地表号
ZB_485(Command_Sign_H,Command_Sign_L);
else // 目的表不是本地表号
{
if(Check_ZB_ZJ_ADD(13)==0) // 第4级中继表是本地表号
{
ZB_down_frame(9); //无级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x01;
ZB_MOV_RE(0);
zb_send_c();
}
else
{ // 第4级中继表不是本地表号
if(Check_ZB_ZJ_ADD(10)==0) // 第3级中继表是本地表号
{
ZB_down_frame(6); //1级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x41;
ZB_ZJ1_frame(6); //1级中继下行数据组帧,填写中继表表地址;
ZB_MOV_RE(3);
zb_send_c();
}
else
{
if(Check_ZB_ZJ_ADD(7)==0)
{
ZB_down_frame(3); //2级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x51;
ZB_ZJ2_frame(3); //2级中继下行数据组帧,填写中继表表地址;
ZB_MOV_RE(6);
zb_send_c();
}
else
{
ZB_down_frame(0); //3级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x61;
ZB_ZJ3_frame(); //3级中继下行数据组帧,填写中继表表地址;
ZB_MOV_RE(9);
zb_send_c();
}
}
}
}
}
else if((Data_Control_sign==0x81)||(Data_Control_sign==0x84)||(Data_Control_sign==0xC4)||(Data_Control_sign==0xC1)) //由从站发出的应答帧
{
HW_ZB=0;
if(ZJ_SEND==0x55) //判断是否本机有载波中继数据下发
{
ZJ_SEND=0x00; // 中继下发标志
Send_Carrier_buf[0]=ZJ_Add_buf[0]; //中继地址
Send_Carrier_buf[1]=ZJ_Add_buf[1];
Send_Carrier_buf[2]=ZJ_Add_buf[2];
for(i=3; i<(Carrier_buf_bak[4]+5); i++)
{
Send_Carrier_buf[i]=Carrier_buf_bak[i];
}
ZB_Glob_Len=Carrier_buf_bak[4]+5;
zb_send_c();
}
}
else if(Data_Control_sign==0x04) // 写数据处理
{
ZJ_addr_bak(0); // 备份中继上传地址
write_meter(0);
}
else if(Data_Control_sign==0x44) //有中继1
{
ZJ_addr_bak(3); // 备份中继上传地址
if(Check_ZB_ZJ_ADD(7)==0) //判断目标地址在16中否?
write_meter(3);
else
{
ZB_down_frame(0); //无级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x04; //命令为读命令
ZB_MOV_WR(0,0);
zb_send_c();
}
}
else if(Data_Control_sign==0x54) //2级中继
{
ZJ_addr_bak(6); // 备份上传地址
if(Check_ZB_ZJ_ADD(10)==0) //目的地址在16个中
write_meter(6);
else
{
if(Check_ZB_ZJ_ADD(7)==0) //2级地址在16个中
{
ZB_down_frame(3); //无级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x04;
ZB_MOV_WR(3,0);
zb_send_c();
}
else //2级地址不在16个中
{
ZB_down_frame(0); //1级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x44;
ZB_ZJ1_frame(0); //1级中继下行数据组帧,填写中继表表地址;
ZB_MOV_WR(3,3);
zb_send_c();
}
}
}
else if(Data_Control_sign==0x64) //3级
{
ZJ_addr_bak(9); // 备份上传地址
if(Check_ZB_ZJ_ADD(13)==0)
write_meter(9);
else
{
if(Check_ZB_ZJ_ADD(10)==0)
{
ZB_down_frame(6); //无级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x04;
ZB_MOV_WR(6,0);
zb_send_c();
}
else
{
if(Check_ZB_ZJ_ADD(7)==0)
{
ZB_down_frame(3); //1级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x44;
ZB_ZJ1_frame(3); //1级中继下行数据组帧,填写中继表表地址;
ZB_MOV_WR(6,3);
zb_send_c();
}
else
{
ZB_down_frame(0); //2级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x54;
ZB_ZJ2_frame(0); //2级中继下行数据组帧,填写中继表表地址;
ZB_MOV_WR(6,6);
zb_send_c();
}
}
}
}
else if(Data_Control_sign==0x74) // 四级中继
{
ZJ_addr_bak(12); // 备份上传地址
if(Check_ZB_ZJ_ADD(16)==0) // 目的表为本地表号
write_meter(12);
else // 目的表不是本地表号
{
if(Check_ZB_ZJ_ADD(13)==0) // 第4级中继表是本地表号
{
ZB_down_frame(9); //无级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x04;
ZB_MOV_WR(9,0);
zb_send_c();
}
else
{ // 第4级中继表不是本地表号
if(Check_ZB_ZJ_ADD(10)==0) // 第3级中继表是本地表号
{
ZB_down_frame(6); //1级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x44;
ZB_ZJ1_frame(6); //1级中继下行数据组帧,填写中继表表地址;
ZB_MOV_WR(9,3);
zb_send_c();
}
else
{
if(Check_ZB_ZJ_ADD(7)==0)
{
ZB_down_frame(3); //2级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x54;
ZB_ZJ2_frame(3); //2级中继下行数据组帧,填写中继表表地址;
ZB_MOV_WR(9,6);
zb_send_c();
}
else
{
ZB_down_frame(0); //3级中继下行数据组帧,填写下行表地址;
Send_Carrier_buf[3]=0x64;
ZB_ZJ3_frame(); //3级中继下行数据组帧,填写中继表表地址;
ZB_MOV_WR(9,9);
zb_send_c();
}
}
}
}
}
}
/**************************************************************************************
*
* FUNCTION: RS485_Design_Prog
*
* DESCRIPTION: RS485规约数据处理
*
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void RS485_Design_Prog()
{
uchar i;
uchar j;
if(HW_ZB=='H') //红外读表数据
{
j=RS485_buf_bak[9]+12;
for(i=0; i<j; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -