Files

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;
}