1. 更新各文件版本号至V1.1.31,固件版本寄存器设为0x012F 2. 南向通道选通:仅在GPIO选通成功后才更新物理通道缓存 3. 重构寄存器地址解码逻辑,统一0x06/0x10功能码的地址校验 4. 新增功率板短路/OCP/动态测试状态定义0x05/0x06/0x07 5. 移除电流命令覆盖逻辑,改为按顺序排队等待回码 6. 优化轮询线程:每次发送前重新选通通道,选通失败则跳过当前任务 7. 新增测试态退出确认流程,初始化和关机时需确认功率板退出测试态 8. 增加跨通道写入保护,拒绝多寄存器写跨通道操作 9. 补充多处中文注释,优化调试日志输出格式
338 lines
13 KiB
C
338 lines
13 KiB
C
/****************************************************************************
|
|
文件名称 : chrg_eload.h
|
|
完成日期 :
|
|
当前版本号 : V1.1.28
|
|
主要功能 : 源载命令数据解析,封装,读写请求,寄存器定义,数据结构定义。
|
|
版本历史 : 创建原始版本
|
|
说明 :
|
|
******************************************************************************/
|
|
#ifndef __CHRG_ELOAD_H__
|
|
#define __CHRG_ELOAD_H__
|
|
|
|
#include <rtthread.h>
|
|
#include "chrg_def.h"
|
|
//显示的类别
|
|
#define SHOW_STATUS 0x00
|
|
#define SHOW_VOLT 0x01
|
|
#define SHOW_CURR 0x02
|
|
#define SHOW_RIPPLE 0x03
|
|
#define SHOW_DZF 0x04
|
|
|
|
// 恒压
|
|
static const rt_uint8_t CV[29] = {
|
|
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
|
|
0x43, 0x48, 0x31, 0x5F, 0x52, 0x75, 0x6E, 0x5F, 0x53, 0x74, 0x61,
|
|
0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xBA, 0xE3, 0xD1, 0xB9, 0x22
|
|
};
|
|
|
|
// 恒流
|
|
static const rt_uint8_t CC[29] = {
|
|
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
|
|
0x43, 0x48, 0x31, 0x5F, 0x52, 0x75, 0x6E, 0x5F, 0x53, 0x74, 0x61,
|
|
0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xBA, 0xE3, 0xC1, 0xF7, 0x22
|
|
};
|
|
|
|
// 停止
|
|
static const rt_uint8_t STOP[29] = {
|
|
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
|
|
0x43, 0x48, 0x31, 0x5F, 0x52, 0x75, 0x6E, 0x5F, 0x53, 0x74, 0x61,
|
|
0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xCD, 0xA3, 0xD6, 0xB9, 0x22
|
|
};
|
|
|
|
// 电源
|
|
static const rt_uint8_t SOURCE[30] = {
|
|
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
|
|
0x43, 0x48, 0x31, 0x5F, 0x46, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F,
|
|
0x6E, 0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xB5, 0xE7, 0xD4, 0xB4, 0x22
|
|
};
|
|
|
|
// 负载
|
|
static const rt_uint8_t LOAD[30] = {
|
|
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
|
|
0x43, 0x48, 0x31, 0x5F, 0x46, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F,
|
|
0x6E, 0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xB8, 0xBA, 0xD4, 0xD8, 0x22
|
|
};
|
|
//寄存器
|
|
#define MB_REGISTER_RD (0x03) // 读寄存器
|
|
#define MB_REGISTER_WR (0x06) // 写寄存器
|
|
#define MB_REGISTER_MORE_WR (0x10) // 写多个寄存器
|
|
#define REG_STA1 (0x00) // R 16bit 工作状态1
|
|
#define STA1_CHARGING (0x00) // 预充电中
|
|
#define STA1_READY (0x01) // 就绪/停止
|
|
#define STA1_RUNNING (0x02) // 运行
|
|
#define STA1_FAULT (0x03) // 故障
|
|
#define STA1_SHORT_TEST (0x05) // 短路测试中
|
|
#define STA1_OCP_TEST (0x06) // OCP测试中
|
|
#define STA1_DYNA_TEST (0x07) // 动态测试中
|
|
#define REG_CV 0X07 // 电压地址
|
|
|
|
#define REG_REL_ON (0X01) // 主继电器控制寄存器
|
|
#define ALL_REL_OFF (0X00) // 关闭主继电器
|
|
#define MAIN_REL_ON (0X01) // 打开主继电器(关闭滤波继电器)
|
|
#define FU_REL_ON (0X02) // 打开副继电器(关闭主继电器)
|
|
#define ALL_REL_ON (0X03) // 打开俩个继电器
|
|
|
|
#define REG_STA2 (0x01) // R 16bit 工作状态2
|
|
#define STA2_PRE_REL_CLOSE (1<<0) // 预充继电器闭合
|
|
#define STA2_MAIN_REL_CLOSE (1<<1) // 主继电器闭合
|
|
|
|
#define REG_FAULT1 (0x02) // R 16bit 故障状态1
|
|
#define FAULT1_LOW_IN_VOL (1<<0) // 输入欠压
|
|
#define FAULT1_OVER_IN_VOL (1<<1) // 输入过压
|
|
#define FAULT1_OVER_IN_CUR (1<<2) // 输入过流
|
|
#define FAULT1_OVER_OUT_VOL (1<<3) // 输出过压
|
|
#define FAULT1_OVER_OUT_CUR (1<<4) // 输出过流
|
|
|
|
#define REG_FAULT2 (0x03) // R 16bit 故障状态2
|
|
#define FALUT2_FLASH (1<<0) // 存储异常
|
|
|
|
#define REG_ELOAD (0x04) // RW 16bit 源载指令 默认负载
|
|
#define ELOAD_SOURCE (0x01) // 电源
|
|
#define ELOAD_LOAD (0x02) // 负载
|
|
|
|
#define REG_WORK (0x05) // W 16bit 工作指令
|
|
#define WORK_START (0x01) // 启动
|
|
#define WORK_STOP (0x02) // 停止
|
|
#define WORK_RESET (0x03) // 故障复位
|
|
#define WORK_SAVE (0xAA) // 存储数据到FLASH
|
|
#define WORK_RESTORE (0xBB) // 恢复默认参数
|
|
|
|
#define REG_MODE (0x06) // RW 16bit 工作模式
|
|
#define MODE_CONSTANT_VOLTAGE (0x01) // 恒压
|
|
#define MODE_CONSTANT_CURRENT (0x02) // 恒流
|
|
#define MODE_OPEN_LOOP (0x03) // 开环
|
|
#define MODE_CONSTANT_POWER (0x04) // 恒功率
|
|
#define MODE_CONSTANT_RESISTANCE (0x05) // 恒阻
|
|
|
|
#define REG_VOLTAGE_OUT (0x07) // RW 32bit 输出电压 0.001V (0~60V) 默认5V
|
|
|
|
#define REG_CURRENT_OUT (0x09) // RW 32bit 输出电流 0.001A (0~60A) 默认1A
|
|
|
|
#define REG_TEMPERATUE (0x0B) // RWP 16bit 读取温度 0.01C (0~100C)
|
|
|
|
#define REG_VERSION (0x0C) // R 16bit 版本号 0~0xFFFF
|
|
|
|
#define REG_ADDRESS (0x0D) // RWP 16bit 从机地址
|
|
|
|
#define REG_SET_VOL (0x0E) // RW 32bit 设定电压
|
|
|
|
#define REG_SET_CUR (0x10) // RW 32bit 设定电流
|
|
|
|
#define REG_POWER (0x14) // RW 32bit 功率 0.01W (0~600W)
|
|
|
|
#define REG_RESISTANCE (0x16) // RW 16bit 电阻 0.001R
|
|
|
|
#define REG_LIMIT_VOL (0x17) // RW 32bit 电压限值 0.001V (0~60V) 默认48V
|
|
|
|
#define REG_LIMIT_VUR (0x19) // RW 32bit 电流限值 0.001A (0~60A) 默认10A
|
|
|
|
#define REG_ADJUST_VOL_K (0x1B) // RWP 16bit 电压矫正K 0~65535 默认4096
|
|
|
|
#define REG_ADJUST_VOL_B (0x1C) // RWP 16bit 电压矫正B 0~65535 默认0
|
|
|
|
#define REG_ADJUST_CUR_K (0x1D) // RWP 16bit 电流矫正K 0~65535 默认4096
|
|
|
|
#define REG_ADJUST_CUR_B (0x1E) // RWP 16bit 电流矫正B 0~65535 默认0
|
|
|
|
#define REG_VOL_LOOP_KP (0x1F) // RWP float 电压环KP 0.001~100 默认0.1
|
|
|
|
#define Eload_Start_V_ON 0x20 //10 16寄存器存储电子负载启动电压,负载检测到电压值为启动电压,才开启电子负载;可配
|
|
|
|
#define REG_VOL_LOOP_KI (0x21) // RWP float 电压环KI 0.001~100 默认0.01
|
|
|
|
#define REG_CUR_LOOP_KP (0x23) // RWP float 电流环KP 0.001~100 默认0.1
|
|
|
|
#define REG_CUR_LOOP_KI (0x25) // RWP float 电流环KI 0.001~100 默认0.01
|
|
|
|
#define REG_POWER_LOOP_KP (0x27) // RWP float 功率环KP 0.001~100 默认0.1
|
|
|
|
#define REG_POWER_LOOP_KI (0x29) // RWP float 功率环KI 0.001~100 默认0.01
|
|
|
|
#define REG_RESIS_LOOP_KP (0x2B) // RWP float 恒阻环KP 0.001~100 默认0.1
|
|
|
|
#define REG_RESIS_LOOP_KI (0x2D) // RWP float 恒阻环KI 0.001~100 默认0.01
|
|
|
|
#define REG_TEMP_PROTECT (0x2F) // RWP 16bit 温度保护值 0.01C (60~100C) 默认90C
|
|
|
|
#define RESET_NORTH_ADDR 0xF0 // 北向复位地址
|
|
#define RESET_NORTH_VALUE 0x0001 // 北向复位值
|
|
#define RESET_SOUTH_ADDR 0xE0 // 南向复位地址
|
|
#define RESET_SOUTH_VALUE 0x61 //南向复位值
|
|
|
|
|
|
typedef enum {
|
|
MB_R_PART1 = 0, // 寄存器分段1
|
|
MB_R_PART2, // 寄存器分段2
|
|
|
|
TOTAL_MB_R
|
|
} eIDX_MB_PART;
|
|
|
|
/* South board firmware version register: one 16-bit register at 0x0301. */
|
|
#define MODBUSRTU_SW_VERSION_REG 0x0301U
|
|
#define MODBUSRTU_SW_VERSION_LEN 1U
|
|
|
|
#define SIZE_P1_RD 19 // 读19个寄存器
|
|
#define SIZE_P2_RD 28 // 读28个寄存器
|
|
|
|
#pragma pack(push,1)
|
|
struct eload_p1_t {
|
|
rt_uint16_t status1; // reg0
|
|
rt_uint16_t status2; // reg1
|
|
rt_uint16_t fault1; // reg2
|
|
rt_uint16_t fault2; // reg3
|
|
rt_uint16_t eload; // reg4
|
|
rt_uint16_t work_cmd; // reg5
|
|
rt_uint16_t work_mode; // reg6
|
|
rt_uint32_t voltage; // reg7-8
|
|
rt_uint32_t current; // reg9-10
|
|
|
|
rt_uint16_t SHORT_volt; // reg11
|
|
rt_uint16_t SHORT_curr; // reg12
|
|
rt_uint16_t OCP_volt; // reg13
|
|
rt_uint16_t OCP_curr; // reg14
|
|
rt_uint16_t Vpkp; // reg15
|
|
rt_uint16_t Vpkn; // reg16
|
|
rt_uint16_t Vpp; // reg17
|
|
rt_uint16_t Ripple; // reg18
|
|
};
|
|
|
|
struct eload_p2_t {
|
|
rt_uint32_t power; // reg20-21
|
|
rt_uint16_t resistance; // reg22
|
|
rt_uint32_t limit_vol; // reg23-24
|
|
rt_uint32_t limit_cur; // reg25-26
|
|
rt_uint16_t adj_vol_k; // reg27
|
|
rt_uint16_t adj_vol_b; // reg28
|
|
rt_uint16_t adj_cur_k; // reg29
|
|
rt_uint16_t adj_cur_b; // reg30
|
|
rt_uint32_t loop_vol_kp; // reg31-32 float
|
|
rt_uint32_t loop_vol_ki; // reg33-34 float
|
|
rt_uint32_t loop_cur_kp; // reg35-36 float
|
|
rt_uint32_t loop_cur_ki; // reg37-38 float
|
|
rt_uint32_t loop_pwr_kp; // reg39-40 float
|
|
rt_uint32_t loop_pwr_ki; // reg41-42 float
|
|
rt_uint32_t loop_resis_kp; // reg43-44 float
|
|
rt_uint32_t loop_resis_ki; // reg45-46 float
|
|
rt_uint16_t temperature; // reg47
|
|
};
|
|
|
|
struct chrg_eload_t {
|
|
rt_uint16_t status1; // 工作状态1
|
|
rt_uint16_t status2; // 工作状态2
|
|
rt_uint16_t fault1; // 故障状态1
|
|
rt_uint8_t fault2; // 故障状态2
|
|
rt_uint8_t eload; // 源载 1:电源 2:负载
|
|
rt_uint8_t work; // 工作指令
|
|
rt_uint8_t mode; // 工作模式
|
|
rt_uint32_t voltage; // 电压
|
|
rt_uint32_t current; // 电流
|
|
rt_uint16_t SHORT_volt;// 短路电压
|
|
rt_uint16_t SHORT_curr;// 短路电流
|
|
rt_uint16_t OCP_volt; //OCP电压
|
|
rt_uint16_t OCP_curr; //OCP电流
|
|
rt_uint16_t vpkp; //量测正峰值
|
|
rt_uint16_t vpkn; //量测负峰值
|
|
rt_uint16_t vpp; //量测峰峰值
|
|
rt_uint16_t Ripple; //读取纹波
|
|
};
|
|
#pragma pack(pop)
|
|
/*****************************************************************
|
|
函数名称: chrg_eload_read_regs
|
|
函数描述: 向南向发送读取寄存器
|
|
输入参数: addr:地址 reg:寄存器起始地址 len:寄存器个数
|
|
输出参数: -
|
|
返回说明: <0: 错误 >0:发送数据长度
|
|
其它说明: -
|
|
*****************************************************************/
|
|
extern int chrg_eload_read_regs (rt_uint8_t addr, rt_uint16_t reg, rt_uint16_t len);
|
|
|
|
/*****************************************************************
|
|
Function: chrg_eload_read_version
|
|
Description: Request the south board firmware version register.
|
|
Input: addr: south board address
|
|
Output: -
|
|
Return: <0: error, >0: sent length
|
|
*****************************************************************/
|
|
extern int chrg_eload_read_version (rt_uint8_t addr);
|
|
|
|
/*****************************************************************
|
|
函数名称: chrg_eload_write_reg
|
|
函数描述: 向南向发送写单个寄存器
|
|
输入参数: addr:地址 reg:寄存器地址 value:写入值
|
|
输出参数: -
|
|
返回说明: <0: 错误 >0:发送数据长度
|
|
其它说明: -
|
|
*****************************************************************/
|
|
extern int chrg_eload_write_reg (rt_uint8_t addr, rt_uint16_t reg, rt_uint16_t value);
|
|
|
|
/*****************************************************************
|
|
函数名称: chrg_eload_refresh
|
|
函数描述: 分段请求读取寄存器表
|
|
输入参数: addr:地址 part:分段
|
|
输出参数: -
|
|
返回说明: <0: 错误 >0:发送数据长度
|
|
其它说明: 实际运行过程只需要读取前13个寄存器即可,即分段0
|
|
*****************************************************************/
|
|
extern int chrg_eload_refresh (rt_uint8_t addr, rt_uint8_t part);
|
|
|
|
/*****************************************************************
|
|
函数名称: chrg_eload_parse
|
|
函数描述: 解析源载返回数据
|
|
输入参数: idx:通道 pt:分段0 *data:数据区 len:数据长度
|
|
输出参数: -
|
|
返回说明: <0: 错误 0:正确
|
|
其它说明: -
|
|
*****************************************************************/
|
|
extern int chrg_eload_parse (rt_uint8_t idx, rt_uint8_t pt, rt_uint8_t *data, rt_uint16_t len);
|
|
|
|
/*****************************************************************
|
|
Function: chrg_eload_parse_version
|
|
Description: Parse and store a valid south board firmware version.
|
|
Input: idx: channel, data: Modbus response, len: response length
|
|
Output: firmware version is stored at the channel version register
|
|
Return: 0: valid, <0: invalid response
|
|
*****************************************************************/
|
|
extern int chrg_eload_parse_version (rt_uint8_t idx, rt_uint8_t *data, rt_uint16_t len);
|
|
/*****************************************************************
|
|
函数名称: chrg_eload_get_sample_seq
|
|
函数描述: 获取指定南向通道P1量测数据的更新序号
|
|
输入参数: idx:南向功率板通道
|
|
输出参数: -
|
|
返回说明: 当前通道量测序号,通道非法时返回0
|
|
其它说明: 每成功解析一帧P1数据后递增,用于区分控制命令前后的新旧量测
|
|
*****************************************************************/
|
|
extern rt_uint32_t chrg_eload_get_sample_seq(rt_uint8_t idx);
|
|
extern void chrg_eload_ripple_filter_reset(rt_uint8_t idx);
|
|
extern void chrg_eload_ripple_filter_relay_start(rt_uint8_t idx);
|
|
extern void chrg_eload_ripple_filter_relay_stop(rt_uint8_t idx);
|
|
// 定义2条继电器指令,控制主继电器和滤波继电器(保留原有有效指令,移除未使用的停止指令)
|
|
static const rt_uint8_t EXTRA_CMD_SOURCE[8] = {0x03, 0x06, 0x00, 0x01, 0x00, 0x01, 0x18, 0x28};
|
|
extern int chrg_eload_send_relay(rt_uint8_t cmd_type);
|
|
|
|
|
|
//写入多寄存器
|
|
extern int chrg_eload_write_More_reg(rt_uint8_t addr,
|
|
rt_uint16_t reg_start,
|
|
rt_uint16_t reg_num,
|
|
const rt_uint16_t *data_buf);
|
|
extern void chrg_write_cv(rt_uint16_t curr,rt_uint16_t volt);
|
|
extern int chrg_eload_send_ymodem_data (rt_uint8_t *buf, rt_uint16_t leng);
|
|
|
|
/*****************************************************************
|
|
函数名称: chrg_eload_set_ymodem_resp / chrg_eload_get_ymodem_resp / chrg_eload_clear_ymodem_resp
|
|
函数描述: Ymodem升级时南向板应答字节的存取接口
|
|
chrg_roll_sou在RUN_UPDATA模式下捕获南向返回的原始ymodem应答(ACK/NAK/C)
|
|
chrg_comm的ymodem_send根据此应答决定给上位机的响应位
|
|
输入参数: resp: 南向返回的ymodem应答字节 (ACK=0x06 / NAK=0x15 / 'C'=0x43)
|
|
输出参数: get返回当前缓存的应答字节,0表示无应答
|
|
返回说明: -
|
|
其它说明: -
|
|
*****************************************************************/
|
|
extern void chrg_eload_set_ymodem_resp(rt_uint8_t resp);
|
|
extern rt_uint8_t chrg_eload_get_ymodem_resp(void);
|
|
extern void chrg_eload_clear_ymodem_resp(void);
|
|
|
|
#endif
|
|
|
|
|