/***************************************************************************** * * MSO Corporation * * File : modbus.c * Compiler : IAR C 5.30C Kickstart * Revision : $Revision: 1.0 $ * Date : $Date: 2010 / 07 / 16 * Updated by : $Author: Jongkwang Woo * * Support mail : spirit0305@naver.com * * Description : MODBUS routines * ****************************************************************************/ #define _MODBUS REG_ #include #include "modbus.h" #include "device_param.h" #include "malloc.h" #include "pl455_comm.h" #include "temp.h" #include "io.h" #include "brtc.h" #include "date_calc.h" /* Defines -------------------------------------------------------------------*/ /* Type declarations ---------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ s16 GetRegisterExp(u16 reg_addr); s16 GetRegisterExp1(u16 reg_addr); /* Private functions ---------------------------------------------------------*/ s16 GetRegister(u16 reg_addr) { s16 result = 0; switch (reg_addr) { case 0: result = (s16)device_value.BatVoltage; break; // 0 0.00V case 1: result = (s16)(device_value.Current / 10); break; // 1 0.1A case 2: result = (s16)(0); break; // 2 0.1A case 3: // 3 CELL_1 0.001V case 4: // 4 CELL_2 0.001V case 5: // 5 CELL_3 0.001V case 6: // 6 CELL_4 0.001V case 7: // 7 CELL_5 0.001V case 8: // 8 CELL_6 0.001V case 9: // 9 CELL_7 0.001V case 10: // 10 CELL_8 0.001V case 11: // 11 CELL_9 0.001V case 12: // 12 CELL_10 0.001V case 13: // 13 CELL_11 0.001V case 14: // 14 CELL_12 0.001V case 15: // 15 CELL_13 0.001V case 16: // 16 CELL_14 0.001V case 17: result = (s16)device_value.Cell.voltage[reg_addr - 3]; break; // 17 CELL_15 0.001V case 18: // 18 TEMP_1 0.1C case 19: // 19 TEMP_2 0.1C case 20: // 20 TEMP_3 0.1C case 21: // 21 TEMP_4 0.1C case 22: // 22 TEMP_5 0.1C case 23: result = (s16)device_value.Temp.temperature[reg_addr - 18]; break; // 23 TEMP_6 0.1C case 24: result = (s16)0; break; // 24 Reserved for Temp case 25: result = (s16)0; break; // 25 Reserved for Temp case 26: result = (s16)device_value.RelativeStateOfCharge; break; // 26 SOC 0.1% case 27: result = (s16)device_value.RemainingCapacity; break; // 27 Remaining Capacity 0.01AH case 28: result = (s16)device_value.StateOfHealth; break; // 28 SOH 0.1% case 29: result = (s16)device_value.CycleCount; break; // 29 Cycle count case 31: result = (s16)device_param.sbs.data.Full_Charge_Capacity; break; // 31 : 0.01AH case 32: result = (s16)device_param.sbs.data.Design_Capacity; break; // 32 : 0.01AH case 37: result = (s16)device_value.Cell.avg.Max.value; break; // 37 : Max Cell Voltage case 38: result = (s16)device_value.Cell.avg.Min.value; break; // 38 : Min Cell Voltage case 39: result = (s16)device_value.Cell.avg.avg; break; // 39 : Average Cell Voltage case 40: result = (s16)device_value.Cell.avg.diff; break; // 40 : Average Cell Voltage case 41: result = (s16)device_status.alarm_status; break; // 41 : AlarmStatus (Protection, Warning, Normal, Warming Up) case 42: result = (s16)device_status.warning.value; break; // 42 : Warning case 43: result = (s16)device_status.protection.value; break; // 43 : Protection case 44: result = (s16)device_status.op_status; break; // 44 : Operating Status case 45: result = (s16)0; break; // 45 : Reserved for Status case 46: result = (s16)device_status.cellbalance.value; break; // 46 : CellBalanceData case 47: result = (s16)GetBalanceAvg(); break; // 47 : CellBalance Average Value case 48: result = (s16)GetBalanceFlag(); break; // 48 : CellBalance Flag (1: Activate, 0: Deactivate) case 50: result = (s16)((UnixTimeStamp >> 16) & 0x0000FFFF);break; // 50 : UnixTimeStamp MSB case 51: result = (s16)((UnixTimeStamp >> 0) & 0x0000FFFF);break; // 51 : UnixTimeStamp LSB case 52: result = (s16)device_value.Cell.avg.Max.num; break; // 52 : Max Cell Number case 53: result = (s16)device_value.Cell.avg.Min.num; break; // 53 : Min Cell Number case 54: result = (s16)device_value.Temp.avg.Max.value; break; // 54 : Max Temp Value case 55: result = (s16)device_value.Temp.avg.Min.value; break; // 55 : Min Temp Value case 56: result = (s16)device_value.Temp.avg.Max.num; break; // 56 : Max Temp Number case 57: result = (s16)device_value.Temp.avg.Min.num; break; // 57 : Min Temp Number case 58: result = (s16)device_value.Temp.avg.avg; break; // 58 : Average Temp case 60: result = (s16)device_param.safety.voltage.CUV_Threshold; break; // 60 : Low cell voltage protection data 0.001V case 61: result = (s16)device_param.safety.voltage.CUV_Warning; break; // 61 : Low cell voltage warning data 0.001V case 62: result = (s16)device_param.safety.voltage.CUV_Recovery; break; // 62 : Low cell voltage recovery data 0.001V case 63: result = (s16)device_param.safety.voltage.SUV_Threshold; break; // 63 : Low voltage protection data 0.01V case 64: result = (s16)device_param.safety.voltage.SUV_Warning; break; // 64 : Low voltage warning data 0.01V case 65: result = (s16)device_param.safety.voltage.SUV_Recovery; break; // 65 : Low voltage recovery data case 66: result = (s16)device_param.safety.voltage.COV_Threshold; break; // 66 : Over cell voltage protection data case 67: result = (s16)device_param.safety.voltage.COV_Warning; break; // 67 : Over cell voltage warning data case 68: result = (s16)device_param.safety.voltage.COV_Recovery; break; // 68 : Over cell voltage recovery data case 69: result = (s16)device_param.safety.voltage.SOV_Threshold; break; // 69 : Over voltage protection data case 70: result = (s16)device_param.safety.voltage.SOV_Warning; break; // 70 : Over voltage warning data case 71: result = (s16)device_param.safety.voltage.SOV_Recovery; break; // 71 : Over voltage recovery data case 72: result = (s16)device_param.safety.current.OC_Chg_Threshold; break; // 72 : Charge over current threshold case 73: result = (s16)device_param.safety.current.OC_Chg_Warning; break; // 73 : Charge over current warning case 74: result = (s16)device_param.safety.current.OC_Chg_Recovery; break; // 74 : Charge Over current recovery case 75: result = (s16)device_param.safety.current.OC_Chg_Rec_Time; break; // 75 : Charge Over current time case 76: result = (s16)device_param.safety.current.OC_Dsg_Threshold; break; // 76 : Discharge over current threshold case 77: result = (s16)device_param.safety.current.OC_Dsg_Warning; break; // 77 : Discharge over current warning case 78: result = (s16)device_param.safety.current.OC_Dsg_Recovery; break; // 78 : Discharge Over current recovery case 79: result = (s16)device_param.safety.current.OC_Dsg_Rec_Time; break; // 79 : Discharge Over current time case 80: result = (s16)device_param.safety.temperature.OT_Chg_Threshold; break; // 80 : Charge high temperature threshold case 81: result = (s16)device_param.safety.temperature.OT_Chg_Warning; break; // 81 : Charge high temperature warning case 82: result = (s16)device_param.safety.temperature.OT_Chg_Recovery; break; // 82 : Charge high temperature recovery case 83: result = (s16)0; break; // 83 : Charge high temperature time case 84: result = (s16)device_param.safety.temperature.OT_Dsg_Threshold; break; // 84 : Discharge high temperature threshold case 85: result = (s16)device_param.safety.temperature.OT_Dsg_Warning; break; // 85 : Discharge high temperature warning case 86: result = (s16)device_param.safety.temperature.OT_Dsg_Recovery; break; // 86 : Discharge high temperature recovery case 87: result = (s16)0; break; // 87 : Discharge high temperature time case 88: result = (s16)(device_param.safety.soc.Low_Soc_Warning * 10); break; // 88 : Low capacity warning case 89: result = (s16)(device_param.safety.soc.Low_Soc_Recovery * 10); break; // 89 : Low capacity recovery case 90: result = (s16)device_status.cov_protection_cell.uValue; break; case 91: result = (s16)device_status.cov_warning_cell.uValue; break; case 92: result = (s16)device_status.cuv_protection_cell.uValue; break; case 93: result = (s16)device_status.cuv_warning_cell.uValue; break; case 94: result = (s16)device_status.otd_warning_temp.uValue; break; case 95: result = (s16)device_status.otd_protection_temp.uValue; break; case 96: result = (s16)device_status.otc_warning_temp.uValue; break; case 97: result = (s16)device_status.otc_protection_temp.uValue; break; case 98: result = (s16)device_status.ltd_warning_temp.uValue; break; case 99: result = (s16)device_status.ltd_protection_temp.uValue; break; case 100: result = (s16)device_status.ltc_warning_temp.uValue; break; case 101: result = (s16)device_status.ltc_protection_temp.uValue; break; case 110: result = (DEVICE_TIME.year + UTC_YEAR); break; case 111: result = DEVICE_TIME.month; break; case 112: result = DEVICE_TIME.date; break; case 113: result = DEVICE_TIME.hour; break; case 114: result = DEVICE_TIME.min; break; case 115: result = DEVICE_TIME.sec; break; default: if (reg_addr >= 0x3000) result = GetRegisterExp1(reg_addr); else if (reg_addr >= 0x2000) result = GetRegisterExp(reg_addr); break; } return result; } s16 GetRegisterExp(u16 reg_addr) { s16 result = 0; s16 *ptr = (s16 *)&device_param; if (reg_addr <= (0x2000 + (sizeof(TDEVICE_PARAM) / 2))) result = (s16)ptr[reg_addr & 0x0FFF]; return result; } s16 GetRegisterExp1(u16 reg_addr) { s16 result = 0; s16 *ptr = (s16 *)&device_status; if (reg_addr <= (0x3000 + (sizeof(TDEVICE_STATUS) / 2))) result = (s16)ptr[reg_addr & 0x0FFF]; return result; } s16 SetRegister(u16 reg_addr, s16 reg_value) { s16 result = 0; switch (reg_addr) { case 50: // TimeStamp MSB Set SetUpTimeStamp(reg_value, 1); break; case 51: // TimeStamp LSB Set SetUpTimeStamp(reg_value, 0); break; case 60: device_param.safety.voltage.CUV_Threshold = reg_value; break; // 61 : Low cell voltage protection data case 61: device_param.safety.voltage.CUV_Warning = reg_value; break; // 60 : Low cell voltage warning data case 62: device_param.safety.voltage.CUV_Recovery = reg_value; break; // 62 : Low cell voltage recovery data case 63: device_param.safety.voltage.SUV_Threshold = reg_value; break; // 63 : Low voltage protection data case 64: device_param.safety.voltage.SUV_Warning = reg_value; break; // 64 : Low voltage warning data case 65: device_param.safety.voltage.SUV_Recovery = reg_value; break; // 65 : Low voltage recovery data case 66: device_param.safety.voltage.COV_Threshold = reg_value; break; // 66 : Over cell voltage protection data case 67: device_param.safety.voltage.COV_Warning = reg_value; break; // 67 : Over cell voltage warning data case 68: device_param.safety.voltage.COV_Recovery = reg_value; break; // 68 : Over cell voltage recovery data case 69: device_param.safety.voltage.SOV_Threshold = reg_value; break; // 69 : Over voltage protection data case 70: device_param.safety.voltage.SOV_Warning = reg_value; break; // 70 : Over voltage warning data case 71: device_param.safety.voltage.SOV_Recovery = reg_value; break; // 71 : Over voltage recovery data case 72: device_param.safety.current.OC_Chg_Threshold = reg_value; break; // 72 : Charge over current threshold case 73: device_param.safety.current.OC_Chg_Warning = reg_value; break; // 73 : Charge over current warning case 74: device_param.safety.current.OC_Chg_Recovery = reg_value; break; // 74 : Charge over current recovery case 75: device_param.safety.current.OC_Chg_Rec_Time = reg_value; break; // 75 : Charge over current recovery time case 76: device_param.safety.current.OC_Dsg_Threshold = reg_value; break; // 76 : Discharge over current threshold case 77: device_param.safety.current.OC_Dsg_Warning = reg_value; break; // 77 : Discharge over current warning case 78: device_param.safety.current.OC_Dsg_Recovery = reg_value; break; // 78 : Discharge over current recovery case 79: device_param.safety.current.OC_Dsg_Rec_Time = reg_value; break; // 79 : Discharge over current recovery time case 80: device_param.safety.temperature.OT_Chg_Threshold = reg_value; break; // 80 : Charge high temperature threshold case 81: device_param.safety.temperature.OT_Chg_Warning = reg_value; break; // 81 : Charge high temperature warning case 82: device_param.safety.temperature.OT_Chg_Recovery = reg_value; break; // 82 : Charge high temperature recovery case 84: device_param.safety.temperature.OT_Dsg_Threshold = reg_value; break; // 84 : Discharge high temperature threshold case 85: device_param.safety.temperature.OT_Dsg_Warning = reg_value; break; // 85 : Discharge high temperature warning case 86: device_param.safety.temperature.OT_Dsg_Recovery = reg_value; break; // 86 : Discharge high temperature recovery case 88: device_param.safety.soc.Low_Soc_Warning = (reg_value / 10); break; // 88 : Low capacity waring case 89: device_param.safety.soc.Low_Soc_Recovery = (reg_value / 10); break; // 89 : Low capacity recovery case 110: SetTime.year = reg_value; break; case 111: SetTime.month = reg_value; break; case 112: SetTime.date = reg_value; break; case 113: SetTime.hour = reg_value; break; case 114: SetTime.min = reg_value; break; case 115: SetTime.sec = reg_value; break; case 0x4000: // Buzzer Hold Alarm_Buzzer_Update(); break; case 0x4001: // Buzzer Hold Alarm_Buzzer_Update(); break; case 0x9000: // Reset Sys_Soft_Reset(); break; } return result; }