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 0000000..7c05d2f Binary files /dev/null and b/docs/BMP4810300-4多å��è®®å�¯ç¼–程å�Œå�‘电æº�通信å��è®®V_1.1.xlsx differ 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 Ô´ÔØÖ¸ÁĬÈÏÊǵç×Ó¸ºÔØ£¬1ÊÇsupply£¬2ÊÇeload + +//¹ÊÕϼĴæÆ÷ +/*****************************¹ÊÕÏÀàÐÍ*****************/ +#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 ´æ´¢Êý¾Ýµ½flash£»0xBB »Ö¸´Ä¬ÈϲÎÊý +#define ModbusRTU_WorkMode 0x06 //06 WR 0x01 ºãѹ£¬0x02 ºãÁ÷£¬0x03¿ª»·£¬04 ºã¹¦ÂÊ£¬05ºã×è +#define ModbusRTU_Volt 0x07 //07-08 WR ÉèÖÃÊä³öµçѹ uint32£¬0.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µØÖ·£¬¶ÁÈ¡°æ±¾ºÅ£¬03´ú±íbuckboost°ëÇÅ£¬01Êǰ汾ºÅ +#define ModbusADDR_SlaveID_Modify 0x1C //11,13µØÖ·,ÐÞ¶©SlaveID + + +#define Line_Compensation 0X1D //1F 14dµØÖ·£¬ÏßËð²¹³¥£¬Õý¸º5V£¬1mv£¬¾«¶È0.001£¬·Å´ó1000±¶£¬5000 + +#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 //µ¥Î»ÊÇms£¬×î´ó65535ms£¬¸ø0ÊÇÁ¢¼´ÊÍ·Å£¬¸øÒ»¸öʱ¼äÖµ£¬Ê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£»·¶Î§1msµ½100ms; +#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Æô¶¯¡¢Í˳ö¡¢ ÒÔ¼°Ä£Ê½£ºContinuous¡¢PULSE¡¢Toggle£»LSB8 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 8307457..0000000 Binary files a/docs/副本BMP4810300-4多å��è®®å�¯ç¼–程å�Œå�‘电æº�通信å��è®®V_2.0 - 副本(1).xlsx and /dev/null differ diff --git a/rt-thread/components/legacy/usb/usbdevice/core/usbdevice_core.c b/rt-thread/components/legacy/usb/usbdevice/core/usbdevice_core.c index 015473f..ab76558 100644 --- a/rt-thread/components/legacy/usb/usbdevice/core/usbdevice_core.c +++ b/rt-thread/components/legacy/usb/usbdevice/core/usbdevice_core.c @@ -2237,6 +2237,7 @@ static struct rt_thread usb_thread; /* internal of the message queue: every message is associated with a pointer, * so in order to recveive USBD_MQ_MAX_MSG messages, we have to allocate more * than USBD_MQ_MSG_SZ*USBD_MQ_MAX_MSG memory. */ +rt_align(RT_ALIGN_SIZE) static rt_uint8_t usb_mq_pool[(USBD_MQ_MSG_SZ+sizeof(void*))*USBD_MQ_MAX_MSG]; /**