123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548 |
- #include "mc0051gs.h"
- #include "plt.h"
- static void mc0051gs_comm_0xA30B(int idx)
- {
- unsigned short tab_us[128] = {0};
- struct mc0051gs_t *dev = &mc0051gs[idx];
- struct comm_t *comm = &dev->comm;
- int chanidx = comm->chanidx;
- int addr = comm->adr;
- int start, nb, rc, i;
- int ret = 0;
- if (comm_get_state(comm) != COMMST_NORMAL)
- {
- return;
- }
- nb = 2;
- start = 0x0400;
- chan_lock(chanidx);
- rc = chan_read_holdingregisters_with_retry(chanidx, addr, start, nb, tab_us);
- chan_unlock(chanidx);
- if (rc < 0)
- {
- comm_set_state(comm, COMMST_ERR);
- return;
- }
- else if (rc == 0)
- { /* read ok */
- const int started_idx = (0x0400 - 0x0400);
- const int runMode_idx = (0x0401 - 0x0400);
- const int ctlMode_idx = (0x0402 - 0x0400);
- dev->started = (int)(tab_us[started_idx]);
- dev->runMode = (int)(tab_us[runMode_idx]);
- dev->ctlMode = (int)(tab_us[ctlMode_idx]);
- if (dev->runMode == 0)
- {
- sprintf(dev->sys_run_mode_set, "%s", "stop");
- }
- else if (dev->runMode == 1)
- {
- sprintf(dev->sys_run_mode_set, "%s", "loop");
- }
- else if (dev->runMode == 2)
- {
- sprintf(dev->sys_run_mode_set, "%s", "cool");
- }
- else if (dev->runMode == 3)
- {
- sprintf(dev->sys_run_mode_set, "%s", "heat");
- }
- else if (dev->runMode == 4)
- {
- sprintf(dev->sys_run_mode_set, "%s", "auto");
- }
- if (dev->ctlMode == 0)
- {
- sprintf(dev->ctrMode_str, "%s", "Cell temp");
- }
- else if (dev->ctlMode == 1)
- {
- sprintf(dev->ctrMode_str, "%s", "out temp");
- }
- else if (dev->ctlMode == 2)
- {
- sprintf(dev->ctrMode_str, "%s", "in temp");
- }
- }
- nb = 4;
- start = 0xA30B;
- chan_lock(chanidx);
- rc = chan_read_holdingregisters_with_retry(chanidx, addr, start, nb, tab_us);
- chan_unlock(chanidx);
- if (rc < 0)
- {
- comm_set_state(comm, COMMST_ERR);
- return;
- }
- else if (rc == 0)
- { /* read ok */
- dev->cellt_max = tab_us[0xA30B - start] / 10.0;
- dev->cellt_min = tab_us[0xA30C - start] / 10.0;
- dev->cellt_ave = tab_us[0xA30D - start] / 10.0;
- dev->cell_run = tab_us[0xA30E - start];
- if (dev->cell_run == 0)
- {
- sprintf(dev->cell_run_str, "%s", "not run");
- }
- else if (dev->cell_run == 1)
- {
- sprintf(dev->cell_run_str, "%s", "running");
- }
- else
- {
- sprintf(dev->cell_run_str, "%s", "unknown");
- }
- }
- }
- static void mc0051gs_comm_0xE600(int idx)
- {
- unsigned short tab_us[128] = {0};
- struct mc0051gs_t *dev = &mc0051gs[idx];
- struct comm_t *comm = &dev->comm;
- int chanidx = comm->chanidx;
- int addr = comm->adr;
- int start, nb, rc, i;
- int ret = 0;
- if (comm_get_state(comm) != COMMST_NORMAL)
- {
- return;
- }
- // start = 0xE600;
- // chan_lock(chanidx);
- // usleep(100000); // 100ms
- // rc = chan_write_single_register_with_retry(chanidx, addr, start, 220); // 制冷点先默认22
- // chan_unlock(chanidx);
- // if (rc < 0)
- // {
- // comm_set_state(comm, COMMST_ERR);
- // return;
- // }
- // start = 0xE602;
- // chan_lock(chanidx);
- // usleep(100000);
- // rc = chan_write_single_register_with_retry(chanidx, addr, start, 50); // 制冷回差默认5
- // chan_unlock(chanidx);
- // if (rc < 0)
- // {
- // comm_set_state(comm, COMMST_ERR);
- // return;
- // }
- chan_lock(comm->chanidx);
- rc = chan_read_holdingregisters_with_retry(comm->chanidx, comm->adr, 0x0400, 1, tab_us);
- chan_unlock(comm->chanidx);
- if (rc < 0)
- {
- comm_set_state(comm, COMMST_ERR);
- return;
- }
- else
- {
- dev->started = tab_us[0];
- }
- nb = 19;
- start = 0xE600;
- chan_lock(chanidx);
- rc = chan_read_holdingregisters_with_retry(chanidx, addr, start, nb, tab_us);
- chan_unlock(chanidx);
- if (rc < 0)
- {
- comm_set_state(comm, COMMST_ERR);
- return;
- }
- else if (rc == 0)
- { /* read ok */
- dev->cool_temp = *((signed short *)&tab_us[0xE600 - start]) / 10.0;
- dev->heat_temp = *((signed short *)&tab_us[0xE601 - start]) / 10.0;
- dev->cool_gap_temp = tab_us[0xE602 - start] / 10.0;
- dev->heat_gap_temp = tab_us[0xE603 - start] / 10.0;
- dev->pump_gear = tab_us[0xE604 - start]; /*水泵档位*/
- dev->adr = tab_us[0xE605 - start];
- if (tab_us[0xE606 - start] == 2)
- {
- dev->baud = 4800;
- }
- else if (tab_us[0xE606 - start] == 3)
- {
- dev->baud = 9600;
- }
- else if (tab_us[0xE606 - start] == 4)
- {
- dev->baud = 19200;
- }
- else if (tab_us[0xE606 - start] == 5)
- {
- dev->baud = 38400;
- }
- else if (tab_us[0xE606 - start] == 6)
- {
- dev->baud = 57600;
- }
- else
- {
- dev->baud = 0;
- }
- dev->comp_gear = tab_us[0xE608 - start]; /*压缩机档位*/
- dev->cool_cell_temp = tab_us[0xE60C - start] / 10.0; /*cell is working*/
- dev->cool_stop_cell_temp = tab_us[0xE60D - start] / 10.0; /*cell is working*/
- dev->heat_cell_temp = tab_us[0xE60E - start] / 10.0; /*cell is working*/
- dev->heat_stop_cell_temp = tab_us[0xE60F - start] / 10.0; /*cell is working*/
- dev->cool_gap_cell_temp_noworking = tab_us[0xE610 - start] / 10.0; /*在电池非运行状态时,制冷开启温度= 电芯温度制冷点+ 电池非运行模式制冷偏差温度*/
- dev->cell_self_cycle_start_diff_temp = tab_us[0xE611 - start] / 10.0; /*电芯温度自循环启动差*/
- dev->cell_self_cycle_stop_diff_temp = tab_us[0xE612 - start] / 10.0; /*电芯温度自循环启动差*/
- }
- }
- static void mc0051gs_comm_0xE700(int idx)
- {
- unsigned short tab_us[128] = {0};
- struct mc0051gs_t *dev = &mc0051gs[idx];
- struct comm_t *comm = &dev->comm;
- int chanidx = comm->chanidx;
- int addr = comm->adr;
- int start, nb, rc, i;
- int ret = 0;
- int temp = 0;
- if (comm_get_state(comm) != COMMST_NORMAL)
- {
- return;
- }
- nb = 72;
- start = 0xE700;
- chan_lock(chanidx);
- rc = chan_read_holdingregisters_with_retry(chanidx, addr, start, nb, tab_us);
- chan_unlock(chanidx);
- if (rc < 0)
- {
- comm_set_state(comm, COMMST_ERR);
- return;
- }
- else if (rc == 0)
- { /* read ok */
- dev->out_water_temp = tab_us[0xE700 - start] / 10.0;
- dev->in_water_temp = tab_us[0xE701 - start] / 10.0;
- dev->out_air_temp = tab_us[0xE702 - start] / 10.0;
- dev->ev_temp = tab_us[0xE703 - start] / 10.0;
- dev->in_water_press = tab_us[0xE704 - start] / 100.0;
- dev->out_water_press = tab_us[0xE705 - start] / 100.0;
- dev->out_water_high_temp_alarm = tab_us[0xE706 - start]; /*0 正常,1 告警,255告警未使能*/
- dev->out_water_low_temp_alarm = tab_us[0xE707 - start]; /*0 正常,1 告警,255告警未使能*/
- dev->out_temp_sensor_alarm = tab_us[0xE708 - start]; /*0 正常,1 告警,255告警未使能*/
- dev->in_temp_sensor_alarm = tab_us[0xE709 - start]; /*0 正常,1 告警,255告警未使能*/
- dev->pump_comm_alarm = tab_us[0xE70A - start]; /*0 正常,1 告警,255告警未使能*/
- dev->VFD_comm_alarm = tab_us[0xE70B - start]; /*0 正常,1 告警,255告警未使能*/
- dev->sys_high_voltage_lock = tab_us[0xE70C - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->sys_low_voltage_lock = tab_us[0xE70D - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->air_out_over_temp_lock = tab_us[0xE70E - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->VFD_oc_lock = tab_us[0xE70F - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->VFD_ot_lock = tab_us[0xE710 - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->VFD_over_fre_lock = tab_us[0xE711 - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->VFD_under_fre_lock = tab_us[0xE712 - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->VFD_phase_lost_lock = tab_us[0xE713 - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->VFD_other_fault_lock = tab_us[0xE714 - start]; /*0 正常,1 锁定,255告警未使能*/
- dev->alarm_level = tab_us[0xE715 - start];
- if (dev->alarm_level == 0)
- {
- sprintf(dev->alarm_level_str, "%s", "no alarm");
- }
- else if (dev->alarm_level == 1)
- {
- sprintf(dev->alarm_level_str, "%s", "serious alarm");
- }
- else if (dev->alarm_level == 2)
- {
- sprintf(dev->alarm_level_str, "%s", "secondary alarm");
- }
- else if (dev->alarm_level == 3)
- {
- sprintf(dev->alarm_level_str, "%s", "commonly alarm");
- }
- else
- {
- sprintf(dev->alarm_level_str, "%s", "unkown alarm");
- }
- dev->elc_heat_state = tab_us[0xE716 - start];
- dev->lack_liquid_alarm = tab_us[0xE717 - start]; /*0 正常,1 告警,255告警未使能*/
- dev->sys_pree_high_alarm = tab_us[0xE718 - start]; /*0 正常,1 告警,255告警未使能*/
- dev->out_water_press_high_alarm = tab_us[0xE719 - start]; /*0 正常,1 告警,255告警未使能*/
- dev->pump_speed = tab_us[0xE71A - start] / 10.0;
- dev->pump_state = tab_us[0xE71B - start];
- dev->heart = tab_us[0xE71C - start];
- dev->comp_state = tab_us[0xE71D - start];
- temp = tab_us[0xE721 - start];
- temp = (temp << 16) + tab_us[0xE720 - start];
- dev->comp_run_time = temp;
- temp = tab_us[0xE723 - start];
- temp = (temp << 16) + tab_us[0xE722 - start];
- dev->comp_start_times = temp;
- temp = tab_us[0xE725 - start];
- temp = (temp << 16) + tab_us[0xE724 - start];
- dev->elc_heat_run_time = temp;
- temp = tab_us[0xE727 - start];
- temp = (temp << 16) + tab_us[0xE726 - start];
- dev->elc_heat_start_times = temp;
- temp = tab_us[0xE729 - start];
- temp = (temp << 16) + tab_us[0xE728 - start];
- dev->pump_run_time = temp;
- temp = tab_us[0xE72B - start];
- temp = (temp << 16) + tab_us[0xE72A - start];
- dev->pump_start_times = temp;
- temp = tab_us[0xE72D - start];
- temp = (temp << 16) + tab_us[0xE72C - start];
- dev->outfan_run_time = temp;
- temp = tab_us[0xE72F - start];
- temp = (temp << 16) + tab_us[0xE72E - start];
- dev->outfan_start_times = temp;
- dev->sys_run_state = tab_us[0xE730 - start];
- if (dev->sys_run_state == 0)
- {
- sprintf(dev->sys_run_state_str, "%s", "stop");
- }
- else if (dev->sys_run_state == 1)
- {
- sprintf(dev->sys_run_state_str, "%s", "Internal circulation");
- }
- else if (dev->sys_run_state == 2)
- {
- sprintf(dev->sys_run_state_str, "%s", "cooling");
- }
- else if (dev->sys_run_state == 3)
- {
- sprintf(dev->sys_run_state_str, "%s", "heating");
- }
- else
- {
- }
- dev->pump_fault = tab_us[0xE735 - start];
- dev->fan_drive_fault = tab_us[0xE736 - start];
- dev->fan_drive_comm_fault = tab_us[0xE737 - start];
- dev->upper_computer_comm_fault = tab_us[0xE738 - start];
- dev->cellt_max_comm_fault = tab_us[0xE739 - start];
- dev->cellt_min_comm_fault = tab_us[0xE740 - start];
- dev->cellt_ave_comm_fault = tab_us[0xE741 - start];
- dev->water_over_press = tab_us[0xE742 - start] / 10.0;
- dev->water_under_press = tab_us[0xE743 - start] / 10.0;
- dev->in_water_over_press_fault = tab_us[0xE744 - start];
- dev->in_water_under_press_fault = tab_us[0xE745 - start];
- dev->out_water_over_press_fault = tab_us[0xE746 - start];
- dev->out_water_under_press_fault = tab_us[0xE747 - start];
- }
- else
- {
- return;
- }
- }
- int mc0051gs_comm_init(int idx)
- {
- struct mc0051gs_t *dev = &mc0051gs[idx];
- struct comm_t *comm = &dev->comm;
- comm_set_state(comm, COMMST_ERR);
- }
- int mc0051gs_comm_reset(int idx)
- {
- struct mc0051gs_t *dev = &mc0051gs[idx];
- struct comm_t *comm = &dev->comm;
- comm_reset(comm);
- // comm_set_state( comm, COMMST_NORMAL );
- }
- int write_single_register(int idx, int regaddr, int value)
- {
- int ret = 0;
- struct mc0051gs_t *dev = &mc0051gs[idx];
- struct comm_t *comm = &dev->comm;
- chan_lock(comm->chanidx);
- ret = chan_write_single_register_with_retry(comm->chanidx, comm->adr, regaddr, value);
- chan_unlock(comm->chanidx);
- // log_dbg("%s, idx:%d, val:%d, ret:%d", __func__, idx, value, ret);
- return ret;
- }
- int mc0051gs_set_dev_start(int idx)
- {
- return write_single_register(idx, 0x0400, 1);
- }
- int mc0051gs_set_dev_stop(int idx)
- {
- return write_single_register(idx, 0x0400, 0);
- }
- int mc0051gs_set_dev_mbadr(int idx, int val)
- {
- return write_single_register(idx, 0x0007, val);
- }
- int mc0051gs_set_run_mode(int idx, int mode)
- {
- return write_single_register(idx, 0x0401, mode);
- }
- int mc0051gs_set_ctl_mode(int idx, int mode)
- {
- if (mode == 0) // 电芯温度控制
- {
- mc0051gs_set_cool_start_temp_cellmode(idx, 25);
- mc0051gs_set_cool_stop_temp_cellmode(idx, 21);
- mc0051gs_set_heat_start_temp_cellmode(idx, 15);
- mc0051gs_set_heat_stop_temp_cellmode(idx, 24);
- }
- else if (mode == 1 || mode == 2)
- {
- static double cool_set = 22, hot_set = 20;
- if (pack_get_cell_t_max() >= 25 && pack_get_cell_t_min() >= 22)
- {
- cool_set = mc0051gs[1].out_water_temp - 4;
- log_dbg("cool_set:%f", cool_set);
- }
- else if (pack_get_cell_t_min() <= 20 && pack_get_cell_t_max() <= 22)
- {
- hot_set = mc0051gs[1].out_water_temp + 6;
- log_dbg("hot_set:%f", hot_set);
- }
- else
- {
- cool_set = 22;
- hot_set = 20;
- log_dbg("hot_set:%f, cool_set:%f", hot_set, cool_set);
- }
- if (cool_set < hot_set)
- {
- hot_set = cool_set - 2;
- }
- mc0051gs_set_cool_temp(idx, cool_set);
- mc0051gs_set_cool_gap_temp(idx, 2);
- mc0051gs_set_heat_temp(idx, hot_set);
- mc0051gs_set_heat_gap_temp(idx, 2);
- }
- else
- {
- return -1;
- }
- return write_single_register(idx, 0x0402, mode);
- }
- int mc0051gs_set_cellt_max(int idx, double temp)
- {
- return write_single_register(idx, 0xA30B, (int)(temp * 10));
- }
- int mc0051gs_set_cellt_min(int idx, double temp)
- {
- return write_single_register(idx, 0xA30C, (int)(temp * 10));
- }
- int mc0051gs_set_cellt_avg(int idx, double temp)
- {
- return write_single_register(idx, 0xA30D, (int)(temp * 10));
- }
- int mc0051gs_set_cellt_running(int idx, int working)
- {
- return write_single_register(idx, 0xA30E, working);
- }
- int mc0051gs_set_cool_temp(int idx, int val)
- {
- return write_single_register(idx, 0xE600, val * 10);
- }
- int mc0051gs_set_heat_temp(int idx, int val)
- {
- return write_single_register(idx, 0xE601, val * 10);
- }
- int mc0051gs_set_cool_gap_temp(int idx, int val)
- {
- return write_single_register(idx, 0xE602, val * 10);
- }
- int mc0051gs_set_heat_gap_temp(int idx, int val)
- {
- return write_single_register(idx, 0xE603, val * 10);
- }
- int mc0051gs_set_pump_gear(int idx, int val)
- {
- return write_single_register(idx, 0xE604, val * 10);
- }
- int mc0051gs_set_comp_gear(int idx, int val)
- {
- return write_single_register(idx, 0xE608, val);
- }
- int mc0051gs_set_cool_start_temp_cellmode(int idx, int val)
- {
- return write_single_register(idx, 0xE60C, val * 10);
- }
- int mc0051gs_set_cool_stop_temp_cellmode(int idx, int val)
- {
- return write_single_register(idx, 0xE60D, val * 10);
- }
- int mc0051gs_set_heat_start_temp_cellmode(int idx, int val)
- {
- return write_single_register(idx, 0xE60E, val * 10);
- }
- int mc0051gs_set_heat_stop_temp_cellmode(int idx, int val)
- {
- return write_single_register(idx, 0xE60F, val * 10);
- }
- void mc0051gs_comm_dac(int idx)
- {
- struct mc0051gs_t *dev = &mc0051gs[idx];
- struct comm_t *comm = &dev->comm;
- int ret = 0;
- if (comm_get_state(comm) != COMMST_NORMAL)
- {
- return;
- }
- comm_start_cal_dac_timing(comm);
- if (comm_get_dac_param_en(comm) == 1)
- {
- comm_set_dac_param_en(comm, 0);
- mc0051gs_set_run_mode(idx, 4); // 自动
- }
- // 设定空调运行模式和温度控制模式
- mc0051gs_set_ctl_mode(idx, 1); // 电芯温度控制
- mc0051gs_comm_0xA30B(idx);
- mc0051gs_comm_0xE600(idx);
- mc0051gs_comm_0xE700(idx);
- comm_stop_cal_dac_timing(comm);
- }
|