';
var div = document.createElement('div');
div.innerHTML = html;
document.body.appendChild(div.firstElementChild);
document.getElementById('plc-modal-cancel').onclick = closeModal;
var rows = document.querySelectorAll('.plc-sig-row');
for (var j = 0; j < rows.length; j++) {
rows[j].onclick = function() {
var saddr = this.getAttribute('data-saddr');
var desc = this.getAttribute('data-desc') || '';
closeModal();
if (confirm('确定绑定信号 ' + saddr + ' 吗?')) { callback(saddr, desc); }
};
}
}
function closeModal() { var m = document.getElementById('plc-modal'); if (m) m.remove(); }
function refreshOutData() {
var sigs = getOutSignals();
if (Array.isArray(sigs)) outSignals = sigs;
for (var i = 0; i < PlcDebugLeds.length; i++) {
var found = findSignal(PlcDebugLeds[i].saddr);
PlcDebugLeds[i].val = found ? found.val : 0;
}
for (var j = 0; j < PlcDebugButtons.length; j++) {
var found2 = findSignal(PlcDebugButtons[j].saddr);
PlcDebugButtons[j].val = found2 ? found2.val : 0;
}
}
function findSignal(saddr) {
for (var i = 0; i < outSignals.length; i++) {
if (outSignals[i].saddr === saddr) return outSignals[i];
}
return null;
}
function countChecked(obj) { var n = 0; for (var k in obj) { if (obj.hasOwnProperty(k)) n++; } return n; }
function updateDelBtn() {
var ledCnt = countChecked(ledChecked);
var btnCnt = countChecked(btnChecked);
var total = ledCnt + btnCnt;
var el = document.getElementById('plc-del-btn');
if (el) {
el.textContent = '🗑 删除选中' + (total > 0 ? '(' + total + ')' : '');
el.disabled = (total === 0);
}
}
/* ---- 增量刷新: 只更新 val 文本, 不重建 DOM (add/del 时才全重建) ---- */
function incrRefresh() {
refreshOutData();
// 指示灯: 逐个更新 val 文本和样式
for (var i = 0; i < PlcDebugLeds.length; i++) {
var valEl = document.getElementById('led-val-' + i);
var iconEl = document.getElementById('led-icon-' + i);
var on = (parseFloat(PlcDebugLeds[i].val) > 0);
if (valEl) valEl.textContent = '(' + PlcDebugLeds[i].val + ')';
if (valEl) valEl.style.color = on ? '#4CAF50' : '#999';
if (iconEl) { iconEl.className = 'plc-led' + (on ? ' plc-led-on' : ''); }
}
// 按键: 逐个更新 val 文本
for (var j = 0; j < PlcDebugButtons.length; j++) {
var bValEl = document.getElementById('btn-val-' + j);
if (bValEl) bValEl.textContent = '(' + PlcDebugButtons[j].val + ')';
}
}
function renderAll() {
refreshOutData();
var html = '';
html += '
'
+ ''
+ ''
+ ''
+ ''
+ ''
+ '
';
html += '
'
+ ''
+ ''
+ ''
+ '
';
html += '
';
// 指示灯
html += '
💡 指示灯
';
for (var i = 0; i < PlcDebugLeds.length; i++) {
var led = PlcDebugLeds[i];
var on = (parseFloat(led.val) > 0);
var chk = ledChecked[i] ? ' checked' : '';
html += '