|
|
@@ -12,6 +12,43 @@
|
|
|
#include "time.h"
|
|
|
#include "snmp.h"
|
|
|
|
|
|
+#define SECOND_MIL 400
|
|
|
+
|
|
|
+enum
|
|
|
+{
|
|
|
+ STR_POWER_ID_OVER,
|
|
|
+ STR_POWER_ID_MAXS,
|
|
|
+ STR_POWER_ID_MIN,
|
|
|
+ STR_POWER_ID_VOL,
|
|
|
+ STR_POWER_ID_CUR,
|
|
|
+ STR_POWER_ID_POWER,
|
|
|
+ STR_POWER_ID_CONSUMER,
|
|
|
+ STR_POWER_ID_MAX
|
|
|
+};
|
|
|
+
|
|
|
+const char *lang_power_str[2][STR_POWER_ID_MAX]={
|
|
|
+ {
|
|
|
+ "超过",
|
|
|
+ "最大",
|
|
|
+ "最小",
|
|
|
+ "电压",
|
|
|
+ "电流",
|
|
|
+ "功率",
|
|
|
+ "耗电量",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "over",
|
|
|
+ "max",
|
|
|
+ "min",
|
|
|
+ "voltage",
|
|
|
+ "current",
|
|
|
+ "power",
|
|
|
+ "consumer",
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
extern AlarmTrapinfo data;
|
|
|
|
|
|
#define LIMIT_HOF(x) (x*1.1f)
|
|
|
@@ -449,9 +486,9 @@ static int total_proc(power_handle_t *h)
|
|
|
tmp[k].consump += (h->pch[i]->power[k].consump/1000.0);
|
|
|
tmp[k].voltage = (tmp[k].voltage > h->pch[i]->power[k].voltage/10.0 ) ? tmp[k].voltage : h->pch[i]->power[k].voltage/10.0;
|
|
|
tmp[k].current += ( h->pch[i]->power[k].current/10.0);
|
|
|
- tmp[k].power += chn_total_p;
|
|
|
- tmp[k].active += h->pch[i]->power[k].power/1000.0;
|
|
|
- tmp[k].reactive += (chn_total_p-(h->pch[i]->power[k].power/1000.0));
|
|
|
+ tmp[k].power += h->pch[i]->power[k].power/1000.0;
|
|
|
+ tmp[k].reactive += chn_total_p;
|
|
|
+ tmp[k].active +=(chn_total_p-(h->pch[i]->power[k].power/1000.0));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -493,12 +530,15 @@ static int total_proc(power_handle_t *h)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
-static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
+
|
|
|
+
|
|
|
+static int board_read(power_handle_t *h, board_data_t *pbrd,uint8_t flag)
|
|
|
{
|
|
|
int i,j,r=-1;
|
|
|
power_t *pwr,power;
|
|
|
uint16_t offset,tmp[144];
|
|
|
power_ch_t *pch=NULL;
|
|
|
+ uint8_t lang = paras_get()->sys.lang;
|
|
|
|
|
|
lock_on(h->lck);
|
|
|
if(pbrd) {
|
|
|
@@ -507,8 +547,9 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
case AC_SINGLE_S_TYPE:
|
|
|
case AC_SINGLE_B_TYPE:
|
|
|
{
|
|
|
- uint32_t val;
|
|
|
-
|
|
|
+
|
|
|
+ uint32_t val;
|
|
|
+
|
|
|
offset = POWER_AC_CUR_INFO_L;
|
|
|
r = read_reg(h, pbrd->addr, offset, tmp, pbrd->chs*12);
|
|
|
if (r<0) {
|
|
|
@@ -516,7 +557,8 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
for (i=0; i<pbrd->chs; i++) {
|
|
|
int idx = i * 12;
|
|
|
pwr = &pbrd->pch[i].power[0];
|
|
|
@@ -549,11 +591,12 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", pbrd->addr, offset, offset, pbrd->chs);
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
for (i=0; i<pbrd->chs; i++) {
|
|
|
pch = &pbrd->pch[i];
|
|
|
//pch->power[0].status = tmp[i] & (0x01);
|
|
|
pch->status = tmp[i] & (0x01);
|
|
|
+ time_t t=time(NULL);
|
|
|
uint8_t old_v_upper = pch->alarm.v_upper;
|
|
|
uint8_t old_v_lower = pch->alarm.v_lower;
|
|
|
uint8_t old_c_upper = pch->alarm.c_upper;
|
|
|
@@ -568,14 +611,17 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
|
|
|
waning_info_t info= {0};
|
|
|
info.type = ALARM_TYPE_POWER;
|
|
|
- time_t t=time(NULL);
|
|
|
+
|
|
|
struct tm *tm=localtime(&t);
|
|
|
if(!old_v_upper && pch->alarm.v_upper)
|
|
|
{
|
|
|
|
|
|
memset(&info.waning_context,0,sizeof(64));
|
|
|
sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
|
|
|
- sprintf(info.waning_context,"%s over max voltage",pch->info.name);
|
|
|
+ sprintf(info.waning_context,"%s %s %s %s!",pch->info.name,
|
|
|
+ lang_power_str[lang][STR_POWER_ID_OVER],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_MAXS],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_VOL]);
|
|
|
wanning_insert(info);
|
|
|
|
|
|
if(paras_get()->snmp.trapmode == 1)
|
|
|
@@ -596,7 +642,10 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
{
|
|
|
memset(&info.waning_context,0,sizeof(64));
|
|
|
sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
|
|
|
- sprintf(info.waning_context,"%s over min voltage",pch->info.name);
|
|
|
+ sprintf(info.waning_context,"%s %s %s %s!",pch->info.name,
|
|
|
+ lang_power_str[lang][STR_POWER_ID_OVER],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_MIN],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_VOL]);
|
|
|
wanning_insert(info);
|
|
|
if(paras_get()->snmp.trapmode == 1)
|
|
|
{
|
|
|
@@ -615,7 +664,10 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
{
|
|
|
memset(&info.waning_context,0,sizeof(64));
|
|
|
sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
|
|
|
- sprintf(info.waning_context,"%s over max current",pch->info.name);
|
|
|
+ sprintf(info.waning_context,"%s %s %s %s!",pch->info.name,
|
|
|
+ lang_power_str[lang][STR_POWER_ID_OVER],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_MAXS],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_CUR]);
|
|
|
wanning_insert(info);
|
|
|
beep_set(1);
|
|
|
if(paras_get()->snmp.trapmode == 1)
|
|
|
@@ -634,7 +686,10 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
{
|
|
|
memset(&info.waning_context,0,sizeof(64));
|
|
|
sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
|
|
|
- sprintf(info.waning_context,"%s over max power",pch->info.name);
|
|
|
+ sprintf(info.waning_context,"%s %s %s %s!",pch->info.name,
|
|
|
+ lang_power_str[lang][STR_POWER_ID_OVER],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_MAXS],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_POWER]);
|
|
|
wanning_insert(info);
|
|
|
beep_set(1);
|
|
|
if(paras_get()->snmp.trapmode == 1)
|
|
|
@@ -653,7 +708,10 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
{
|
|
|
memset(&info.waning_context,0,sizeof(64));
|
|
|
sprintf(info.date, "%04d%/%02d/%02d %2d:%2d:%2d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday,tm->tm_hour, tm->tm_min, tm->tm_sec);
|
|
|
- sprintf(info.waning_context,"%s over max consumer",pch->info.name);
|
|
|
+ sprintf(info.waning_context,"%s %s %s %s!",pch->info.name,
|
|
|
+ lang_power_str[lang][STR_POWER_ID_OVER],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_MAXS],
|
|
|
+ lang_power_str[lang][STR_POWER_ID_CONSUMER]);
|
|
|
wanning_insert(info);
|
|
|
beep_set(1);
|
|
|
if(paras_get()->snmp.trapmode == 1)
|
|
|
@@ -667,52 +725,79 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
|
|
|
snmp_power_alarm_trap(&data);
|
|
|
}
|
|
|
}
|
|
|
- //pch->alarm.ph_loss = 0;
|
|
|
- }
|
|
|
-
|
|
|
- offset = POWER_AC_BREAKER_INFO;
|
|
|
- r = read_reg(h, pch->info.addr, offset, tmp, 1);
|
|
|
- if (r < 0) {
|
|
|
- LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", pbrd->addr, offset, offset, pbrd->chs);
|
|
|
- break;
|
|
|
- }
|
|
|
- pbrd->brk[0].samp.sw = (tmp[0]&BIT(0))?1:0;
|
|
|
- // pbrd->brk[0].samp.time = tm;
|
|
|
- pbrd->brk[1].samp.sw = (tmp[0]&BIT(1))?1:0;
|
|
|
- // pbrd->brk[1].samp.time = tm;
|
|
|
|
|
|
- uint16_t buffer[16] = {0};
|
|
|
+ }
|
|
|
|
|
|
- for (i=0; i<pbrd->chs; i++) {
|
|
|
- pch = &pbrd->pch[i];
|
|
|
- offset = POWER_AC_THRESHOLD_L+i*16;
|
|
|
- r = read_reg(h, pch->info.addr, offset, buffer, 16);
|
|
|
- if(r) break;
|
|
|
-
|
|
|
- pch->thr.v_upper = ((buffer[1]<<16)|buffer[0])/100;
|
|
|
- pch->thr.v_lower = ((buffer[3]<<16)|buffer[2])/100;
|
|
|
- pch->thr.c_upper = ((buffer[5]<<16)|buffer[4])/100;
|
|
|
- pch->thr.p_upper = ((buffer[9]<<16)|buffer[8]);
|
|
|
- pch->thr.w_upper = ((buffer[13]<<16)|buffer[12]);
|
|
|
- }
|
|
|
- //read channel delay
|
|
|
- memset(buffer,0,16);
|
|
|
- offset = POWER_AC_OPEN_DELAY_TIME_L;
|
|
|
- r =read_reg(h, pch->info.addr, offset, buffer, pbrd->chs);
|
|
|
- for(int i = 0; i < pbrd->chs;i++)
|
|
|
+ if(flag)
|
|
|
{
|
|
|
- pch = &pbrd->pch[i];
|
|
|
- pch->info.open_delay = buffer[i] / 1000;
|
|
|
+ offset = POWER_AC_BREAKER_INFO;
|
|
|
+ r = read_reg(h, pch->info.addr, offset, tmp, 1);
|
|
|
+ if (r < 0) {
|
|
|
+ LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", pbrd->addr, offset, offset, pbrd->chs);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ pbrd->brk[0].samp.sw = (tmp[0]&BIT(0))?1:0;
|
|
|
+ pbrd->brk[1].samp.sw = (tmp[0]&BIT(1))?1:0;
|
|
|
+
|
|
|
+ if(pbrd->chs < 8)
|
|
|
+ {
|
|
|
+ offset = POWER_AC_THRESHOLD_L;
|
|
|
+ r = read_reg(h, pch->info.addr, offset, tmp, pbrd->chs * 16);
|
|
|
+ if(r) break;
|
|
|
+ for (i=0; i<pbrd->chs; i++) {
|
|
|
+ pch = &pbrd->pch[i];
|
|
|
+ pch->thr.v_upper = ((tmp[1]<<16)|tmp[0])/100;
|
|
|
+ pch->thr.v_lower = ((tmp[3]<<16)|tmp[2])/100;
|
|
|
+ pch->thr.c_upper = ((tmp[5]<<16)|tmp[4])/100;
|
|
|
+ pch->thr.p_upper = ((tmp[9]<<16)|tmp[8]);
|
|
|
+ pch->thr.w_upper = ((tmp[13]<<16)|tmp[12]);
|
|
|
+ }
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ offset = POWER_AC_THRESHOLD_L;
|
|
|
+ r = read_reg(h, pch->info.addr, offset, tmp, 7 * 16);
|
|
|
+ if(r) break;
|
|
|
+ for (i=0; i< 7; i++) {
|
|
|
+ pch = &pbrd->pch[i];
|
|
|
+ pch->thr.v_upper = ((tmp[1]<<16)|tmp[0])/100;
|
|
|
+ pch->thr.v_lower = ((tmp[3]<<16)|tmp[2])/100;
|
|
|
+ pch->thr.c_upper = ((tmp[5]<<16)|tmp[4])/100;
|
|
|
+ pch->thr.p_upper = ((tmp[9]<<16)|tmp[8]);
|
|
|
+ pch->thr.w_upper = ((tmp[13]<<16)|tmp[12]);
|
|
|
+ }
|
|
|
+ offset = POWER_AC_THRESHOLD_L + (16*7);
|
|
|
+
|
|
|
+ r = read_reg(h, pch->info.addr, offset, tmp, (pbrd->chs-7) * 16);
|
|
|
+ for (i=0; i< (pbrd->chs-7); i++) {
|
|
|
+ pch = &pbrd->pch[i+7];
|
|
|
+ pch->thr.v_upper = ((tmp[1]<<16)|tmp[0])/100;
|
|
|
+ pch->thr.v_lower = ((tmp[3]<<16)|tmp[2])/100;
|
|
|
+ pch->thr.c_upper = ((tmp[5]<<16)|tmp[4])/100;
|
|
|
+ pch->thr.p_upper = ((tmp[9]<<16)|tmp[8]);
|
|
|
+ pch->thr.w_upper = ((tmp[13]<<16)|tmp[12]);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ offset = POWER_AC_OPEN_DELAY_TIME_L;
|
|
|
+ r =read_reg(h, pch->info.addr, offset, tmp, pbrd->chs);
|
|
|
+ for(int i = 0; i < pbrd->chs;i++)
|
|
|
+ {
|
|
|
+ pch = &pbrd->pch[i];
|
|
|
+ pch->info.open_delay = tmp[i] / 1000;
|
|
|
+ }
|
|
|
+ offset = POWER_AC_CLOSE_DELAY_TIME_L;
|
|
|
+ r =read_reg(h, pch->info.addr, offset, tmp, pbrd->chs);
|
|
|
+
|
|
|
+
|
|
|
+ for(int i = 0; i < pbrd->chs;i++)
|
|
|
+ {
|
|
|
+ pch = &pbrd->pch[i];
|
|
|
+ pch->info.close_delay = tmp[i] / 1000;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- memset(buffer,0,16);
|
|
|
- offset = POWER_AC_CLOSE_DELAY_TIME_L;
|
|
|
- r =read_reg(h, pch->info.addr, offset, buffer, pbrd->chs);
|
|
|
- for(int i = 0; i < pbrd->chs;i++)
|
|
|
- {
|
|
|
- pch = &pbrd->pch[i];
|
|
|
- pch->info.close_delay = buffer[i] / 1000;
|
|
|
- }
|
|
|
+
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -1080,32 +1165,40 @@ static int power_copy(power_handle_t *h)
|
|
|
}
|
|
|
|
|
|
|
|
|
+static uint32_t count = 0;
|
|
|
|
|
|
static int board_query(power_handle_t *h)
|
|
|
{
|
|
|
int i,r;
|
|
|
-
|
|
|
- time_t t=time(NULL);
|
|
|
- //printf("....................%ld\n",(uint32_t)t);
|
|
|
- for(i=0; i<h->brd_max; i++) {
|
|
|
- r = board_read(h, h->pbrd[i]);
|
|
|
+ count++;
|
|
|
+ uint8_t flag = 0;
|
|
|
+ if(count == SECOND_MIL)
|
|
|
+ {
|
|
|
+ flag =1;
|
|
|
+ count = 0;
|
|
|
+ }
|
|
|
+ for(i=1; i<(h->cnt+1); i++) {
|
|
|
+ r = board_read(h, h->pbrd[i],flag);
|
|
|
}
|
|
|
total_proc(h);
|
|
|
power_copy(h);
|
|
|
- t=time(NULL);
|
|
|
- //printf("____________________%ld\n",(uint32_t)t);
|
|
|
+ usleep(10000);
|
|
|
+
|
|
|
return r;
|
|
|
}
|
|
|
+
|
|
|
+//rt_tick_t start_tick = 0;
|
|
|
+
|
|
|
static void power_thread(void *arg)
|
|
|
{
|
|
|
int r;
|
|
|
board_data_t *pbrd=NULL;
|
|
|
thread_handle_t *th=(thread_handle_t*)arg;
|
|
|
power_handle_t *h=(power_handle_t*)th->attr->arg;;
|
|
|
+
|
|
|
|
|
|
while(th->quit==0) {
|
|
|
- board_query(h);
|
|
|
- usleep(300000);
|
|
|
+ board_query(h);
|
|
|
}
|
|
|
}
|
|
|
|