EMS 知识库
首页 / knowledge/代码解析/索引/功能索引

midware-platform 功能反查索引

覆盖源文件:36 个(midware/interface 12 个、midware/ethernt 14 个、midware/debug 8 个、midware/auxiliary 2 个)。文档本体见 docs/knowledge/代码解析/midware/。 用法:在「想找的功能」列里搜关键词,即可定位到源文件。 说明:midware/ethernt/lan/w5500.c|h、wizchip_conf.c|h、wireless/wifi/WM6232PU.c|h 属本目录但不属于本次分配范围,无对应分析文档,不在此表内。

接口任务与 485 总线仲裁

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
接口层两个任务在哪创建 / task_interface_parse 和 task_modbus_rtu 谁建的task_interface_parse、task_modbus_rtu;配套头文件 interface.h(仅声明这两个任务入口 + DEBUG_INTERFACE 宏)midware/interface/interface.c、midware/interface/interface.h../../midware/interface/interface.c.md、../../midware/interface/interface.h.md
接口轮询任务一周期按什么顺序跑哪四件事task_interface_parse(固定 500 ms:drm_mode_judge → Handle_Dry_Node_Logic → query_parameter_save_tags → epo_control_handle)midware/interface/interface.c../../midware/interface/interface.c.md
485 口(USART3)在并机/充电桩/Modbus 三种用途之间怎么仲裁task_modbus_rtu(4 路优先级分支;只有默认分支才 OSSemPend(g_t_uart3_rcv_sem, 100))midware/interface/interface.c../../midware/interface/interface.c.md
485 总线切换时波特率被强制改成多少 / 为什么写 9600task_modbus_rtu(充电桩/EV 分支强制 BAUD_RATE_9600 + uart3_init(9600) + 置 u8_set_modbus_config_flag)midware/interface/interface.c../../midware/interface/interface.c.md
Modbus-RTU 收帧信号量超时判多久 / 为什么是 100task_modbus_rtu(OSSemPend(..., 100, ...),100 tick = 100 ms)midware/interface/interface.c../../midware/interface/interface.c.md
参数改动后谁负责写 Flash / 配置落盘标志轮询在哪query_parameter_save_tags(12 个标志位 → Flash 页映射;内部 5 s 节流;先清标志再 save_job_post)midware/interface/interface.c../../midware/interface/interface.c.md
并机通讯方案(UART4/CAN/USART3)自适应探测在哪parallel_precept_change(1 h 强制超时兜底 CAN;主机 15 s / 从机 30 s 乒乓切换)midware/interface/interface.c../../midware/interface/interface.c.md
并机方案探测多久还没通就锁 CANparallel_precept_change(OSTimeGet 差值 ≥ 3600000 = 1 h)midware/interface/interface.c../../midware/interface/interface.c.md
Sunspec 使能后接口任务在哪初始化/刷新数据sunspec_modbus_data_init、sunspec_modbus_data_refresh、sunspec_refresh_flag_getmidware/interface/interface.c../../midware/interface/interface.c.md

