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
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;
|
||
|
}
|