|
|
|
#ifndef __HM_INVERTERS_H__
|
|
|
|
#define __HM_INVERTERS_H__
|
|
|
|
|
|
|
|
#include "debug.h"
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
// units
|
|
|
|
enum {UNIT_V = 0, UNIT_A, UNIT_W, UNIT_WH, UNIT_KWH, UNIT_HZ, UNIT_C, UNIT_PCT};
|
|
|
|
const char* const units[] = {"V", "A", "W", "Wh", "kWh", "Hz", "°C", "%"};
|
|
|
|
|
|
|
|
// field types
|
|
|
|
enum {FLD_UDC = 0, FLD_IDC, FLD_PDC, FLD_YD, FLD_YW, FLD_YT,
|
|
|
|
FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_T, FLD_PCT};
|
|
|
|
const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", "YieldTotal",
|
|
|
|
"U_AC", "I_AC", "P_AC", "Freq", "Temp", "Pct"};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// CH0 is default channel (freq, ac, temp)
|
|
|
|
enum {CH0 = 0, CH1, CH2, CH3, CH4};
|
|
|
|
enum {CMD01 = 0x01, CMD02, CMD03, CMD83 = 0x83, CMD84};
|
|
|
|
|
|
|
|
enum {INV_TYPE_HM600 = 0, INV_TYPE_HM1200, INV_TYPE_HM400};
|
|
|
|
const char* const invTypes[] = {"HM600", "HM1200", "HM400"};
|
|
|
|
#define NUM_INVERTER_TYPES 3
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
uint8_t fieldId; // field id
|
|
|
|
uint8_t unitId; // uint id
|
|
|
|
uint8_t ch; // channel 0 - 3
|
|
|
|
uint8_t cmdId; // received command id
|
|
|
|
uint8_t start; // pos of first byte in buffer
|
|
|
|
uint8_t num; // number of bytes in buffer
|
|
|
|
uint16_t div; // divisor
|
|
|
|
} byteAssign_t;
|
|
|
|
|
|
|
|
|
|
|
|
union serial_u {
|
|
|
|
uint64_t u64;
|
|
|
|
uint8_t b[8];
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
uint8_t id; // unique id
|
|
|
|
char name[MAX_NAME_LENGTH]; // human readable name, eg. "HM-600.1"
|
|
|
|
uint8_t type; // integer which refers to inverter type
|
|
|
|
byteAssign_t* assign; // type of inverter
|
|
|
|
uint8_t listLen; // length of assignments
|
|
|
|
serial_u serial; // serial number as on barcode
|
|
|
|
serial_u radioId; // id converted to modbus
|
|
|
|
} inverter_t;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* indices are built for the buffer starting with cmd-id in first byte
|
|
|
|
* (complete payload in buffer)
|
|
|
|
* */
|
|
|
|
|
|
|
|
//-------------------------------------
|
|
|
|
// HM400 HM350?, HM300?
|
|
|
|
//-------------------------------------
|
|
|
|
const byteAssign_t hm400assignment[] = {
|
|
|
|
{ FLD_UDC, UNIT_V, CH1, CMD01, 14, 2, 10 },
|
|
|
|
{ FLD_IDC, UNIT_A, CH1, CMD01, 16, 2, 100 },
|
|
|
|
{ FLD_PDC, UNIT_W, CH1, CMD01, 18, 2, 10 },
|
|
|
|
{ FLD_YT, UNIT_KWH, CH1, CMD01, 20, 4, 1000 },
|
|
|
|
{ FLD_YD, UNIT_WH, CH1, CMD01, 24, 2, 1000 },
|
|
|
|
{ FLD_UAC, UNIT_V, CH0, CMD01, 26, 2, 10 },
|
|
|
|
{ FLD_F, UNIT_HZ, CH0, CMD82, 12, 2, 100 },
|
|
|
|
{ FLD_PAC, UNIT_W, CH0, CMD82, 14, 2, 10 },
|
|
|
|
{ FLD_IAC, UNIT_A, CH0, CMD82, 18, 2, 100 },
|
|
|
|
{ FLD_T, UNIT_C, CH0, CMD82, 22, 2, 10 }
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------
|
|
|
|
// HM600, HM700
|
|
|
|
//-------------------------------------
|
|
|
|
const byteAssign_t hm600assignment[] = {
|
|
|
|
{ FLD_UDC, UNIT_V, CH1, CMD01, 14, 2, 10 },
|
|
|
|
{ FLD_IDC, UNIT_A, CH1, CMD01, 16, 2, 100 },
|
|
|
|
{ FLD_PDC, UNIT_W, CH1, CMD01, 18, 2, 10 },
|
|
|
|
{ FLD_UDC, UNIT_V, CH2, CMD01, 20, 2, 10 },
|
|
|
|
{ FLD_IDC, UNIT_A, CH2, CMD01, 22, 2, 100 },
|
|
|
|
{ FLD_PDC, UNIT_W, CH2, CMD01, 24, 2, 10 },
|
|
|
|
{ FLD_YW, UNIT_WH, CH0, CMD02, 12, 2, 1 },
|
|
|
|
{ FLD_YT, UNIT_WH, CH0, CMD02, 14, 4, 1 },
|
|
|
|
{ FLD_YD, UNIT_WH, CH1, CMD02, 18, 2, 1 },
|
|
|
|
{ FLD_YD, UNIT_WH, CH2, CMD02, 20, 2, 1 },
|
|
|
|
{ FLD_UAC, UNIT_V, CH0, CMD02, 22, 2, 10 },
|
|
|
|
{ FLD_F, UNIT_HZ, CH0, CMD02, 24, 2, 100 },
|
|
|
|
{ FLD_IAC, UNIT_A, CH0, CMD02, 26, 2, 10 },
|
|
|
|
{ FLD_T, UNIT_C, CH0, CMD83, 18, 2, 10 }
|
|
|
|
};
|
|
|
|
#define HM600_LIST_LEN (sizeof(hm600assignment) / sizeof(byteAssign_t))
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------
|
|
|
|
// HM1200, HM1500?
|
|
|
|
//-------------------------------------
|
|
|
|
const byteAssign_t hm1200assignment[] = {
|
|
|
|
{ FLD_UDC, UNIT_V, CH1, CMD01, 3, 2, 10 },
|
|
|
|
{ FLD_IDC, UNIT_A, CH1, CMD01, 5, 2, 100 },
|
|
|
|
{ FLD_PDC, UNIT_W, CH1, CMD01, 9, 2, 10 },
|
|
|
|
{ FLD_YD, UNIT_WH, CH1, CMD02, 5, 2, 1 },
|
|
|
|
{ FLD_YT, UNIT_KWH, CH1, CMD01, 13, 4, 1000 },
|
|
|
|
{ FLD_UDC, UNIT_V, CH2, CMD02, 9, 2, 10 },
|
|
|
|
{ FLD_IDC, UNIT_A, CH2, CMD01, 7, 2, 100 },
|
|
|
|
{ FLD_PDC, UNIT_W, CH2, CMD01, 11, 2, 10 },
|
|
|
|
{ FLD_YD, UNIT_WH, CH2, CMD02, 7, 2, 1 },
|
|
|
|
{ FLD_YT, UNIT_KWH, CH2, CMD02, 1, 4, 1000 },
|
|
|
|
{ FLD_IDC, UNIT_A, CH3, CMD02, 11, 2, 100 },
|
|
|
|
{ FLD_PDC, UNIT_W, CH3, CMD02, 15, 2, 10 },
|
|
|
|
{ FLD_YD, UNIT_WH, CH3, CMD03, 11, 2, 1 },
|
|
|
|
{ FLD_YT, UNIT_KWH, CH3, CMD03, 3, 4, 1000 },
|
|
|
|
{ FLD_IDC, UNIT_A, CH4, CMD02, 13, 2, 100 },
|
|
|
|
{ FLD_PDC, UNIT_W, CH4, CMD03, 1, 2, 10 },
|
|
|
|
{ FLD_YD, UNIT_WH, CH4, CMD03, 13, 2, 1 },
|
|
|
|
{ FLD_YT, UNIT_KWH, CH4, CMD03, 7, 4, 1000 },
|
|
|
|
{ FLD_UAC, UNIT_V, CH0, CMD03, 15, 2, 10 },
|
|
|
|
{ FLD_IAC, UNIT_A, CH0, CMD84, 7, 2, 100 },
|
|
|
|
{ FLD_PAC, UNIT_W, CH0, CMD84, 3, 2, 10 },
|
|
|
|
{ FLD_F, UNIT_HZ, CH0, CMD84, 1, 2, 100 },
|
|
|
|
{ FLD_PCT, UNIT_PCT, CH0, CMD84, 9, 2, 10 },
|
|
|
|
{ FLD_T, UNIT_C, CH0, CMD84, 11, 2, 10 }
|
|
|
|
};
|
|
|
|
#define HM1200_LIST_LEN (sizeof(hm1200assignment) / sizeof(byteAssign_t))
|
|
|
|
|
|
|
|
#endif /*__HM_INVERTERS_H__*/
|