290 lines
6.4 KiB
C
290 lines
6.4 KiB
C
//#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;
|
||
}
|
||
|