Files
HBshuiwuConcentrator/shuangjia/sjrecv.c
2025-12-15 16:07:49 +08:00

290 lines
6.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//#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<num;i++)
{
metertable_add(&pp[2],0);
pp = pp + 10;
}
metertable_write();
concent_send_uart(q,len);
return true;
}
break;
case 0x96: //10.上报回应
{
rp_recvack();
return true;
}
break;
case 0x88: //10.修改ip
{
//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
//68 55 01 55 01 68 40 07 55 00 08 00 88 73 00 00 01 00 00 78 4C E5 35 DC 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 4D 4E 45 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F1 16
//comm_04F3_param.primary.ip1 = ip1[0];
//comm_04F3_param.primary.ip2 = ip1[1];
//comm_04F3_param.primary.ip3 = ip1[2];
//comm_04F3_param.primary.ip4 = ip1[3];
//comm_04F3_param.primary.port = port1;
comm_04F3_param.reserve.ip1 = p[19];
comm_04F3_param.reserve.ip2 = p[20];
comm_04F3_param.reserve.ip3 = p[21];
comm_04F3_param.reserve.ip4 = p[22];
comm_04F3_param.reserve.port = (p[24]<<8)|p[23];
ipport_write();
ipport_init();
sj_frame_ack(q,&len,0x88);
concent_send_uart(q,len);
//rp_recvack();
return true;
}
break;
case 0x9E: //11.透明传输
{
//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 9E 74 00 00 01 00 1B 16
amt_task(p);
amt_frame_data(q,&len, smt_get_val(),smt_get_len());
concent_send_uart(q,len);
return true;
}
break;
}
return false;
}