253 lines
15 KiB
C
253 lines
15 KiB
C
/*****************************************************************************
|
|
*
|
|
* 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;
|
|
}
|