|
@@ -17,8 +17,8 @@
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
#define ERR_MAX 5
|
|
#define ERR_MAX 5
|
|
|
-#define CASCADE_MAX 2
|
|
|
|
|
-//#define CASCADE_MAX 99
|
|
|
|
|
|
|
+#define CASCADE_MAX 10
|
|
|
|
|
+//#define CASCADE_MAX 100
|
|
|
|
|
|
|
|
#define MB_MAX_LEN 250
|
|
#define MB_MAX_LEN 250
|
|
|
|
|
|
|
@@ -91,7 +91,6 @@ static int mbus_init(cascade_handle_t *cas, char *path, int mode, int addr, uint
|
|
|
modbus_set_response_timeout(cas->mb, 1, 5000);
|
|
modbus_set_response_timeout(cas->mb, 1, 5000);
|
|
|
modbus_set_byte_timeout(cas->mb, 0, 50000);
|
|
modbus_set_byte_timeout(cas->mb, 0, 50000);
|
|
|
|
|
|
|
|
- cas->addr = addr;
|
|
|
|
|
if(addr>0) { //slave mode
|
|
if(addr>0) { //slave mode
|
|
|
modbus_set_slave(cas->mb, addr);
|
|
modbus_set_slave(cas->mb, addr);
|
|
|
}
|
|
}
|
|
@@ -173,20 +172,19 @@ static int cascade_scan(cascade_handle_t *cas)
|
|
|
int i,r=0 ;
|
|
int i,r=0 ;
|
|
|
uint16_t tmp[100];
|
|
uint16_t tmp[100];
|
|
|
|
|
|
|
|
- for(i=1; i<=CASCADE_MAX; i++) {
|
|
|
|
|
|
|
+ for(i=1; i<CASCADE_MAX; i++) {
|
|
|
if(find_addr(cas, i)) {
|
|
if(find_addr(cas, i)) {
|
|
|
//LOGD("___slave 0x%02x is in the list\n", i);
|
|
//LOGD("___slave 0x%02x is in the list\n", i);
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- r = mbus_read(cas, i, 6000, tmp, 10);
|
|
|
|
|
|
|
+ r = mbus_read(cas, i, 6000, tmp, 1);
|
|
|
if(r>0) {
|
|
if(r>0) {
|
|
|
- LOGD("____ scan addr:%d, %d 0x%04x, 0x%04x\n", i, r, tmp[0], tmp[1]);
|
|
|
|
|
- //add_slave(cas, i);
|
|
|
|
|
|
|
+ LOGD("____ find slave %d\n", i);
|
|
|
|
|
+ add_slave(cas, i);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- LOGD("____ scan fail, %s\n", modbus_strerror(errno));
|
|
|
|
|
-
|
|
|
|
|
|
|
+ //LOGD("____ scan slave %d fail, %s\n", i, modbus_strerror(errno));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
//print_slave(cas);
|
|
//print_slave(cas);
|
|
@@ -216,7 +214,7 @@ static void power_init(void)
|
|
|
GlobalPowerManger* pm = (GlobalPowerManger*)malloc(sizeof(GlobalPowerManger));
|
|
GlobalPowerManger* pm = (GlobalPowerManger*)malloc(sizeof(GlobalPowerManger));
|
|
|
memset(pm, 0, sizeof(GlobalPowerManger));
|
|
memset(pm, 0, sizeof(GlobalPowerManger));
|
|
|
pm->product_id = dm2->_global_device_info->product_id;
|
|
pm->product_id = dm2->_global_device_info->product_id;
|
|
|
- pm->product_saddr = 0;
|
|
|
|
|
|
|
+ pm->product_saddr = -1;
|
|
|
pm->product_ch_id = 1;
|
|
pm->product_ch_id = 1;
|
|
|
pm->product_ch_addr = 0;
|
|
pm->product_ch_addr = 0;
|
|
|
sprintf(pm->product_ch_name,"CH%d",pm->product_ch_id);
|
|
sprintf(pm->product_ch_name,"CH%d",pm->product_ch_id);
|
|
@@ -229,63 +227,63 @@ static void power_init(void)
|
|
|
list_add_tail(&pm->list,&dm2->_globalPowerManger.list);
|
|
list_add_tail(&pm->list,&dm2->_globalPowerManger.list);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static int power_get(cascade_handle_t *cas, int addr, PowerInfo *pwr)
|
|
|
|
|
|
|
+
|
|
|
|
|
+static void print_sensor(char *s, sensor_data_t *ss)
|
|
|
{
|
|
{
|
|
|
- uint32_t offset = 0;
|
|
|
|
|
|
|
+ LOGD("__%s__ ss.type: %d\n", s, ss->type);
|
|
|
|
|
+ LOGD("__%s__ ss.addr: %d\n", s, ss->addr);
|
|
|
|
|
+
|
|
|
|
|
+ LOGD("__%s__ ss.voltage: %f\n", s, ss->pwr.voltage);
|
|
|
|
|
+ LOGD("__%s__ ss.current: %f\n", s, ss->pwr.current);
|
|
|
|
|
+ LOGD("__%s__ ss.power: %f\n", s, ss->pwr.power);
|
|
|
|
|
+ LOGD("__%s__ ss.consumption: %f\n", s, ss->pwr.consumption);
|
|
|
|
|
+ LOGD("__%s__ ss.freq: %f\n", s, ss->pwr.freq);
|
|
|
|
|
+ LOGD("__%s__ ss.factor: %f\n", s, ss->pwr.factor);
|
|
|
|
|
+
|
|
|
|
|
+ LOGD("__%s__ ss.temprature: %f\n", s, ss->temprature);
|
|
|
|
|
+ LOGD("__%s__ ss.humidity: %f\n", s, ss->humidity);
|
|
|
|
|
+ LOGD("__%s__ ss.warning: %d\n", s, ss->warning);
|
|
|
|
|
+ LOGD("__%s__ ss.power_status: %d\n", s, ss->power_status);
|
|
|
|
|
+ LOGD("__%s__ ss.sensor_status: %d\n", s, ss->sensor_status);
|
|
|
|
|
+ LOGD("\n");
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+#define VALUE_OF(m,a,b) ((m[a]<<16)+m[b])
|
|
|
|
|
+static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
|
|
|
|
|
+{
|
|
|
|
|
+ uint32_t offset = 6000;
|
|
|
uint32_t value = 0 ;
|
|
uint32_t value = 0 ;
|
|
|
uint16_t temp[100];
|
|
uint16_t temp[100];
|
|
|
- sensor_data_t sdat;
|
|
|
|
|
-
|
|
|
|
|
- int cnt = 10;
|
|
|
|
|
- offset = 6000;
|
|
|
|
|
|
|
+ int r,cnt = sizeof(sensor_ori_t)/2;
|
|
|
|
|
|
|
|
- //
|
|
|
|
|
- mbus_read(cas, addr, offset, temp, cnt);
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- //
|
|
|
|
|
- value = (temp[1] << 16) + temp[0];
|
|
|
|
|
- //dm->
|
|
|
|
|
|
|
+ if(addr<=0) {
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- //reserved
|
|
|
|
|
- value = (temp[3] << 16) + temp[2];
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
- value = (temp[5] << 16) + temp[4];
|
|
|
|
|
- pwr->voltage = value / 1000.0;
|
|
|
|
|
|
|
+ r = mbus_read(cas, addr, offset, temp, cnt);
|
|
|
|
|
+ if(r!=cnt) {
|
|
|
|
|
+ LOGE("___mbus_read slave %d failed, %s\n", addr, modbus_strerror(errno));
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- //
|
|
|
|
|
- value = (temp[7] << 16) + temp[6];
|
|
|
|
|
- pwr->current = value / 1000.0;
|
|
|
|
|
|
|
+ ss->type = temp[0];
|
|
|
|
|
+ ss->addr = temp[1];
|
|
|
|
|
|
|
|
- //
|
|
|
|
|
- value = (temp[9] << 16) + temp[8];
|
|
|
|
|
- pwr->power = value / 1000.0;
|
|
|
|
|
-
|
|
|
|
|
- //
|
|
|
|
|
- value = (temp[11] << 16) + temp[10];
|
|
|
|
|
- pwr->consumption = value / 1000.0;
|
|
|
|
|
-
|
|
|
|
|
- //
|
|
|
|
|
- value = (temp[13] << 16) + temp[12];
|
|
|
|
|
- pwr->factor = value/1000.0;
|
|
|
|
|
|
|
+ ss->pwr.voltage = VALUE_OF(temp,3,2)/1000.0;
|
|
|
|
|
+ ss->pwr.current = VALUE_OF(temp,5,4)/1000.0;
|
|
|
|
|
+ ss->pwr.power = VALUE_OF(temp,7,6)/1000.0;
|
|
|
|
|
+ ss->pwr.consumption = VALUE_OF(temp,9,8)/1000.0;
|
|
|
|
|
+ ss->pwr.freq = VALUE_OF(temp,11,10)/1000.0;
|
|
|
|
|
+ ss->pwr.factor = VALUE_OF(temp,13,12)/1000.0;
|
|
|
|
|
|
|
|
- //
|
|
|
|
|
- value = (temp[15] << 16) + temp[14];
|
|
|
|
|
|
|
+ ss->temprature = VALUE_OF(temp,15,14)/1000.0;
|
|
|
|
|
+ ss->humidity = VALUE_OF(temp,17,16)/1000.0;
|
|
|
|
|
+ ss->warning = VALUE_OF(temp,19,18)/1000.0;
|
|
|
|
|
+ ss->power_status = temp[20];
|
|
|
|
|
+ ss->sensor_status = temp[21];
|
|
|
|
|
|
|
|
- value = (temp[17] << 16) + temp[16];
|
|
|
|
|
- //ss->sensor_type = 1;
|
|
|
|
|
- //ss->
|
|
|
|
|
-
|
|
|
|
|
- //
|
|
|
|
|
- value = (temp[19] << 16) + temp[18];
|
|
|
|
|
- pwr->status = value;
|
|
|
|
|
-
|
|
|
|
|
-#if 0
|
|
|
|
|
- LOGD("___ voltage: %f, current: %f, power: %f, consum: %d, factor: %f, status: %d\n", pwr->voltage, pwr->voltage, pwr->current, pwr->power, pwr->consumption, pwr->factor, pwr->status);
|
|
|
|
|
- LOGD("___ devtype: %d, addr: %d, voltage: %f, current: %f, power: %f, consum: %d, factor: %f, power_status: %d, sensor_status: %d\n",
|
|
|
|
|
- sdat.deveice_type, sdat.slave_addr, sdat.voltage, sdat.voltage, sdat.current, sdat.power, sdat.consumption, sdat.factor, sdat.power_status, sdat.sensor_status);
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+ //print_sensor("11", ss);
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
@@ -293,17 +291,26 @@ static int power_get(cascade_handle_t *cas, int addr, PowerInfo *pwr)
|
|
|
|
|
|
|
|
static int master_request(cascade_handle_t *cas)
|
|
static int master_request(cascade_handle_t *cas)
|
|
|
{
|
|
{
|
|
|
|
|
+ int r;
|
|
|
GlobalPowerManger *tmp=NULL;
|
|
GlobalPowerManger *tmp=NULL;
|
|
|
|
|
|
|
|
list_for_each_entry(tmp, &get_dm2()->_globalPowerManger.list, list)
|
|
list_for_each_entry(tmp, &get_dm2()->_globalPowerManger.list, list)
|
|
|
{
|
|
{
|
|
|
- tmp->product_saddr=cas->addr;
|
|
|
|
|
|
|
+ tmp->product_saddr=cur_dev_addr;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(tmp) {
|
|
if(tmp) {
|
|
|
- LOGD("___ master request %d\n", cas->addr);
|
|
|
|
|
- power_get(cas, cas->addr, &tmp->_PowerInfo);
|
|
|
|
|
|
|
+ sensor_data_t sdat;
|
|
|
|
|
+
|
|
|
|
|
+ //LOGD("___ master request slave %d\n", cur_dev_addr);
|
|
|
|
|
+ r = power_get(cas, cur_dev_addr, &sdat);
|
|
|
|
|
+ if(r==0) {
|
|
|
|
|
+ tmp->_PowerInfo = sdat.pwr;
|
|
|
|
|
+ }
|
|
|
|
|
+ else {
|
|
|
|
|
+ //err++
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -333,7 +340,7 @@ static void* cascade_thread(void *arg)
|
|
|
LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
|
|
LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
|
|
|
while(h->quit==0) {
|
|
while(h->quit==0) {
|
|
|
if(info->product_modbus_type==0) { //主模
|
|
if(info->product_modbus_type==0) { //主模
|
|
|
- //r = master_request(cas);
|
|
|
|
|
|
|
+ r = master_request(cas);
|
|
|
sleep(1);
|
|
sleep(1);
|
|
|
}
|
|
}
|
|
|
else { //从模式,等待主设备发起数据请�?
|
|
else { //从模式,等待主设备发起数据请�?
|
|
@@ -408,8 +415,8 @@ int cascade_init(void)
|
|
|
paras_load();
|
|
paras_load();
|
|
|
power_init();
|
|
power_init();
|
|
|
|
|
|
|
|
- lc.log = 1;
|
|
|
|
|
- lc.max = 100;
|
|
|
|
|
|
|
+ lc.log = 0;
|
|
|
|
|
+ lc.max = CASCADE_MAX;
|
|
|
lc.mode = LIST_FULL_FIFO;
|
|
lc.mode = LIST_FULL_FIFO;
|
|
|
cas->l = xlist_init(&lc);
|
|
cas->l = xlist_init(&lc);
|
|
|
|
|
|
|
@@ -422,7 +429,6 @@ int cascade_init(void)
|
|
|
set_modbus(cas, info);
|
|
set_modbus(cas, info);
|
|
|
|
|
|
|
|
add_slave(cas, 0);
|
|
add_slave(cas, 0);
|
|
|
- add_slaves(cas, 1, 10);
|
|
|
|
|
|
|
|
|
|
sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
|
|
sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
|
|
|
sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
|
|
sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
|