C:\Users\admin\PyCharmMiscProject\.venv\Scripts\python.exe F:\issue\main.py
✅ 配置文件已加载: F:\issue\config\config.json
🔁 已从配置恢复 channel_set_map: {}
✅ 配置文件已加载: F:\issue\config\config.json
🔁 已从配置恢复 channel_set_map: {}
📊 开始解析 Excel 文件: input/Archer BE900US 2.xlsx
ℹ️ 备份已存在: input/wlc_clm_data_6726b0.c.bak,跳过备份
🧹 'Cover' → 清洗后: 'Cover'
🟡 未匹配到 'Cover' 的模式,跳过...
🧹 '版本历史' → 清洗后: '版本历史'
🟡 未匹配到 '版本历史' 的模式,跳过...
🧹 '2.4G功率表(版本1.0)' → 清洗后: '2.4G功率表版本1.0'
✅ 匹配成功!'2.4G功率表(版本1.0)' → [2G] 配置
✅ 找到表头行: 第 4 行
🔍 开始向上查找 '认证功率',扫描第 0 ~ 3 行...
📌 发现合并单元格含 '证功率': '认证功率' → G4
🔍 解析 CH 行(第 6 行),限定列范围: Col 6 ~ 18
👉 发现 CH1 @ Col6
👉 发现 CH2 @ Col7
👉 发现 CH3 @ Col8
👉 发现 CH4 @ Col9
👉 发现 CH5 @ Col10
👉 发现 CH6 @ Col11
👉 发现 CH7 @ Col12
👉 发现 CH8 @ Col13
👉 发现 CH9 @ Col14
👉 发现 CH10 @ Col15
👉 发现 CH11 @ Col16
👉 发现 CH12 @ Col17
👉 发现 CH13 @ Col18
✔️ 成功提取 CH1-13 共 13 个信道
🟡 无法识别物理模式: 'Mode'
🟡 无法识别物理模式: 'Mode'
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 20M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🔍 解析复合模式 '11AC/AX 40M' → ['11AC', '11AX']
🟡 无法识别物理模式: '说明:
1、Boardlimit填写各信道均满足EVM要求的最大功率;根据实际情况调整表格,如存在不同chain不一样的情况,则分开填写。
2、认证功率中填写各信道的认证功率限制;注意空间流,TXBF等信息需对应。
3、实发功率会根据Boardlimit和认证 power取小,生成DUT实发功率。实发功率表根据实际情况增减。'
📊 已采集第 7 行 → 11b 20M, 11 个信道, 使用宏: RATE_SET_2G_20M_11b
📊 已采集第 7 行 → 11b 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_11b
📊 已采集第 7 行 → 11b 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT_11b
📊 已采集第 7 行 → 11b 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT4_11b
📊 已采集第 8 行 → 11g 20M, 11 个信道, 使用宏: RATE_SET_2G_20M_11g
📊 已采集第 8 行 → 11g 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_11g
📊 已采集第 8 行 → 11g 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT_11g
📊 已采集第 8 行 → 11g 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT4_11g
🗑️ 跳过空行: 第 9 行(无任何有效功率值)
🗑️ 跳过空行: 第 10 行(无任何有效功率值)
🗑️ 跳过空行: 第 11 行(无任何有效功率值)
🗑️ 跳过空行: 第 12 行(无任何有效功率值)
🗑️ 跳过空行: 第 13 行(无任何有效功率值)
📊 已采集第 14 行 → 11n 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_11n
📊 已采集第 14 行 → 11n 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT_11n
📊 已采集第 14 行 → 11n 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT4_11n
🗑️ 跳过空行: 第 15 行(无任何有效功率值)
🗑️ 跳过空行: 第 16 行(无任何有效功率值)
🗑️ 跳过空行: 第 17 行(无任何有效功率值)
🗑️ 跳过空行: 第 18 行(无任何有效功率值)
🗑️ 跳过空行: 第 19 行(无任何有效功率值)
🗑️ 跳过空行: 第 20 行(无任何有效功率值)
📊 已采集第 21 行 → 11AC 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_11AC
📊 已采集第 21 行 → 11AC 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT_11AC
📊 已采集第 21 行 → 11AC 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT4_11AC
📊 已采集第 21 行 → 11AX 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_11AX
📊 已采集第 21 行 → 11AX 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT_11AX
📊 已采集第 21 行 → 11AX 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT4_11AX
🗑️ 跳过空行: 第 22 行(无任何有效功率值)
🗑️ 跳过空行: 第 23 行(无任何有效功率值)
🗑️ 跳过空行: 第 24 行(无任何有效功率值)
🗑️ 跳过空行: 第 25 行(无任何有效功率值)
🗑️ 跳过空行: 第 26 行(无任何有效功率值)
🗑️ 跳过空行: 第 27 行(无任何有效功率值)
🗑️ 跳过空行: 第 28 行(无任何有效功率值)
🗑️ 跳过空行: 第 29 行(无任何有效功率值)
🗑️ 跳过空行: 第 30 行(无任何有效功率值)
🗑️ 跳过空行: 第 31 行(无任何有效功率值)
📊 已采集第 32 行 → 11BE 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_11BE
📊 已采集第 32 行 → 11BE 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT_11BE
📊 已采集第 32 行 → 11BE 20M, 11 个信道, 使用宏: RATE_SET_2G_HT_20M_EXT4_11BE
🗑️ 跳过空行: 第 33 行(无任何有效功率值)
🗑️ 跳过空行: 第 34 行(无任何有效功率值)
🗑️ 跳过空行: 第 35 行(无任何有效功率值)
🗑️ 跳过空行: 第 36 行(无任何有效功率值)
🗑️ 跳过空行: 第 37 行(无任何有效功率值)
🗑️ 跳过空行: 第 38 行(无任何有效功率值)
🗑️ 跳过空行: 第 39 行(无任何有效功率值)
🗑️ 跳过空行: 第 40 行(无任何有效功率值)
🗑️ 跳过空行: 第 41 行(无任何有效功率值)
🗑️ 跳过空行: 第 42 行(无任何有效功率值)
🗑️ 跳过空行: 第 43 行(无任何有效功率值)
🗑️ 跳过空行: 第 44 行(无任何有效功率值)
📊 已采集第 46 行 → 11n 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_11n
📊 已采集第 46 行 → 11n 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_EXT_11n
📊 已采集第 46 行 → 11n 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_EXT4_11n
🗑️ 跳过空行: 第 47 行(无任何有效功率值)
🗑️ 跳过空行: 第 48 行(无任何有效功率值)
🗑️ 跳过空行: 第 49 行(无任何有效功率值)
🗑️ 跳过空行: 第 50 行(无任何有效功率值)
🗑️ 跳过空行: 第 51 行(无任何有效功率值)
🗑️ 跳过空行: 第 52 行(无任何有效功率值)
📊 已采集第 53 行 → 11AC 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_11AC
📊 已采集第 53 行 → 11AC 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_EXT_11AC
📊 已采集第 53 行 → 11AC 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_EXT4_11AC
📊 已采集第 53 行 → 11AX 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_11AX
📊 已采集第 53 行 → 11AX 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_EXT_11AX
📊 已采集第 53 行 → 11AX 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_EXT4_11AX
🗑️ 跳过空行: 第 54 行(无任何有效功率值)
🗑️ 跳过空行: 第 55 行(无任何有效功率值)
🗑️ 跳过空行: 第 56 行(无任何有效功率值)
🗑️ 跳过空行: 第 57 行(无任何有效功率值)
🗑️ 跳过空行: 第 58 行(无任何有效功率值)
🗑️ 跳过空行: 第 59 行(无任何有效功率值)
🗑️ 跳过空行: 第 60 行(无任何有效功率值)
🗑️ 跳过空行: 第 61 行(无任何有效功率值)
🗑️ 跳过空行: 第 62 行(无任何有效功率值)
🗑️ 跳过空行: 第 63 行(无任何有效功率值)
📊 已采集第 64 行 → 11BE 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_11BE
📊 已采集第 64 行 → 11BE 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_EXT_11BE
📊 已采集第 64 行 → 11BE 40M, 7 个信道, 使用宏: RATE_SET_2G_HT_40M_EXT4_11BE
🗑️ 跳过空行: 第 65 行(无任何有效功率值)
🗑️ 跳过空行: 第 66 行(无任何有效功率值)
🗑️ 跳过空行: 第 67 行(无任何有效功率值)
🗑️ 跳过空行: 第 68 行(无任何有效功率值)
🗑️ 跳过空行: 第 69 行(无任何有效功率值)
🗑️ 跳过空行: 第 70 行(无任何有效功率值)
🗑️ 跳过空行: 第 71 行(无任何有效功率值)
🗑️ 跳过空行: 第 72 行(无任何有效功率值)
🗑️ 跳过空行: 第 73 行(无任何有效功率值)
🗑️ 跳过空行: 第 74 行(无任何有效功率值)
🗑️ 跳过空行: 第 75 行(无任何有效功率值)
🗑️ 跳过空行: 第 76 行(无任何有效功率值)
🆕 自动分配: RANGE_2G_20M_1_11 → CHANNEL_SET_1
🆕 自动分配: RANGE_2G_20M_1_1 → CHANNEL_SET_2
🆕 自动分配: RANGE_2G_20M_11_11 → CHANNEL_SET_3
🆕 自动分配: RANGE_2G_20M_2_10 → CHANNEL_SET_4
🆕 自动分配: RANGE_2G_40M_3_3 → CHANNEL_SET_5
🆕 自动分配: RANGE_2G_40M_4_8 → CHANNEL_SET_6
🆕 自动分配: RANGE_2G_40M_9_9 → CHANNEL_SET_7
📊 [Band=2G] 累计 2.4G 信道范围: CH1 – CH11
✔️ 成功从 '2.4G功率表(版本1.0)' 添加 88 条压缩后 TX 限幅条目
📊 当前累计 2.4G 信道范围: CH1 – CH11
🧹 '5G功率表(版本1.0)' → 清洗后: '5G功率表版本1.0'
✅ 匹配成功!'5G功率表(版本1.0)' → [5G] 配置
✅ 找到表头行: 第 3 行
🔍 开始向上查找 '认证功率',扫描第 0 ~ 2 行...
📌 发现合并单元格含 '证功率': '认证功率' → L3
🔍 解析 CH 行(第 5 行),限定列范围: Col 11 ~ 35
❌ 在指定区域内未找到任何 CHx 列
⚠️ 从 '5G功率表(版本1.0)' 未收集到有效数据
🧹 '6G功率表 (版本1.0)NSS=1' → 清洗后: '6G功率表版本1.0NSS=1'
✅ 匹配成功!'6G功率表 (版本1.0)NSS=1' → [6G] 配置
✅ 找到表头行: 第 3 行
🔍 开始向上查找 '认证功率',扫描第 0 ~ 2 行...
📌 发现合并单元格含 '证功率': '认证功率' → P3
🔍 解析 CH 行(第 5 行),限定列范围: Col 15 ~ 39
❌ 在指定区域内未找到任何 CHx 列
⚠️ 从 '6G功率表 (版本1.0)NSS=1' 未收集到有效数据
🧹 '6G功率表 (版本1.0)NSS=2' → 清洗后: '6G功率表版本1.0NSS=2'
✅ 匹配成功!'6G功率表 (版本1.0)NSS=2' → [6G] 配置
✅ 找到表头行: 第 3 行
🔍 开始向上查找 '认证功率',扫描第 0 ~ 2 行...
📌 发现合并单元格含 '证功率': '认证功率' → P3
🔍 解析 CH 行(第 5 行),限定列范围: Col 15 ~ 39
❌ 在指定区域内未找到任何 CHx 列
⚠️ 从 '6G功率表 (版本1.0)NSS=2' 未收集到有效数据
🧹 '6G功率表 (版本1.0)NSS=4' → 清洗后: '6G功率表版本1.0NSS=4'
✅ 匹配成功!'6G功率表 (版本1.0)NSS=4' → [6G] 配置
✅ 找到表头行: 第 3 行
🔍 开始向上查找 '认证功率',扫描第 0 ~ 2 行...
📌 发现合并单元格含 '证功率': '认证功率' → P3
🔍 解析 CH 行(第 5 行),限定列范围: Col 15 ~ 39
❌ 在指定区域内未找到任何 CHx 列
⚠️ 从 '6G功率表 (版本1.0)NSS=4' 未收集到有效数据
🧹 'Sheet1' → 清洗后: 'Sheet1'
🟡 未匹配到 'Sheet1' 的模式,跳过...
🔧 正在执行 generate_outputs()...
📊 自动分类结果:
├─ Normal 模式(不含 HT): 4 条
└─ HT 模式(含 HT): 84 条
📊 已存在映射: RANGE_2G_20M_1_11 → CHANNEL_SET_1
🎉 已生成: output\locale_default.c
🎉 已生成: output\tx_limit_table.c
🎉 已生成: output\clm_macros.h
✅ 已生成精简 manifest 文件: output\generated_ranges_manifest.json
📊 共 7 个唯一 RANGE 宏被使用:
- RANGE_2G_20M_11_11
- RANGE_2G_20M_1_1
- RANGE_2G_20M_1_11
- RANGE_2G_20M_2_10
- RANGE_2G_40M_3_3
- RANGE_2G_40M_4_8
- RANGE_2G_40M_9_9
🔄 开始同步 RANGE 到 C 数组...
✅ 已从 output\generated_ranges_manifest.json 加载 0 条 RANGE 映射
🟢 所有 RANGE 均已在正确数组中,无需修改
🎉 同步完成
✅ 所有输出文件生成完成。
✅ Excel 解析完成,共生成 88 条 TX 限幅记录
🔧 正在执行 generate_outputs()...
📊 自动分类结果:
├─ Normal 模式(不含 HT): 4 条
└─ HT 模式(含 HT): 84 条
📊 已存在映射: RANGE_2G_20M_1_11 → CHANNEL_SET_1
🎉 已生成: output\locale_default.c
🎉 已生成: output\tx_limit_table.c
🎉 已生成: output\clm_macros.h
✅ 已生成精简 manifest 文件: output\generated_ranges_manifest.json
📊 共 7 个唯一 RANGE 宏被使用:
- RANGE_2G_20M_11_11
- RANGE_2G_20M_1_1
- RANGE_2G_20M_1_11
- RANGE_2G_20M_2_10
- RANGE_2G_40M_3_3
- RANGE_2G_40M_4_8
- RANGE_2G_40M_9_9
🔄 开始同步 RANGE 到 C 数组...
✅ 已从 output\generated_ranges_manifest.json 加载 0 条 RANGE 映射
🟢 所有 RANGE 均已在正确数组中,无需修改
🎉 同步完成
✅ 所有输出文件生成完成。
这是日志,里面并没有说已成功将更新的 channel_set_map 写回配置文件: F:\issue\config\config.json