|
|
@@ -9,6 +9,7 @@
|
|
|
#include "stdio.h"
|
|
|
#include "string.h"
|
|
|
#include "power.h"
|
|
|
+#include "paras.h"
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
@@ -66,10 +67,31 @@ typedef struct cascade_info{
|
|
|
}data; //modbus to user
|
|
|
}cascade_handle_t;
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd);
|
|
|
+static int master_query(cascade_handle_t *cas);
|
|
|
+void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const mb_cb_table_t mb_table = {
|
|
|
+ .read_disc = mb_port_read_disc, //读离散量输入
|
|
|
+ .read_coil = mb_port_read_coil, //读线圈
|
|
|
+ .write_coil = mb_port_write_coil, //写线圈
|
|
|
+ .read_input = mb_port_read_input, //读输入寄存器
|
|
|
+ .read_hold = mb_port_read_hold, //读保持寄存器
|
|
|
+ .write_hold = mb_port_write_hold, //写保持寄存器
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
static cascade_handle_t slave_info = {0};
|
|
|
+static mb_cascade_fun_t func = {0};
|
|
|
|
|
|
uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint8_t baud)
|
|
|
{
|
|
|
@@ -81,6 +103,8 @@ uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint8_t baud)
|
|
|
para.para.rtu.parity = 2;
|
|
|
para.para.rtu.pin = -1;
|
|
|
para.para.rtu.lvl = 0;
|
|
|
+ paras_data_t* p_data = paras_get();
|
|
|
+ addr = p_data->cas.addr;
|
|
|
if(addr == 0){
|
|
|
para.mode = MB_MODE_MASTER;
|
|
|
}else
|
|
|
@@ -97,7 +121,9 @@ uint8_t cascade_init(const char* uart,uint8_t mode,uint8_t addr,uint8_t baud)
|
|
|
{
|
|
|
mb_handle_t *handle = (mb_handle_t *)(slave_info.mb);
|
|
|
mb_set_slave(handle->rtu.h,slave_info.saddr);
|
|
|
- //mb_set_cb_table();
|
|
|
+ mb_set_cb_table(handle->rtu.h,&mb_table);
|
|
|
+ func.slave_func = slave_func;
|
|
|
+ mb_set_cb_cascade(handle->rtu.h,&func);
|
|
|
}
|
|
|
//cas data
|
|
|
|
|
|
@@ -135,16 +161,92 @@ static uint8_t master_scan(cascade_handle_t *cas)
|
|
|
|
|
|
void * cascade_scan_thread(void *arg)
|
|
|
{
|
|
|
+
|
|
|
while(1)
|
|
|
{
|
|
|
if(slave_info.md_type == MB_MODE_MASTER)
|
|
|
{
|
|
|
master_scan(&slave_info);
|
|
|
+ }else //做从机//拷贝数据到北向
|
|
|
+ {
|
|
|
+ paras_data_t* p_data = paras_get();
|
|
|
+ power_data_t power = power_data_get();
|
|
|
+ if(p_data->prod.type == PDU_AC_I1O1 || p_data->prod.type == PDU_DC_I1O1)
|
|
|
+ {
|
|
|
+ slave_info.data.ac_dc.dev_cnt = (p_data->prod.type << 8 | power.chs);
|
|
|
+ int cnt = power.chs > 64 ? 64 : power.chs;
|
|
|
+ //电量信息
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ slave_info.data.ac_dc.power[i].voltage = power.pch[i].power[0].voltage *1000;
|
|
|
+ slave_info.data.ac_dc.power[i].current = power.pch[i].power[0].current *1000;
|
|
|
+ slave_info.data.ac_dc.power[i].power = power.pch[i].power[0].power *1000;
|
|
|
+ slave_info.data.ac_dc.power[i].consumer = power.pch[i].power[0].consump *1000;
|
|
|
+ slave_info.data.ac_dc.power[i].factor = power.pch[i].power[0].factor *1000;
|
|
|
+ slave_info.data.ac_dc.power[i].freq = power.pch[i].power[0].freq *1000;
|
|
|
+ }
|
|
|
+ //总信息
|
|
|
+ //slave_info.data.ac_dc.power_all. = power.ttl.total;
|
|
|
+ slave_info.data.ac_dc.power_all.all_consumer = power.ttl.total[0].consump *1000;
|
|
|
+ slave_info.data.ac_dc.power_all.all_current = power.ttl.total[0].current *1000;
|
|
|
+ slave_info.data.ac_dc.power_all.all_power = power.ttl.total[0].power *1000;
|
|
|
+ slave_info.data.ac_dc.power_all.all_voltage = power.ttl.total[0].voltage *1000;
|
|
|
+ //温湿度
|
|
|
+ slave_info.data.ac_dc.temp = 0; //后续加上传感器数据
|
|
|
+ slave_info.data.ac_dc.humity = 0;
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ slave_info.data.ac_dc.switch_stu[i] = 0;
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ slave_info.data.ac_dc.delay_open[i] = power.pch[i].info.start_delay;
|
|
|
+ }
|
|
|
+ for(int i = 0; i < cnt;i++)
|
|
|
+ {
|
|
|
+ slave_info.data.ac_dc.delay_close[i] = power.pch[i].info.stop_delay;
|
|
|
+ }
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ slave_info.data.ac_3.dev_cnt = (p_data->prod.type << 8 | power.chs);
|
|
|
+ for(int i = A_P; i <= C_P;i++)
|
|
|
+ {
|
|
|
+ slave_info.data.ac_3.ac_3_all_pw[i].consumer = power.ttl.total[i].consump *1000;
|
|
|
+ slave_info.data.ac_3.ac_3_all_pw[i].current = power.ttl.total[i].current *1000;
|
|
|
+ slave_info.data.ac_3.ac_3_all_pw[i].power = power.ttl.total[i].power *1000;
|
|
|
+ slave_info.data.ac_3.ac_3_all_pw[i].voltage = power.ttl.total[i].voltage *1000;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
sleep(1);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void* cascade_thread(void *arg)
|
|
|
+{
|
|
|
+ int r;
|
|
|
+ //thread_handle_t *h=(thread_handle_t*)arg;
|
|
|
+ cascade_handle_t *cas=&slave_info;
|
|
|
+ //ModbusInfo_t *info=&cas->mInfo;
|
|
|
+ mb_handle_t *handle=(mb_handle_t *)(cas->mb);
|
|
|
+ LOGD("__ cascade %s\n", (cas->md_type==MODBUS_MASTER)?"master":"slave");
|
|
|
+ while(handle->quit==0) {
|
|
|
+ if(cas->md_type==MODBUS_MASTER) { //主模
|
|
|
+ r = master_query(cas);
|
|
|
+ sleep(1);
|
|
|
+ }
|
|
|
+ else { //从模式,等待主设备发起数据请�?
|
|
|
+ //r = slave_receive(cas);
|
|
|
+ mb_slave_fsm(handle->rtu.h);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pthread_exit(NULL);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static int slave_get_info(cascade_handle_t *cas)
|
|
|
{
|
|
|
slave_info_t *info=&cas->info;
|
|
|
@@ -153,6 +255,9 @@ static int slave_get_info(cascade_handle_t *cas)
|
|
|
//info->channels=0;
|
|
|
//memcpy(info->ch,board->pbrd[],)
|
|
|
//copy mem to info
|
|
|
+ if(info->channels > SLAVE_CH_MAX)
|
|
|
+ info->channels = SLAVE_CH_MAX;
|
|
|
+ memcpy(info->ch,&power.pch[0],sizeof(power.pch[0]) * info->channels);
|
|
|
|
|
|
}
|
|
|
|