Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X
This commit is contained in:
@@ -264,11 +264,12 @@ const TREND_GROUPS = [
|
||||
]
|
||||
|
||||
// V_VBDA_GAUGE 厚度曲线:4 个图,列名来自 DDL
|
||||
// 厚度列是相对设定值的偏差百分比,图中以 100% 为目标值;速度图保持原单位
|
||||
// 厚度列是相对设定值的厚度偏差百分比,纵轴直接以 0 为设定基准线显示
|
||||
// (与 L2 原生 HMI 一致);速度图保持原单位
|
||||
const GAUGE_COLS = [
|
||||
{ col: 'THICK0', title: '入口测厚仪 [%]' },
|
||||
{ col: 'THICK1', title: '1架出口厚度 [%]' },
|
||||
{ col: 'THICK5', title: '末架出口厚度 [%]' },
|
||||
{ col: 'THICK0', title: '1架入口厚度偏差 [%]' },
|
||||
{ col: 'THICK1', title: '1架出口厚度偏差 [%]' },
|
||||
{ col: 'THICK5', title: '末架出口厚度偏差 [%]' },
|
||||
{ col: 'EXIT_SPEED', title: '轧制速度 [m/min]' }
|
||||
]
|
||||
|
||||
@@ -313,23 +314,8 @@ function calcYRange(vals) {
|
||||
return { min: parseFloat((min - pad).toFixed(4)), max: parseFloat((max + pad).toFixed(4)) }
|
||||
}
|
||||
|
||||
/**
|
||||
* 厚度百分比图专用纵轴范围:实测列在带头/带尾存在测厚仪不在带上的离群值
|
||||
* (可达 ±1000% 以上),直接用全量 min/max 会把纵轴撑爆,
|
||||
* 导致实际值、目标值、上下限挤成几条横线无法分辨。
|
||||
* 这里对实测值取 2%~98% 分位数,再并入上下限/目标线所在区间。
|
||||
*/
|
||||
function calcPercentRange(yVals, bandVals) {
|
||||
const nums = yVals.filter(v => v != null && isFinite(Number(v))).map(Number).sort((a, b) => a - b)
|
||||
const band = bandVals.filter(v => v != null && isFinite(Number(v))).map(Number)
|
||||
if (!nums.length && !band.length) return {}
|
||||
const lo = nums.length ? nums[Math.floor(nums.length * 0.02)] : Infinity
|
||||
const hi = nums.length ? nums[Math.min(nums.length - 1, Math.ceil(nums.length * 0.98))] : -Infinity
|
||||
const min = Math.min(lo, ...band)
|
||||
const max = Math.max(hi, ...band)
|
||||
const pad = (max - min) * 0.15 || Math.abs(max) * 0.2 || 1
|
||||
return { min: parseFloat((min - pad).toFixed(3)), max: parseFloat((max + pad).toFixed(3)) }
|
||||
}
|
||||
// 厚度偏差图纵轴固定为 -5% ~ +5%(与 L2 原生 HMI 一致)
|
||||
const GAUGE_DEV_RANGE = { min: -5, max: 5 }
|
||||
|
||||
/**
|
||||
* 生成折线图 option。
|
||||
@@ -654,40 +640,44 @@ export default {
|
||||
const refCol = refColMap[col]
|
||||
|
||||
if (refCol) {
|
||||
// ── 厚度图:THICKx 本身就是相对设定值的偏差百分比 ──
|
||||
// 实测数据验证(卷 26061045000):THICK0≈-3.0 而 THICK0REF=3.0mm,
|
||||
// 绝对厚度不可能为负,故 THICKx 是偏差%,纵轴画 100 + 偏差
|
||||
// ── 厚度偏差图:THICKx 即相对设定值的偏差%,纵轴直接画偏差、0 为基准 ──
|
||||
// 实测数据验证(卷 26061045000):THICK0 在 -3% 上下、THICK0REF=3.0mm,
|
||||
// 与 L2 原生 HMI 一致——蓝色 0 线为设定值,曲线为实测偏差
|
||||
const yData = rows.map(r => {
|
||||
const v = getRowVal(r, col)
|
||||
const rv = getRowVal(r, refCol)
|
||||
if (v == null || rv == null || rv === 0) return null
|
||||
return parseFloat((100 + v).toFixed(3))
|
||||
return parseFloat(v.toFixed(3))
|
||||
})
|
||||
// 设定值(绝对厚度 mm):取首个非空 REF,写入标题
|
||||
let refVal = null
|
||||
for (const r of rows) {
|
||||
const rv = getRowVal(r, refCol)
|
||||
if (rv != null && rv !== 0) { refVal = rv; break }
|
||||
}
|
||||
const chartTitle = refVal != null ? `${title} - 设定值: ${refVal.toFixed(2)}[mm]` : title
|
||||
|
||||
const extras = []
|
||||
// 目标值恒为 100%
|
||||
const refLine = rows.map(r => {
|
||||
const rv = getRowVal(r, refCol)
|
||||
return (rv != null && rv !== 0) ? 100 : null
|
||||
})
|
||||
// TOPLIMIT/BOTLIMIT 同为偏差限百分比,且逐行变化
|
||||
// (头尾加减速段约 ±2.5%,稳态段收紧到约 ±1%),不是 mm 偏差量
|
||||
const upData = rows.map(r => {
|
||||
const rv = getRowVal(r, refCol)
|
||||
const tl = getRowVal(r, 'TOPLIMIT')
|
||||
if (rv == null || rv === 0) return null
|
||||
return parseFloat((100 + (tl ?? 3)).toFixed(3))
|
||||
})
|
||||
const loData = rows.map(r => {
|
||||
const rv = getRowVal(r, refCol)
|
||||
const bl = getRowVal(r, 'BOTLIMIT')
|
||||
if (rv == null || rv === 0) return null
|
||||
return parseFloat((100 + (bl ?? -3)).toFixed(3))
|
||||
})
|
||||
if (refLine.some(v => v != null)) extras.push({ name: '目标值(100%)', data: refLine, color: '#909399', dash: false })
|
||||
if (upData.some(v => v != null)) extras.push({ name: '上限', data: upData, color: '#F56C6C', dash: true })
|
||||
if (loData.some(v => v != null)) extras.push({ name: '下限', data: loData, color: '#67C23A', dash: true })
|
||||
const yRange = calcPercentRange(yData, [...refLine, ...upData, ...loData])
|
||||
return this.makeChart(ref, makeLine(title, xData, yData, extras, '%', yRange))
|
||||
// 设定基准线恒为 0
|
||||
extras.push({ name: '设定值(0)', data: yData.map(v => v == null ? null : 0), color: '#909399', dash: false })
|
||||
|
||||
// TOPLIMIT/BOTLIMIT 是冷轧机出口厚度的 AGC 公差带(逐行变化,
|
||||
// 头尾加减速段约 ±2.5%、稳态段收紧到约 ±1%),只约束出口厚度。
|
||||
// 入口测的是来料热卷,天然偏离名义值且不受此公差约束,
|
||||
// 故公差带仅画在出口侧图(THICK1/THICK5),入口图只画偏差曲线。
|
||||
if (col !== 'THICK0') {
|
||||
const upData = rows.map(r => {
|
||||
const tl = getRowVal(r, 'TOPLIMIT')
|
||||
return tl == null ? null : parseFloat(tl.toFixed(3))
|
||||
})
|
||||
const loData = rows.map(r => {
|
||||
const bl = getRowVal(r, 'BOTLIMIT')
|
||||
return bl == null ? null : parseFloat(bl.toFixed(3))
|
||||
})
|
||||
if (upData.some(v => v != null)) extras.push({ name: '上限', data: upData, color: '#F56C6C', dash: true })
|
||||
if (loData.some(v => v != null)) extras.push({ name: '下限', data: loData, color: '#67C23A', dash: true })
|
||||
}
|
||||
return this.makeChart(ref, makeLine(chartTitle, xData, yData, extras, '%', GAUGE_DEV_RANGE))
|
||||
} else {
|
||||
// ── 速度等无参考值的图:保持原始单位 ──
|
||||
const yData = rows.map(r => {
|
||||
|
||||
Reference in New Issue
Block a user