|
|
|
@ -17,6 +17,18 @@
|
|
|
|
|
#define LOG_TAG "sjzd"
|
|
|
|
|
#include "sjzd.h"
|
|
|
|
|
#include "elog.h"
|
|
|
|
|
#include "scl_shm.h"
|
|
|
|
|
#include "iec61850_process.h"
|
|
|
|
|
#include "string.h"
|
|
|
|
|
#include "sys/stat.h"
|
|
|
|
|
#include "unistd.h"
|
|
|
|
|
#include "fcntl.h"
|
|
|
|
|
#include "stdlib.h"
|
|
|
|
|
#include "stdio.h"
|
|
|
|
|
#include "modbus_rtu_slave.h"
|
|
|
|
|
#include "single_Amp_Extra.h"
|
|
|
|
|
|
|
|
|
|
extern uint8_t dev_par[18];
|
|
|
|
|
//2.通讯协议AA+addr(1byte)+data_len(2bytes)+data(n)+crc_val(2byte)+0x55
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
@ -36,6 +48,8 @@
|
|
|
|
|
* Note(s) : none.
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t sjzd_make_frm(uint8_t *enc_buf,uint8_t slave_addr,uint8_t cmd,uint8_t *data,uint16_t data_len)
|
|
|
|
|
{
|
|
|
|
|
int i=0;
|
|
|
|
@ -71,42 +85,47 @@ int32_t sjzd_make_frm(uint8_t *enc_buf,uint8_t slave_addr,uint8_t cmd,uint8_t *d
|
|
|
|
|
|
|
|
|
|
int32_t sjzd_chk_frm(uint8_t *buf,uint16_t len,uint8_t slave_addr,uint8_t cmd)
|
|
|
|
|
{
|
|
|
|
|
uint8_t crc_val[2];
|
|
|
|
|
uint16_t i;
|
|
|
|
|
uint16_t rx_len;
|
|
|
|
|
if(buf[0]!=0xAA)
|
|
|
|
|
{
|
|
|
|
|
memcpy(&buf[0],&buf[1],len-1);
|
|
|
|
|
uint8_t crc_val[2];
|
|
|
|
|
uint16_t rx_len;
|
|
|
|
|
|
|
|
|
|
if(buf[0]!=0xAA)
|
|
|
|
|
{
|
|
|
|
|
return FRM_ERR_START;
|
|
|
|
|
memcpy(&buf[0],&buf[1],len-1);
|
|
|
|
|
if(buf[0]!=0xAA)
|
|
|
|
|
{
|
|
|
|
|
log_e("chk:buf[0]=%02X, !=0xAA error!",buf[0]);
|
|
|
|
|
return FRM_ERR_START;
|
|
|
|
|
}
|
|
|
|
|
len-=1;
|
|
|
|
|
}
|
|
|
|
|
len-=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(buf[1]!=slave_addr)//
|
|
|
|
|
if(buf[1]!=slave_addr)//
|
|
|
|
|
{
|
|
|
|
|
log_e("chK:buf[1]=%d, slave_addr=%d error!",buf[1], slave_addr);
|
|
|
|
|
return FRM_ERR_SLAVE_ADDR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rx_len=(uint16_t)buf[3]*256+buf[2];
|
|
|
|
|
rx_len=(uint16_t)buf[3]*256+buf[2];
|
|
|
|
|
if((rx_len+6)>len)
|
|
|
|
|
{
|
|
|
|
|
log_e("chk:b2+b3*256+6=%d, recvlen=%d error!",rx_len+6, len);
|
|
|
|
|
return FRM_ERR_BYTE_COUNT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if((rx_len+6)>len)
|
|
|
|
|
{
|
|
|
|
|
return FRM_ERR_BYTE_COUNT;
|
|
|
|
|
}
|
|
|
|
|
if(buf[4]!=cmd)//
|
|
|
|
|
{
|
|
|
|
|
log_e("chk:buf[4]=%d, cmd=%d error!",buf[4], cmd);
|
|
|
|
|
return FRM_ERR_FC;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(buf[4]!=cmd)//
|
|
|
|
|
{
|
|
|
|
|
return FRM_ERR_FC;
|
|
|
|
|
}
|
|
|
|
|
crc16_ex(buf,rx_len+4,crc_val);//
|
|
|
|
|
|
|
|
|
|
crc16_ex(buf,rx_len+4,crc_val);//
|
|
|
|
|
if((crc_val[0]==(buf[rx_len+4]))&&(crc_val[1]==(buf[rx_len+5])))
|
|
|
|
|
return FRM_ERR_NONE;
|
|
|
|
|
if((crc_val[0]==(buf[rx_len+5]))&&(crc_val[1]==(buf[rx_len+4])))
|
|
|
|
|
return FRM_ERR_NONE;
|
|
|
|
|
return FRM_ERR_CRC;
|
|
|
|
|
if((crc_val[0]==(buf[rx_len+4]))&&(crc_val[1]==(buf[rx_len+5])))
|
|
|
|
|
return FRM_ERR_NONE;
|
|
|
|
|
if((crc_val[0]==(buf[rx_len+5]))&&(crc_val[1]==(buf[rx_len+4])))
|
|
|
|
|
return FRM_ERR_NONE;
|
|
|
|
|
log_e("chk:buf[rx_len+4][rx_len+5]=%02X%02X,crc_val=%02X%02X error!",buf[rx_len+4], buf[rx_len+5], crc_val[0],crc_val[1]);
|
|
|
|
|
return FRM_ERR_CRC;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int32_t sjzd_swp_uint16(uint8_t *buf,uint32_t len)
|
|
|
|
@ -174,6 +193,7 @@ int32_t sjzd_reg_rd(uint8_t slave_node,uint32_t reg_addr,uint8_t *reg_tbl,uint32
|
|
|
|
|
|
|
|
|
|
//读应答,应答格式cmd+data
|
|
|
|
|
sjzd_serial_read(sjzd_rx_buf,nbr_reg+8,&sjzd_rx_len);
|
|
|
|
|
|
|
|
|
|
if(sjzd_rx_len<(nbr_reg+8))
|
|
|
|
|
{
|
|
|
|
|
ret=FRM_ERR_BYTE_COUNT;
|
|
|
|
@ -202,7 +222,7 @@ int32_t sjzd_reg_wr(uint8_t slave_node,uint32_t reg_addr,uint8_t *reg_tbl,uint32
|
|
|
|
|
uint8_t sjzd_rx_buf[FRM_MAX_LEN];
|
|
|
|
|
uint16_t sjzd_rx_len=0;
|
|
|
|
|
int32_t ret;
|
|
|
|
|
uint32_t i=0;
|
|
|
|
|
uint32_t i=0,m=0;
|
|
|
|
|
|
|
|
|
|
//发送请求命令reg_addr[4bytes]+reg_num[4bytes]+data
|
|
|
|
|
memcpy(&sjzd_rx_buf[i],®_addr,sizeof(uint32_t));
|
|
|
|
@ -212,7 +232,10 @@ int32_t sjzd_reg_wr(uint8_t slave_node,uint32_t reg_addr,uint8_t *reg_tbl,uint32
|
|
|
|
|
memcpy(&sjzd_rx_buf[i],reg_tbl,nbr_reg);
|
|
|
|
|
i+=nbr_reg;
|
|
|
|
|
sjzd_tx_len=sjzd_make_frm(sjzd_tx_buf,slave_node,SJZD_WR_REGS,(uint8_t *)sjzd_rx_buf,i);
|
|
|
|
|
|
|
|
|
|
sjzd_serial_write(sjzd_tx_buf,sjzd_tx_len);
|
|
|
|
|
// for(m=0;m<sjzd_tx_len;m++)
|
|
|
|
|
// log_d("sjzd_tx_buf[m]=0x%x",sjzd_tx_buf[m]);
|
|
|
|
|
|
|
|
|
|
if(slave_node==0xFF)
|
|
|
|
|
return FRM_ERR_NONE;
|
|
|
|
@ -256,8 +279,11 @@ static int32_t sjzd_read_file_info(uint8_t slave_node,char *in_file,int *info)
|
|
|
|
|
sjzd_serial_write(sjzd_tx_buf,sjzd_tx_len);
|
|
|
|
|
|
|
|
|
|
//读取应答
|
|
|
|
|
sjzd_serial_read(sjzd_rx_buf,4+1+4+2+2,&sjzd_rx_len);
|
|
|
|
|
if(sjzd_rx_len<13)
|
|
|
|
|
//sjzd_serial_read(sjzd_rx_buf,4+1+4+2+2,&sjzd_rx_len);
|
|
|
|
|
//if(sjzd_rx_len<13)
|
|
|
|
|
sjzd_serial_read(sjzd_rx_buf,4+1+4+2+1,&sjzd_rx_len);
|
|
|
|
|
// log_d("sjzd_rx_len = %d",sjzd_rx_len);
|
|
|
|
|
if(sjzd_rx_len<12)
|
|
|
|
|
{
|
|
|
|
|
//log_e("mb_rx_len=%d,mb_tx_len=%d",mb_rx_len,mb_tx_len);
|
|
|
|
|
ret= FRM_ERR_BYTE_COUNT;
|
|
|
|
@ -293,10 +319,13 @@ static int32_t sjzd_read_file_content(uint8_t slave_node,uint32_t ofs,uint8_t *b
|
|
|
|
|
sjzd_serial_write(sjzd_tx_buf,sjzd_tx_len);//发送命令
|
|
|
|
|
|
|
|
|
|
//读取应答
|
|
|
|
|
//sjzd_serial_read(sjzd_rx_buf,16+len,&sjzd_rx_len);
|
|
|
|
|
//if(sjzd_rx_len<16+len)
|
|
|
|
|
|
|
|
|
|
sjzd_serial_read(sjzd_rx_buf,8+len,&sjzd_rx_len);
|
|
|
|
|
if(sjzd_rx_len<8)
|
|
|
|
|
if(sjzd_rx_len<8+len)
|
|
|
|
|
{
|
|
|
|
|
//log_e("mb_rx_len=%d,mb_tx_len=%d",mb_rx_len,mb_tx_len);
|
|
|
|
|
log_e("read:sjzd_rx_len=%d ofs=%d",sjzd_rx_len, ofs);
|
|
|
|
|
ret= FRM_ERR_BYTE_COUNT;
|
|
|
|
|
goto EXIT;
|
|
|
|
|
}
|
|
|
|
@ -306,10 +335,11 @@ static int32_t sjzd_read_file_content(uint8_t slave_node,uint32_t ofs,uint8_t *b
|
|
|
|
|
//elog_hexdump("modbus_rx",16,mb_rx_buf,mb_rx_len);
|
|
|
|
|
if(ret_len!=NULL)
|
|
|
|
|
*ret_len=sjzd_rx_len-8;
|
|
|
|
|
memcpy(buf,&sjzd_rx_buf[5],sjzd_rx_len-8);
|
|
|
|
|
return FRM_ERR_NONE;
|
|
|
|
|
}
|
|
|
|
|
EXIT:
|
|
|
|
|
log_e("%d",ret);
|
|
|
|
|
log_e("%d sjzd_rx_len=%d",ret, sjzd_rx_len);
|
|
|
|
|
if(sjzd_rx_len)
|
|
|
|
|
elog_hexdump("sjzd_read_file_content",16,sjzd_rx_buf,sjzd_rx_len);
|
|
|
|
|
return ret;
|
|
|
|
@ -343,7 +373,6 @@ static int32_t sjzd_read_file_end(uint8_t slave_node,char *in_file)
|
|
|
|
|
return FRM_ERR_NONE;
|
|
|
|
|
}
|
|
|
|
|
EXIT:
|
|
|
|
|
log_e("%d",ret);
|
|
|
|
|
if(sjzd_rx_len)
|
|
|
|
|
elog_hexdump("sjzd_read_file_end",16,sjzd_rx_buf,sjzd_rx_len);
|
|
|
|
|
return ret;
|
|
|
|
@ -374,7 +403,7 @@ int32_t sjzd_file_rd(uint8_t slave_node,char *in_file,char *out_file)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//分配缓冲区
|
|
|
|
|
file_content=(uint8_t *)malloc(file_tot_len);
|
|
|
|
|
file_content=(uint8_t *)malloc(file_tot_len);
|
|
|
|
|
if(file_content==NULL)
|
|
|
|
|
{
|
|
|
|
|
log_e("alloc file buf failed");
|
|
|
|
@ -405,6 +434,7 @@ int32_t sjzd_file_rd(uint8_t slave_node,char *in_file,char *out_file)
|
|
|
|
|
}
|
|
|
|
|
}while(i<file_tot_len);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//保存文件
|
|
|
|
|
ret=save_to_file(out_file,0,file_content,file_tot_len);//返回保存的长度
|
|
|
|
|
|
|
|
|
@ -423,3 +453,541 @@ EXIT:
|
|
|
|
|
free(file_content);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SJZD_file_analysis_nodata(uint8_t slave_addr)
|
|
|
|
|
{
|
|
|
|
|
USR_MV tmp1,tmp2,tmp3;
|
|
|
|
|
USR_MV fft_value[19];
|
|
|
|
|
char k;
|
|
|
|
|
char m;
|
|
|
|
|
char n;
|
|
|
|
|
switch(slave_addr)
|
|
|
|
|
{
|
|
|
|
|
case 1:
|
|
|
|
|
tmp1.v.f=0;
|
|
|
|
|
tmp1.q = 1;
|
|
|
|
|
tmp1.t.secs=time(NULL);
|
|
|
|
|
tmp1.t.ms = tmp1.t.secs*1000;
|
|
|
|
|
lock_scl_mem();
|
|
|
|
|
for(k=0;k<15;k++)
|
|
|
|
|
{
|
|
|
|
|
put_mv_data(0,k*46+19,&tmp1,1);
|
|
|
|
|
put_mv_data(0,k*46+20,&tmp1,1);
|
|
|
|
|
}
|
|
|
|
|
unlock_scl_mem();
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
for(m=0;m<6;m++)
|
|
|
|
|
{
|
|
|
|
|
for(n=0;n<19;n++)
|
|
|
|
|
{
|
|
|
|
|
fft_value[n].v.f=0;
|
|
|
|
|
fft_value[n].q=0;
|
|
|
|
|
fft_value[n].t.secs=time(NULL);
|
|
|
|
|
fft_value[n].t.ms = fft_value[n].t.secs*1000;
|
|
|
|
|
sjzd_modbus_data[21+19*m+n]=0;//单位换算为g,保留两位小数
|
|
|
|
|
}
|
|
|
|
|
put_mv_data(0,m*46,fft_value,19);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
for(m=6;m<12;m++)
|
|
|
|
|
{
|
|
|
|
|
for(n=0;n<19;n++)
|
|
|
|
|
{
|
|
|
|
|
fft_value[n].v.f=0;
|
|
|
|
|
fft_value[n].q=0;
|
|
|
|
|
fft_value[n].t.secs=time(NULL);
|
|
|
|
|
fft_value[n].t.ms = fft_value[n].t.secs*1000;
|
|
|
|
|
sjzd_modbus_data[21+19*m+n]=0;//单位换算为g,保留两位小数
|
|
|
|
|
}
|
|
|
|
|
put_mv_data(0,m*46,fft_value,19);
|
|
|
|
|
for(n=0;n<7;n++)
|
|
|
|
|
sjzd_modbus_data[135+7*m+n]=0;//单位换算为g,保留两位小数
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
log_d("default");
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SJZD_file_analysis(uint8_t slave_addr,char *curr_file,float sensor_range)
|
|
|
|
|
{
|
|
|
|
|
uint8_t buf[160*1024];
|
|
|
|
|
int16_t data[8][10240];
|
|
|
|
|
double dv0[10000];
|
|
|
|
|
int32_t ret;
|
|
|
|
|
float sum;
|
|
|
|
|
float num=0;
|
|
|
|
|
float noise=0;
|
|
|
|
|
float neu=0;
|
|
|
|
|
double code=0;
|
|
|
|
|
double amp_data[19];
|
|
|
|
|
float amp_temp[19];
|
|
|
|
|
int amp_size[2]={0,0};
|
|
|
|
|
int k,n,m;
|
|
|
|
|
FILE *fp;
|
|
|
|
|
LN_SVBR_TYPE ln_svbr;
|
|
|
|
|
USR_MV tmp1,tmp2,tmp3;
|
|
|
|
|
USR_MV fft_value[19];
|
|
|
|
|
memset(&tmp1, 0x00, sizeof(USR_MV));
|
|
|
|
|
memset(&tmp2, 0x00, sizeof(USR_MV));
|
|
|
|
|
memset(&tmp3, 0x00, sizeof(USR_MV));
|
|
|
|
|
memset(fft_value, 0x00, 19*sizeof(USR_MV));
|
|
|
|
|
double pri_max[]={196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,96000,196000,196000};
|
|
|
|
|
double sec_max[]={196000,196000,196000,196000,196000,196000,196000};
|
|
|
|
|
double offset[]={1.2626,0.3597,0,0,0,0,0,0,0,0,0,0};
|
|
|
|
|
int channel_num=0;
|
|
|
|
|
double noise_max=150;
|
|
|
|
|
double neu_max=50;
|
|
|
|
|
char noise_warning=0;
|
|
|
|
|
char neu_warning=0;
|
|
|
|
|
char amp_warning[19];
|
|
|
|
|
memset(amp_warning,0,19);
|
|
|
|
|
ret=load_from_file(curr_file,0 ,buf,160*1024);
|
|
|
|
|
tmp3.v.stVal=1;
|
|
|
|
|
tmp3.q = 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(ret>0)
|
|
|
|
|
{
|
|
|
|
|
memcpy(data,buf,160*1024);
|
|
|
|
|
// for(k=0;k<8;k++)
|
|
|
|
|
// for(m=0;m<100;m++)
|
|
|
|
|
// log_d("data[%d][%d]=%d",k,m,data[k][m]);
|
|
|
|
|
// int16_t tt[]={7000,20000,30000,8000,24000,9000,16000};
|
|
|
|
|
// sum=0;
|
|
|
|
|
// qsort(tt,7, sizeof(int16_t), cmp);
|
|
|
|
|
// for(k=2;k<5;k++)
|
|
|
|
|
// sum+=(tt[k]*5.0f/32768-1)*22.5f+30.0f;
|
|
|
|
|
// log_d("sum=%f",sum);
|
|
|
|
|
// noise=sum/3.0;
|
|
|
|
|
// log_d("noise=%f",noise);
|
|
|
|
|
switch(slave_addr)
|
|
|
|
|
{
|
|
|
|
|
case 1:
|
|
|
|
|
sum=0;
|
|
|
|
|
channel_num=dev_par[4]-1;
|
|
|
|
|
qsort(data[channel_num],10000, sizeof(int16_t), cmp);
|
|
|
|
|
// log_d("channel_num=%d",channel_num);
|
|
|
|
|
if((channel_num+1)>0)
|
|
|
|
|
{
|
|
|
|
|
for(k=1000;k<9000;k++)
|
|
|
|
|
{
|
|
|
|
|
if((data[channel_num][k]-(offset[0]*32768.0/5.0))>0)//小于0去掉
|
|
|
|
|
{
|
|
|
|
|
sum+=(data[channel_num][k]*5.0f/32768-offset[0])*18.0f+30.0f;
|
|
|
|
|
num=num+1.0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//log_d("sum=%f",sum);
|
|
|
|
|
noise=sum/num;
|
|
|
|
|
num=0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
noise=0;
|
|
|
|
|
/* code */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sum=0;
|
|
|
|
|
qsort(data[2],10000, sizeof(int16_t), cmp);
|
|
|
|
|
channel_num=dev_par[5]-1;
|
|
|
|
|
if((channel_num+1)>0)
|
|
|
|
|
{
|
|
|
|
|
for(k=1000;k<9000;k++)
|
|
|
|
|
sum+=(data[channel_num][k]*5.0f/32768-offset[1])*40.0f;
|
|
|
|
|
//log_d("sum=%f",sum);
|
|
|
|
|
neu=sum/8000.0;
|
|
|
|
|
//log_d("noise=%f,neu=%f",noise,neu);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
neu=0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tmp1.v.f=noise;
|
|
|
|
|
tmp1.q = 1;
|
|
|
|
|
tmp1.t.secs=time(NULL);
|
|
|
|
|
tmp1.t.ms = tmp1.t.secs*1000;
|
|
|
|
|
tmp2.v.f=neu;
|
|
|
|
|
tmp2.q = 1;
|
|
|
|
|
tmp2.t.secs=time(NULL);
|
|
|
|
|
tmp2.t.ms = tmp2.t.secs*1000;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(noise>=noise_max)
|
|
|
|
|
noise_warning=1;
|
|
|
|
|
else
|
|
|
|
|
noise_warning=0;
|
|
|
|
|
|
|
|
|
|
if(neu>=neu_max)
|
|
|
|
|
neu_warning=1;
|
|
|
|
|
else
|
|
|
|
|
neu_warning=0;
|
|
|
|
|
|
|
|
|
|
tmp3.t.secs=time(NULL);
|
|
|
|
|
tmp3.t.ms = tmp3.t.secs*1000;
|
|
|
|
|
|
|
|
|
|
lock_scl_mem();
|
|
|
|
|
for(k=0;k<15;k++)
|
|
|
|
|
{
|
|
|
|
|
put_mv_data(0,k*46+19,&tmp1,1);
|
|
|
|
|
put_mv_data(0,k*46+20,&tmp2,1);
|
|
|
|
|
//put_mv_data(0,k*46+21,&tmp3,1);
|
|
|
|
|
tmp3.v.stVal=noise_warning;
|
|
|
|
|
put_mv_data(0,k*46+25,&tmp3,1);
|
|
|
|
|
tmp3.v.stVal=neu_warning;
|
|
|
|
|
put_mv_data(0,k*46+26,&tmp3,1);
|
|
|
|
|
}
|
|
|
|
|
unlock_scl_mem();
|
|
|
|
|
|
|
|
|
|
sjzd_modbus_data[11]=(uint16_t)(noise*100.0);
|
|
|
|
|
sjzd_modbus_data[12]=(uint16_t)(neu*100.0);
|
|
|
|
|
sjzd_modbus_data[206]=(uint16_t)noise_warning;
|
|
|
|
|
sjzd_modbus_data[207]=(uint16_t)neu_warning;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
lock_scl_mem();
|
|
|
|
|
tmp3.t.secs=time(NULL);
|
|
|
|
|
tmp3.t.ms = tmp3.t.secs*1000;
|
|
|
|
|
for(m=0;m<6;m++)
|
|
|
|
|
{
|
|
|
|
|
channel_num=dev_par[m+6]-8-1;
|
|
|
|
|
// log_d("channel_num=%d",channel_num);
|
|
|
|
|
if((channel_num+1)>0)
|
|
|
|
|
{
|
|
|
|
|
for(k=0;k<10000;k++)
|
|
|
|
|
dv0[k]=data[channel_num][k]-(offset[m+2]*32768.0/5.0);
|
|
|
|
|
|
|
|
|
|
single_Amp_Extra(dv0, 10000.0f, 1.0f, &code, amp_data,amp_size);
|
|
|
|
|
for(n=0;n<19;n++)
|
|
|
|
|
{
|
|
|
|
|
amp_temp[n]=(float)amp_data[n]/(sensor_range/100.0);
|
|
|
|
|
fft_value[n].v.f=amp_temp[n];
|
|
|
|
|
fft_value[n].q=0;
|
|
|
|
|
fft_value[n].t.secs=time(NULL);
|
|
|
|
|
fft_value[n].t.ms = fft_value[n].t.secs*1000;
|
|
|
|
|
sjzd_modbus_data[21+19*m+n]=(uint16_t)(fft_value[n].v.f/1000.0*100);//单位换算为g,保留两位小数
|
|
|
|
|
|
|
|
|
|
if(amp_temp[n]>=pri_max[n])
|
|
|
|
|
{
|
|
|
|
|
amp_warning[n]=1;//modbus 每个分量报警
|
|
|
|
|
tmp3.v.stVal=1;
|
|
|
|
|
put_mv_data(0,m*46+27+n,&tmp3,1);//61850实时更新报警,每个传感器每个分量告警
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tmp3.v.stVal=0;
|
|
|
|
|
put_mv_data(0,m*46+27+n,&tmp3,1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for(n=0;n<19;n++)
|
|
|
|
|
{
|
|
|
|
|
fft_value[n].v.f=0;
|
|
|
|
|
fft_value[n].q=0;
|
|
|
|
|
fft_value[n].t.secs=time(NULL);
|
|
|
|
|
fft_value[n].t.ms = fft_value[n].t.secs*1000;
|
|
|
|
|
sjzd_modbus_data[21+19*m+n]=0;//单位换算为g,保留两位小数
|
|
|
|
|
|
|
|
|
|
//amp_warning[n]=0;//modbus 每个分量报警
|
|
|
|
|
tmp3.v.stVal=0;
|
|
|
|
|
for(k=0;k<6;k++)
|
|
|
|
|
put_mv_data(0,k*46+27+n,&tmp3,1);//61850实时更新报警,每个传感器每个分量告警
|
|
|
|
|
}
|
|
|
|
|
/* code */
|
|
|
|
|
}
|
|
|
|
|
put_mv_data(0,m*46,fft_value,19);
|
|
|
|
|
}
|
|
|
|
|
unlock_scl_mem();
|
|
|
|
|
|
|
|
|
|
for(m=0;m<19;m++)
|
|
|
|
|
sjzd_modbus_data[180+m]=(uint16_t)amp_warning[n];//单位换算为g,保留两位小数
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
lock_scl_mem();
|
|
|
|
|
tmp3.t.secs=time(NULL);
|
|
|
|
|
tmp3.t.ms = tmp3.t.secs*1000;
|
|
|
|
|
for(m=6;m<12;m++)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
channel_num=dev_par[m+6]-16-1;
|
|
|
|
|
//log_d("channel_num=%d",channel_num);
|
|
|
|
|
if((channel_num+1)>0)//判断通道是否使能
|
|
|
|
|
{
|
|
|
|
|
for(k=0;k<10000;k++)
|
|
|
|
|
dv0[k]=data[channel_num][k]-(offset[m+2]*32768.0/5.0);
|
|
|
|
|
single_Amp_Extra(dv0, 10000.0f, 1.0f, &code, amp_data,amp_size);
|
|
|
|
|
for(n=0;n<19;n++)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
amp_temp[n]=(float)(amp_data[n])/(sensor_range/100.0);
|
|
|
|
|
fft_value[n].v.f=amp_temp[n];
|
|
|
|
|
fft_value[n].q=1;
|
|
|
|
|
fft_value[n].t.secs=time(NULL);
|
|
|
|
|
fft_value[n].t.ms = fft_value[n].t.secs*1000;
|
|
|
|
|
if(amp_temp[n]>=sec_max[n])
|
|
|
|
|
{
|
|
|
|
|
amp_warning[n]=1;//modbus 每个分量报警
|
|
|
|
|
tmp3.v.stVal=1;
|
|
|
|
|
put_mv_data(0,m*46+27+n,&tmp3,1);//61850实时更新报警,每个传感器每个分量告警
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tmp3.v.stVal=0;
|
|
|
|
|
put_mv_data(0,m*46+27+n,&tmp3,1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for(n=0;n<19;n++)
|
|
|
|
|
{
|
|
|
|
|
fft_value[n].v.f=0;
|
|
|
|
|
fft_value[n].q=0;
|
|
|
|
|
fft_value[n].t.secs=time(NULL);
|
|
|
|
|
fft_value[n].t.ms = fft_value[n].t.secs*1000;
|
|
|
|
|
sjzd_modbus_data[21+19*m+n]=0;//单位换算为g,保留两位小数
|
|
|
|
|
memset(amp_temp,0,sizeof(amp_temp));
|
|
|
|
|
//amp_warning[n]=0;//modbus 每个分量报警
|
|
|
|
|
tmp3.v.stVal=0;
|
|
|
|
|
for(k=6;k<12;k++)
|
|
|
|
|
put_mv_data(0,k*46+27+n,&tmp3,1);//61850实时更新报警,每个传感器每个分量告警
|
|
|
|
|
}
|
|
|
|
|
/* code */
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
for(n=0;n<7;n++)
|
|
|
|
|
sjzd_modbus_data[135+7*m+n]=(uint16_t)(amp_temp[2*n+1]/1000.0*100);//单位换算为g,保留两位小数
|
|
|
|
|
put_mv_data(0,m*46,fft_value,19);
|
|
|
|
|
}
|
|
|
|
|
unlock_scl_mem();
|
|
|
|
|
for(m=0;m<7;m++)
|
|
|
|
|
sjzd_modbus_data[199+m]=(uint16_t)amp_warning[2*m+1];//单位换算为g,保留两位小数
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
log_d("default");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// fp = fopen("/home/debian/my_task/data/time_5.txt", "r");
|
|
|
|
|
// for(m = 0; m<10000; m++)
|
|
|
|
|
// {
|
|
|
|
|
// for(n = 0; n < 14; n++)
|
|
|
|
|
// {
|
|
|
|
|
// fscanf(fp, "%d ", &a[n][m]);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//其中cmp函数:
|
|
|
|
|
int cmp(const void *a, const void *b)
|
|
|
|
|
{
|
|
|
|
|
return *(int16_t*)a - *(int16_t*)b; //由小到大排序
|
|
|
|
|
//return *(int *)b - *(int *)a; 由大到小排序
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//通讯异常上传 MoDevConf MoDevDetF
|
|
|
|
|
void fault_up(char dev_fault)
|
|
|
|
|
{
|
|
|
|
|
USR_MV tmp3;
|
|
|
|
|
int k;
|
|
|
|
|
tmp3.q = 1;
|
|
|
|
|
tmp3.t.secs=time(NULL);
|
|
|
|
|
tmp3.t.ms = tmp3.t.secs*1000;
|
|
|
|
|
|
|
|
|
|
tmp3.v.stVal=(char) dev_fault&0x01;
|
|
|
|
|
|
|
|
|
|
lock_scl_mem();
|
|
|
|
|
for(k=0;k<15;k++)
|
|
|
|
|
put_mv_data(0,k*46+22,&tmp3,1);
|
|
|
|
|
|
|
|
|
|
unlock_scl_mem();
|
|
|
|
|
|
|
|
|
|
tmp3.v.stVal=(char) (dev_fault&0x02)>>1;
|
|
|
|
|
lock_scl_mem();
|
|
|
|
|
for(k=0;k<6;k++)
|
|
|
|
|
put_mv_data(0,k*46+21,&tmp3,1);
|
|
|
|
|
unlock_scl_mem();
|
|
|
|
|
|
|
|
|
|
tmp3.v.stVal=(char) (dev_fault&0x04)>>2;
|
|
|
|
|
lock_scl_mem();
|
|
|
|
|
for(k=6;k<12;k++)
|
|
|
|
|
put_mv_data(0,k*46+21,&tmp3,1);
|
|
|
|
|
unlock_scl_mem();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void sensor_fault(char slave_addr,char sensor_err)
|
|
|
|
|
{
|
|
|
|
|
USR_MV tmp3;
|
|
|
|
|
int k;
|
|
|
|
|
tmp3.q = 1;
|
|
|
|
|
tmp3.t.secs=time(NULL);
|
|
|
|
|
tmp3.t.ms = tmp3.t.secs*1000;
|
|
|
|
|
|
|
|
|
|
tmp3.v.stVal=sensor_err;
|
|
|
|
|
|
|
|
|
|
lock_scl_mem();
|
|
|
|
|
if(slave_addr == 1)
|
|
|
|
|
{
|
|
|
|
|
for(k=0;k<15;k++)
|
|
|
|
|
put_mv_data(0,k*46+24,&tmp3,1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for(k=(slave_addr-1)*6;k<(slave_addr-1)*6+6;k++)
|
|
|
|
|
put_mv_data(0,k*46+23,&tmp3,1);
|
|
|
|
|
/* code */
|
|
|
|
|
}
|
|
|
|
|
unlock_scl_mem();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void heartbeat(char dev_num)
|
|
|
|
|
{
|
|
|
|
|
int32_t ret;
|
|
|
|
|
SLAVE_REG_TYPE slave_regs[3];
|
|
|
|
|
uint32_t tmp_reg;
|
|
|
|
|
uint8_t rlt,slave_addr;
|
|
|
|
|
int32_t i;
|
|
|
|
|
char dev_fault=0x7;
|
|
|
|
|
for(i=0;i<dev_num;i++)
|
|
|
|
|
{
|
|
|
|
|
//读寄存器
|
|
|
|
|
slave_addr=i+1;
|
|
|
|
|
ret=sjzd_reg_rd(slave_addr,0,(uint8_t *)&slave_regs[i],sizeof(SLAVE_REG_TYPE));
|
|
|
|
|
|
|
|
|
|
if(FRM_ERR_NONE==ret)
|
|
|
|
|
dev_fault&=~(1<<i);
|
|
|
|
|
else
|
|
|
|
|
dev_fault|=1<<i;
|
|
|
|
|
}
|
|
|
|
|
//start_scl_mem();
|
|
|
|
|
sjzd_modbus_data[1]=(uint16_t)dev_fault;
|
|
|
|
|
fault_up(dev_fault);
|
|
|
|
|
//stop_scl_mem();
|
|
|
|
|
}
|
|
|
|
|
int relay_init(void)
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
int i=0;
|
|
|
|
|
char dir[]="/sys/class/gpio/gpio1/direction";
|
|
|
|
|
char val[]="/sys/class/gpio/gpio1/value";
|
|
|
|
|
char index[]={'1','2','3','4'};
|
|
|
|
|
for(i=0;i<4;i++)
|
|
|
|
|
{
|
|
|
|
|
dir[20]=index[i];
|
|
|
|
|
val[20]=index[i];
|
|
|
|
|
fd = open("/sys/class/gpio/export", O_WRONLY);
|
|
|
|
|
if(fd < 0)
|
|
|
|
|
return 1 ;
|
|
|
|
|
write(fd, &dir[20], 1);
|
|
|
|
|
close(fd);
|
|
|
|
|
fd = open(dir, O_WRONLY);
|
|
|
|
|
if(fd < 0)
|
|
|
|
|
return 1 ;
|
|
|
|
|
write(fd, "out", strlen("out"));
|
|
|
|
|
close(fd);
|
|
|
|
|
fd = open(val, O_WRONLY);
|
|
|
|
|
if(fd < 0)
|
|
|
|
|
return 1 ;
|
|
|
|
|
write(fd, "1", 1);
|
|
|
|
|
close(fd);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int relay_on(void)
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
int i=0;
|
|
|
|
|
char val[]="/sys/class/gpio/gpio1/value";
|
|
|
|
|
char index[]={'1','2','3','4'};
|
|
|
|
|
for(i=0;i<4;i++)
|
|
|
|
|
{
|
|
|
|
|
val[20]=index[i];
|
|
|
|
|
fd = open(val, O_WRONLY);
|
|
|
|
|
if(fd < 0)
|
|
|
|
|
return 1 ;
|
|
|
|
|
write(fd, "0", 1);
|
|
|
|
|
close(fd);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
int relay_off(void)
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
int i=0;
|
|
|
|
|
char val[]="/sys/class/gpio/gpio1/value";
|
|
|
|
|
char index[]={'1','2','3','4'};
|
|
|
|
|
for(i=0;i<4;i++)
|
|
|
|
|
{
|
|
|
|
|
val[20]=index[i];;
|
|
|
|
|
fd = open(val, O_WRONLY);
|
|
|
|
|
if(fd < 0)
|
|
|
|
|
return 1 ;
|
|
|
|
|
write(fd, "1", 1);
|
|
|
|
|
close(fd);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// #define size 6000//数组大小
|
|
|
|
|
// #define N 12//滑动平均滤波计算平均值时所取的点数
|
|
|
|
|
// /*上面两句在使用下面这个函数的时候加到程序的开头*/
|
|
|
|
|
// void Smooth(float data[],int 32,int32_t size)
|
|
|
|
|
// {
|
|
|
|
|
// Sum1=0;
|
|
|
|
|
// for(int j=0;j<size;j++)
|
|
|
|
|
// {
|
|
|
|
|
// if(j<N/2)
|
|
|
|
|
// {
|
|
|
|
|
// for(int k=0;k<N;k++)
|
|
|
|
|
// {
|
|
|
|
|
// Sum1+=data[j+k];
|
|
|
|
|
// }
|
|
|
|
|
// data[j]=Sum1/N;
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// if(j<size -N/2)
|
|
|
|
|
// {
|
|
|
|
|
// for(int k=0;k<N/2;k++)
|
|
|
|
|
// {
|
|
|
|
|
// Sum1+=(data[j+k]+data[j-k]);
|
|
|
|
|
// }
|
|
|
|
|
// data[j]=Sum1/N;
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// for(int k=0;k<size-j;k++)
|
|
|
|
|
// {
|
|
|
|
|
// Sum1+=data[j+k];
|
|
|
|
|
// }
|
|
|
|
|
// for(int k=0;k<(N-size+j);k++)
|
|
|
|
|
// {
|
|
|
|
|
// Sum1+=data[j-k];
|
|
|
|
|
// }
|
|
|
|
|
// data[j]=Sum1/N;
|
|
|
|
|
// }
|
|
|
|
|
// Sum1=0;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|