Modbus RTU / TCP 从站与寄存器映射

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
Modbus 寄存器地址表在哪 / 上位机读写哪个寄存器对应哪个变量REG_MODBUS_E 枚举、REG_MODBUS_START/各段 *_MAX_E 哨兵;配套头文件 modbus.hmidware/interface/modbus/modbus.h../../midware/interface/modbus/modbus.h.md
Modbus 从站协议栈实现体在哪 / RTU 和 TCP 是不是同一套handle_modbus_ret_recv_data(RTU)、ems_to_modbus_tcp(TCP)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
Modbus RTU 整帧接收超时判多久handle_modbus_ret_recv_data(OSTimeGet 差值 300 tick = 300 ms 忙等)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
Modbus TCP 收一帧头最长等多久 / 整包超时handle_modbus_tcp_recv_data(MBAP 6 字节头 1000 tick、整包累计 1000 tick,各 = 1 s)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
Modbus 从站地址/波特率/Sunspec 地址存在哪个结构体g_t_modbus_config(MODBUS_CONFIG_INFO_T,128 字节带 CRC;含 u8_address_modbus、u8_modbus_baud_rate、u8_sunspec_en、u16_sunspec_addr)midware/interface/modbus/modbus.c、midware/interface/modbus/modbus.h../../midware/interface/modbus/modbus.c.md、../../midware/interface/modbus/modbus.h.md
Modbus 功能码支持哪几个 / 03 06 10 怎么处理response_modbus_tcp_cmd(0x03 读、0x06 写单、0x10 写多)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
读寄存器分派(寄存器号 → 系统变量)在哪get_para_from_reg_addr(1211 个 case 的巨型 switch)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
写寄存器分派(寄存器号 → 系统变量)在哪Set_Para_to_Reg_Addr(493 个 case)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
寄存器地址越界/非法地址怎么判is_start_addr_and_num_err;异常响应走 Handle_Modbus_Exception(回 `功能码\0x80 + REG_ILLEGAL_DATA_ADDRESS_E`)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
Modbus TCP 端口号和 socket 号是多少ems_to_modbus_tcp(SOCK_TCP_SERVER = 3、端口 502、Keep-Alive 周期 12)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
Modbus 从站状态机 SOCK_INIT / ESTABLISHED / CLOSE_WAIT 怎么走ems_to_modbus_tcp(按 getSn_SR() 四态分派)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
电网采样曲线主动推送是哪段代码 / 0xAA 0x55 帧ems_to_modbus_tcp(g_grid_sampling_curve_t.u8_sampling_curve_en + u8_sampling_curve{1,2}_send_flag)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
周期性充放电时间表(28 段)怎么校验 / 每天最多几段time_charge_discharge_save_check、is_time_period_overlap、is_timeperiod_charge_insert、is_timeperiod_discharge_insert、count_chargebits_inposition、chargebit_over_check(MAX_ONES_PER_BIT = 4)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
当前正在读写第几个时间段 / 段号怎么选g_u8_read_write_timecount(0~27;<14 用 control1,≥14 用 control2)、REG_NEW_TIME_GROUP_PERIOD_READ_WRITE_Emidware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
Modbus 写时间寄存器后 RTC 立即生效吗Set_Para_to_Reg_Addr → u8_set_time_flag → Set_RTC(同一次调用内,不等落盘)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
RTU 收发缓冲区多大 / TCP 缓冲区放哪buff_Recv_modbus/buff_send_modbus(256 B,LEN_RECV_MODBUS)、buff_Recv_modbus_tcp(2048 B @SDRAM_MODBUS_REV_BUF_ADDR)、buff_send_modbus_tcp(5120 B @SDRAM_MODBUS_SEND_BUF_ADDR)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
Modbus 请求结构体为什么正好 6 字节 / MBAP 头字段在哪MODBUS_REQ_T(#pragma pack(1) 6 字节)、MODBUS_TCP_TABLE、MODBUS_TCP_PDU_ADDR = 7midware/interface/modbus/modbus.h../../midware/interface/modbus/modbus.h.md
配置表尺寸的编译期断言(不跨 Flash 扇区)在哪STATIC_ASSERT(ASSERT_FLASH_SECTOR_SIZE % sizeof(MODBUS_CONFIG_INFO_T) == 0)midware/interface/modbus/modbus.h../../midware/interface/modbus/modbus.h.md

SunSpec 协议(从站数据模型)

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
SunSpec 寄存器映射表在哪 / 783 条表g_t_sunspec_mudbus[]、SUNSPEC_STRU_NUM(783)、g_t_sunspec_id[]midware/interface/modbus/sunspec_modbus.c、midware/interface/modbus/sunspec_modbus.h../../midware/interface/modbus/sunspec_modbus.c.md、../../midware/interface/modbus/sunspec_modbus.h.md
SunSpec 各信息模型(Model 1/701/702/704/713/714/203)的字段定义在哪SUNSPEC_DATA_BASE_T、SUNSPEC_RUN_DATA_T、SUNSPEC_NAMEPLATE_T、SUNSPEC_CONTROL_T、SUNSPEC_BAT_T、SUNSPEC_DC_T、SUNSPEC_AC_METER_T;全局实体 g_t_sunspec_base/_base_GRID/_base_PV、g_t_sunspec_run、g_t_sunspec_inv_nameplate、g_t_sunspec_ctlAC、g_t_sunspec_bat、g_t_sunspec_DC、g_t_sunspec_AC_meter、g_t_sunspec_PV_metermidware/interface/modbus/sunspec_modbus.h、midware/interface/modbus/sunspec_modbus.c../../midware/interface/modbus/sunspec_modbus.h.md、../../midware/interface/modbus/sunspec_modbus.c.md
SunSpec 寄存器地址按什么方式查表 / 二分查找sunspec_modbus_data_get、sunspec_modbus_data_setmidware/interface/modbus/sunspec_business.c../../midware/interface/modbus/sunspec_business.c.md
SunSpec 大小端 / 倍率(scale factor)怎么用,为什么老是差 1000 倍E_BIG_ENDIAN(BIG_ENDIAN/LIT_ENDIAN)、E_SCALE_FACTOR(SCALE_0_001~SCALE_1000,取值是 ×1000 的倒数)midware/interface/modbus/sunspec_modbus.h../../midware/interface/modbus/sunspec_modbus.h.md
SunSpec 哪些寄存器可写(RW)/ 写权限怎么判E_R_W(RO=1、WO=2、RW=3,按位与判断);可写清单见 sunspec_modbus.c.md 4.6 节(78 个 RW)midware/interface/modbus/sunspec_modbus.h、midware/interface/modbus/sunspec_modbus.c../../midware/interface/modbus/sunspec_modbus.h.md、../../midware/interface/modbus/sunspec_modbus.c.md
SunSpec 数据刷新在哪 / 谁把逆变器电表数据搬进 SunSpec 模型sunspec_modbus_data_refresh(按模型分组刷新)、sunspec_modbus_data_initmidware/interface/modbus/sunspec_business.c../../midware/interface/modbus/sunspec_business.c.md
SunSpec 有功功率调度(Wset / WsetPct)怎么下发sunspec_active_power_dispatch_refresh(static;WsetMod=1 绝对值、否则 WsetPct*max_actpower/100;u16ActivePower = 计算值 + 32000)midware/interface/modbus/sunspec_business.c../../midware/interface/modbus/sunspec_business.c.md
SunSpec 调度的回退倒计时(RvrtTms)在哪算sunspec_active_power_dispatch_refresh(WsetRvrtRem,靠 OSTimeGet() 差值软件倒计时;WsetRvrt 回退值当前被注释不生效)midware/interface/modbus/sunspec_business.c../../midware/interface/modbus/sunspec_business.c.md
SunSpec 上位机是否在线的判据 / 通信看门狗超时多久sunspec_refresh_flag_set、sunspec_refresh_flag_get(OSTimeGet - refresh_tick > 30000 = 30 s 判离线)midware/interface/modbus/sunspec_business.c../../midware/interface/modbus/sunspec_business.c.md
SunSpec 控制 MPPT 百分比(万分之一)在哪设/读sunspec_modbus_mppt_percentage_set、sunspec_modbus_mppt_percentage_get、sunspec_modbus_mppt_over_count_add、sunspec_modbus_mppt_over_count_get、sunspec_modbus_Wset_ena_getmidware/interface/modbus/sunspec_business.c../../midware/interface/modbus/sunspec_business.c.md
SunSpec 充放电功率上限 / 额定功率 getter 在哪sunspec_modbus_chg_get、sunspec_modbus_dischg_get、sunspec_modbus_max_charge_rat_get、sunspec_modbus_max_discharge_rat_getmidware/interface/modbus/sunspec_business.c../../midware/interface/modbus/sunspec_business.c.md
AlphaESS 三代机型铭牌参数(额定功率/无功/电压电流范围)硬编码在哪g_t_sunspec_inv_nameplate_array(14 种机型 G3-S5~T20)midware/interface/modbus/sunspec_business.c../../midware/interface/modbus/sunspec_business.c.md
SunSpec 从站地址和使能怎么配 / 高字节使能低字节地址modbus_sunspec_en_addr_set、modbus_sunspec_en_set、modbus_sunspec_addr_set、寄存器 REG_EMS_SUNSPEC_SET_E = 0x07F0midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
SunSpec 功能对外头文件在哪 / 15 个函数原型声明集合 sunspec_business.h(15 个原型 + 转包含 sunspec_modbus.h)midware/interface/modbus/sunspec_business.h../../midware/interface/modbus/sunspec_business.h.md

固件升级(Modbus TCP 私有功能码 + 云/无线通道)

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
Modbus TCP 固件升级五个私有功能码 0x18~0x22 分别干什么response_modbus_tcp_cmd(0x18 查询版本/机型 → 0x19 校验 → 0x20 配置 → 0x21 写分片 → 0x22 查进度)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
升级前校验版本/机型,返回错误位图是什么意思check_upgrade_infomation、check_upgrade_infomation_for_cmd(6 位位图:bit0/1 对象、bit2/3 版本、bit4/5 机型;奇=键缺失、偶=值不匹配)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
那个升级前查询用 0x18 拼的 JSON 长什么样response_modbus_tcp_cmd({"Upgrade object":…,"Firmware Version":…,"Factory model":…},无 CRC)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
升级包 MD5 / 文件长度 / 厂商标识 "311" 怎么校验set_update_system_config(要求 u16_data_len == 0x1E;厂商标识 0x33 0x31 0x31;16 字节 MD5 转 32 位 hex;4 字节大端文件长度)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
固件升级分包写入 / 偏移不符怎么报错 / 收满后做什么write_firmware_content(返回码 1=长度不符、2=偏移不符;收满后 calculate_ems_flash_md5 / calculate_dev_FW_Flash_MD5 整包校验并清上下文)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
升级对象码(EMS/APP2/BMS/INV_MASTER/SLAVE/ARM)怎么映射到槽位set_update_system_config(EMS/APP2→UPDT_EMS、BMU/BMS→UPDT_BMS、INV_MASTER→UPDT_INV1、INV_SLAVE→UPDT_INV2、INV_ARM→UPDT_INV3)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
两条升级通道(Modbus 强制升级 vs 云端下发)怎么避免打架set_flag_modbus_force_update、get_flag_modbus_force_update(同一 modbus_tcp_upgrade_table.u8_update_flag;ethernet.c 与 net/ems.c 据此屏蔽)midware/interface/modbus/modbus.c../../midware/interface/modbus/modbus.c.md
升级相关枚举(对象/错误码/进度)定义在哪MODBUS_UPGRADE_OBJECT_E、UPGRADE_CONFIG_ERR_E;MODBUS_UPGRADE_* 相关宏midware/interface/modbus/modbus.h../../midware/interface/modbus/modbus.h.md
升级超时后怎么兜底 / 卡在升级状态自动清掉net_abnormal_detect(升级中超过 SENCOND_30M:清 g_stEMSInfo.stUpt、set_updt_status_current(UPDT_STS_NONE)、置 u16_upgrade_error.BIT.timeout = 1)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
升级/下载/断点续传期间哪些业务会被暂停wireless_status_detect、wireless_read_P1_data(判 get_updt_status_current()、IsSystemDownload()、Get_Resume_Status_Current())midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
正在升级固件时网络自愈为什么要跳过硬复位net_abnormal_detect(s_u8ResetFlag == TRUE && !IsSystemUpgrade() 才 system_hard_reset())midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md

DRM 需求响应与并网限功率

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
DRM 模式判定入口在哪 / 谁周期调它drm_mode_judge(内部 1 s 节流:OSTimeGet 差值 < 1000 直接返回)midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
DRM0~DRM4 五个信号怎么采集 / DRM0 走 ADC 还是 GPIOdrm_get(DRM1~4 走 get_drm1_flag()~get_drm4_flag();DRM0 走 get_drm0_data())midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
DRM 信号打包成什么格式 / 移位是怎么算的u16_drm_state(`(drm1!=0)<<12 \(drm2!=0)<<8 \(drm3!=0)<<4 \(drm4!=0),镜像到 g_t_logic_info.u16_drm_state`)midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
DRM0 的 ADC 低通滤波系数和分档门限是多少drm_mode_judge(一阶 IIR y = 0.5568x + 0.4432y_prev;分档 <800 → 0、<3000 → 1、否则 2)midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
u8_drm_mode 取值 0/1~4/5~8/16 分别代表什么drm_mode_judge(0=DRM0 关断、1~4=DRM1~4 半功率级、5~8=DRM1~4 关断级、16=无效)midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
南澳 CSIP-AUS 调度受限时为什么强制 DRM 模式 0drm_mode_judge → sys_limited_by_csip_judge() 覆写 u8_drm_mode = 0midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
德国 RRCR 馈网限值百分比怎么映射 / 哪个 DRM 组合对应哪档drm_mode_judge(u8_rrcr_en == RRCR_ENABLE:u16_drm_state → u8_feedin_percent1~4 / u8_max_feedin_percent)midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
德国 EZA(自用优化)馈网限值映射在哪drm_mode_judge(u8_rrcr_en == EZA_ENABLE → u8_eza_feedin_percent)midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
§14a EnWG 使能怎么按 DRM 组合判定drm_mode_judge(u8_14a_enwg_en 三值枚举 × u16_drm_state → u8_14a_enwg_enable)midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
奥地利 KNG WLV 远程功率限制百分比怎么取drm_mode_judge(u8_kng_wlv_config_en:0x0000→100%、0x0100→30%、其余→0%)midware/interface/drm/drm.c../../midware/interface/drm/drm.c.md
DRM 模块对外有哪几个函数 / drm_init 做什么drm_init、drm_mode_judge、drm_get;配套头文件 drm.h(仅 3 条原型)midware/interface/drm/drm.h、midware/interface/drm/drm.c../../midware/interface/drm/drm.h.md、../../midware/interface/drm/drm.c.md
馈网限制总使能 / 各国限功率标志是哪个变量g_t_logic_info.u8_deu_feedin_enable、u8_rrcr_feedin_percent、u8_eza_feedin_percent、u8_14a_enwg_enablemidware/interface/drm/drm.c../../midware/interface/drm/drm.c.md

干接点 / 继电器联动

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
两路干接点逻辑总入口在哪 / 谁调它Handle_Dry_Node_Logic(仅 task_interface_parse 调用)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
干接点新旧两代逻辑怎么切换 / 走 II 还是旧版Handle_Dry_Node_Logic(`u8FeedMode1 != 0 \\u8FeedMode2 != 0 → Dry_Node_Logic_ii(),否则 Dry_Node1_Logic()/Dry_Node2_Logic()`)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
新版干接点 6 步流水线是哪 6 步Dry_Node_Logic_ii(update_dry_node_data → check_dry_node_mode → judge_by_week_time → deal_dry_node_mode → deal_dry_node_tick → driver_dry_node)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
干接点按 SOC 判据怎么干活 / AT_LEAST 和 AT_MOST 差别check_dry_node_mode、deal_dry_node_mode(13 种 DRY_NODE_II_MODE_E 模式)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
干接点按馈网功率判据怎么干活 / 正向取电超过多少算无馈网deal_dry_node_mode(馈网判据 meter_read_actpower(GRID_METER, PHASE_T) < 0 && abs(...) >= u32_set_feed_value;power > 100 写的 100 W 魔法数)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
干接点延时 / 持续 / 暂停三重节流状态机在哪deal_dry_node_tick(DRY_NODE_DELAY_STATUS/DURATION/PAUSE 三态,含 tick 回绕保护)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
干接点动作什么时候真正驱动继电器driver_dry_node(CLOSE → DRY_NODE1_ON/DRY_NODE2_ON,否则 OFF)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
干接点按星期和时间段怎么判 / 星期怎么算出来的Get_Week_By_Date(Zeller 变形,Century 写死 20)、Judge_By_Time(小时粒度)、judge_by_week_time(II 逻辑分钟粒度)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
干接点配置表怎么存 Flash / 有几个通道字段STDryNodeTab / STDryNodeInfo(#pragma pack(1),对应 DRY_NODE_PARA_PAGE = 4078)、DRY_NODE_II_TAB_Tmidware/interface/dry_node/dry_node.h../../midware/interface/dry_node/dry_node.h.md
干接点控制模式枚举 / 动作枚举定义在哪ENDryNodeMode(MODE_ON/MODE_OFF/MODE_AUTO)、ENDryNodeDo(NODE_DONE_OPEN/CLOSE/NONE)、ENDryNodeStatus、DRY_NODE_II_MODE_E、DRY_NODE_MODE_STATUS_Emidware/interface/dry_node/dry_node.h../../midware/interface/dry_node/dry_node.h.md
干接点 IO 宏(DRY_NODE1_ON 等)展开成什么DRY_NODE1_ON/OFF、DRY_NODE2_ON/OFF、DI_1_DRY_CONTACT、DI_1_ACCESS_POINT、DI_2_*midware/interface/dry_node/dry_node.h../../midware/interface/dry_node/dry_node.h.md
干接点继电器当前状态怎么回读 / 存哪Get_Dry_Node_Status、STDryNodeInfo.u8StatusNmidware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
柴油机干接点跟随 / 老化模式干接点怎么走Handle_Dry_Node_Logic(t_config_data.Generator → 跟随 g_t_logic_info.u8_generator_on;DispatchInfo.u8ControlMode == AGING_MODE → 按 u16_mppt_percentage == 0)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
外置 NPE(N-PE 短接继电器)控制在哪 / 判定阈值多少handle_outside_npe_function(三相电网电压最大值 > 60 V 判市电恢复则断开;inverter_read_run_mode() == cUPS 闭合)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
SG-Ready 热泵联动 / UPS 模式干接点怎么做check_dry_node_mode(sg_ready_enable、ups_enable + cUPS 分支)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
OEM_HHE 定制干接点为什么是反逻辑(有故障才闭合)Handle_Dry_Node_Logic(u16_oem_flag == OEM_HHE:无 EMS 故障 + BMS 无故障 + DI_1 未接 → 断开)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md
干接点 EPO 输入采集为什么要上电延时 10 秒Handle_Dry_Node_Logic(s_u32_epo_di_delay_start,OSTimeGet 差值 > 10*1000 才 epo_set_signal_status)midware/interface/dry_node/dry_node.c../../midware/interface/dry_node/dry_node.c.md

EPO 紧急停机

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
EPO 紧急停机状态机在哪 / 三个状态是什么epo_control_handle(EPO_IDLE → EPO_SEND_SHUTDOWN → EPO_SEND_STARTUP)midware/interface/interface.c../../midware/interface/interface.c.md
EPO 触发后一直重复发关机命令还是只发一次epo_control_handle(EPO_SEND_SHUTDOWN 无出口,每 500 ms 重复 inverter_shutdown + bms_set_shutdown(TRUE))midware/interface/interface.c../../midware/interface/interface.c.md
EPO 保护怎么自动恢复 / 恢复条件是什么epo_control_handle(protect_enable && !signal_status && u8_alphaess_run_mode == 1 && inverter_read_comm_flag() → EPO_SEND_STARTUP → inverter_startup)midware/interface/interface.c../../midware/interface/interface.c.md
EPO 触发置的是第几号故障位epo_control_handle(ems_set_fault_bit(24, TRUE) 置位、恢复时清 24)midware/interface/interface.c../../midware/interface/interface.c.md
EPO 相关配置与信号读写接口在哪epo_read_config_enable、epo_read_signal_status、epo_set_protect_enable、epo_read_protect_enable、epo_set_signal_statusmidware/interface/interface.c(调用方)、midware/interface/dry_node/dry_node.c(信号来源)../../midware/interface/interface.c.md、../../midware/interface/dry_node/dry_node.c.md

云端以太网通道(W5500)

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
设备与云端的 TCP 收发实现在哪 / 有线无线两条通道怎么合流task_ethernet、task_ethernet_monitor、ems_server_data_comm、wireless_event_promidware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
云端 TCP 客户端状态机(connect/listen/断开)在哪ems_server_event_pro(SOCK_TCP_CLIENT = 2)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
W5500 上电初始化时序 / 为什么上电要等 4 秒W5500_Init(SPI1 → 掉电 1 s → 上电 1 s → 硬复位 On 1 s → Off 1 s → 注册回调 → ctlwizchip(CW_INIT_WIZCHIP, memsize) → Net_Para_Init → network_init)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
W5500 各 socket 的收发缓冲怎么分配 / socket2 为什么拿 8KBW5500_Init(memSize[2] = {2,2,8,2,0,...},socket2 8 KB)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
网口申请 IP 的 DHCP 流程在哪(上层时序)dhcp_function、dhcp_pro_fun、my_ip_assignmidware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
域名解析流程 / 解析失败会按几个备用 DNS 轮换dns_pro_fun(依次轮换 8 个公共 DNS 服务器)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
每秒计时/超时 tick 是谁在加internet_time_handle(由 task_system_aux 每秒调用 DHCP_time_handler、DNS_time_handler)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
网络自愈分几层 / 什么时候复位 W5500,什么时候整机硬复位handle_net_abnormal、wireless_abnormal_detect、net_abnormal_detectmidware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
DHCP 多久没拿到地址就复位网络 / 累计多少次重启整机net_abnormal_detect(SENCOND_300S 一次复位;累计 DHCP_FAIL_NUM = 12)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
DNS 失败多久复位 / socket 建不起来多久复位net_abnormal_detect(DNS 失败 SENCOND_30M、DNS 成功但 socket 未 OK SENCOND_300S)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
登录无应答多少次算异常 / 心跳超时多久net_abnormal_detect(u8LogInCnt >= LOGIN_NO_ACK_NUM = 18;心跳 SENCOND_180S;连续 HEART_RST_FAIL = 3 次触发整机复位)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
网络任务心跳超时监控 / net app 任务超时多久net_abnormal_detect(task_ethernet SENCOND_180S、task_net_app SENCOND_60S → s_u8ResetFlag)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
消息队列 g_pEthernetQ 谁投谁取 / 超时多少task_ethernet(OSQPend(g_pEthernetQ, 10, &err) 10 tick 超时)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
服务器指向(固定域名表 / 用户自定义域名 / 临时指向)三级优先级在哪get_ethernet_server_point、get_ethernet_server_port、get_server_data_encryption_flag、SERVER_POINT_E + s_serverInfo[]midware/ethernt/ethernet.c、midware/ethernt/ethernet.h../../midware/ethernt/ethernet.c.md、../../midware/ethernt/ethernet.h.md
临时服务器指向的倒计时到期后做什么server_skip_support_check(每 SENCOND_1H 减 1;归零后清临时指向、置 u8_set_net_para_flag、net_init())midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
用户自定义域名 / 自定义端口存在哪、被谁读g_system_custom_info、宏 CUSTOM_SERVER_NAME/CUSTOM_SERVER_PORT、IP_ADDR_TAB_T IP_Address(掉电保存网参)midware/ethernt/ethernet.h../../midware/ethernt/ethernet.h.md
网参(MAC/IP/掩码/网关/DNS)结构体是哪个 / 掉电怎么存IP_ADDR_TAB_T、STEthernetSys g_stNetSysInfo、STEthernetData g_stNetDataSend、wiz_NetInfo g_stNetInfomidware/ethernt/ethernet.h../../midware/ethernt/ethernet.h.md
无线通道的域名下发格式是什么wireless_get_ethernet_server_pointmidware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
APP 直连和有线通道谁优先task_ethernet(g_t_app_info.u8_app_connect_flag == TRUE 时走无线,APP 直连优先于有线)midware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md
网络参数被改动后触发重连的入口net_init、ip_add_skip_change_clear、g_t_config_save_flag.u8_set_net_para_flagmidware/ethernt/ethernet.c../../midware/ethernt/ethernet.c.md

LAN 协议栈(DHCP / DNS / Socket)

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
DHCP 客户端状态机在哪 / 有哪几个状态DHCP_run(INIT/DISCOVER/REQUEST/LEASED/REREQUEST/RELEASE/STOP 六态)、DHCP_init、DHCP_stopmidware/ethernt/lan/dhcp.c../../midware/ethernt/lan/dhcp.c.md
DHCP 超时重试次数和每级等待时间MAX_DHCP_RETRY = 2、DHCP_WAIT_TIME = 10,在 check_DHCP_timeout 中使用midware/ethernt/lan/dhcp.c、midware/ethernt/lan/dhcp.h../../midware/ethernt/lan/dhcp.c.md、../../midware/ethernt/lan/dhcp.h.md
DHCP 拿到 IP 后怎么通知上层 / 回调注册reg_dhcp_cbfunc、my_ip_assign、default_ip_assign/default_ip_update/default_ip_conflictmidware/ethernt/lan/dhcp.c../../midware/ethernt/lan/dhcp.c.md
DHCP 协议报文组帧 / DISCOVER / REQUEST / DECLINE 在哪构造makeDHCPMSG、send_DHCP_DISCOVER、send_DHCP_REQUEST、send_DHCP_DECLINE、parseDHCPMSGmidware/ethernt/lan/dhcp.c../../midware/ethernt/lan/dhcp.c.md
IP 冲突检测怎么做的 / 为什么有 2 秒忙等check_DHCP_leasedIP(while((dhcp_tick_1s - ret) < 2); 忙等,靠高优先级任务递增秒计数退出)midware/ethernt/lan/dhcp.c../../midware/ethernt/lan/dhcp.c.md
从 DHCP 取回 IP/网关/掩码/DNS/租期getIPfromDHCP、getGWfromDHCP、getSNfromDHCP、getDNSfromDHCP、getDHCPLeasetimemidware/ethernt/lan/dhcp.c、midware/ethernt/lan/dhcp.h../../midware/ethernt/lan/dhcp.c.md、../../midware/ethernt/lan/dhcp.h.md
DHCP 返回值(FAILED/RUNNING/IP_ASSIGN/IP_CHANGED/LEASED/STOPPED)含义匿名枚举 DHCP_FAILED/DHCP_RUNNING/DHCP_IP_ASSIGN/DHCP_IP_CHANGED/DHCP_IP_LEASED/DHCP_STOPPEDmidware/ethernt/lan/dhcp.h../../midware/ethernt/lan/dhcp.h.md
DNS 查询报文怎么组帧 / 域名长度上限多少dns_makequery(MAX_DOMAIN_NAME = 168、MAXCNAME = 252、MAX_DNS_BUF_SIZE = 512)midware/ethernt/lan/dns.c、midware/ethernt/lan/dns.h../../midware/ethernt/lan/dns.c.md、../../midware/ethernt/lan/dns.h.md
DNS 为什么要改成分次调用的非阻塞状态机DNS_run(新增 static u8 s_u8_flag 分"发查询/收应答"两次调用,避免阻塞 task_ethernet)midware/ethernt/lan/dns.c../../midware/ethernt/lan/dns.c.md
DNS 超时与重试次数 / DNS 初始化与计时check_DNS_timeout、DNS_init、DNS_time_handler、MAX_DNS_RETRY、DNS_WAIT_TIMEmidware/ethernt/lan/dns.c、midware/ethernt/lan/dns.h../../midware/ethernt/lan/dns.c.md、../../midware/ethernt/lan/dns.h.md
DNS 应答解析 / CNAME 递归展开parseDNSMSG、parse_name、dns_question、dns_answer、get16、put16midware/ethernt/lan/dns.c../../midware/ethernt/lan/dns.c.md
W5500 的 socket 类 Berkeley 接口实现在哪socket、close、listen、connect、disconnect、send、recv、sendto、recvfrom、ctlsocket、setsockopt、getsockoptmidware/ethernt/lan/socket.c../../midware/ethernt/lan/socket.c.md
socket 接口头文件在哪 / 13 个原型和错误码在哪定义声明集合 socket.h(SOCK_OK/SOCK_BUSY/SOCK_FATAL、SOCKERR_*、SF_*、PACK_*、sockint_kind、ctlsock_type、sockopt_type)midware/ethernt/lan/socket.h../../midware/ethernt/lan/socket.h.md
recv() 的阻塞超时被改成多少 / 为什么和 RTOS 耦合recv(基于 OSTimeGet() 的 2000 tick 阻塞超时;sendto() 里 OSTimeDlyHMSM(0,0,0,1) 让出 1 ms)midware/ethernt/lan/socket.c../../midware/ethernt/lan/socket.c.md
UDP/MACRAW 包分片(PACK_FIRST/REMAINED/COMPLETED)怎么处理recvfrom、sendto、PACK_FIRST、PACK_REMAINED、PACK_COMPLETEDmidware/ethernt/lan/socket.c、midware/ethernt/lan/socket.h../../midware/ethernt/lan/socket.c.md、../../midware/ethernt/lan/socket.h.md
socket 各状态枚举(SOCK_INIT/LISTEN/ESTABLISHED/CLOSE_WAIT)与命令码在哪定义SOCK_CLOSED~SOCK_MACRAW、Sn_CR_OPEN~Sn_CR_RECV(实际定义在 w5500.h,socket.h 只是转包含)midware/ethernt/lan/socket.h../../midware/ethernt/lan/socket.h.md
谁在用 socket API(云端 TCP / Modbus TCP / DHCP / DNS)socket/send/recv 调用方清单(ethernet.c、modbus.c、dhcp.c、dns.c、net/ems.c、net/server.c)midware/ethernt/lan/socket.h../../midware/ethernt/lan/socket.h.md

无线通讯棒(WIFI / 4G)驱动

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
无线通讯棒驱动适配层在哪 / 无线收发接口wireless_send、wireless_recv、wireless_recv_flag、wireless_initmidware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
通讯棒型号怎么探测(易联 WIFI / 4G / 自研 / ZLG)wireless_module_find(每 10 s 一次;连续 7 次探测不到 → 请求重启)midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
无线巡检状态机在哪 / 巡检周期是多少wireless_status_detect(型号探测 10 s、周期体检 300 s、延迟重启三分支;入口 30 ms 闸门)midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
通讯棒硬重启时序 / 为什么要 9 秒wireless_restart(3 s 等收尾 → 掉电 3 s → 上电 3 s,穿插 4 次 IWDG_Feed())midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
通讯棒重启标志谁置谁查wireless_set_restart_flag、wireless_query_restart_flagmidware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
无线运行状态总表 / 信号强度字段的哨兵值WIRELESS_TAB_T g_t_wireless_info;配套头文件 wireless_driver.hmidware/ethernt/wireless/wireless_driver.c、midware/ethernt/wireless/wireless_driver.h../../midware/ethernt/wireless/wireless_driver.c.md、../../midware/ethernt/wireless/wireless_driver.h.md
无线协议支持位(TCP/TLS/MQTT/MQTTS)怎么打包与选择端口PROTOCOL_TYPE_E、e_linker_protocol_support_state、get_ethernet_server_port(WIRELESS, tls_flag)midware/ethernt/wireless/wireless_driver.h、midware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wireless_driver.h.md、../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
AT 指令通道收发(UART5)在哪 / 一条 AT 指令怎么发e_linker_send、e_linker_recv、e_linker_recv_flag、e_linker_clear_buf、at_execute_commandmidware/ethernt/wireless/elink_parse.c../../midware/ethernt/wireless/elink_parse.c.md
AT 应答解析状态机(按 \n / \r 分行,匹配 OK / ERROR)recv_wifi_log(AT_RECV_HEAD→READ_DATE→DATA_LF_MSG→MSG_DATA)midware/ethernt/wireless/elink_parse.c../../midware/ethernt/wireless/elink_parse.c.md
AT 指令发/收超时常量是多少SEND_AT_CODE_TIMEOUT(100 ms)、RECV_AT_CODE_TIMEOUT(1500 ms);强度查询用 SENCOND_3Smidware/ethernt/wireless/elink_parse.h、midware/ethernt/wireless/elink_parse.c../../midware/ethernt/wireless/elink_parse.h.md、../../midware/ethernt/wireless/elink_parse.c.md
AT 指令集宏(AT_GET_SN / AT_P1_DATA / AT_SET_AP_SSID 等)在哪定义AT_* 宏集合、AT_STATE_E、AT_COMM_Emidware/ethernt/wireless/elink_parse.h../../midware/ethernt/wireless/elink_parse.h.md
通讯棒登录握手怎么做e_linker_wifi_login(含 "Login Error" 判定)midware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
棒内配置(AP SSID / 目标域名 / 端口 / 密码)与 EMS 配置怎么逐项对齐e_linker_wifi_init(阶段一读回比对、阶段二按需写回并 wireless_restart())midware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
AP SSID 命名规则 / 后缀 AW / EL 是什么意思ap_ssid_stitching(自研棒 = SN+"AW"、易联+TLS = SN+"EL"、其余 = SN)midware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
一机一密(TLS)密码怎么由 SN 生成并下发e_linker_wifi_init → set_e_linker_key_algorithm(配合 alpha_generate_pwd);默认密码 AT_DEFAULT_PWD = "12345678"midware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
写棒内 AP SSID / 目标 IP / 目标端口 / 密码的四个 AT 封装set_e_linker_ap_ssid、set_e_linker_c0_dst_addr0、set_e_linker_c0_dst_port0、set_e_linker_wifi_pwdmidware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
读棒内 AP SSID / 目标 IP / 目标端口 / 密码get_e_linker_ap_ssid、get_e_linker_c0_dst_addr0、get_e_linker_c0_dst_port0、get_e_linker_wifi_pwdmidware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
读通讯棒 SN / 硬件版本 / 软件版本get_e_linker_sn、get_e_linker_hw、get_e_linker_sw、get_e_linker_wifi_info、E_LINKER_ID_INFO g_e_linker_infomidware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
WIFI 与 4G 的连接状态/路由状态/APP 登录状态位怎么解析e_linker_wifi_status_detect、e_linker_4g_status_detect、e_linker_wifi_state、e_linker_tcp_state、e_linker_4g_state、g_wifi_state、g_4g_statemidware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
WIFI 信号强度 / 4G CSQ 强度怎么读e_linker_sta_eirp(AT+STA_EIRP?)、get_e_linker_4g_csq(AT+CSQ?)midware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
无线状态位联合体(位域 + union)定义在哪 / 两个状态快照WIFI_STATE、elinker_4g_state、g_wifi_state、g_4g_state;配套头文件 e_linker_wifi.hmidware/ethernt/wireless/wifi/e_linker_wifi.h../../midware/ethernt/wireless/wifi/e_linker_wifi.h.md
无线通道串口互斥怎么保证(避免 AT 与抄表抢 UART5)u8_wireless_uart_flag(wireless_status_detect 入口/出口置位清零)midware/ethernt/wireless/wireless_driver.c、midware/ethernt/wireless/wireless_driver.h../../midware/ethernt/wireless/wireless_driver.c.md、../../midware/ethernt/wireless/wireless_driver.h.md
无线状态回写云端(CMD_RXD_WIFI_INFO 响应)wireless_status_refreshmidware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
无线通讯棒上电/掉电 GPIO 在哪控制wireless_init → wifi_power_on/wifi_power_off(WIRELESS_POWER_PIN/WIRELESS_POWER_PORT)midware/ethernt/wireless/wireless_driver.c、midware/ethernt/wireless/wireless_driver.h../../midware/ethernt/wireless/wireless_driver.c.md、../../midware/ethernt/wireless/wireless_driver.h.md

无线 P1 抄表

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
P1 采集器电表数据从哪读 / 谁周期调wireless_read_P1_data(task_meter 每 300 ms 调用;读间隔 ≥ SENCOND_800MS)midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
P1 数据传输的 AT 指令和长度要求e_linker_P1_data(发 AT+P1E_DATA?\r\n,返回串长度须 > MAX_E_LINKER_P1_LEN = 75)midware/ethernt/wireless/wifi/e_linker_wifi.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md
P1 返回的 24 个字段分别是什么 / sscanf 格式串wireless_read_P1_data(24 项逗号分隔:链路状态、SN、HW/SW 版本、周期、类型、双向电量、有功、三相电压/电流/功率、频率、功率因数、电费)midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
P1 电量口径 0.001kWh 怎么归一到 0.01kWhwireless_read_P1_data(u32_energy_input[PHASE_T] = (in_1 + in_2)/10;s32_actpower[PHASE_T] = in_actpower - out_actpower)midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
P1 掉线判定超时多久 / 掉线怎么置标志wireless_read_P1_data(OSTimeGet - u32_P1_refresh_tick > 3000 = 3 s → meter_set_grid_com_sta/meter_set_clear_grid_data/meter_set_P1_lose_flag)midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
P1 连续读失败多少次才报故障wireless_read_P1_data(s_u8_timeout_count 超过 15 次才 meter_set_grid_wifi_P1_fault(1))midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wireless_driver.c.md
哪些棒支持 P1 抄表 / 自研棒支持吗e_linker_protocol_support_state → u8_wifi_support_P1_falg(仅 E_LINKER_WIFI/E_LINKER_4G 且支持 18031 协议)midware/ethernt/wireless/wifi/e_linker_wifi.c、midware/ethernt/wireless/wireless_driver.c../../midware/ethernt/wireless/wifi/e_linker_wifi.c.md、../../midware/ethernt/wireless/wireless_driver.c.md

电量统计与系统时间(系统辅助任务)

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
系统辅助任务在哪 / 周期多少task_system_aux(优先级 8、400 ms 周期)midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
电量累计(Wh)是谁在算 / 瞬时功率怎么积分成电量task_system_aux(按实际毫秒数做 W·ms 累加,满 1 分钟折算 Wh 入 g_t_energy_info)midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
PV 发电量 / 电池充放电量 / 电网买卖电量统计分别在哪grid_chargr_energy_statistics、bat_total_energy_statistics、generator_output_energy_statistics、generator_charge_energy_statisticsmidware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
电量累计值怎么读(云端/Modbus/HMI 用的访问器)energy_read_storage_pv_input、energy_read_storage_inv_input、energy_read_storage_inv_output、energy_read_storage_bat_charge、energy_read_storage_bat_dischg、energy_read_grid_chgrge、energy_read_grid_feedin、energy_read_grid_consumption、energy_read_pv_chgrge、energy_read_pv_inverter_output、energy_read_bat_chgrge、energy_read_bat_dischg、energy_read_bat_dischg_feedin_grid、energy_read_gc_charge、energy_read_gc_outputmidware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
电量统计持久化结构体长什么样 / 多少个累计项ENERGY_COUNT_INFO_T(#pragma pack(1),128 字节:u16_head + 21 个 u32 + u8_reserve[40] + u16_crc_code)、g_t_energy_infomidware/auxiliary/system_aux.h、midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.h.md、../../midware/auxiliary/system_aux.c.md
电量累计值什么时候写 Flash / 落在哪个页enenrgy_count_handle(由 data/system_config/system_config.c 在保存作业中调用,写 ENERGY_INFO_PAGE = 4076)midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
实时充放电量(含从电网充、馈网放)怎么读get_realtime_bat_chg、get_realtime_bat_dischg、get_realtime_bat_chg_from_grid、get_realtime_bat_dischg_feedin_gridmidware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
电网电表 1 分钟平均功率怎么算calculation_average_power_of_gridmeter、get_average_power_of_gridmeter(1 s 采样节流 + 滑动窗口 60 样本 / 60)midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
RTC 时间怎么刷新 / 读失败怎么报故障rtc_refresh(PCF8563_Get_DateTime_Other 成功清 RTC 故障位、失败置位:ems_set_fault_bit(1, ...))midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
系统时间全局量是哪个 / 三个时间变量分工SYSTEM_DATETIME(6 字段)、g_t_sys_datetime(含星期)、get_rtc_tick(Unix 秒)midware/auxiliary/system_aux.c、midware/auxiliary/system_aux.h../../midware/auxiliary/system_aux.c.md、../../midware/auxiliary/system_aux.h.md
RTC 年份换算基准是多少 / 1900 还是 2000TIME_BASE_YEAR = 1900、NOW_BASE_YEAR = 2000,在 rtc_refresh 中参与 tm_year 换算midware/auxiliary/system_aux.h../../midware/auxiliary/system_aux.h.md
按机型初始化设备功能位(哪些功能该机型支持)在哪device_function_init(约 1100 行,按 INVERTER_TYPE × get_inverter_sub() × get_board_type() 分派)midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
功能位表有哪些 / 表编号代表什么g_system_function_info.t_dev_fun.*_fun_u.bit.*、*_table 字段(ems=1、ems2=2、bms=3、inv=4、meter=5、evc=6、grid_regulation=7、ems3=8)midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
并机功能位(强制馈网 / 取电限制)怎么初始化para_device_function_init(仅 S5/B5/S3.6/B3.6/S6/S8 使能 u8_en_para_force_discharge、u8_para_grid_meter_limit)midware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
旧版功能位表初始化 / 并机方式变化后整体重建ststem_function1_init、device_function_init_parallel_change、parallel_system_function_handlemidware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
云端远程改写功能位(使能/禁用某功能)set_system_function_enablemidware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
功能位落 Flash 的处理入口system_function_release_processing_handlemidware/auxiliary/system_aux.c../../midware/auxiliary/system_aux.c.md
功能位表的编译期扇区断言STATIC_ASSERT(ASSERT_FLASH_SECTOR_SIZE % sizeof(...) == 0)(在 system_aux.h 中对能量结构做校验)midware/auxiliary/system_aux.h../../midware/auxiliary/system_aux.h.md
相位参数 PHASE_A/B/C/T 怎么区分 / 电量按相怎么取energy_read_* 系列与 get_average_power_of_gridmeter(u8) 的相位入参约定midware/auxiliary/system_aux.h../../midware/auxiliary/system_aux.h.md

产线测试与调试通道

想找的功能(关键词 / 用户可能的问法)入口函数或符号源文件文档
单板自检怎么触发 / 结果怎么读回去board_test(Modbus 写 REG_SINGLE_BOARD_TEST_ENABLE 置 g_u8_single_board_test_enable;task_system_aux 每 400 ms 轮询;结果由 u_single_board_test_result 经 Modbus 读出)midware/debug/board_test.c../../midware/debug/board_test.c.md
单板自检测了哪 10 类外设 / 每位对应什么led_test、rtc_test、flash_test、sdram_test、rs485_test、usart_test、w5500_test、can_test、dry_node_test、drm_testmidware/debug/board_test.c../../midware/debug/board_test.c.md
单板测试结果位图(bit0~bit31)定义在哪 / 高低 16 位怎么取BOARD_TEST_U(u32_all 与 bit.* 共用 4 字节;初值 0xFFFFFFFF 即全部失败)、u_single_board_test_result;配套头文件 board_test.hmidware/debug/board_test.h、midware/debug/board_test.c../../midware/debug/board_test.h.md、../../midware/debug/board_test.c.md
单板测试怎么判定 Flash/EEPROM 好坏 / JEDEC ID 期望值flash_test(Flash_ReadID 命中 C2 20 18/19/1A;Flash 与 EEPROM 共用一个判据)midware/debug/board_test.c../../midware/debug/board_test.c.md
SDRAM 自检怎么测 / 测多少字节sdram_test(从 SDRAM_SDRAM_TEST_ADDR 起写 0x65 读回 1024 字节,带 ADDR_MAX_SDRAM 越界保护)midware/debug/board_test.c../../midware/debug/board_test.c.md
CAN 自检怎么做的 / 报文内容can_test(ID 0xA0、8 字节固定数据、CAN0/CAN1 各收发 4 次比对)midware/debug/board_test.c../../midware/debug/board_test.c.md
RS485 / USART 自检怎么做的rs485_test(USART1 ↔ UART4 双向)、usart_test(USART2、USART5 自发自收 16 字节)midware/debug/board_test.c../../midware/debug/board_test.c.md
DRM 自检的 ADC 期望窗口是多少 / 哪些板型跳过drm_test(AD 落在 2000~2100 且 DRM1~4 全 TRUE;BOARD_EMS3_6_2_E 直接判通过)midware/debug/board_test.c../../midware/debug/board_test.c.md
干接点自检(DO/DI 回环)怎么做的dry_node_test(DO1 拉高/拉低各等 100 ms 回读 DI1;EMS3.6-1/2/3/4 再测 DO2/DI2)midware/debug/board_test.c../../midware/debug/board_test.c.md
W5500 自检怎么测 / 为什么有漏检风险w5500_test(ctlnetwork(CN_GET_NETINFO) 读回 MAC 与 IP_Address.u8_mac_addr 用 strcmp 比对)midware/debug/board_test.c../../midware/debug/board_test.c.md
自检期间长时间占用任务怎么防止看门狗复位board_test 及各子测试(反复 IWDG_Feed() + 忙等延时)midware/debug/board_test.c../../midware/debug/board_test.c.md
AST 自检/单板测试与其它功能的互锁g_u8_single_board_test_enable(被 board_test、ate.c 透传判定、modbus.c 读写)midware/debug/board_test.h../../midware/debug/board_test.h.md
ATE 模拟串口透传模式在哪实现 / 干什么用的passthrough_detection、emulated_serial_passthrough、set_passthrough_flag、get_passthrough_flagmidware/debug/ate.c../../midware/debug/ate.c.md
透传模式进入条件是什么(升级中/单板测试中能进吗)passthrough_detection(需:不在逆变器升级、不在单板测试、机型允许、UART4 有数据、当前未透传)midware/debug/ate.c../../midware/debug/ate.c.md
透传模式多久没活动就自动退出 / ATE 常驻模式get_passthrough_timeout_flag(abs(tick - OSTimeGet()) > 10000 = 10 s;u8_ate_mode_flag 非 0 则常驻不超时)midware/debug/ate.c../../midware/debug/ate.c.md
透传退出后串口恢复成什么参数(波特率硬编码吗)passthrough_detection(usart2_init(9600)、uart4_init(9600)、set_inverter_init())midware/debug/ate.c../../midware/debug/ate.c.md
透传的位级转发靠哪两个外部中断EXTI2_IRQHandler(PD2→PB10,UART4→USART2)、EXTI10_15_IRQHandler(PB11→PC12+PG9,USART2→UART4 并自动切换 485 方向)midware/debug/ate.c../../midware/debug/ate.c.md
透传期间业务通信怎么暂停 / 屏幕怎么切测试画面get_passthrough_flag(inverter.c、hmi/led.c、hmi/ui/ui_main.c 查询);配套头文件 ate.hmidware/debug/ate.c、midware/debug/ate.h../../midware/debug/ate.c.md、../../midware/debug/ate.h.md
ATE 模式常驻标志由哪个寄存器写入g_t_inv_info.t_control_parameter.u8_ate_mode_flag(写 REG_ATE_MODE_FLAG_E,modbus.c 写入)midware/debug/ate.c../../midware/debug/ate.c.md
printf 输出重定向到哪个串口 / 半主机模式怎么关掉的fputc、_sys_exit、__use_no_semihosting、FILE __stdout(输出到 USART0)midware/debug/debug.c../../midware/debug/debug.c.md
十六进制 dump 打印接口在哪 / 谁在用 ShowDataShowData(被 system_config.c、flash_data_store.c、net_event_log.c、modbus.c、net/server.c 等 30 余处调用)midware/debug/debug.c../../midware/debug/debug.c.md
编译期断言宏 STATIC_ASSERT 定义在哪、怎么用的STATIC_ASSERT(condition)、ASSERT_FLASH_SECTOR_SIZE(展开为 FLASH_SECTOR_SIZE = 4 KB)midware/debug/debug.h../../midware/debug/debug.h.md
配置表尺寸校验(不能跨 Flash 扇区)在哪断言STATIC_ASSERT(ASSERT_FLASH_SECTOR_SIZE % sizeof(...) == 0)(被十几个头文件复用)midware/debug/debug.h../../midware/debug/debug.h.md
USMART 在线调试 shell 在哪 / 为什么现在不生效task_usmart、usmart_nametab[]、usmart_dev(DEBUG_SUMART = 0,整个文件条件编译剔除,任务不创建)midware/debug/shell_usmart.c、midware/debug/shell_usmart.h../../midware/debug/shell_usmart.c.md、../../midware/debug/shell_usmart.h.md
USMART 总开关宏在哪 / 影响哪几处编译DEBUG_SUMART(shell_usmart.h 定义 0;被 shell_usmart.c、common/usmart/usmart.c、usmart_str.c、user/main.c 共 5 处引用)midware/debug/shell_usmart.h../../midware/debug/shell_usmart.h.md
USMART 注册了哪些函数可以手工调用usmart_nametab[](表项为 {函数指针, "带返回值和参数类型的原型字符串"})midware/debug/shell_usmart.c../../midware/debug/shell_usmart.c.md

文件清单核对

源文件状态
midware/interface/interface.c已在表中出现
midware/interface/interface.h已在表中出现
midware/interface/modbus/modbus.c已在表中出现
midware/interface/modbus/modbus.h已在表中出现
midware/interface/modbus/sunspec_business.c已在表中出现
midware/interface/modbus/sunspec_business.h已在表中出现
midware/interface/modbus/sunspec_modbus.c已在表中出现
midware/interface/modbus/sunspec_modbus.h已在表中出现
midware/interface/drm/drm.c已在表中出现
midware/interface/drm/drm.h已在表中出现
midware/interface/dry_node/dry_node.c已在表中出现
midware/interface/dry_node/dry_node.h已在表中出现
midware/ethernt/ethernet.c已在表中出现
midware/ethernt/ethernet.h已在表中出现
midware/ethernt/lan/dhcp.c已在表中出现
midware/ethernt/lan/dhcp.h已在表中出现
midware/ethernt/lan/dns.c已在表中出现
midware/ethernt/lan/dns.h已在表中出现
midware/ethernt/lan/socket.c已在表中出现
midware/ethernt/lan/socket.h已在表中出现
midware/ethernt/wireless/elink_parse.c已在表中出现
midware/ethernt/wireless/elink_parse.h已在表中出现
midware/ethernt/wireless/wireless_driver.c已在表中出现
midware/ethernt/wireless/wireless_driver.h已在表中出现
midware/ethernt/wireless/wifi/e_linker_wifi.c已在表中出现
midware/ethernt/wireless/wifi/e_linker_wifi.h已在表中出现
midware/debug/ate.c已在表中出现
midware/debug/ate.h已在表中出现
midware/debug/board_test.c已在表中出现
midware/debug/board_test.h已在表中出现
midware/debug/debug.c已在表中出现
midware/debug/debug.h已在表中出现
midware/debug/shell_usmart.c已在表中出现
midware/debug/shell_usmart.h已在表中出现
midware/auxiliary/system_aux.c已在表中出现
midware/auxiliary/system_aux.h已在表中出现