*{box-sizing:border-box;margin:0;padding:0;font-family:"Microsoft YaHei",sans-serif}

body{max-width:1100px;margin:20px auto;padding:0 15px;background:#f3f6fa}

.container{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:20px}

@media(max-width:768px){.container{grid-template-columns:1fr}}

.card{background:#fff;padding:20px;border-radius:10px;box-shadow:0 1px 8px #00000012}

h2{text-align:center;color:#2a3442;margin-bottom:18px;font-size:20px}

h3{margin:16px 0 10px;color:#333;font-size:16px}

.group{margin-bottom:14px}

label{display:block;margin-bottom:5px;color:#444;font-weight:500}

input,textarea{width:100%;padding:9px 12px;border:1px solid #d0d7e3;border-radius:6px;font-size:15px;outline:0}

input:focus,textarea:focus{border-color:#2b7cd3}

.row{display:flex;gap:10px;align-items:center}

.result-box{padding:12px;background:#e8f3ff;border-radius:6px;margin-top:8px;font-weight:bold;color:#1c4b82}

.percent{color:#238547;margin-left:12px}

.warn{color:#dc3545 !important;}

.btn{background:#2b7cd3;color:#fff;border:none;padding:7px 12px;border-radius:5px;cursor:pointer;font-size:14px}

.btn:hover{background:#2068b9}

.btn-danger{background:#dc3545}

.btn-danger:hover{background:#bb2d3b}

.btn-success{background:#28a745}

.btn-success:hover{background:#218838}

.divider{height:1px;background:#e2e8f0;margin:22px 0}

table{width:100%;border-collapse:collapse;margin-top:10px;font-size:14px}

th,td{border:1px solid #dee2e6;padding:8px;text-align:center}

th{background:#f1f5fb}

.record-wrap{max-height:320px;overflow:auto}

.oper-bar{display:flex;gap:8px;margin:10px 0}

.tip{font-size:12px;color:#666;margin-top:4px}

.set-row{display:grid;grid-template-columns:1fr 1fr;gap:10px}

基础互转(断线检测+单位+小数位)

量程下限 (4mA对应值)

量程上限 (20mA对应值)

工程值单位

小数保留位数(1~6)

输入电流 mA

工程值:-- 占比:0.00%

保存本条记录

复制结果

输入工程值

电流:-- mA 占比:0.00%

保存本条记录

复制结果

批量转换

批量输入(每行1个电流mA,自动转工程值+百分比)

批量计算

全部存入记录

全部转换记录

导出CSV文件

清空全部记录

电流(mA)

工程值

单位

百分比(%)

状态

// 全局记录数组

let recordList = [];

const tableTbody = document.querySelector("#recordTable tbody");

// 获取全局配置

function getConfig(){

const min = parseFloat(document.getElementById("minRange").value) || 0;

const max = parseFloat(document.getElementById("maxRange").value) || 100;

const span = max - min;

const unit = document.getElementById("unitText").value.trim();

const dec = parseInt(document.getElementById("decimalNum").value) || 2;

const decimal = Math.max(1, Math.min(6, dec));

return {min,max,span,unit,decimal};

}

// 判断电流是否断线异常

function isAbnormalCurrent(curr){

return curr < 4 || curr > 20;

}

// 电流转工程值、百分比

function currToProc(curr){

const {min,max,span,decimal} = getConfig();

const proc = min + span * (curr - 4) / 16;

const pct = ((curr - 4)/16 * 100);

return {

proc: proc.toFixed(decimal),

pct: pct.toFixed(decimal)

};

}

// 工程值转电流、百分比

function procToCurr(proc){

const {min,max,span,decimal} = getConfig();

const curr = 4 + 16 * (proc - min) / span;

const pct = ((proc - min)/span * 100);

return {

curr: curr.toFixed(decimal),

pct: pct.toFixed(decimal)

};

}

// 实时刷新电流转换

function refreshCurrView(){

const {unit} = getConfig();

const curr = parseFloat(document.getElementById("currIn").value);

const box = document.getElementById("currResult");

if(isNaN(curr)){

box.innerHTML = `工程值:-- ${unit} 占比:0.00%`;

box.className = "result-box";

return;

}

const res = currToProc(curr);

let html = `工程值:${res.proc} ${unit} 占比:${res.pct}%`;

box.className = "result-box";

if(isAbnormalCurrent(curr)){

box.classList.add("warn");

html += " 【断线异常】";

}

box.innerHTML = html;

}

// 实时刷新工程值转换

function refreshProcView(){

const {unit,decimal} = getConfig();

const proc = parseFloat(document.getElementById("procIn").value);

const box = document.getElementById("procResult");

if(isNaN(proc)){

box.innerHTML = `电流:-- mA 占比:0.00%`;

box.className = "result-box";

return;

}

const res = procToCurr(proc);

const currVal = parseFloat(res.curr);

let html = `电流:${res.curr} mA 占比:${res.pct}%`;

box.className = "result-box";

if(isAbnormalCurrent(currVal)){

box.classList.add("warn");

html += " 【断线异常】";

}

box.innerHTML = html;

}

// 绑定所有输入监听

["minRange","maxRange","unitText","decimalNum","currIn","procIn"].forEach(id=>{

document.getElementById(id).addEventListener("input",()=>{

refreshCurrView();

refreshProcView();

})

})

// 保存电流转换记录

function saveCurrRecord(){

const {unit} = getConfig();

const curr = parseFloat(document.getElementById("currIn").value);

if(isNaN(curr)) return alert("请输入有效电流");

const r = currToProc(curr);

const status = isAbnormalCurrent(curr) ? "异常" : "正常";

recordList.push({

curr:curr.toFixed(getConfig().decimal),

proc:r.proc,

unit:unit,

pct:r.pct,

status:status

});

renderRecord();

}

// 保存工程值转换记录

function saveProcRecord(){

const {unit,decimal} = getConfig();

const proc = parseFloat(document.getElementById("procIn").value);

if(isNaN(proc)) return alert("请输入有效工程值");

const r = procToCurr(proc);

const currVal = parseFloat(r.curr);

const status = isAbnormalCurrent(currVal) ? "异常" : "正常";

recordList.push({

curr:r.curr,

proc:proc.toFixed(decimal),

unit:unit,

pct:r.pct,

status:status

});

renderRecord();

}

// 渲染记录表格

function renderRecord(){

tableTbody.innerHTML = "";

recordList.forEach(item=>{

const tr = document.createElement("tr");

let warnTd = item.status === "异常" ? 'style="color:red"' : "";

tr.innerHTML = `

${item.curr}

${item.proc}

${item.unit}

${item.pct}

${item.status}

`;

tableTbody.appendChild(tr);

})

}

// 清空所有记录

function clearAllRecord(){

recordList = [];

renderRecord();

}

// 复制结果

function copyCurr(){

const txt = document.getElementById("currResult").innerText.trim();

navigator.clipboard.writeText(txt).then(()=>alert("已复制:"+txt))

}

function copyProc(){

const txt = document.getElementById("procResult").innerText.trim();

navigator.clipboard.writeText(txt).then(()=>alert("已复制:"+txt))

}

// 批量计算

function calcBatch(){

const {unit} = getConfig();

const text = document.getElementById("batchInput").value.trim();

const lines = text.split("\n").filter(v=>v.trim()!="");

let html = "电流(mA) 工程值 单位 百分比 状态

";

lines.forEach(line=>{

const c = parseFloat(line.trim());

if(isNaN(c)) return;

const r = currToProc(c);

const status = isAbnormalCurrent(c) ? "异常" : "正常";

const red = isAbnormalCurrent(c) ? 'style="color:red"' : "";

html += `

${c}

${r.proc}

${unit}

${r.pct}%

${status}

`;

})

html += "";

document.getElementById("batchOut").innerHTML = html;

}

// 批量存入记录

function saveAllBatch(){

const {unit,decimal} = getConfig();

const text = document.getElementById("batchInput").value.trim();

const lines = text.split("\n").filter(v=>v.trim()!="");

lines.forEach(line=>{

const c = parseFloat(line.trim());

if(isNaN(c)) return;

const r = currToProc(c);

const status = isAbnormalCurrent(c) ? "异常" : "正常";

recordList.push({

curr:c.toFixed(decimal),

proc:r.proc,

unit:unit,

pct:r.pct,

status:status

});

})

renderRecord();

alert("批量数据已存入记录表格");

}

// 导出CSV

function exportCSV(){

if(recordList.length === 0) return alert("暂无记录可导出");

let csv = "电流(mA),工程值,单位,百分比(%),运行状态\n";

recordList.forEach(item=>{

csv += `${item.curr},${item.proc},${item.unit},${item.pct},${item.status}\n`;

})

const blob = new Blob([csv],{type:"text/csv;charset=utf-8"});

const a = document.createElement("a");

a.href = URL.createObjectURL(blob);

a.download = "4-20mA转换记录.csv";

a.click();

URL.revokeObjectURL(a.href);

}

// 页面初始化刷新

refreshCurrView();

refreshProcView();