//#include "stdafx.h" #include "sjframe.h" #include "metertable.h" #include "meterseltable.h" #include "rptime.h" extern void rp_recvack(); extern u8 * get_uart_send(); extern void sj_frame_data_ack(u8 * val,u16 * len,u8 * meter,u8 * data); extern void controlkeyaddr(u8 *str1,u8 val); extern void simul_plc_rx_addr(u8 *str1); extern void metertable_add(const u8 * addr,const u8 type); extern void metertable_write(); extern void ClearMeterInfo(); extern bool get_dl_task_state(); extern void dl_start(); extern void ClearMeterInfo_realdl( void ); extern void ctl_start(u8 flag); extern afn04_F3_st comm_04F3_param; extern void ctl_sel_start(u8 flag); extern void dl_task_set_rp(); extern void mbus_master_tx_begin(); extern u8 smt_get_len(); extern u8 * smt_get_val(); extern void amt_task(u8 * val); extern void concent_send_uart(u8 * val,u16 len); extern void amt_frame_data(u8 * val,u16 * len,u8 * amtval,u8 amtlen); extern u8 sj_get_recvser(); void control_key_ack(u8 key) { u16 len = 0; u8 * q = get_uart_send(); sj_frame_ack(q,&len,key); concent_send_uart(q,len); } void sj_data_ack(u8 * meter,u8 * data) { u16 len = 0; u8 * q = get_uart_send(); sj_frame_data_ack(q,&len,meter,data); concent_send_uart(q,len); } ////////////////////////////////////////////////// static bool is_ctl_flag = false; static u16 is_ctl_count = 0; u8 ctladdr[7]; u8 ctlflag = 0; void sj_ctl_process() { if(is_ctl_flag) { is_ctl_count++; if(is_ctl_count>6) { is_ctl_flag = false; is_ctl_count = 0; // printf("等待多个点开关阀时间到\r\n"); ctl_sel_start(ctlflag); } } } bool sj_frame_recv(u8 * val,u16 vallen) { u8 * p = val; //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //68 71 00 71 00 68 40 12 34 56 78 00 93 71 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 59 16 u8 fn = p[12]; u8 * q = get_uart_send(); u16 len = 0; sj_set_recvser(p[13]); switch(fn) { default: break; case 0x93: //1.集中器初始化 { metertable_init(); metertable_write(); sj_frame_ack(q,&len,0x93); concent_send_uart(q,len); return true; } break; case 0x8C: //2.上报时间 { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //68 8D 00 8D 00 68 40 07 55 00 08 00 8C 72 00 00 01 00 81 05 04 02 25 10 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7D 16 // rptime_set(&p[18]); rptime_write(); sj_frame_ack(q,&len,0x8C); concent_send_uart(q,len); return true; } break; case 0x81: //3.关阀 { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 //68 99 00 99 00 68 40 12 34 56 78 00 81 71 00 00 01 00 00 00 00 96 25 10 08 19 00 00 00 00 00 00 00 AA 00 00 00 00 00 00 00 00 00 00 DD 16 control_key_ack(0x81); ctlflag = METER_CLOSE; is_ctl_flag = true; is_ctl_count = 0; meterseltable_add(&p[21],METER_CLOSE); return true; } break; case 0x82: //4.开阀 { control_key_ack(0x82); ctlflag = METER_OPEN; is_ctl_flag = true; is_ctl_count = 0; meterseltable_add(&p[21],METER_OPEN); return true; } break; case 0x84: //5.单个抄表 { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //68 55 00 55 00 68 40 12 34 56 78 00 84 71 00 00 01 00 00 01 00 59 02 81 90 11 11 D9 16 //sj_frame_ack(q,&len,0x82); //concent_send_uart(q,len); //清除数据 ClearMeterInfo_realdl(); //因为涉及到延长30秒,特地加这个。 mbus_master_tx_begin(); simul_plc_rx_addr(&p[21]); return true; } break; case 0x9D: //6.集抄 { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //68 31 00 31 00 68 40 12 34 56 78 00 9D 71 00 00 01 00 63 16 // 5秒后启动定时上报 sj_frame_ack(q,&len,0x9D); concent_send_uart(q,len); //不仅抄表还需要上报 dl_task_set_rp(); dl_start(); return true; } case 0x51: //7.批量关阀 { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //68 31 00 31 00 68 40 12 34 56 78 00 51 73 00 00 01 00 19 16 // 批量关阀 sj_frame_ack(q,&len,0x51); concent_send_uart(q,len); ctl_start(METER_CLOSE); return true; } break; case 0x52: //8.批量开阀 { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //68 31 00 31 00 68 40 12 34 56 78 00 52 74 00 00 01 00 1B 16 // 批量开阀 sj_frame_ack(q,&len,0x52); concent_send_uart(q,len); ctl_start(METER_OPEN); return true; } break; case 0x85: //9.下发档案 { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // 68 40 12 34 56 78 00 85 71 00 00 01 00 02 00 //01 00 48 20 10 08 19 00 00 01 //02 00 96 25 10 08 19 00 00 01 //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D7 16 // 批量开阀 sj_frame_ack(q,&len,0x85); // u8 num = p[18]; u8 * pp = &p[20]; for(u8 i = 0;i