7 changed files with 287 additions and 30 deletions
@ -0,0 +1,64 @@ |
|||
# V1.2.2 更新日志 |
|||
|
|||
- **更新日期**: 2026年06月09日 |
|||
- **版本号**: 1.2.2 |
|||
|
|||
## 新增功能 |
|||
|
|||
### 1. 数据修正系数配置 |
|||
- **新增数据修正系数功能**:在系统设置中新增 X/Y 双方向修正系数配置,支持分别设置 `xK`、`xB`、`yK`、`yB` |
|||
- **支持线性修正公式**:页面显示值按 `newValue = K * originalValue + B` 计算 |
|||
- **本地持久化保存**:修正系数自动保存到本地,上位机重启后可继续沿用 |
|||
- **页面更新提示**:修正系数修改成功后,页面会给出即时提示,方便确认操作结果 |
|||
|
|||
### 2. 修正值统一应用 |
|||
- **曲线显示统一使用修正值**:X/Y 方向曲线改为显示修正后的数据 |
|||
- **实时数据显示统一使用修正值**:右侧实时数据显示与曲线口径保持一致 |
|||
- **报警判断统一使用修正值**:报警逻辑基于修正后的 X/Y 数据进行判断 |
|||
- **CSV 导出统一使用修正值**:实时数据与报警数据导出均使用修正后的值 |
|||
|
|||
## 技术细节 |
|||
|
|||
### 修正系数 |
|||
- 修正系数项: |
|||
- `xK` |
|||
- `xB` |
|||
- `yK` |
|||
- `yB` |
|||
- 默认值: |
|||
- `xK = 1` |
|||
- `xB = 0` |
|||
- `yK = 1` |
|||
- `yB = 0` |
|||
|
|||
### 数据处理策略 |
|||
- 页面接收到实时传感器数据后,先计算并冻结: |
|||
- `correctedX` |
|||
- `correctedY` |
|||
- 冻结结果用于: |
|||
- 历史曲线显示 |
|||
- 实时数据显示 |
|||
- 报警判断 |
|||
- 实时 CSV 导出 |
|||
- 报警 CSV 导出 |
|||
|
|||
## 影响范围 |
|||
- 挠度采集页 X/Y 曲线显示 |
|||
- 挠度采集页实时数据显示 |
|||
- 系统设置中的数据修正系数配置 |
|||
- 报警判断逻辑 |
|||
- 实时数据 CSV 导出 |
|||
- 报警数据 CSV 导出 |
|||
|
|||
## 依赖更新 |
|||
- 无依赖包更新 |
|||
|
|||
## 注意事项 |
|||
1. 修正系数仅作用于当前上位机本地显示与导出,不会下发到设备端。 |
|||
2. 设备侧“测点设置”中的“计算系数”仍为独立参数,与本次新增的上位机修正系数互不替代。 |
|||
3. 修改修正系数后,仅后续新采集数据使用新系数,已有历史数据保持采集当时的结果。 |
|||
4. 如需验证导出结果,建议同时比对页面曲线、实时数据显示与 CSV 记录的一致性。 |
|||
|
|||
--- |
|||
|
|||
**完整更新内容请查看项目 Git 提交记录** |
|||
@ -0,0 +1,60 @@ |
|||
export const DEFLECTION_CORRECTION_STORAGE_KEY = 'deflectionCorrectionFactors' |
|||
|
|||
export const DEFAULT_CORRECTION_FACTORS = { |
|||
xK: 1, |
|||
xB: 0, |
|||
yK: 1, |
|||
yB: 0 |
|||
} |
|||
|
|||
const toFiniteNumber = (value) => { |
|||
const num = Number(value) |
|||
return Number.isFinite(num) ? num : null |
|||
} |
|||
|
|||
export const sanitizeCorrectionFactors = (value) => { |
|||
const next = value && typeof value === 'object' ? value : {} |
|||
|
|||
return { |
|||
xK: toFiniteNumber(next.xK) ?? DEFAULT_CORRECTION_FACTORS.xK, |
|||
xB: toFiniteNumber(next.xB) ?? DEFAULT_CORRECTION_FACTORS.xB, |
|||
yK: toFiniteNumber(next.yK) ?? DEFAULT_CORRECTION_FACTORS.yK, |
|||
yB: toFiniteNumber(next.yB) ?? DEFAULT_CORRECTION_FACTORS.yB |
|||
} |
|||
} |
|||
|
|||
export const correctAxisValue = (originalValue, k, b) => { |
|||
if (originalValue === null || originalValue === undefined || originalValue === '') { |
|||
return null |
|||
} |
|||
|
|||
const numericOriginal = Number(originalValue) |
|||
if (!Number.isFinite(numericOriginal)) { |
|||
return null |
|||
} |
|||
|
|||
return k * numericOriginal + b |
|||
} |
|||
|
|||
export const applyCorrectionToSensor = (sensor, correctionFactors) => { |
|||
if (!sensor || typeof sensor !== 'object') { |
|||
return sensor |
|||
} |
|||
|
|||
const normalizedFactors = sanitizeCorrectionFactors(correctionFactors) |
|||
|
|||
return { |
|||
...sensor, |
|||
appliedCorrectionFactors: normalizedFactors, |
|||
correctedX: correctAxisValue(sensor.xReal, normalizedFactors.xK, normalizedFactors.xB), |
|||
correctedY: correctAxisValue(sensor.yReal, normalizedFactors.yK, normalizedFactors.yB) |
|||
} |
|||
} |
|||
|
|||
export const applyCorrectionToSensors = (sensors, correctionFactors) => { |
|||
if (!Array.isArray(sensors)) { |
|||
return [] |
|||
} |
|||
|
|||
return sensors.map((sensor) => applyCorrectionToSensor(sensor, correctionFactors)) |
|||
} |
|||
Loading…
Reference in new issue