From 2148a068f85cd02f5485d357c0a515f457e7866d Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Thu, 11 Jun 2026 15:10:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8E=9A=E5=BA=A6?= =?UTF-8?q?=E5=81=8F=E5=B7=AE=E6=9B=B2=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acid/components/ActualPerformance.vue | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue b/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue index d98d2daa..a826a310 100644 --- a/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue +++ b/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue @@ -664,29 +664,34 @@ export default { return parseFloat((100 + v).toFixed(3)) }) const extras = [] - // 目标值恒为 100% + // 目标值恒为 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]) + + // TOPLIMIT/BOTLIMIT 是冷轧机出口厚度的 AGC 公差带(逐行变化, + // 头尾加减速段约 ±2.5%、稳态段收紧到约 ±1%),只约束出口厚度。 + // 入口测厚仪测的是来料热卷,天然偏离名义值且不受此公差约束, + // 故公差带仅画在出口侧图上(THICK1/THICK5),入口图只画偏差曲线。 + if (col !== 'THICK0') { + 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 (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, extras.flatMap(e => e.data)) return this.makeChart(ref, makeLine(title, xData, yData, extras, '%', yRange)) } else { // ── 速度等无参考值的图:保持原始单位 ── From 0adb29139efa4271322832cb83d18e7924eb5ef5 Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Thu, 11 Jun 2026 15:24:46 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8E=9A=E5=BA=A6?= =?UTF-8?q?=E5=81=8F=E5=B7=AE=E6=9B=B2=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acid/components/ActualPerformance.vue | 67 +++++++------------ 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue b/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue index a826a310..0dd27686 100644 --- a/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue +++ b/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue @@ -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,45 +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)) }) - const extras = [] - // 目标值恒为 100%(各通道相对各自设定值) - const refLine = rows.map(r => { + // 设定值(绝对厚度 mm):取首个非空 REF,写入标题 + let refVal = null + for (const r of rows) { const rv = getRowVal(r, refCol) - return (rv != null && rv !== 0) ? 100 : null - }) - if (refLine.some(v => v != null)) extras.push({ name: '目标值(100%)', data: refLine, color: '#909399', dash: false }) + if (rv != null && rv !== 0) { refVal = rv; break } + } + const chartTitle = refVal != null ? `${title} - 设定值: ${refVal.toFixed(2)}[mm]` : title + + const extras = [] + // 设定基准线恒为 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),入口图只画偏差曲线。 + // 入口测的是来料热卷,天然偏离名义值且不受此公差约束, + // 故公差带仅画在出口侧图(THICK1/THICK5),入口图只画偏差曲线。 if (col !== 'THICK0') { 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)) + return tl == null ? null : parseFloat(tl.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)) + 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 }) } - const yRange = calcPercentRange(yData, extras.flatMap(e => e.data)) - return this.makeChart(ref, makeLine(title, xData, yData, extras, '%', yRange)) + return this.makeChart(ref, makeLine(chartTitle, xData, yData, extras, '%', GAUGE_DEV_RANGE)) } else { // ── 速度等无参考值的图:保持原始单位 ── const yData = rows.map(r => {