You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
4.2 KiB
C

1 year ago
#define LOG_TAG "main"
#include "main.h"
#include "elog.h"
#include "modbus_rtu_slave.h"
#include "sjzd.h"
#include <time.h>
#include "iec61850_process.h"
#define APP_VERSION "SV01.002"
#define START_SMP_HOUR 8 //8点开始采样
#define SMP_INV 60 //60分钟采样一次
#define SJZD_PORT "/dev/ttySZ3"
#define SJZD_BAUD "38400"
#define SJZD_PARITY "no"
typedef struct
{
uint32_t has_new_data;
uint32_t new_data_len;
uint32_t data_timestamp;
uint32_t rsv;
} SLAVE_REG_TYPE;
static int doit=0;
void ctrlCfun(int i)
{
doit = 1;
}
int log_init(void)
{
/* close printf buffer */
setbuf(stdout,NULL);
/* initialize EasyLogger */
elog_init();
/* set EasyLogger log format */
elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL);//设置assert级别的输出内容格式
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);//错误日志输出消息级别,标签,时间
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);//警告日志输出格式设置
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL & ~ELOG_FMT_FUNC);
#ifdef ELOG_COLOR_ENABLE
elog_set_text_color_enabled(true);
#endif
/* start EasyLogger */
elog_start();
return 0;
}
char *make_file_name(uint32_t sn,uint8_t addr)
{
static char data_file_name[64];
struct tm *p;
memset(data_file_name,0,sizeof(data_file_name));
p=localtime((time_t *)&sn);
sprintf(data_file_name,"%04d%02d%02d_%02d%02d%02d_%d",p->tm_year+1900,p->tm_mon+1,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec,addr);
return data_file_name;
}
//1.串口轮询线程,
//2.通讯协议AA+55+addr(2byte)+data_len(2bytes)+data(n)+crc_val+##
int main(int argc,char **args)
{
int32_t ret;
SLAVE_REG_TYPE slave_regs[3];
uint32_t tmp_reg;
uint8_t rlt,slave_addr;
int32_t i;
time_t now;
struct tm *p;
uint32_t last_smp_time=0;
char *curr_file;
signal(SIGINT,ctrlCfun);
log_init();
elog_raw("Application Version:%s\r\n",APP_VERSION);
//if(read_dev_cfg(&dev_cfg)!=0)
//{
// log_e("load device config failed");
//}
if(sjzd_master_init(SJZD_PORT,SJZD_BAUD,SJZD_PARITY)!=0)
{
log_e("sjzd master init failed");
return -1;
}
now=time(NULL);
p=localtime((time_t *)&now);
if(p->tm_hour<START_SMP_HOUR)
{
last_smp_time=now-(now%86400)+START_SMP_HOUR*3600-SMP_INV*60;
}
else
{
last_smp_time=now-(now%86400)+(START_SMP_HOUR*3600)+(((now%86400)-START_SMP_HOUR*3600)/(SMP_INV*60))*(SMP_INV*60);
}
modbus_rtu_slave_init();
iec61850_rx_init();
while(!doit)
{
usleep(500*1000);
now=time(NULL);
p=localtime((time_t *)&now);
for(i=0;i<3;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)
{
if(slave_regs[i].has_new_data)//判断是否有新数据
{
//读数据文件
curr_file=make_file_name(now,slave_addr);
if(sjzd_file_rd(slave_addr,"dummy_file",curr_file)>0)
{
log_d("read data from slave %d ok",slave_addr);
//分析数据文件curr_file
}
else
{
log_e("read data from slave %d failed",slave_addr);
}
//清数据标志
tmp_reg=0;
if(sjzd_reg_wr(slave_addr,0,(uint8_t *)&tmp_reg,sizeof(tmp_reg),&rlt)!=FRM_ERR_NONE)
{
log_e("clear slave %d data failed",slave_addr);
}
}
}
}
//判断是否需要启动采样
if(p->tm_hour>=START_SMP_HOUR)
{
if(now>=(last_smp_time+SMP_INV*60))
{
for(i=0;i<3;i++)
{
slave_addr=i+1;
//发送启动采样命令
tmp_reg=1;
if(sjzd_reg_wr(slave_addr,16,(uint8_t *)&tmp_reg,1,&rlt)!=FRM_ERR_NONE)
{
if(sjzd_reg_wr(slave_addr,16,(uint8_t *)&tmp_reg,1,&rlt)!=FRM_ERR_NONE)
log_e("clear slave %d data failed",slave_addr);
}
else
{
log_d("start slave %d sample succeed",slave_addr);
}
}
last_smp_time=now;
}
}
}//end while(!doit)
return 0;
}