河北水利局项目

This commit is contained in:
2025-12-15 16:07:49 +08:00
commit f11a7c2b95
1146 changed files with 452892 additions and 0 deletions

289
shuangjia/sjrecv.c Normal file
View File

@@ -0,0 +1,289 @@
//#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;
}