# 9 号机 3 缸 2026-04-15 23:15 功图角度问题初步分析 ## 1. 原始文件清单 已按 `wave_file.file_name` + `compressor_data_import.directory_path` 生成: - `9号机_20260415_2315_原始文件清单.csv`(含 1/2/3/4/5/6 缸盖侧、轴侧共 12 个文件) 用户要求重点关注的 1、3、5 缸: | 缸 | 测点 | wave_file_id | 键相 | |---|---|---|---| | 一缸 | 压力盖侧 | 222589 | 键相8-0-0 | | 一缸 | 压力轴侧 | 224154 | 键相8-0-0 | | 三缸 | 压力盖侧 | 239529 | 键相8-0-135 | | 三缸 | 压力轴侧 | 242439 | 键相8-0-135 | | 五缸 | 压力盖侧 | 257776 | 键相8-0-270 | | 五缸 | 压力轴侧 | 260757 | 键相8-0-270 | 完整路径见 CSV 的“完整路径”列。 ## 2. 当前算法口径 `backend/app/services/data_service.py` 与 `viewer/backend/services/indicator_service.py`: 1. 用 `detect_cycles` 找 `second_value >= 30` 的长脉冲作为 0° 标记; 2. `wave_file.cycle_start` 取该长脉冲的**上升沿**,`cycle_end` 取下一个 0° 脉冲上升沿; 3. `wave_sample_one` 保存 `[cycle_start, cycle_end)` 的一个完整周期; 4. 对周期内样本做 `linspace(0, 360)`,**直接把周期起点当作 0°**; 5. 整个过程**没有读取 `wave_file.keyphase_info`**。 `statistic_pressure_angle` 也是用同一口径生成(angle=0 的压力与 `wave_sample_one` 首值完全一致),所以数据库内的角度表与前端功图是同一套相位。 ## 3. 本次核对结果 同一时刻 1/3/5 缸的周期边界完全一致: - `cycle_start = 1412`,`cycle_end = 2958`,周期长度 1546 点; - 995.4 rpm、25600 Hz 下一转理论长度 `25600*60/995.4 ≈ 1543` 点,1546 点合理; - 周期内正好 8 个键相脉冲,第一个为长脉冲(0° 标记)。 也就是说:**不是每个缸取到了不同的圈**,周期长度和键相分割本身是对的。 当前“存储 0°”处(即周期起点)的压力: | 缸 | 键相 | 盖侧 0° | 轴侧 0° | |---|---|---|---| | 一缸 | 0 | 4.876 | 3.421 | | 二缸 | 0 | 1.906 | 0.683 | | 三缸 | 135 | 2.075 | 2.374 | | 四缸 | 135 | 0.810 | 1.245 | | 五缸 | 270 | 1.686 | 3.882 | | 六缸 | 265 | 0.642 | 1.917 | 用户给出的 3 缸实际 0° 约为盖侧 1.9、轴侧 3.3。当前 3 缸存储 0° 是 2.075 / 2.374,轴侧明显偏低,方向对不上。 在三缸存储周期内搜索 `(盖≈1.9, 轴≈3.3)` 的最佳位置: - 约在存储角 **337°** 处:盖 1.851、轴 3.299,与用户给出的数值最接近。 如果按 `键相8-0-135` 做相位平移,令物理 0° 对应存储角 225°(=360-135): - 盖 1.696、轴 3.741,方向正确(盖下降、轴上升),但数值仍有偏差。 五缸按 `键相8-0-270` 平移到存储角 90°: - 盖 1.865、轴 3.492,同样落在“盖约 1.9、轴约 3.5”附近。 ## 4. 初步判断 更可能是**角度参考/相位问题**,而不是采样数据丢失或取错圈: 1. 1、2 缸键相为 `0`,当前算法等于不做平移,所以用户看到“1 缸完全符合、2 缸大方向符合”; 2. 3、4 缸键相为 `135`,5、6 缸为 `270/265`,而代码完全忽略该字段,所以这几缸的功图相对真实 0° 被整体旋转; 3. “2/4/6 同级缸”不能解释现象:2 缸对是因为键相 0,4 缸不对是因为键相 135,与缸径级别无关; 4. “首周期取错”目前证据不足:三个缸的 `cycle_start/cycle_end` 完全相同、周期长度正确、8 个键相脉冲完整。更像是**首周期的 0° 定义(键相偏置)没对齐**,而不是取到了另一圈。 ## 5. 需要原始文件确认的点 请把 CSV 中 1/3/5 缸的原始 CSV 拷到本地后,重点核对: 1. 原始文件表头/列名:是否已有“角度”“曲轴转角”“键相”列; 2. 原始文件前几行(sample_index 0 附近)盖侧/轴侧压力是否就是用户所说的 1.9 / 3.3; 3. 原始文件里 0° 到底对应长键相脉冲的上升沿、下降沿还是中心; 4. `键相8-0-135` 中 135 的含义,是否就是该测点相对气缸 0° 的安装偏置; 5. 原始软件的 P-θ 图在 0° 处取值与 `statistic_pressure_angle` 的差异。 拿到原始文件后,可以直接对比: - 原始 CSV 的时间列/采样序号 → 确认 `cycle_start=1412` 是否就是原始软件认定的 0°; - 原始 CSV 的 0° 行压力 → 与 `wave_sample_one` 首值对比,判断是“数据取错”还是“相位差”。 ## 6. 附带发现 - `6 缸盖侧` 的 `wave_file_id=1162517` 来自 `test_20260324111644_20260622111644` 批次,而其余文件来自 `exp_all_device_2026.3.16-2026.4.18...`。同一时刻可能存在重复导入,后续分析时建议先确认是否应排除测试批次。 - 键相偏置是**按测点**配置的,不是按缸固定:例如 `backend/预训练之文件头.csv` 中 7 号机三缸盖侧为 `键相8-0-270`、轴侧为 `键相8-0-0`。修复时必须逐测点读取 `keyphase_info`。 ## 7. 原始文件验证(决定性) 原始 CSV 放在 `cache/9号机组一三五缸压力_20260415231501/`。文件无表头,两列:`压力, 键相`。 逐点比对 `wave_sample_one` 与原始文件 `raw[1412:2958]`: | 文件 | wave_file_id | 样本区间 | max\|raw-db\| | |---|---|---|---| | 一缸盖 | 222589 | 1412:2958 | 0.000000 | | 一缸轴 | 224154 | 1412:2958 | 0.000000 | | 三缸盖 | 239529 | 1412:2958 | 0.000000 | | 三缸轴 | 242439 | 1412:2958 | 0.000000 | | 五缸盖 | 257776 | 1412:2958 | 0.000000 | | 五缸轴 | 260757 | 1412:2958 | 0.000000 | 结论:**数据库里的首周期与原始文件逐点完全一致,取数没有错。** 6 个文件的键相长脉冲起点全部是 `1412`,脉冲序列也完全相同(79, 276, 468, ...),说明它们用的是同一个键相信号、同一个物理圈,`cycle_start/cycle_end` 正确。 原始文件中,3 缸 `(盖≈1.9, 轴≈3.3)` 出现在共享键相坐标的 **≈337°**(raw 第 2859 点,1.856 / 3.292);按键相 135° 旋转则出现在 225°(1.696 / 3.741)。两者都说明:**真实 0° 不在共享长脉冲起点,而是存在固定相位偏置。** ## 8. 最终结论 **是角度相位/键相偏置问题,不是数据问题,也不是首周期取错圈。** - 数据:原始文件与库内逐点一致(误差 0)。 - 圈:6 个文件同一键相脉冲、同一圈、周期长度 1546 点正确。 - 形态:1/3/5 缸归一化后是同一形状,互相关 0.95~0.99,正向优于反向(不是采样方向问题)。 - 相位:相对旋转量长期稳定,且按键相分组: - 1/2 缸 `键相0`:基本同相(2 缸约 -20°,所以“大方向符合”); - 3/4 缸 `键相135`:约 220°(≈360-135); - 5/6 缸 `键相270/265`:约 100°(≈360-270)。 - 代码在 `_stored_first_cycle`、`indicator_service.py`、`statistic_pressure_angle` 全链路都直接 `linspace(0,360)`,**没有使用 `keyphase_info`**。 ## 9. 修复建议 1. 逐测点解析 `keyphase_info` 末位角度 `K`,把共享键相角换算成该测点自身角:`display_angle = (shared_angle - K) mod 360`(方向需用 1 缸/3 缸实测标定一次)。 2. 用 8 个键相脉冲做分段角度,替代均匀 `linspace`,消除周期内小角度畸变。 3. 用 1 缸做基线回归:修正后 1 缸应与现在一致;3/4/5/6 缸 0° 应落到用户给出的 `≈1.9/3.3` 附近。 4. 修复只影响显示/角度分箱,不改原始采样与阶段规则。