feat: KT mBMS 펌웨어 3종(HW1/2/3) 및 통합 빌드 환경 초기 커밋 (V4.0.0.1)
This commit is contained in:
252
mBMS_APP_V3117/APP/modbus_reg.c
Normal file
252
mBMS_APP_V3117/APP/modbus_reg.c
Normal file
@@ -0,0 +1,252 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* 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 <includes.h>
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user