From 8f44ae6877e8d459d4218f4dacf4cc9da0ce2d0d Mon Sep 17 00:00:00 2001 From: wrh Date: Thu, 23 Jul 2026 10:36:59 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=B9=B6=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增并替换通信协议文档,删除旧版V2.0协议文档 2. 重构充电源逻辑,移除Set_CV_Flag相关变量和代码 3. 优化充电源关闭流程,修正寄存器配置逻辑 4. 完善Modbus输入寄存器回调和功能码处理逻辑 5. 调整输入寄存器映射表,简化寄存器定义 6. 为USB设备队列内存添加对齐宏定义 7. 新增南向电源Modbus寄存器头文档 --- apps/chrg/applications/thread/chrg_comm.c | 23 ++- apps/chrg/applications/thread/chrg_north.c | 141 +++++++------ apps/chrg/applications/utils/chrg_regs.h | 53 +---- apps/chrg/applications/utils/chrg_sink.c | 1 - apps/chrg/applications/utils/chrg_source.c | 3 +- apps/chrg/applications/utils/chrg_source.h | 1 - ...00-4多协议可编程双向电源通信协议V_1.1.xlsx | Bin 0 -> 17979 bytes docs/south_regs.h | 190 ++++++++++++++++++ ...可编程双向电源通信协议V_2.0 - 副本(1).xlsx | Bin 17467 -> 0 bytes .../usb/usbdevice/core/usbdevice_core.c | 1 + 10 files changed, 300 insertions(+), 113 deletions(-) create mode 100644 docs/BMP4810300-4多协议可编程双向电源通信协议V_1.1.xlsx create mode 100644 docs/south_regs.h delete mode 100644 docs/副本BMP4810300-4多协议可编程双向电源通信协议V_2.0 - 副本(1).xlsx diff --git a/apps/chrg/applications/thread/chrg_comm.c b/apps/chrg/applications/thread/chrg_comm.c index 9f46ba8..9fbce17 100644 --- a/apps/chrg/applications/thread/chrg_comm.c +++ b/apps/chrg/applications/thread/chrg_comm.c @@ -221,6 +221,16 @@ static eMBException mb_error (eMBErrorCode eErrorCode) } //extern eMBErrorCode Modbus_Protocal_Set(rt_uint16_t Role_value,rt_uint16_t src,rt_uint16_t pps,rt_uint16_t pro_value,rt_uint16_t volt_value,rt_uint16_t curr_value); +/***************************************************************** +函数名称: mb_reg_input_cb +函数描述: Modbus输入寄存器读取回调函数 +输入参数: pucRegBuffer:输入寄存器返回数据缓冲区 + usAddress:输入寄存器起始地址 + usNRegs:需要读取的输入寄存器数量 +输出参数: pucRegBuffer:按Modbus高字节在前格式填充寄存器数据 +返回说明: MB_ENOERR:读取成功 MB_ENOREG:地址范围错误 +其它说明: 只读usRegInBuf,不处理写操作;每个输入寄存器转换为两个字节 +*****************************************************************/ eMBErrorCode mb_reg_input_cb (rt_uint8_t *pucRegBuffer, rt_uint16_t usAddress, rt_uint16_t usNRegs) { eMBErrorCode eStatus = MB_ENOERR; @@ -566,11 +576,12 @@ eMBException funcReadHoldingRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen, /***************************************************************** 函数名称: funcReadInputRegister -函数描述: 读输入寄存器 +函数描述: 处理Modbus功能码0x04,读取输入寄存器 输入参数: reqFrame: 请求数据 reqLen: 请求长度 resFrame:响应数据 resLen:响应长度 -输出参数: - -返回说明: - -其它说明: - +输出参数: resFrame:输入寄存器响应帧 resLen:响应帧长度 +返回说明: MB_EX_NONE:读取成功 其他:Modbus异常码 +其它说明: 请求地址和数量校验方式与功能码0x03保持一致;输入寄存器 + 数据从usRegInBuf读取,响应数据按高字节在前返回 *****************************************************************/ eMBException funcReadInputRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen, rt_uint8_t *resFrame, rt_uint16_t *resLen) @@ -594,13 +605,14 @@ eMBException funcReadInputRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen, resFrame[1] = MB_READ_INPUT_REGISTER; resFrame[2] = cntReg * 2; - eRegStatus = mb_reg_discrete_cb(&resFrame[3], regAddress, cntReg); + eRegStatus = mb_reg_input_cb(&resFrame[3], regAddress, cntReg); if (eRegStatus != MB_ENOERR) { eStatus = mb_error(eRegStatus); } else { *resLen = 3+cntReg*2; } + rt_kprintf("------COM READ INPUT addr=%d count=%d-------\n", regAddress, cntReg); return eStatus; } @@ -801,6 +813,7 @@ typedef struct { } SrcProtoMap_t; static const SrcProtoMap_t src_proto_map[] = { + {0x20, PRO_NONE}, // 标准协议(无快充) {0x2A, PRO_PD0PSS}, // PD {0x22, PRO_FCP}, // FCP {0x23, PRO_SCPB}, // SCPB diff --git a/apps/chrg/applications/thread/chrg_north.c b/apps/chrg/applications/thread/chrg_north.c index ea4f291..68b78b0 100644 --- a/apps/chrg/applications/thread/chrg_north.c +++ b/apps/chrg/applications/thread/chrg_north.c @@ -28,100 +28,133 @@ #define SOURCE_VOLT_RETRY_FRAMES 3U /***************************************************************** -函数名称: chrg_source_standard_output -功能描述: 南向功率源标准输出控制函数 -函数描述: 根据CV标志位,分别设置电源输出电压或输出电流,实现标准模式下的恒压/恒流输出 -输入参数: - idx :功率通道编号 - pSW :北向通道控制结构体指针,包含电压/电流设定值、CV控制标志等参数 -输出参数: - pSW :更新CV控制标志位 -返回说明: 无返回值 +函数名称: chrg_source_voltage_control +函数描述: 统一处理Source目标电压、误差判断和状态机切换 +输入参数: idx:当前通道 pSW:通道控制结构体 volt_mv:目标电压(mV) + curr_ma:目标电流(mA) +输出参数: 更新source.vc及source.work_mode +返回说明: 0:状态处理成功 <0:参数错误或命令提交失败 +其它说明: 目标电压变化时立即进入RUNING;实际电压与目标值的绝对误差 + 小于等于200mV时进入WAIT;连续3次超过误差范围时重发 *****************************************************************/ -void chrg_source_standard_output(eIDX_SOU_CH idx, struct chrg_switch_t *pSW) +static int chrg_source_voltage_control(eIDX_SOU_CH idx, + struct chrg_switch_t *pSW, + rt_uint16_t volt_mv, + rt_uint16_t curr_ma) { - if(pSW->source.Set_CV_Flag) { - chrg_set_sou_reg((eIDX_SOU_CH)idx, REG_VOLTAGE_OUT+1, pSW->source.max_vol); -#if DEBUG_NORTH - rt_kprintf("Volt_Set%d\r\n",pSW->source.vc.set_voltage); -#endif - pSW->source.Set_CV_Flag = 1; - pSW->change_flag = 0; - } -} - -/***************************************************************** -函数名称: chrg_source_parse -函数描述: 解析北向电源板电压电流回码并驱动Source状态机 -输入参数: frame_data:完整北向回码 idx:当前通道 pSW:通道控制结构体 - pNOR:北向总控结构体 -输出参数: 更新电压、电流、source.work_mode及电压重试计数 -返回说明: - -其它说明: frame_data[4~7]为实测值,[8~11]为协议协商目标值; - 新目标立即进入RUNING;实际误差连续3帧超过200mV时重发 -*****************************************************************/ -void chrg_source_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx, - struct chrg_switch_t *pSW, struct chrg_north_t *pNOR) -{ - rt_uint16_t volt_mv; - rt_uint16_t curr_ma; rt_uint16_t volt_error; static rt_uint16_t last_volt_mv[TOTAL_SOU_CHS] = {0}; static rt_uint8_t last_volt_valid[TOTAL_SOU_CHS] = {0}; + static rt_uint8_t last_protocol[TOTAL_SOU_CHS] = {0}; static rt_uint8_t volt_retry_count[TOTAL_SOU_CHS] = {0}; rt_bool_t need_set = RT_FALSE; int ret; - if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL) || - (frame_data == RT_NULL)) { - return; + if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) { + return -1; } - volt_mv = (frame_data[8] << 8) | frame_data[9]; - curr_ma = (frame_data[10] << 8) | frame_data[11]; - /* 保存北向协议板返回的实测值和协商目标值。 */ + + /* 保存本次目标值,RUNING状态只使用其中的目标电压下发命令。 */ pSW->source.vc.set_voltage = volt_mv; pSW->source.vc.set_current = curr_ma; if (!pSW->source.On_Flag) { - /* 关机后清除历史值,确保下次启动至少下发一次目标电压。 */ + /* 关机后清除历史缓存,下一次启动必须重新设置目标电压。 */ last_volt_valid[idx] = 0; volt_retry_count[idx] = 0; - return; + return 0; } - /* 使用绝对误差,避免无符号减法在实际电压较小时发生下溢。 */ + /* 使用绝对误差,避免实际电压低于目标值时发生无符号下溢。 */ volt_error = (pSW->Now_voltage >= volt_mv) ? (pSW->Now_voltage - volt_mv) : (volt_mv - pSW->Now_voltage); - if (!last_volt_valid[idx] || (volt_mv != last_volt_mv[idx])) { - /* 首次设置或目标变化,立即进入RUNING下发新电压。 */ + if (!last_volt_valid[idx] || + (last_protocol[idx] != (rt_uint8_t)pSW->source.protocol) || + (volt_mv != last_volt_mv[idx])) { + /* 首次设置、协议切换或目标变化时立即下发新电压。 */ need_set = RT_TRUE; } else if (volt_error <= SOURCE_VOLT_ERROR_MV) { - /* 实际电压已进入允许范围,清除连续失败计数。 */ + /* 实际电压误差不超过200mV即可视为设置成功。 */ volt_retry_count[idx] = 0; } else { /* 给功率板三个反馈周期的稳定时间,避免每帧重复写电压。 */ if (volt_retry_count[idx] < SOURCE_VOLT_RETRY_FRAMES) { volt_retry_count[idx]++; } - if (volt_retry_count[idx] >= SOURCE_VOLT_RETRY_FRAMES) { need_set = RT_TRUE; } } - /* 解析函数只决定状态,具体寄存器操作仍由Source状态机执行。 */ pSW->source.work_mode = need_set ? SOURCE_WORK_RUNING : SOURCE_WORK_WAIT; - ret = chrg_source_work_state(idx, pSW); if ((ret == 0) && need_set) { - /* 成功入队后更新缓存;重发成功后重新开始计算连续超差帧数。 */ + /* 只有命令成功提交后才更新缓存,失败时下一次继续重试。 */ last_volt_mv[idx] = volt_mv; + last_protocol[idx] = (rt_uint8_t)pSW->source.protocol; last_volt_valid[idx] = 1; volt_retry_count[idx] = 0; } + + return ret; +} + +/***************************************************************** +函数名称: chrg_source_standard_output +函数描述: 使用COM配置值驱动标准协议电源输出 +输入参数: idx:当前通道 pSW:通道控制结构体 +输出参数: 更新source.vc及source.work_mode +返回说明: 无返回值 +其它说明: 外部协议值0x20映射为PRO_NONE;本函数不解析北向协议返回 + 数据,目标电压和保护电流直接使用COM配置值 +*****************************************************************/ +void chrg_source_standard_output(eIDX_SOU_CH idx, struct chrg_switch_t *pSW) +{ + if (pSW == RT_NULL) { + return; + } + + (void)chrg_source_voltage_control(idx, pSW, + pSW->source.max_vol, pSW->source.protective_curr); +} + +/***************************************************************** +函数名称: chrg_source_parse +函数描述: 按电源协议类型处理目标电压并驱动Source状态机 +输入参数: frame_data:完整北向回码 idx:当前通道 pSW:通道控制结构体 + pNOR:北向总控结构体 +输出参数: 更新电压、电流、source.work_mode及电压重试计数 +返回说明: - +其它说明: 标准协议不解析frame_data,直接使用COM配置值;快充协议读取 + frame_data[8~11]中的协商目标值。新目标立即进入RUNING, + 实际误差连续3帧超过200mV时重发 +*****************************************************************/ +void chrg_source_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx, + struct chrg_switch_t *pSW, struct chrg_north_t *pNOR) +{ + rt_uint16_t volt_mv; + rt_uint16_t curr_ma; + + if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) { + return; + } + + /* 标准协议使用COM设定值,不读取北向协议返回帧。 */ + if (pSW->source.protocol == PRO_NONE) { + chrg_source_standard_output(idx, pSW); + return; + } + + if (frame_data == RT_NULL) { + return; + } + volt_mv = (frame_data[8] << 8) | frame_data[9]; + curr_ma = (frame_data[10] << 8) | frame_data[11]; + /* 快充只负责解析北向协商结果,后续控制逻辑与标准协议共用。 */ + (void)chrg_source_voltage_control(idx, pSW, volt_mv, curr_ma); } /***************************************************************** @@ -138,7 +171,7 @@ void chrg_source_setting(rt_uint8_t *frame_data, eIDX_SOU_CH idx, { //执行输出调整 if (pSW->source.On_Flag == 1) { - if(pSW->source.protocol==0x00){//标准下输出设定值 + if(pSW->source.protocol == PRO_NONE){//标准下输出设定值 chrg_source_standard_output(idx, pSW); } else{ //快充部分按协商结果输出 @@ -258,7 +291,6 @@ struct chrg_north_t chrgnorth = { .id = ID_SINK, // 初始为负载模式 .source = { // 电源侧参数初始化 .On_Flag = 0, // 启动标志初始关闭 - .Set_CV_Flag = 1, // 启停控制初始置1 .work_mode = SOURCE_WORK_WAIT, // 上电保持等待,禁止自动执行Source INIT }, // 关键:补充逗号分隔source和sink .sink = { @@ -276,7 +308,6 @@ struct chrg_north_t chrgnorth = { .change_flag = 0, .source = { .On_Flag = 0, - .Set_CV_Flag = 1, .work_mode = SOURCE_WORK_WAIT, // 上电保持等待,禁止自动执行Source INIT }, .sink = { @@ -293,7 +324,6 @@ struct chrg_north_t chrgnorth = { .change_flag = 0, .source = { .On_Flag = 0, - .Set_CV_Flag = 1, .work_mode = SOURCE_WORK_WAIT, // 上电保持等待,禁止自动执行Source INIT }, .sink = { @@ -310,7 +340,6 @@ struct chrg_north_t chrgnorth = { .change_flag = 0, .source = { .On_Flag = 0, - .Set_CV_Flag = 1, .work_mode = SOURCE_WORK_WAIT, // 上电保持等待,禁止自动执行Source INIT }, .sink = { diff --git a/apps/chrg/applications/utils/chrg_regs.h b/apps/chrg/applications/utils/chrg_regs.h index 635a128..c18391e 100644 --- a/apps/chrg/applications/utils/chrg_regs.h +++ b/apps/chrg/applications/utils/chrg_regs.h @@ -93,60 +93,17 @@ enum { TOTAL_COIL_REGS // ̵24 }; -#define TOTAL_INPUT_CH_REGS (10) // ͨ Ĵ - +#define TOTAL_INPUT_CH_REGS (50) // ͨĴַͨΪ50 +#define TOTAL_INPUT_REGS TOTAL_INPUT_CH_REGS * 4 // Ĵб +// ÿͨռ50ַǰʵʹǰ4ĴַԤ enum { INPUT_REG_CH0_STA1 = INPUT_REG_START, // ͨ0 ״̬1 ͬԴ INPUT_REG_CH0_STA2, // ͨ0 ״̬2 ͬԴ INPUT_REG_CH0_FAULT1, // ͨ0 ״̬1 ͬԴ - INPUT_REG_CH0_FAULT2, // ͨ0 ״̬2 ͬԴ - INPUT_REG_04, // Ĵ04 - INPUT_REG_05, // Ĵ05 - INPUT_REG_06, // Ĵ06 - INPUT_REG_07, // Ĵ07 - INPUT_REG_08, // Ĵ08 - INPUT_REG_09, // Ĵ09 - // add more TOTAL_INPUT_CH_REGS - - INPUT_REG_CH1_STA1, // ͨ1 ״̬1 - INPUT_REG_CH1_STA2, // ͨ1 ״̬2 - INPUT_REG_CH1_FAULT1, // ͨ1 ״̬1 - INPUT_REG_CH1_FAULT2, // ͨ1 ״̬2 - INPUT_REG_14, // Ĵ14 - INPUT_REG_15, // Ĵ15 - INPUT_REG_16, // Ĵ16 - INPUT_REG_17, // Ĵ17 - INPUT_REG_18, // Ĵ18 - INPUT_REG_19, // Ĵ19 - - INPUT_REG_CH2_STA1, // ͨ2 ״̬1 - INPUT_REG_CH2_STA2, // ͨ2 ״̬2 - INPUT_REG_CH2_FAULT1, // ͨ2 ״̬1 - INPUT_REG_CH2_FAULT2, // ͨ2 ״̬2 - INPUT_REG_24, // Ĵ24 - INPUT_REG_25, // Ĵ25 - INPUT_REG_26, // Ĵ26 - INPUT_REG_27, // Ĵ27 - INPUT_REG_28, // Ĵ28 - INPUT_REG_29, // Ĵ29 - - INPUT_REG_CH3_STA1, // ͨ3 ״̬1 - INPUT_REG_CH3_STA2, // ͨ3 ״̬2 - INPUT_REG_CH3_FAULT1, // ͨ3 ״̬1 - INPUT_REG_CH3_FAULT2, // ͨ3 ״̬2 - INPUT_REG_34, // Ĵ34 - INPUT_REG_35, // Ĵ35 - INPUT_REG_36, // Ĵ36 - INPUT_REG_37, // Ĵ37 - INPUT_REG_38, // Ĵ38 - INPUT_REG_39, // Ĵ39 - INPUT_REG_40, // Ĵ40 - - - TOTAL_INPUT_REGS // Ĵ + INPUT_REG_CH0_FAULT2 // ͨ0 ״̬2 ͬԴ + }; -//AI޸ģһ׼ȷ // ======================== ¼Ĵӳ (0x06/0x10׼Modbus) ======================== // ַռ滮: // (Sink): 0x0000 + ͨš29 + ƫ (4ͨ29=116, 0x0000~0x0073) diff --git a/apps/chrg/applications/utils/chrg_sink.c b/apps/chrg/applications/utils/chrg_sink.c index aecb00f..a39b9a4 100644 --- a/apps/chrg/applications/utils/chrg_sink.c +++ b/apps/chrg/applications/utils/chrg_sink.c @@ -228,7 +228,6 @@ static int chrg_sink_nor_work_off(eIDX_SOU_CH idx, struct chrg_switch_t *pSW) } pSW->sink.On_work = 0; - pSOU->enable[idx] = 0; pSOU->online[idx] = 0; pNOR->enable[idx] = 0; diff --git a/apps/chrg/applications/utils/chrg_source.c b/apps/chrg/applications/utils/chrg_source.c index f8c8c23..7641413 100644 --- a/apps/chrg/applications/utils/chrg_source.c +++ b/apps/chrg/applications/utils/chrg_source.c @@ -135,8 +135,7 @@ static int chrg_source_work_stop(eIDX_SOU_CH idx, struct chrg_switch_t *pSW) } pSW->source.On_Flag = 0; - pSOU->enable[idx] = 0; - pNOR->enable[idx] = 0; + pNOR->enable[idx] = 0; pSOU->online[idx] = 0; chrg_nor_sw_rel((eIDX_NOR_CH)idx, 0); pSW->source.work_mode = SOURCE_WORK_WAIT; diff --git a/apps/chrg/applications/utils/chrg_source.h b/apps/chrg/applications/utils/chrg_source.h index 937b0a7..dba1737 100644 --- a/apps/chrg/applications/utils/chrg_source.h +++ b/apps/chrg/applications/utils/chrg_source.h @@ -156,7 +156,6 @@ struct chrg_src_t { rt_uint16_t protective_curr; // 保护电流 rt_uint8_t Now_State; // 当前状态 rt_uint8_t On_Flag; // 启动总标志(0/1) - rt_uint8_t Set_CV_Flag; // 电压/电流切换标志(0/1) rt_uint8_t LCD_Set_Pro_Flag; // LCD设置协议标志位 rt_uint8_t change_sink_Flag; // 从source切换到sink标志位 rt_uint8_t work_mode; diff --git a/docs/BMP4810300-4多协议可编程双向电源通信协议V_1.1.xlsx b/docs/BMP4810300-4多协议可编程双向电源通信协议V_1.1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7c05d2f5ee0db463928fdbe8a9972e524f55cfc7 GIT binary patch literal 17979 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ℌok_?e1G!bzlMi@0{$6a{SA1_ z{|~@FqO1QJZT$)Q?~%dZknb}t2mRpWAM1Oz!fBNy2kpKVy literal 0 HcmV?d00001 diff --git a/docs/south_regs.h b/docs/south_regs.h new file mode 100644 index 0000000..d535cab --- /dev/null +++ b/docs/south_regs.h @@ -0,0 +1,190 @@ +#ifndef __DigtalPower_ModbusRTU_REG_List_H__ +#define __DigtalPower_ModbusRTU_REG_List_H__ + +#include "USART1_Modbus_RTU.h" +#include "dac.h" + +#define ModbusRTU_SW_Version 0x0301; //01ǵԴţ02Ǹشţ03ǷǽԴشţ04ǽܵԴ;ֽ01ǰ汾ţV0.1 + +//ModbusRTU վַ//״̬вʾ +#define ModbusRTU_Power_Status 0x00 //R,״ָ̬ʾ00 Ԥ磻01/ֹͣ 02 03 У04 :03 03 00 00 00 01 85 E8 +#define ModbusRTU_Relay_Status 0x01 //bit0=0 ̵Ͽ bit0=1 ̵պϣbit1=0 ˲̵Ͽ bit1=1 ˲̵պ +#define ModbusRTU_Fault_Status 0x02 //״̬Ĵ +#define ModbusRTU_Flash_Status 0x03 //flash洢״̬ +#define ModbusRTU_Role_ModeFlag 0x04 //0x04 ԴָĬǵӸأ1supply2eload + +//ϼĴ +/**********************************************/ +#define F_NOERR 0x0000//޹ +#define F_SW_VIN_UVP 0x0001//Ƿѹ +#define F_SW_VIN_OVP 0x0002//ѹ +#define F_SW_VOUT_UVP 0x0004//Ƿѹ +#define F_SW_VOUT_OVP 0x0008//ѹ +#define F_SW_IOUT_OCP 0x0010// +#define F_SW_SHORT 0x0020//· +#define F_SW_OTP 0x0040//± + +//Դָ +#define ModbusRTU_PowerCmd 0x05 //05 W 0x01 0x02 ػ0x03ϸλ0xAA 洢ݵflash0xBB ָĬϲ +#define ModbusRTU_WorkMode 0x06 //06 WR 0x01 ѹ0x02 0x0304 㹦ʣ05 +#define ModbusRTU_Volt 0x07 //07-08 WR ѹ uint320.001V, 0~60V,Ĭ5VѯѹҲָ +#define ModbusRTU_Current 0x09 //09-0A WR uint32 0.001A, 0~60A,Ĭֵ1AѯѹҲָ + +#define ModbusRTU_ShortTest_VoltShort 0x0B //shortԳɹʧܣ·ֵʱĵѹ +#define ModbusRTU_ShortTest_CurrentShort 0x0C //۲Գɹʧܣ·ֵʱĵѹ +#define ModbusRTU_OCPTest_VoltOCP 0x0D //shortԳɹʧܣ·ֵʱĵѹ +#define ModbusRTU_OCPTest_CurrentOCP 0x0E //۲Գɹʧܣ·ֵʱĵѹ + +#define ModbusRTU_DUT_Vpkp 0x0F //ֵ +#define ModbusRTU_DUT_Vpkn 0x10 //⸺ֵ +#define ModbusRTU_DUT_Vpp 0x11 //ֵ +//ƲĴ +#define ModbusRTU_Ripple_Value 0x12 //ȡƲ + +#define ModbusRTU_Temp 0x1A //WR 11,ǰڲ¶ȶȡ +#define ModbusADDR_SW_Version 0x1B //10,12ַȡ汾ţ03buckboostţ01ǰ汾 +#define ModbusADDR_SlaveID_Modify 0x1C //11,13ַ,޶SlaveID + + +#define Line_Compensation 0X1D //1F 14dַ𲹳5V1mv0.001Ŵ10005000 + +#define Eload_Start_VON 0x20 //10 16Ĵ洢Ӹѹؼ⵽ѹֵΪѹſӸأ +#define Eload_Stop_Volt 0x21 //11 17Ĵ洢Ӹعرյѹ +#define Eload_Slew_Rate 0x22 //12 18Ĵ洢Ӹбʲ + +#define ModbusRTU_CPower 0x24 //36-37 ֵ +#define ModbusRTU_CResistor 0x26 //38 ֵ + +//6.3.1ԴƲ +#define ModbusRTU_VoltLimit 0x28 //0x29 40-41 0x2A 42Ĵѹֵ,Ĭ6.0V,΢6.5V +#define ModbusRTU_CurrentLimit_H 0x2A //42~43WR ֵ +#define ModbusRTU_CurrentLimit_L 0x2B //42~43WR ֵ + +#define ModbusRTU_Volt_CAL_K 0x2C //2C~2D ѹУ׼Kֵ,ŴQ16ƶ16ȥʹֽ +#define ModbusRTU_Volt_CAL_K_L 0x2D +#define ModbusRTU_Volt_CAL_B 0x2E //2E ѹУ׼Bֵ +#define ModbusRTU_Current_CAL_K 0x2F //2F-30 У׼Kֵ +#define ModbusRTU_Current_CAL_K_L 0x30 + +#define ModbusRTU_Current_CAL_B 0x31 //31 У׼Bֵ + +#define ModbusRTU_SourceCurrent_CAL_K 0x32 //32-33 У׼Kֵ +#define ModbusRTU_SourceCurrent_CAL_K_L 0x33 + +#define ModbusRTU_SourceCurrent_CAL_B 0x34 //34 У׼Bֵ + +#define ModbusRTU_SourceSink_Current_Offset 0x35 //Դĵϱoffset +//#define ModbusRTU_Sink_Current_Offset 0x33 //صĵϱoffset + +#define ModbusRTU_CALI_CRC 0x36 //У׼ƫ6УֵʹCRC16-ModbusУ飻 + + +#define ModbusRTU_CAL_WriteEnable 0x37 //ʹдFLASH´εʹǸħ0x4361 C+a +#define ModbusRTU_CAL_WriteRecovery 0x38 //ʹд0x5763 +#define ModbusRTU_CAL_ReadRecovery 0x39 //ʹܶݶǰbankУ6 + +//short +#define ModbusRTU_ShortTest_CMD_MODE_FLAG 0x40 //16λ0x0101; 01ֽڵ01ֵΪ0ͷŵ 20260601һֽڵbit7=0ǻָǰ״̬bit7=1ǽжص㣻 +#define ModbusRTU_ShortTest_Hold_Time 0x41 //λms65535ms0ͷţһʱֵDZʱ䲻䣻 +//#define ModbusRTU_ShortTest_CurrentShort 0x42 //۲Գɹʧܣ·ֵʱĵѹ + +//OCP +#define ModbusRTU_OCPTest_CMD_MODE_FLAG 0x43 //16λ0x0101; 01ֽڵ01ֵΪ0ͷŵ 20260601һֽڵbit7=0ǻָǰ״̬bit7=1ǽжص㣻 +#define ModbusRTU_OCPTest_StartCurrent 0x44 //ʼ +#define ModbusRTU_OCPTest_StopCurrent 0x45 //ֹ +#define ModbusRTU_OCPTest_StepCurrent 0x46 //ÿһĵ +#define ModbusRTU_OCPTest_Step_Hold_Time 0x47 //ÿһıʱ䣻Ĭ10msΧ1ms100ms; +#define ModbusRTU_OCPTest_Vtrig_Stop 0x48 //ﵽOCPĵѹֵ +#define ModbusRTU_OCPTest_Hold_Time 0x49 +//#define ModbusRTU_OCPTest_VoltOCP 0x49 //shortԳɹʧܣ·ֵʱĵѹ +//#define ModbusRTU_OCPTest_CurrentOCP 0x4A //۲Գɹʧܣ·ֵʱĵѹ + +//DYNA ӸصĶ̬ģʽҲж̬ػ˲̬ԡڸģʽ£ػᰴ趨бʡƵʺռձȣֵ߸غ͵͸أ֮䣬ԵԴ˲̬Ӧָʱԡ +#define ModbusRTU_DYNA_CMD_MODE_FLAG 0x4B //̬ CMD˳ ԼģʽContinuousPULSEToggleLSB8 BIT7 ·ʱĵ/㣻bit1 bit0 ɹ/ʧ +#define ModbusRTU_DYNA_L1 0x4C //̬Ե1 +#define ModbusRTU_DYNA_L2 0x4D //̬Ե2 +#define ModbusRTU_DYNA_T1 0x4E //̬Ե1ʱ +#define ModbusRTU_DYNA_T2 0x4F //̬Ե2ʱ +#define ModbusRTU_DYNA_Rise_Slew_Rate 0x50 //̬б +#define ModbusRTU_DYNA_Fall_Slew_Rate 0x51 //̬½б + + +#define ModbusRTU_DUT_ValueReset 0x5D //λֵ + +#define ModbusRTU_SYS_Reset 0x61 //ϵͳλָ쳣ѹָͨϵͳλ + +//#define ModbusRTU_Volt_Kp 0x30 //48-49 RW ѹkp +//#define ModbusRTU_Volt_Ki 0x32 //50-51WR ѹki +//#define ModbusRTU_Curr_Kp 0x34 //52-53WR kp +//#define ModbusRTU_Curr_Ki 0x36 //54-55WR ki + +//#define ModbusRTU_CP_Kp 0x38 //56-57 RW ʻkp +//#define ModbusRTU_CP_Ki 0x3A //58-59 WR ʻki +//#define ModbusRTU_CR_Kp 0x3C //60-61 WR 軷kp +//#define ModbusRTU_CR_Ki 0x3E //62-63 WR 軷ki + +//112,0x70ĴΪǰڲ¶ȶȡ㣻 + +#define ModbusRTU_TempLimit 0x71 //WR ¶ֵ +#define ModbusRTU_FANSpeed 0x72 //ٿƣλ趨Զģʽ£¶ȸһֵܣС + +#define SMU_Relay_ON 0x0001 //Դ̵ +#define SMU_EL_PB15_EMI_Bypass_ON 0x0002 //·˲̵ +//ֵĹϵY(VDAC) = K*X(I-real)+B +#define Init_OCP_VALUE 12000 //12A +// +#define K_COEFF_FWD_Q16 (9960) +#define B_Intercept_FWD (1846) +// +#define K_COEFF_REV_Q16 (-9960) +#define B_Intercept_REV (1846) + +//ṹ +//6.2.1״̬вʾ PowerStatusAndParaShow +typedef struct { + uint16_t Power_Status; + uint16_t Relay_Status; + uint16_t Fault_Status; + uint16_t Flash_Status; + uint32_t InputVolt; + uint32_t InputCurr; + uint32_t OutputVolt; + uint32_t OutputCurr; + uint32_t OutputPower; + uint16_t statusRsv1; //Ԥλ + uint16_t statusRsv2; +}S_PowerStatusAndParaShow; + +extern S_PowerStatusAndParaShow PowerStatusAndParaShow; + +//6.2.2ԴָPowerControlCmd +typedef struct{ + uint16_t PowerCmd; + uint16_t WorkMode; + uint32_t Vout; + uint32_t Iout; + uint8_t Remote_Power_ON_Flag; //ػָʾ + uint8_t Remote_Power_Reset_Flag; //λָʾ +}S_PowerControlCmd; + +extern S_PowerControlCmd PowerControlCmd; + + +//6.3.1ԴƲ +typedef struct{ + uint32_t VoutLimit; + uint32_t IoutLimit; + uint16_t DutyLimit; + uint16_t FrequnceLimit; + float VoltKp; + float VoltKi; + float CurrKp; + float CurrKi; +}S_PowerControlPara; + +extern uint8_t Power_OnOff_Flag,Power_OnOff_Flag; + +extern S_PowerControlPara PowerControlPara; +//Modbus ʼ +extern void Modbus_Para_Init(void); +#endif diff --git a/docs/副本BMP4810300-4多协议可编程双向电源通信协议V_2.0 - 副本(1).xlsx b/docs/副本BMP4810300-4多协议可编程双向电源通信协议V_2.0 - 副本(1).xlsx deleted file mode 100644 index 83074575fe13d3c35980de020a65e0c0b70c1f5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17467 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