<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://kumajaya.github.io/kiiota-blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://kumajaya.github.io/kiiota-blog/" rel="alternate" type="text/html" /><updated>2026-05-11T04:53:09+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/feed.xml</id><title type="html">Kiiota Blog</title><subtitle>Kiiota Blog adalah ruang catatan teknis dan refleksi humanis di dunia otomasi industri. Berisi dokumentasi eksperimen, troubleshooting, dan filosofi kerja yang lahir dari lapangan. Repositori ini menyimpan konten dalam bentuk statis, memungkinkan backup otomatis, serta publikasi via static site generator (Jekyll, Hugo, Eleventy) dan GitHub Pages.
</subtitle><author><name>Ketut Kumajaya</name><email>ketut.kumajaya@gmail.com</email></author><entry><title type="html">Memahami Cara Kerja PID Control pada DCS Supcon</title><link href="https://kumajaya.github.io/kiiota-blog/distributed-control-system/2026/05/09/memahami-cara-kerja-pid-control-pada-dcs-supcon.html" rel="alternate" type="text/html" title="Memahami Cara Kerja PID Control pada DCS Supcon" /><published>2026-05-09T09:38:18+00:00</published><updated>2026-05-09T09:38:18+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/distributed-control-system/2026/05/09/memahami-cara-kerja-pid-control-pada-dcs-supcon</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/distributed-control-system/2026/05/09/memahami-cara-kerja-pid-control-pada-dcs-supcon.html"><![CDATA[<p><em>Ditulis oleh Ketut Kumajaya — 9 Mei 2026</em></p>
<h1 id="pendahuluan">Pendahuluan</h1>
<p>Pada banyak sistem kontrol industri, PID controller merupakan algoritma utama untuk menjaga variabel proses seperti pressure, flow, temperature, dan level tetap berada pada setpoint. Salah satu hal yang sering membingungkan engineer ketika menggunakan DCS Supcon adalah bentuk parameter PID-nya yang sedikit berbeda dibanding beberapa PLC atau DCS modern lain.</p>
<p>Pada Supcon:</p>
<ul>
<li>Parameter <strong>P</strong> menggunakan <strong>Proportional Band (%)</strong></li>
<li>Parameter <strong>I</strong> menggunakan <strong>nilai reciprocal dari Integral Time ($1/T_I$)</strong></li>
<li>Derivative menggunakan bentuk <strong>filtered derivative</strong></li>
</ul>
<p>Akibatnya:</p>
<ul>
<li>Semakin <strong>kecil</strong> nilai P → controller semakin agresif</li>
<li>Semakin <strong>besar</strong> nilai I → integral semakin agresif</li>
</ul>
<p>Ini berbeda dengan beberapa sistem lain yang menggunakan proportional gain langsung maupun integral time langsung.</p>
<hr />

<h1 id="apa-itu-pid-controller">Apa itu PID Controller?</h1>
<p>PID controller adalah algoritma kontrol yang menghitung output berdasarkan tiga komponen: Proportional, Integral, dan Derivative. Ketiganya bekerja bersama untuk menjaga process variable (PV) tetap berada di setpoint (SP).</p>
<h2 id="proportional-p">Proportional (P)</h2>
<p>Komponen P menghasilkan output yang proporsional terhadap besar error saat ini — selisih antara SP dan PV. Semakin besar error, semakin besar output yang dihasilkan.</p>
<p>P bekerja instan: begitu error muncul, output langsung berubah. Kelemahannya, P saja hampir selalu meninggalkan offset permanen — PV mendekati SP tapi tidak pernah benar-benar mencapainya.</p>
<h2 id="integral-i">Integral (I)</h2>
<p>Komponen I menjumlahkan error dari waktu ke waktu. Selama error masih ada, integral terus terakumulasi dan mendorong output hingga offset benar-benar hilang.</p>
<p>I bertugas menghilangkan offset yang ditinggalkan oleh P. Namun integral yang terlalu agresif dapat menyebabkan overshoot dan oscillation karena output terus didorong bahkan saat PV sudah mendekati SP.</p>
<h2 id="derivative-d">Derivative (D)</h2>
<p>Komponen D membaca kecepatan perubahan error. Bila PV bergerak cepat menuju SP, derivative mulai mengurangi output lebih awal — seperti rem sebelum mencapai target.</p>
<p>D membantu mengurangi overshoot dan mempercepat stabilisasi. Namun derivative sangat sensitif terhadap noise sehingga tidak selalu digunakan, terutama pada proses dengan sinyal yang tidak bersih.</p>
<hr />

<!--kg-card-begin: html-->
<p>&lt;!DOCTYPE html&gt;</p>
<html lang="id">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>PID Visualizer</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js"></script>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #fff; color: #1a1a1a; padding: 16px; }

.tab-bar { display: flex; gap: 0; margin-bottom: 20px; border-bottom: 1px solid #e0e0e0; }
.tab-btn { padding: 8px 20px; font-size: 13px; font-weight: 500; border: none; background: transparent; color: #888; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color 0.15s; }
.tab-btn.active { color: #185FA5; border-bottom-color: #185FA5; }
.tab-btn:hover:not(.active) { color: #444; }

.tab-panel { display: none; }
.tab-panel.active { display: block; }

.mode-bar { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 14px; }
.mode-btn { font-size: 12px; padding: 4px 14px; border-radius: 20px; border: 1px solid #ddd; background: transparent; color: #888; cursor: pointer; transition: all 0.15s; }
.mode-btn.active { background: #e6f1fb; color: #185FA5; border-color: #185FA5; }

.chart-wrap { position: relative; width: 100%; height: 240px; margin-bottom: 10px; }

.legend { display: flex; gap: 16px; flex-wrap: wrap; align-items: center; font-size: 12px; color: #888; margin-bottom: 14px; }
.legend span { display: flex; align-items: center; gap: 5px; }
.leg-line { display: inline-block; width: 14px; height: 2px; }
.leg-dash { display: inline-block; width: 14px; height: 0; border-top: 2px dashed #D85A30; }
.noise-label { margin-left: auto; display: flex; align-items: center; gap: 5px; cursor: pointer; user-select: none; }
.noise-label input { accent-color: #185FA5; cursor: pointer; }

.controls { border-top: 1px solid #f0f0f0; padding-top: 12px; }
.ctrl { display: flex; align-items: center; gap: 10px; margin: 8px 0; }
.ctrl-label { font-size: 12px; color: #666; width: 130px; flex-shrink: 0; line-height: 1.4; }
.ctrl-label small { font-size: 11px; color: #aaa; display: block; }
.ctrl input[type=range] { flex: 1; accent-color: #185FA5; }
.ctrl-val { font-size: 13px; font-weight: 500; min-width: 52px; text-align: right; color: #1a1a1a; }
.ctrl-sub { font-size: 11px; color: #aaa; min-width: 72px; text-align: right; }

.status-box { margin-top: 10px; padding: 8px 12px; background: #f7f7f7; border-radius: 6px; font-size: 12px; color: #666; line-height: 1.5; min-height: 36px; }
</style>
</head>
<body>

<div class="tab-bar">
  <button class="tab-btn active" onclick="switchTab(event,'general')">PID Umum</button>
  <button class="tab-btn" onclick="switchTab(event,'supcon')">PID Supcon</button>
</div>

<!-- TAB: PID UMUM -->
<div class="tab-panel active" id="tab-general">
  <div class="mode-bar">
    <button class="mode-btn active" onclick="setMode('general','pid')" id="g-btn-pid">P + I + D</button>
    <button class="mode-btn" onclick="setMode('general','p')" id="g-btn-p">P saja</button>
    <button class="mode-btn" onclick="setMode('general','pi')" id="g-btn-pi">P + I</button>
    <button class="mode-btn" onclick="setMode('general','pd')" id="g-btn-pd">P + D</button>
  </div>
  <div class="chart-wrap"><canvas id="g-chart" role="img" aria-label="Grafik respons PID umum"></canvas></div>
  <div class="legend">
    <span><span class="leg-line" style="background:#378ADD;"></span>Setpoint (SP)</span>
    <span><span class="leg-line" style="background:#1D9E75;"></span>Process Variable (PV)</span>
    <span><span class="leg-dash"></span>Output controller</span>
    <label class="noise-label"><input type="checkbox" id="g-noise" onchange="updateGeneral()" /> Noise PV</label>
  </div>
  <div class="controls">
    <div class="ctrl">
      <div class="ctrl-label">Gain (Kp)<small>besar = agresif</small></div>
      <input type="range" id="g-kp" min="0.1" max="5" step="0.1" value="1" oninput="updateGeneral()" />
      <span class="ctrl-val" id="g-kp-val">1.0</span>
      <span class="ctrl-sub"></span>
    </div>
    <div class="ctrl">
      <div class="ctrl-label">Integral time T_I (min)<small>kecil = agresif</small></div>
      <input type="range" id="g-ti" min="0.2" max="20" step="0.1" value="2" oninput="updateGeneral()" />
      <span class="ctrl-val" id="g-ti-val">2.0 min</span>
      <span class="ctrl-sub"></span>
    </div>
    <div class="ctrl">
      <div class="ctrl-label">Derivative T_D (detik)<small>besar = lebih prediktif</small></div>
      <input type="range" id="g-td" min="0" max="30" step="1" value="0" oninput="updateGeneral()" />
      <span class="ctrl-val" id="g-td-val">0s</span>
      <span class="ctrl-sub"></span>
    </div>
  </div>
  <div class="status-box" id="g-status"></div>
</div>

<!-- TAB: PID SUPCON -->
<div class="tab-panel" id="tab-supcon">
  <div class="mode-bar">
    <button class="mode-btn active" onclick="setMode('supcon','pid')" id="s-btn-pid">P + I + D</button>
    <button class="mode-btn" onclick="setMode('supcon','p')" id="s-btn-p">P saja</button>
    <button class="mode-btn" onclick="setMode('supcon','pi')" id="s-btn-pi">P + I</button>
    <button class="mode-btn" onclick="setMode('supcon','pd')" id="s-btn-pd">P + D</button>
  </div>
  <div class="chart-wrap"><canvas id="s-chart" role="img" aria-label="Grafik respons PID konvensi Supcon"></canvas></div>
  <div class="legend">
    <span><span class="leg-line" style="background:#378ADD;"></span>Setpoint (SP)</span>
    <span><span class="leg-line" style="background:#1D9E75;"></span>Process Variable (PV)</span>
    <span><span class="leg-dash"></span>Output controller</span>
    <label class="noise-label"><input type="checkbox" id="s-noise" onchange="updateSupcon()" /> Noise PV</label>
  </div>
  <div class="controls">
    <div class="ctrl">
      <div class="ctrl-label">P — band (%)<small>kecil = agresif</small></div>
      <input type="range" id="s-p" min="20" max="600" step="10" value="150" oninput="updateSupcon()" />
      <span class="ctrl-val" id="s-p-val">150%</span>
      <span class="ctrl-sub" id="s-p-kp">Kp = 0.67</span>
    </div>
    <div class="ctrl">
      <div class="ctrl-label">I — input DCS<small>besar = agresif</small></div>
      <input type="range" id="s-i" min="0.05" max="5" step="0.05" value="1" oninput="updateSupcon()" />
      <span class="ctrl-val" id="s-i-val">1.00</span>
      <span class="ctrl-sub" id="s-i-ti">T_I = 1.0 min</span>
    </div>
    <div class="ctrl">
      <div class="ctrl-label">D — detik<small>besar = lebih prediktif</small></div>
      <input type="range" id="s-d" min="0" max="30" step="1" value="0" oninput="updateSupcon()" />
      <span class="ctrl-val" id="s-d-val">0s</span>
      <span class="ctrl-sub"></span>
    </div>
    <div class="ctrl" id="s-dpi-row" style="opacity:0.3;">
      <div class="ctrl-label">Mode derivative<small>aktif saat D &gt; 0</small></div>
      <div style="display:flex; gap:6px; flex:1;">
        <button class="mode-btn" id="s-dpi-err" onclick="setDpiMode('error')" style="flex:1;">D on Error</button>
        <button class="mode-btn active" id="s-dpi-pv" onclick="setDpiMode('pv')" style="flex:1;">D on PV (D_PI)</button>
      </div>
    </div>
  </div>
  <div class="status-box" id="s-status"></div>
</div>

<script>
const modes = { general: 'pid', supcon: 'pid' };
const charts = {};
let dpiMode = 'pv';

function switchTab(evt, tab) {
  document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active'));
  document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
  document.getElementById('tab-' + tab).classList.add('active');
  evt.currentTarget.classList.add('active');
}

function setDpiMode(m) {
  dpiMode = m;
  document.getElementById('s-dpi-err').classList.toggle('active', m === 'error');
  document.getElementById('s-dpi-pv').classList.toggle('active', m === 'pv');
  updateSupcon();
}

function setMode(tab, m) {
  modes[tab] = m;
  ['pid','p','pi','pd'].forEach(k => {
    const btn = document.getElementById((tab === 'general' ? 'g' : 's') + '-btn-' + k);
    if (btn) btn.classList.toggle('active', k === m);
  });
  tab === 'general' ? updateGeneral() : updateSupcon();
}

function simulateGeneral(Kp, Ti, Td, mode, useNoise) {
  const dt = 0.1, steps = 600, tau = 8;
  const useI = mode === 'pi' || mode === 'pid';
  const useD = mode === 'pd' || mode === 'pid';
  let pv = 0, integral = 0, prev_err = 0;
  const pvArr = [], outArr = [], spArr = [];
  for (let i = 0; i < steps; i++) {
    const SP = i < 150 ? 50 : 100;
    const noise = useNoise ? (Math.random() - 0.5) * 1.5 : 0;
    const measuredPv = pv + noise;
    const err = SP - measuredPv;
    const d_err = (err - prev_err) / dt;
    let u = Kp * err;
    if (useI) { integral += err * dt; u += (Kp / Ti) * integral; }
    if (useD) { u += Kp * Td * d_err; }
    const output = Math.min(Math.max(u, 0), 150);
    if (useI && (u > 150 || u < 0)) integral -= err * dt;
    pv += (output * 0.6 - pv) * (dt / tau);
    pvArr.push(parseFloat(measuredPv.toFixed(2)));
    outArr.push(parseFloat(output.toFixed(2)));
    spArr.push(SP);
    prev_err = err;
  }
  return { pvArr, outArr, spArr };
}

function simulateSupcon(Kp, Ti, Td, mode, useNoise) {
  const dt = 0.1, steps = 600, tau = 8;
  const useI = mode === 'pi' || mode === 'pid';
  const useD = mode === 'pd' || mode === 'pid';
  const useDpi = useD && dpiMode === 'pv';
  let pv = 0, integral = 0, prev_pv = 0, prev_err = 0;
  const pvArr = [], outArr = [], spArr = [];
  for (let i = 0; i < steps; i++) {
    const SP = i < 150 ? 50 : 100;
    const noise = useNoise ? (Math.random() - 0.5) * 1.5 : 0;
    const measuredPv = pv + noise;
    const err = SP - measuredPv;
    let u = Kp * err;
    if (useI) { integral += err * dt; u += (Kp / Ti) * integral; }
    if (useD) {
      const d_term = useDpi
        ? -Kp * Td * (measuredPv - prev_pv) / dt
        : Kp * Td * (err - prev_err) / dt;
      u += d_term;
    }
    const output = Math.min(Math.max(u, 0), 150);
    if (useI && (u > 150 || u < 0)) integral -= err * dt;
    pv += (output * 0.6 - pv) * (dt / tau);
    pvArr.push(parseFloat(measuredPv.toFixed(2)));
    outArr.push(parseFloat(output.toFixed(2)));
    spArr.push(SP);
    prev_pv = measuredPv;
    prev_err = err;
  }
  return { pvArr, outArr, spArr };
}

function statusMsg(pvArr, mode, isSupcon, useNoise) {
  const final = pvArr[pvArr.length - 1];
  const offset = (100 - final).toFixed(1);
  const overshoot = (Math.max(...pvArr.slice(150)) - 100).toFixed(1);
  const stepNote = 'SP step 50→100 di t=15s. ';
  const noiseNote = useNoise ? ' Noise aktif — perhatikan efek pada output controller.' : '';

  if (mode === 'p') return stepNote + `P saja: offset akhir ${offset}% — proportional tidak bisa menghilangkan offset sepenuhnya.` + noiseNote;

  if (mode === 'pi') return stepNote + (parseFloat(offset) < 1
    ? `P+I: offset ≈ 0 — integral berhasil menghilangkan offset.`
    : `P+I: integral sedang bekerja, offset tersisa ${offset}%.`) + noiseNote;

  if (mode === 'pd') {
    const dNote = isSupcon
      ? ` Derivative: ${dpiMode === 'pv' ? 'D on PV (D_PI) — tidak ada derivative kick saat SP step.' : 'D on Error — perhatikan lonjakan output saat SP step di t=10s.'}`
      : '';
    return stepNote + `P+D: offset akhir ${offset}% — tanpa integral, offset permanen tetap ada.` + dNote + noiseNote;
  }

  const dNote = isSupcon
    ? ` Derivative: ${dpiMode === 'pv' ? 'D on PV (D_PI) — kick minimal.' : 'D on Error — derivative kick terlihat saat t=10s. Coba ganti ke D on PV.'}`
    : '';

  if (parseFloat(overshoot) > 5) {
    return stepNote + (isSupcon
      ? `P+I+D: overshoot ${overshoot}% setelah SP step.` + dNote
      : `P+I+D: overshoot ${overshoot}% — coba kecilkan Kp atau perbesar T_I.`) + noiseNote;
  }
  return stepNote + `P+I+D: stabil. Offset ≈ 0, overshoot ${overshoot}%.` + dNote + noiseNote;
}

function renderChart(id, pvArr, outArr, spArr) {
  const labels = pvArr.map((_, i) => (i * 0.1).toFixed(1));
  if (!charts[id]) {
    charts[id] = new Chart(document.getElementById(id), {
      type: 'line',
      data: {
        labels,
        datasets: [
          { label:'SP',     data:spArr,  borderColor:'#378ADD', borderWidth:2,   pointRadius:0 },
          { label:'PV',     data:pvArr,  borderColor:'#1D9E75', borderWidth:2.5, pointRadius:0 },
          { label:'Output', data:outArr, borderColor:'#D85A30', borderWidth:1.5, borderDash:[5,3], pointRadius:0, yAxisID:'y2' }
        ]
      },
      options: {
        responsive: true, maintainAspectRatio: false,
        animation: { duration: 200 },
        plugins: { legend: { display: false } },
        scales: {
          x: {
            ticks: { maxTicksLimit: 10, color:'#aaa', font:{size:11},
              callback: (v, i) => i % 60 === 0 ? (i * 0.1).toFixed(0) + 's' : ''
            },
            grid: { color:'rgba(0,0,0,0.05)' }
          },
          y: {
            min:0, max:130,
            ticks: { color:'#aaa', font:{size:11} },
            grid: { color:'rgba(0,0,0,0.05)' },
            title: { display:true, text:'PV / SP', color:'#aaa', font:{size:11} }
          },
          y2: {
            min:0, max:160, position:'right',
            ticks: { color:'#D85A30', font:{size:11} },
            grid: { drawOnChartArea:false },
            title: { display:true, text:'Output %', color:'#D85A30', font:{size:11} }
          }
        }
      }
    });
  } else {
    charts[id].data.labels = labels;
    charts[id].data.datasets[0].data = spArr;
    charts[id].data.datasets[1].data = pvArr;
    charts[id].data.datasets[2].data = outArr;
    charts[id].update();
  }
}

function updateGeneral() {
  const Kp = parseFloat(document.getElementById('g-kp').value);
  const Ti = parseFloat(document.getElementById('g-ti').value);
  const Td = parseFloat(document.getElementById('g-td').value) / 60;
  const m = modes.general;
  const useNoise = document.getElementById('g-noise').checked;

  document.getElementById('g-kp-val').textContent = Kp.toFixed(1);
  document.getElementById('g-ti-val').textContent = Ti.toFixed(1) + ' min';
  document.getElementById('g-td-val').textContent = (Td * 60).toFixed(0) + 's';
  document.getElementById('g-ti').style.opacity = (m === 'pi' || m === 'pid') ? '1' : '0.3';
  document.getElementById('g-td').style.opacity = (m === 'pd' || m === 'pid') ? '1' : '0.3';

  const { pvArr, outArr, spArr } = simulateGeneral(Kp, Ti, Td, m, useNoise);
  renderChart('g-chart', pvArr, outArr, spArr);
  document.getElementById('g-status').textContent = statusMsg(pvArr, m, false, useNoise);
}

function updateSupcon() {
  const P = parseFloat(document.getElementById('s-p').value);
  const I = parseFloat(document.getElementById('s-i').value);
  const D = parseFloat(document.getElementById('s-d').value);
  const Kp = 100 / P;
  const Ti = 1 / I;
  const Td = D / 60;
  const m = modes.supcon;
  const useNoise = document.getElementById('s-noise').checked;

  document.getElementById('s-p-val').textContent = P + '%';
  document.getElementById('s-i-val').textContent = I.toFixed(2);
  document.getElementById('s-d-val').textContent = D + 's';
  document.getElementById('s-p-kp').textContent = 'Kp = ' + Kp.toFixed(3);
  document.getElementById('s-i-ti').textContent = 'T_I = ' + Ti.toFixed(2) + ' min';

  document.getElementById('s-i').style.opacity     = (m === 'pi' || m === 'pid') ? '1' : '0.3';
  document.getElementById('s-i-ti').style.opacity  = (m === 'pi' || m === 'pid') ? '1' : '0.3';
  document.getElementById('s-d').style.opacity     = (m === 'pd' || m === 'pid') ? '1' : '0.3';
  document.getElementById('s-dpi-row').style.opacity = (m === 'pd' || m === 'pid') && D > 0 ? '1' : '0.3';

  const { pvArr, outArr, spArr } = simulateSupcon(Kp, Ti, Td, m, useNoise);
  renderChart('s-chart', pvArr, outArr, spArr);
  document.getElementById('s-status').textContent = statusMsg(pvArr, m, true, useNoise);
}

updateGeneral();
updateSupcon();
</script>
</body>
</html>

<!--kg-card-end: html-->
<h1 id="struktur-pid-pada-supcon">Struktur PID pada Supcon</h1>
<p>Dokumen Supcon menunjukkan formula dasar berikut:</p>
<p>$$\frac{U(s)}{E(s)} = \frac{1}{P} + \frac{1}{T_I s} + \frac{T_D s}{1+\frac{T_D}{K_d}s}$$</p>
<p>Dengan:</p>
<ul>
<li>$U(s)$ = output controller</li>
<li>$E(s)$ = error</li>
<li>$P$ = proportional band</li>
<li>$T_I$ = integral time</li>
<li>$T_D$ = derivative time</li>
<li>$K_d$ = derivative filter gain</li>
</ul>
<p>Error didefinisikan sebagai:</p>
<p>$$e(t) = SP(t) - PV(t)$$</p>
<p>Di mana:</p>
<ul>
<li>$SP$ = setpoint</li>
<li>$PV$ = process variable</li>
</ul>
<hr />

<h1 id="komponen-proportional-p">Komponen Proportional (P)</h1>
<p>Bagian proportional pada Supcon:</p>
<p>$$U_P(s)=\frac{1}{P}E(s)$$</p>
<p>Karena Supcon menggunakan proportional band, hubungan dengan gain klasik menjadi:</p>
<p>$$K_p=\frac{100}{P}$$</p>
<h2 id="makna-praktis">Makna Praktis</h2>
<p>Semakin kecil P:</p>
<ul>
<li>gain semakin besar</li>
<li>respons controller semakin agresif</li>
</ul>
<p>Semakin besar P:</p>
<ul>
<li>gain semakin kecil</li>
<li>controller semakin lembut</li>
</ul>
<hr />

<h2 id="contoh">Contoh</h2>
<h3 id="p-100">P = 100%</h3>
<p>$K_p=\frac{100}{100}=1$</p>
<h3 id="p-600">P = 600%</h3>
<p>$K_p=\frac{100}{600}=0.167$</p>
<p>Artinya:</p>
<ul>
<li>P 100% sekitar 6 kali lebih agresif dibanding P 600%.</li>
</ul>
<hr />

<h1 id="cara-kerja-integral-i">Cara Kerja Integral (I)</h1>
<p>Bagian integral pada Supcon:</p>
<p>$$U_I(s)=\frac{1}{T_I s}E(s)$$</p>
<p>Dalam domain waktu:</p>
<p>$$u_I(t)=\frac{1}{T_I}\int e(t),dt$$</p>
<p>Integral bertugas:</p>
<ul>
<li>menghilangkan offset</li>
<li>memastikan PV akhirnya mencapai SP</li>
</ul>
<hr />

<h2 id="parameter-i-sebagai-reciprocal">Parameter I sebagai Reciprocal</h2>
<p>Penting dipahami: <strong>parameter I yang diinput di DCS Supcon bukan $T_I$ langsung, melainkan nilai reciprocal-nya</strong>.</p>
<p>Dokumentasi Supcon menyebutkan bahwa I ditampilkan sebagai reciprocal, dan nilai yang terlalu kecil dapat menyebabkan overflow perhitungan. Nilai minimum yang diizinkan adalah 1/60 = 0.02 menit.</p>
<p>Hubungannya:</p>
<p>$$I_{input} = \frac{1}{T_I}$$</p>
<p>Artinya:</p>
<table>
<thead>
<tr>
<th>I (input DCS)</th>
<th>T_I aktual</th>
<th>Karakter</th>
</tr>
</thead>
<tbody>
<tr>
<td>0.02 menit</td>
<td>50 menit</td>
<td>sangat lambat</td>
</tr>
<tr>
<td>0.17 menit</td>
<td>6 menit</td>
<td>lambat</td>
</tr>
<tr>
<td>1 menit</td>
<td>1 menit</td>
<td>sedang</td>
</tr>
<tr>
<td>2 menit</td>
<td>0.5 menit</td>
<td>agresif</td>
</tr>
<tr>
<td>6 menit</td>
<td>10 detik</td>
<td>sangat agresif</td>
</tr>
</tbody>
</table>
<p><strong>Kesimpulan: I besar → integral lebih agresif.</strong></p>
<p>Ini kebalikan dari intuisi engineer yang terbiasa dengan sistem yang menggunakan integral time langsung.</p>
<hr />

<h2 id="karakter-integral">Karakter Integral</h2>
<p>Semakin besar $I_{input}$:</p>
<ul>
<li>integral semakin cepat</li>
<li>offset dihilangkan lebih agresif</li>
</ul>
<p>Semakin kecil $I_{input}$:</p>
<ul>
<li>integral semakin lambat</li>
<li>loop lebih tenang</li>
</ul>
<hr />

<h1 id="cara-kerja-derivative-d">Cara Kerja Derivative (D)</h1>
<p>Bagian derivative pada Supcon:</p>
<p>$$U_D(s)=\frac{T_D s}{1+\frac{T_D}{K_d}s}E(s)$$</p>
<p>Derivative berfungsi:</p>
<ul>
<li>memprediksi arah perubahan PV</li>
<li>mengurangi overshoot</li>
<li>mempercepat stabilisasi</li>
</ul>
<p>Namun Supcon tidak menggunakan derivative ideal murni, melainkan derivative yang sudah difilter.</p>
<hr />

<h1 id="mengapa-derivative-difilter">Mengapa Derivative Difilter?</h1>
<p>Derivative sangat sensitif terhadap noise.</p>
<p>Tanpa filter:</p>
<p>$$U_D(s)=T_D sE(s)$$</p>
<p>Sedikit noise pada PV dapat menghasilkan perubahan output besar.</p>
<p>Karena itu Supcon menambahkan filter low-pass:</p>
<p>$$\frac{T_D s}{1+\frac{T_D}{K_d}s}$$</p>
<p>Agar derivative tetap stabil untuk aplikasi industri.</p>
<hr />

<h1 id="dpi-mode-pada-supcon">D_PI Mode pada Supcon</h1>
<p>Supcon menyediakan mode penting bernama <strong>D_PI</strong>.</p>
<p>Pada mode ini:</p>
<ul>
<li>derivative hanya diterapkan ke PV</li>
<li>bukan ke error</li>
</ul>
<p>Formula discrete yang digunakan:</p>
<p>$$u_d(n)=\frac{T_D}{K_d T_s+T_D}u_d(n-1)+K_d\left[y(n)-y(n-1)\right]$$</p>
<p>Dengan:</p>
<ul>
<li>$y(n)$ = PV sekarang</li>
<li>$y(n-1)$ = PV sebelumnya</li>
<li>$u_d(n)$ = derivative output sekarang</li>
<li>$u_d(n-1)$ = derivative output sebelumnya</li>
<li>$T_s$ = sampling time</li>
</ul>
<hr />

<h1 id="mengapa-dpi-penting">Mengapa D_PI Penting?</h1>
<p>Jika derivative diterapkan langsung pada error:</p>
<p>$$\frac{d}{dt}(SP-PV)$$</p>
<p>Maka perubahan mendadak pada SP akan menghasilkan:</p>
<ul>
<li>derivative kick</li>
<li>lonjakan output besar</li>
</ul>
<p>Pada plant nyata ini bisa berbahaya:</p>
<ul>
<li>valve bergerak mendadak</li>
<li>pressure spike</li>
<li>instabilitas proses</li>
</ul>
<p>Karena itu Supcon menggunakan derivative terhadap PV saja.</p>
<p>Ini merupakan praktik industri yang baik.</p>
<hr />

<h2 id="kapan-mengaktifkan-dpi">Kapan Mengaktifkan D_PI?</h2>
<p>Aktifkan D_PI ketika:</p>
<ul>
<li>loop menggunakan derivative (D &gt; 0)</li>
<li>setpoint loop sering diubah oleh operator atau oleh major loop cascade</li>
<li>proses sensitif terhadap lonjakan output mendadak — misalnya pressure loop, recycle valve, atau cryogenic process</li>
</ul>
<p>Dengan D_PI aktif, perubahan SP tidak akan memicu derivative kick karena derivative hanya menghitung perubahan PV, bukan perubahan error.</p>
<hr />

<h2 id="kapan-derivative-sebaiknya-tidak-dipakai-sama-sekali">Kapan Derivative Sebaiknya Tidak Dipakai Sama Sekali?</h2>
<p>Derivative tidak diperlukan — bahkan kontraproduktif — pada kondisi berikut:</p>
<ul>
<li><strong>Flow loop</strong> — sinyal flow transmitter mengandung noise tinggi; derivative akan memperkuat noise dan membuat valve hunting</li>
<li><strong>Level loop</strong> — proses lambat dan toleran terhadap offset kecil; derivative tidak memberikan manfaat signifikan</li>
<li><strong>Loop dengan transmitter noise tinggi</strong> — noise sekecil apapun akan diperkuat oleh derivative, meskipun sudah difilter</li>
<li><strong>Loop yang sudah stabil dengan PI saja</strong> — menambahkan D tanpa alasan jelas hanya menambah kompleksitas tuning</li>
</ul>
<p>Sebagai panduan praktis: aktifkan derivative hanya bila ada masalah spesifik yang ingin diatasi — overshoot berlebihan atau respons yang terlalu lambat pada proses dengan dead time besar seperti temperature loop.</p>
<hr />

<h2 id="dpi-pada-cascade-control">D_PI pada Cascade Control</h2>
<p>Perlu diperhatikan: <strong>mode D_PI tidak berlaku pada minor loop di cascade control</strong>.</p>
<p>Ketika minor loop menerima setpoint dari major loop, differential action pada minor loop tetap menggunakan formula derivative original terhadap error, bukan terhadap PV. Hal ini karena setpoint minor loop berubah secara dinamis mengikuti output major loop, sehingga metode PV differential tidak dapat diterapkan.</p>
<p>Implikasinya pada aplikasi seperti compressor atau ASU: bila derivative diaktifkan pada secondary loop cascade, perlu diperhitungkan bahwa derivative kick tetap dapat terjadi saat major loop memberikan perubahan setpoint yang signifikan.</p>
<hr />

<h1 id="bentuk-lengkap-pid-supcon">Bentuk Lengkap PID Supcon</h1>
<p>Secara konseptual dalam domain waktu:</p>
<p>$$u(t)=\frac{1}{P}e(t)+\frac{1}{T_I}\int e(t),dt+T_D\frac{de(t)}{dt}$$</p>
<p>Walaupun implementasi aktualnya menggunakan:</p>
<ul>
<li>derivative filter</li>
<li>discrete execution</li>
<li>anti-reset windup</li>
<li>mode D_PI</li>
</ul>
<hr />

<h1 id="interpretasi-parameter-supcon">Interpretasi Parameter Supcon</h1>
<h2 id="proportional-band">Proportional Band</h2>
<table>
<thead>
<tr>
<th>P (%)</th>
<th>Karakter</th>
</tr>
</thead>
<tbody>
<tr>
<td>1000</td>
<td>sangat lembut</td>
</tr>
<tr>
<td>600</td>
<td>lembut</td>
</tr>
<tr>
<td>300</td>
<td>sedang</td>
</tr>
<tr>
<td>100</td>
<td>agresif</td>
</tr>
<tr>
<td>50</td>
<td>sangat agresif</td>
</tr>
</tbody>
</table>
<p>Range yang diizinkan: minimum 6.25%, maximum 204800%.</p>
<hr />

<h2 id="integral-time-i-sebagai-reciprocal">Integral Time (I sebagai reciprocal)</h2>
<p>I input adalah $1/T_I$ — semakin besar nilai I yang diinput, semakin agresif integral. Lihat tabel konversi lengkap di bagian "Parameter I sebagai Reciprocal" di atas.</p>
<p>Range yang diizinkan: minimum 0.02 menit (= 1/60), maximum sama dengan D.</p>
<hr />

<h2 id="derivative-time">Derivative Time</h2>
<table>
<thead>
<tr>
<th>D (detik)</th>
<th>Karakter</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>derivative nonaktif</td>
</tr>
<tr>
<td>kecil</td>
<td>efek derivative kecil</td>
</tr>
<tr>
<td>besar</td>
<td>derivative kuat</td>
</tr>
</tbody>
</table>
<p>Range yang diizinkan: minimum 0s, maximum 3276.8s.</p>
<hr />

<h1 id="karakter-tuning-berdasarkan-jenis-proses">Karakter Tuning Berdasarkan Jenis Proses</h1>
<p>Tabel berikut memberikan range tipikal sebagai <strong>starting point</strong> tuning awal. Nilai final harus selalu disesuaikan dengan dinamika aktual loop di plant masing-masing — ukuran equipment, span transmitter, dan karakteristik valve sangat mempengaruhi hasil akhir.</p>
<table>
<thead>
<tr>
<th>Proses</th>
<th>P tipikal (%)</th>
<th>I tipikal (input)</th>
<th>D</th>
<th>Alasan</th>
</tr>
</thead>
<tbody>
<tr>
<td>Flow</td>
<td>50–200</td>
<td>1–5</td>
<td>Tidak perlu</td>
<td>Proses cepat, butuh respons agresif</td>
</tr>
<tr>
<td>Pressure</td>
<td>100–500</td>
<td>0.3–2</td>
<td>Jarang</td>
<td>Rentan oscillation, coupling antar equipment</td>
</tr>
<tr>
<td>Temperature</td>
<td>300–1000</td>
<td>0.05–0.3</td>
<td>Opsional</td>
<td>Proses lambat, integral agresif bisa windup</td>
</tr>
<tr>
<td>Level</td>
<td>500–2000</td>
<td>0.05–0.1</td>
<td>Tidak perlu</td>
<td>Tank sebagai buffer, cukup proportional-dominant</td>
</tr>
</tbody>
</table>
<hr />

<h2 id="flow-control">Flow Control</h2>
<p>Flow adalah proses tercepat — dead time kecil, time constant kecil.</p>
<p>Starting point yang umum digunakan:</p>
<ul>
<li>P: 50–200% (agresif)</li>
<li>I: 1–5 (agresif, $T_I$ aktual 1–0.2 menit)</li>
<li>D: tidak diperlukan, noise pada flow transmitter membuat derivative kontraproduktif</li>
</ul>
<hr />

<h2 id="pressure-control">Pressure Control</h2>
<p>Pressure sering memiliki coupling antar equipment — terutama pada header bersama atau sistem compressor dengan recycle.</p>
<p>Starting point yang umum digunakan:</p>
<ul>
<li>P: 100–500% (sedang)</li>
<li>I: 0.3–2 (sedang, $T_I$ aktual 3–0.5 menit)</li>
<li>D: jarang digunakan, perlu hati-hati terhadap oscillation</li>
</ul>
<hr />

<h2 id="temperature-control">Temperature Control</h2>
<p>Proses thermal memiliki time constant besar dan dead time yang signifikan.</p>
<p>Starting point yang umum digunakan:</p>
<ul>
<li>P: 300–1000% (lembut)</li>
<li>I: 0.05–0.3 (lambat, $T_I$ aktual 20–3 menit)</li>
<li>D: opsional, dapat membantu pada proses dengan dead time besar</li>
</ul>
<p>Integral yang terlalu agresif pada temperature loop berisiko windup karena proses lambat merespons.</p>
<hr />

<h2 id="level-control">Level Control</h2>
<p>Tank berfungsi sebagai buffer — tidak perlu mengejar setpoint terlalu agresif.</p>
<p>Starting point yang umum digunakan:</p>
<ul>
<li>P: 500–2000% (lembut, proportional-dominant)</li>
<li>I: 0.05–0.1 (sangat lambat, $T_I$ aktual 20–10 menit)</li>
<li>D: tidak diperlukan</li>
</ul>
<hr />

<h1 id="kesalahan-umum-saat-tuning-supcon">Kesalahan Umum Saat Tuning Supcon</h1>
<h2 id="salah-interpretasi-p">Salah interpretasi P</h2>
<p>Karena Supcon menggunakan proportional band, banyak engineer salah interpretasi:</p>
<p>Mereka mengira P besar = agresif. Padahal pada Supcon, P besar = lembut.</p>
<h2 id="salah-interpretasi-i">Salah interpretasi I</h2>
<p>Karena Supcon menampilkan I sebagai reciprocal, banyak engineer mengira I kecil = agresif.</p>
<p>Padahal pada Supcon: <strong>I besar = agresif</strong> (karena $I = 1/T_I$, nilai besar berarti waktu integral singkat).</p>
<p>Akibat kedua kesalahan ini:</p>
<ul>
<li>tuning menjadi terlalu lambat</li>
<li>atau justru terlalu agresif tanpa disadari</li>
</ul>
<hr />

<h1 id="kesimpulan">Kesimpulan</h1>
<p>PID pada Supcon menggunakan:</p>
<ul>
<li>proportional band untuk P</li>
<li>reciprocal integral time untuk I</li>
<li>filtered derivative untuk D</li>
</ul>
<p>Karakter utamanya:</p>
<ul>
<li><strong>P kecil → lebih agresif</strong></li>
<li><strong>I besar → lebih agresif</strong> (karena $I = 1/T_I$)</li>
<li>derivative menggunakan filter untuk mengurangi noise</li>
<li>tersedia mode D_PI untuk menghindari derivative kick, kecuali pada minor loop cascade</li>
</ul>
<p>Memahami interpretasi parameter ini sangat penting sebelum melakukan tuning di plant nyata, terutama pada sistem seperti:</p>
<ul>
<li>compressor</li>
<li>Air Separation Unit</li>
<li>cryogenic process</li>
<li>pressure loop</li>
<li>recycle control</li>
<li>flow regulation</li>
</ul>]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="distributed-control-system" /><category term="Distributed Control System" /><category term="Engineering Lessons" /><category term="Field Experience" /><summary type="html"><![CDATA[DCS Supcon menggunakan proportional band dan reciprocal integral time — bukan gain dan integral time langsung. Salah baca parameter ini berarti tuning yang terasa sudah benar ternyata jauh dari optimal.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1579719558505-ad4a5fee0847?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI2fHxjb250cm9sfGVufDB8fHx8MTc3ODMxNjQyNnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1579719558505-ad4a5fee0847?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI2fHxjb250cm9sfGVufDB8fHx8MTc3ODMxNjQyNnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Analisis Spektrum Keahlian: Relevansi Pemahaman Lintas Domain</title><link href="https://kumajaya.github.io/kiiota-blog/engineering-lessons/2026/04/19/analisis-spektrum-keahlian-relevansi-pemahaman-lintas-domain.html" rel="alternate" type="text/html" title="Analisis Spektrum Keahlian: Relevansi Pemahaman Lintas Domain" /><published>2026-04-19T05:46:07+00:00</published><updated>2026-04-19T05:46:07+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/engineering-lessons/2026/04/19/analisis-spektrum-keahlian-relevansi-pemahaman-lintas-domain</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/engineering-lessons/2026/04/19/analisis-spektrum-keahlian-relevansi-pemahaman-lintas-domain.html"><![CDATA[<p><em>Ditulis oleh Ketut Kumajaya — 1 November 2025</em></p>
<p><em>Catatan ini saya tulis di penghujung 2025 sebagai refleksi atas perjalanan 25 tahun di dunia kontrol dan otomasi. Membacanya kembali hari ini, saya menyadari bahwa di tengah gempuran teknologi yang semakin cepat, prinsip-prinsip inilah yang menjaga akurasi dan kemanusiaan dalam setiap keputusan teknis saya.</em></p>
<h2 id="pendahuluan"><strong>Pendahuluan</strong></h2>
<p>Perjalanan profesional saya tidak pernah berjalan lurus. Ada banyak persimpangan, percobaan, bahkan kegagalan dan kehilangan pekerjaan yang justru menjadi guru terbaik. Dari pemrograman kernel Linux hingga desain control system yang dapat diaudit, serta dokumentasi yang ramah bagi siapa saja, saya belajar bahwa keahlian bukanlah label yang melekat, melainkan proses yang terus berkembang — dan yang terpenting, bisa diwariskan agar orang lain tak perlu mengulang kesulitan yang sama.</p>
<blockquote>
<p><strong>"Teknologi tidak berhenti di mesin, melainkan di pemahaman manusia."</strong></p>
</blockquote>
<p>Tulisan ini adalah upaya sederhana saya untuk melihat diri sendiri secara jujur, sambil berbagi apa yang saya pelajari. Saya mencoba merangkum pengalaman ke dalam <strong>delapan lapisan kompetensi yang saling terhubung</strong>, yang bersama-sama membentuk cara saya berpikir dan bekerja: <em>integratif, sistematik, dan humanistik</em>.</p>
<p>Urutan lapisan ini mengikuti alur alami perjalanan saya — dari fondasi teknis yang paling dasar, naik ke integrasi sistem, lalu ke aspek manusiawi dan visioner — dengan harapan bisa memberikan titik pijak bagi siapa saja yang sedang menavigasi dunia yang semakin kompleks ini.</p>
<hr />

<h2 id="1-lapisan-teknis-operasional-%E2%80%94-dari-sensor-ke-data"><strong>1. Lapisan Teknis-Operasional — Dari Sensor ke Data</strong></h2>
<p>Lapisan ini adalah fondasi: kemampuan untuk mengubah konsep menjadi sistem nyata di lapangan. Dari PLC, SCADA, hingga flowmeter kriogenik, saya belajar bahwa detail teknis bukan sekadar angka — melainkan jembatan antara fenomena fisik dan keputusan operasional sehari-hari.</p>
<h3 id="cakupan-utama">Cakupan Utama</h3>
<ul>
<li>Desain dan pemrograman <em>PLC, DCS, dan SCADA</em> berbasis Ladder, Function Block Data (FBD), dan Structured Text (ST), atau bahkan JavaScript di Node-RED dan C# di Rapid SCADA.</li>
<li>Integrasi solusi terbuka seperti 4diac FORTE (IEC 61499) atau OpenPLC (IEC 61131-3).</li>
<li>Integrasi PLC, PID control, sistem I/O dan instrumentasi berbagai merk.</li>
<li>Analisis performa <em>kompresor sentrifugal, booster expander, dan tangki kriogenik</em>.</li>
<li>Konfigurasi transmitter DP dan <em>orifice flowmeter</em> dengan kompensasi tekanan dan temperatur.</li>
<li>Implementasi sistem logging audit-grade berbasis JSON dan MQTT.</li>
</ul>
<h3 id="pelajaran-yang-saya-dapat">Pelajaran yang Saya Dapat</h3>
<p>Sistem kontrol terbaik bukan hanya yang bekerja — tapi yang bisa ditelusuri, diverifikasi, dan dipahami oleh tim. Sistem yang tidak bisa dijelaskan kepada orang lain adalah sistem yang rapuh. Fondasi ini perlu disatukan dalam arsitektur yang lebih luas agar tidak terisolasi.</p>
<hr />

<h2 id="2-lapisan-arsitektur-integrasi-sistem-%E2%80%94-menyatukan-ekosistem"><strong>2. Lapisan Arsitektur &amp; Integrasi Sistem — Menyatukan Ekosistem</strong></h2>
<p>Otomasi industri bukan kumpulan perangkat yang bekerja sendiri-sendiri. Ia adalah ekosistem data. Lapisan ini adalah jembatan antara dunia fisik — sensor dan aktuator — dengan dunia digital: dashboard, analitik, dan keputusan berbasis data.</p>
<h3 id="cakupan-utama">Cakupan Utama</h3>
<ul>
<li>Desain <em>arsitektur edge-to-server</em> dengan retry logic, buffering, dan dead-letter queue.</li>
<li>Pengembangan middleware untuk menyatukan API, autentikasi, dan datasource visualisasi.</li>
<li>Sinkronisasi <em>flow context memory → persistent storage</em> untuk mencegah kehilangan data.</li>
<li>Integrasi <em>Modbus, OPC UA, dan REST API</em> ke dalam sistem visualisasi terdistribusi.</li>
<li>Implementasi pola <em>event sourcing</em> dan <em>self-healing pipeline</em>.</li>
</ul>
<h3 id="pelajaran-yang-saya-dapat">Pelajaran yang Saya Dapat</h3>
<p>Arsitektur terbuka memberi ruang bagi sistem untuk bertahan lama — tidak tergantung vendor, dapat diaudit, dan bisa diteruskan ke tim berikutnya tanpa kehilangan konteks. Pengalaman ini membawa saya ke akarnya: pemahaman software dari level paling dalam membuat integrasi terasa lebih intuitif.</p>
<hr />

<h2 id="3-lapisan-software-embedded-systems-%E2%80%94-dari-kernel-ke-aplikasi"><strong>3. Lapisan Software &amp; Embedded Systems — Dari Kernel ke Aplikasi</strong></h2>
<p>Dari arsitektur yang lebih tinggi, pengalaman saya kembali ke level paling rendah dari sistem digital: kernel dan firmware. Perspektif <em>bottom-up</em> ini membentuk cara saya mendekati kompleksitas — dari bawah, bukan dari asumsi.</p>
<h3 id="cakupan-utama">Cakupan Utama</h3>
<ul>
<li>Pengembangan <em>Linux kernel dan Android device tree</em> untuk SoC ARM.</li>
<li>Pembuatan utility open source karena kebutuhan kerja.</li>
<li>Skrip otomatisasi (Bash, Python, JavaScript) untuk data logging dan visualisasi performa.</li>
<li>Kontribusi pada ekosistem CyanogenMod, 4diac, Rapid SCADA, dan komunitas FOSS lain.</li>
</ul>
<h3 id="pelajaran-yang-saya-dapat">Pelajaran yang Saya Dapat</h3>
<p>Memahami sistem dari bawah ke atas mengubah cara merancang solusi di level aplikasi. Bukan sekadar lebih efisien — tapi lebih jujur terhadap apa yang sebenarnya terjadi di dalam sistem.</p>
<hr />

<h2 id="4-lapisan-komunitas-open-source-%E2%80%94-kolaborasi-inklusivitas-transparansi"><strong>4. Lapisan Komunitas Open Source — Kolaborasi, Inklusivitas, Transparansi</strong></h2>
<p>Komunitas open source mengajarkan sesuatu yang tidak diajarkan di tempat kerja manapun: bahwa gelar dan jabatan bukan penentu kualitas kontribusi. Profesor bisa setara dengan diploma. Setiap orang bisa berkontribusi, setiap ide bisa diuji, dan setiap kesalahan bisa diperbaiki secara terbuka — di depan semua orang.</p>
<h3 id="cakupan-utama">Cakupan Utama</h3>
<ul>
<li>Kontribusi pada kernel Linux, device tree, dan utilitas open source.</li>
<li>Partisipasi dalam komunitas FOSS global (Android, GitHub, forum teknis).</li>
<li>Pembuatan dan pemeliharaan tool lintas komunitas.</li>
<li>Diskusi terbuka, peer review, dan iterasi berbasis masukan publik.</li>
</ul>
<h3 id="pelajaran-yang-saya-dapat">Pelajaran yang Saya Dapat</h3>
<ul>
<li><strong>Inklusivitas</strong>: kontribusi tidak mengenal latar belakang.</li>
<li><strong>Transparansi</strong>: keputusan teknis harus bisa ditelusuri dan dipahami siapa pun.</li>
<li><strong>Kerendahan hati</strong>: selalu ada ruang untuk belajar.</li>
<li><strong>Keberlanjutan</strong>: solusi yang baik bisa diteruskan.</li>
</ul>
<h3 id="dampak-pada-cara-berpikir">Dampak pada Cara Berpikir</h3>
<p>Nilai-nilai ini saya bawa ke dunia industri yang cenderung tertutup: menulis dokumentasi audit-grade, membangun sistem vendor-neutral, mendorong budaya yang tidak menyembunyikan cara kerjanya. Bukan sebagai idealisme — tapi karena sistem yang transparan lebih mudah dijaga dan lebih tahan lama.</p>
<hr />

<h2 id="5-lapisan-mekanikal-proses-%E2%80%94-menghormati-fenomena-fisik"><strong>5. Lapisan Mekanikal &amp; Proses — Menghormati Fenomena Fisik</strong></h2>
<p>Data digital hanyalah representasi. Di baliknya ada energi, fluida, tekanan, dan temperatur yang nyata — dan yang nyata ini tidak bisa diabaikan.</p>
<h3 id="cakupan-utama">Cakupan Utama</h3>
<ul>
<li>Analisis performa <em>kompresor sentrifugal</em>.</li>
<li>Studi fenomena <em>surge dan choke</em>.</li>
<li>Perhitungan volume tangki torisferik berbasis standar ASME.</li>
<li>Evaluasi efisiensi expander, pompa, dan sistem kriogenik.</li>
</ul>
<h3 id="pelajaran-yang-saya-dapat">Pelajaran yang Saya Dapat</h3>
<p>Engineering adalah bahasa universal — menghubungkan fenomena fisik dengan angka yang bisa diuji ulang. Kesalahan di lapangan sering bukan karena kurang data, tapi karena kurang pemahaman terhadap fisika yang bekerja di baliknya.</p>
<hr />

<h2 id="6-lapisan-rekayasa-pengetahuan-dokumentasi"><strong>6. Lapisan Rekayasa Pengetahuan &amp; Dokumentasi</strong></h2>
<p>Dokumentasi bukan produk akhir dari pekerjaan. Ia adalah bagian dari pekerjaan itu sendiri. Menulis dengan jelas berarti berpikir dengan jelas — dan itu berlaku dua arah.</p>
<h3 id="cakupan-utama">Cakupan Utama</h3>
<ul>
<li>Dokumentasi teknis human-friendly dengan narasi edukatif.</li>
<li><em>Living documentation</em> berbasis Markdown, Pandoc, GitHub Pages.</li>
<li>Prinsip <em>troubleshooting mental framework</em>.</li>
<li>Gaya penulisan yang menghubungkan sains, etika, dan empati.</li>
</ul>
<h3 id="pelajaran-yang-saya-dapat">Pelajaran yang Saya Dapat</h3>
<p>Pengetahuan yang tidak bisa ditulis ulang oleh orang lain adalah pengetahuan yang rentan hilang. Dokumentasi yang baik bukan yang paling lengkap — tapi yang paling mudah diikuti oleh orang yang belum pernah ada di sana sebelumnya.</p>
<hr />

<h2 id="7-lapisan-inovasi-efisiensi-sustainability"><strong>7. Lapisan Inovasi, Efisiensi, &amp; Sustainability</strong></h2>
<p>Filosofi <em>Zero-Cost Engineering</em> tidak lahir dari pilihan ideologis. Ia lahir dari keterbatasan anggaran yang memaksa kreativitas. Keterbatasan bukan hambatan — ia adalah filter yang menyisakan solusi yang benar-benar bisa bertahan.</p>
<h3 id="cakupan-utama">Cakupan Utama</h3>
<ul>
<li>Integrasi alur kerja FOSS end-to-end tanpa lisensi.</li>
<li>Desain sistem otomasi yang dapat diperluas tanpa ketergantungan vendor.</li>
<li>Kerangka kerja <em>reproducible engineering documentation</em>.</li>
<li>Edukasi internal tentang efisiensi berbasis keterbukaan.</li>
</ul>
<h3 id="pelajaran-yang-saya-dapat">Pelajaran yang Saya Dapat</h3>
<p>Efisiensi sejati bukan soal biaya yang ditekan, melainkan kemandirian intelektual yang dibangun — kemampuan untuk memahami, memodifikasi, dan meneruskan sistem tanpa bergantung pada satu vendor atau satu orang.</p>
<hr />

<h2 id="8-lapisan-kepemimpinan-budaya-kerja"><strong>8. Lapisan Kepemimpinan &amp; Budaya Kerja</strong></h2>
<p>Kepemimpinan bagi saya bukan memberi perintah. Bukan pula memberi motivasi. Kepemimpinan adalah memberi arah yang jelas dan ruang yang cukup agar orang lain bisa tumbuh dengan cara mereka sendiri.</p>
<h3 id="cakupan-utama">Cakupan Utama</h3>
<ul>
<li>Membangun budaya <em>human empowerment</em>.</li>
<li>Mendorong transformasi menuju sistem otomasi terbuka.</li>
<li>Menulis refleksi tentang kepemimpinan manusiawi di era otomasi.</li>
<li>Menyeimbangkan data dengan intuisi manusia.</li>
</ul>
<h3 id="pelajaran-yang-saya-dapat">Pelajaran yang Saya Dapat</h3>
<p>Pemimpin yang hanya membaca data akan selalu terlambat. Yang dibutuhkan adalah kemampuan membaca situasi — memahami konteks manusia di balik angka, dan mengambil keputusan yang tidak mereduksi manusia menjadi variabel.</p>
<hr />

<h2 id="kesimpulan"><strong>Kesimpulan</strong></h2>
<p>Delapan lapisan ini bukan daftar keahlian. Ia adalah peta perjalanan — dengan semua persimpangan, percobaan, dan kegagalannya.</p>
<p>Tuntutan atasan, ekspektasi customer, dan tekanan organisasi sering memaksa keluar dari zona nyaman. Justru di situlah pertumbuhan terjadi: belajar lebih cepat, berpikir lebih jernih, dan menemukan cara menjembatani teknologi dengan kebutuhan manusia.</p>
<p>Keterlibatan dalam komunitas open source memperluas cara pandang: kolaborasi, transparansi, dan inklusivitas bukan nilai tambahan — melainkan fondasi sistem dan budaya kerja yang bisa bertahan lama. Nilai ini saya bawa ke dunia industri agar solusi tidak hanya berfungsi, tetapi juga bisa diaudit, dipelajari, dan diteruskan.</p>
<p>Setiap lapisan adalah jembatan — antara mesin dan manusia, data dan intuisi, logika dan empati. Di era di mana AI dan otomasi mengubah segalanya, keahlian lintas domain bukan lagi pilihan. Ia adalah prasyarat untuk tidak tertinggal — dan untuk tidak meninggalkan orang lain.</p>
<blockquote>
<p><strong>Formula yang saya pegang:</strong></p>
<ul>
<li><em>Precision in System</em> — setiap logika harus bisa diaudit.</li>
<li><em>Transparency in Knowledge</em> — setiap ide harus bisa diajarkan.</li>
<li><em>Humanity in Leadership</em> — setiap keputusan harus memuliakan manusia.</li>
</ul>
</blockquote>
<p>Saya tidak berusaha menjadi ahli di semua bidang. Saya berusaha memahami bagaimana semuanya saling terhubung — dan mengapa hubungan itu penting.</p>]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="engineering-lessons" /><category term="Engineering Lessons" /><summary type="html"><![CDATA[Bagaimana pengalaman teknis, kolaborasi, & tantangan relevan dengan kebutuhan pemahaman lintas domain saat ini—di mana AI/otomasi menuntut integrasi antar bidang, bukan terjebak di spesialisasi yang sempit.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1515162816999-a0c47dc192f7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHJlZmxlY3Rpb258ZW58MHx8fHwxNzYyMDE3NTkyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1515162816999-a0c47dc192f7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHJlZmxlY3Rpb258ZW58MHx8fHwxNzYyMDE3NTkyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Booster Expander dalam Sistem Cryogenic: Konsep Dasar hingga Monitoring Operasional</title><link href="https://kumajaya.github.io/kiiota-blog/practical-engineering/2026/04/19/booster-expander-dalam-sistem-cryogenic-konsep-dasar-hingga-monitoring-operasional.html" rel="alternate" type="text/html" title="Booster Expander dalam Sistem Cryogenic: Konsep Dasar hingga Monitoring Operasional" /><published>2026-04-19T02:34:56+00:00</published><updated>2026-04-19T02:34:56+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/practical-engineering/2026/04/19/booster-expander-dalam-sistem-cryogenic-konsep-dasar-hingga-monitoring-operasional</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/practical-engineering/2026/04/19/booster-expander-dalam-sistem-cryogenic-konsep-dasar-hingga-monitoring-operasional.html"><![CDATA[<p><em>Ditulis oleh Ketut Kumajaya — 19 April 2026</em></p>
<h2 id="pendahuluan">Pendahuluan</h2>
<p>Dalam sistem Air Separation Unit (ASU), booster expander adalah salah satu komponen rotating equipment yang paling sering disalahpahami. Banyak operator memandangnya sebagai dua mesin terpisah — sebuah expander dan sebuah kompresor booster — yang kebetulan terhubung pada satu shaft.</p>
<p>Padahal pemahaman yang tepat justru sebaliknya:</p>
<blockquote>
<p>Booster bukan mesin utama yang dibantu expander. Booster adalah beban — expander adalah prime mover yang memutarnya.</p>
</blockquote>
<p>Dengan kata lain, booster tidak menentukan kemampuan sistem. Ia hanya mengikuti energi yang disediakan oleh expander. Ini bukan sekadar konsep, melainkan batasan fisika yang menentukan bagaimana sistem harus dioperasikan.</p>
<p>Artikel ini membahas konsep dasar booster expander, hubungan energi di dalamnya, serta pendekatan monitoring berbasis rasio yang lebih tepat untuk operasional sehari-hari.</p>
<hr />

<h2 id="konsep-dasar-satu-sistem-energi">Konsep Dasar: Satu Sistem Energi</h2>
<p>Booster expander terdiri dari dua komponen utama dalam satu shaft:</p>
<ul>
<li><strong>Expander</strong> — gas bertekanan tinggi diekspansikan, menghasilkan kerja melalui ekstraksi enthalpy, memutar shaft, dan menghasilkan efek pendinginan yang signifikan.</li>
<li><strong>Booster</strong> — memanfaatkan energi tersebut untuk mengkompresi gas di sisi booster.</li>
</ul>
<p>Keduanya bukan dua mesin independen, melainkan satu sistem energi yang saling terikat.</p>
<blockquote>
<p>Energi yang tersedia dari expander adalah batas atas dari kerja yang dapat dilakukan oleh booster.</p>
</blockquote>
<p>Penting untuk dipahami bahwa energi expander bukanlah nilai tetap — ia sangat dinamis, dipengaruhi oleh kondisi inlet (temperatur dan tekanan), posisi nozzle, serta backpressure di sisi outlet. Inilah sebabnya kapasitas booster bisa terasa berubah meskipun tidak ada yang diubah di sisi booster itu sendiri — sumber energinya yang berfluktuasi.</p>
<p>Pendinginan pada expander bukan sekadar akibat penurunan tekanan seperti yang terjadi pada ekspansi melalui valve (efek Joule-Thomson), tetapi karena ekstraksi kerja dari gas. Inilah sebabnya expander jauh lebih efektif menghasilkan temperatur rendah dibandingkan ekspansi melalui valve biasa.</p>
<hr />

<!--kg-card-begin: html-->
<p>&lt;!DOCTYPE html&gt;</p>
<html lang="id">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Booster Expander — Cryostar HA1660A (Performance Curve)</title>
<style>
  * { box-sizing: border-box; margin: 0; padding: 0; }
  body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #f8f8f6; color: #1a1a18; padding: 1rem; }
  .scene { display: flex; flex-direction: column; align-items: center; padding: 1.5rem 1rem; gap: 0.9rem; max-width: 680px; margin: 0 auto; }
  .mode-toggle { display: flex; background: #e8e8e4; padding: 4px; border-radius: 20px; gap: 4px; border: 1px solid rgba(0,0,0,0.1); }
  .tgl-btn { border: none; padding: 6px 18px; border-radius: 16px; cursor: pointer; font-size: 11px; font-weight: 600; transition: all 0.2s; color: #666; background: transparent; }
  .tgl-btn.active { background: #185FA5; color: white; box-shadow: 0 2px 4px rgba(0,0,0,0.2); }
  .bar-wrap { width: 100%; max-width: 620px; }
  .bar-label { font-size: 11px; color: #666; margin-bottom: 3px; display: flex; justify-content: space-between; }
  .bar-bg { background: #e8e8e4; border-radius: 4px; height: 7px; overflow: hidden; }
  .bar-fill { height: 7px; border-radius: 4px; transition: width 0.08s; }
  .bar-wrap + .bar-wrap { margin-top: 6px; } /* Rapatkan dua bar pertama */
  .controls { display: flex; flex-direction: column; gap: 8px; width: 100%; max-width: 620px; }
  .ctrl { display: flex; align-items: center; gap: 10px; }
  .ctrl label { font-size: 12px; color: #666; width: 150px; flex-shrink: 0; }
  .ctrl input[type=range] { flex: 1; }
  .ctrl span { font-size: 12px; font-weight: 500; min-width: 40px; text-align: right; }
  .stats { display: flex; gap: 8px; width: 100%; max-width: 620px; flex-wrap: wrap; }
  .stat { flex: 1; min-width: 90px; background: #e8e8e4; border-radius: 8px; padding: 8px 10px; }
  .stat .sl { font-size: 10px; color: #666; margin-bottom: 3px; }
  .stat .sv { font-size: 15px; font-weight: 500; }
  .ok { color: #1D9E75 !important; }
  .warn { color: #BA7517 !important; }
  .danger { color: #E24B4A !important; }
  .spec-row { display: flex; gap: 8px; width: 100%; max-width: 620px; }
  .spec-card { flex: 1; background: #e8e8e4; border-radius: 8px; padding: 8px 10px; border-left: 3px solid; }
  .spec-card .sc-title { font-size: 11px; font-weight: 500; margin-bottom: 4px; }
  .spec-card .sc-row { font-size: 11px; color: #555; line-height: 1.6; }
  .design-note { font-size: 10px; color: #888; text-align: center; }
</style>
</head>
<body>
<div class="scene">

  <div class="mode-toggle">
    <button id="btn-warm" class="tgl-btn active" onclick="switchMode('warm')">Warm Unit</button>
    <button id="btn-cold" class="tgl-btn" onclick="switchMode('cold')">Cold Unit</button>
  </div>

  <div class="spec-row">
    <div class="spec-card" style="border-color:#185FA5;"><div class="sc-title" style="color:#185FA5;">Expander — design</div><div class="sc-row" id="spec-exp"></div></div>
    <div class="spec-card" style="border-color:#888780;"><div class="sc-title" style="color:#5F5E5A;">Shaft — design</div><div class="sc-row" id="spec-shaft"></div></div>
    <div class="spec-card" style="border-color:#BA7517;"><div class="sc-title" style="color:#BA7517;">Booster — design</div><div class="sc-row" id="spec-bst"></div></div>
  </div>

  <canvas id="c" width="620" height="210" style="max-width:100%;"></canvas>

  <div class="bar-wrap">
    <div class="bar-label"><span>Energi expander (cold production)</span><span id="ep-val">0 kW</span></div>
    <div class="bar-bg"><div class="bar-fill" id="ebar" style="background:#378ADD;"></div></div>
  </div>
  <div class="bar-wrap">
    <div class="bar-label"><span>Power dikonsumsi booster</span><span id="bp-val">0 kW</span></div>
    <div class="bar-bg"><div class="bar-fill" id="bbar" style="background:#EF9F27;"></div></div>
  </div>
  <div class="bar-wrap">
    <div class="bar-label"><span>Bearing losses</span><span id="bl-val">0 kW</span></div>
    <div class="bar-bg"><div class="bar-fill" id="bl-bar" style="background:#B4B2A9;"></div></div>
  </div>

  <div class="controls">
    <div class="ctrl">
      <label>Opening nozzle expander</label>
      <input type="range" min="0" max="100" value="77" id="nozzle" step="1" />
      <span id="nozzle-out">77%</span>
    </div>
    <div class="ctrl">
      <label>Bypass booster</label>
      <input type="range" min="0" max="100" value="0" id="bypass" step="1" />
      <span id="bypass-out">0%</span>
    </div>
  </div>

  <div class="stats">
    <div class="stat"><div class="sl">Speed shaft</div><div class="sv" id="sv">0 RPM</div></div>
    <div class="stat"><div class="sl">ER aktual / design</div><div class="sv" id="er">—</div></div>
    <div class="stat"><div class="sl">CR aktual / design</div><div class="sv" id="cr">—</div></div>
    <div class="stat"><div class="sl">Status</div><div class="sv ok" id="st">Normal</div></div>
  </div>

  <div class="design-note" id="design-note">Design point: nozzle 77.5%</div>
</div>

<script>
// ================== DATA DESIGN & PERFORMANCE CURVES ==================
const data = {
  warm: { badge: "Warm unit · TC 200/45-AS · HA1660A", tagExp: "TC 200/45-AS", bearing: "45", speed: 28100, loss: 27, bLossPct: 2.1,
    designNozzle: 77.5, designFlow: 0.603, designHead: 51.0,
    exp: { pin: 30.80, pout: 5.39, er: 5.71, tin: -5.0, tout: -101 },
    bst: { pin: 30.90, pout: 51.30, cr: 1.66, tin: 40, tout: 101, pwr: 1231 },
    cold: 1258 },
  cold: { badge: "Cold unit · TC 200/50B-AS · HA1660A", tagExp: "TC 200/50B-AS", bearing: "50B", speed: 24628, loss: 55, bLossPct: 6.6,
    designNozzle: 67.0, designFlow: 0.360, designHead: 33.5,
    exp: { pin: 70.70, pout: 5.43, er: 13.02, tin: -96.5, tout: -178 },
    bst: { pin: 51.18, pout: 71.10, cr: 1.39, tin: 40, tout: 78, pwr: 775 },
    cold: 830 }
};

const warmCompressorCurve = [
  [0.417375,54.223512],[0.427559,54.203734],[0.435537,54.169314],[0.442842,54.123498],[0.450884,54.073491],
  [0.459469,54.041862],[0.467446,53.910149],[0.475424,53.811950],[0.483401,53.711726],[0.491378,53.596317],
  [0.499355,53.474833],[0.507332,53.334115],[0.515309,53.187322],[0.523286,53.024332],[0.531262,52.844132],
  [0.539239,52.648746],[0.547215,52.422989],[0.555192,52.189133],[0.563168,51.941105],[0.571144,51.654606],
  [0.579120,51.332675],[0.586691,50.973062],[0.595071,50.558218],[0.603046,50.104680],[0.611020,49.583314],
  [0.618994,48.978933],[0.626968,48.288502],[0.634941,47.495823],[0.642534,46.626311],[0.649366,45.728537],
  [0.655439,44.822377],[0.660942,43.913074],[0.665875,42.995115],[0.670238,42.118156],[0.674412,41.203993],
  [0.678395,40.255815],[0.681998,39.333148],[0.685222,38.408355],[0.688255,37.480905],[0.690341,36.838688],
  [0.692565,36.169341]
];

const coldCompressorCurve = [
  [0.255468638,34.422696],[0.260968758,34.432963],[0.265141273,34.410987],[0.269313777,34.387275],
  [0.273486249,34.358936],[0.277341413,34.340421],[0.281831245,34.309861],[0.286003377,34.230546],
  [0.290175683,34.177339],[0.294347927,34.114879],[0.298520132,34.046636],[0.302692276,33.969139],
  [0.306864396,33.888172],[0.311036474,33.800843],[0.315208490,33.704261],[0.319380451,33.599583],
  [0.323552370,33.488543],[0.327724204,33.364779],[0.331895960,33.229449],[0.336067686,33.089492],
  [0.340239310,32.934498],[0.344410827,32.763311],[0.348582289,32.584027],[0.352753668,32.392372],
  [0.356924857,32.172253],[0.361096031,31.949966],[0.365267028,31.701224],[0.369437834,31.423887],
  [0.373608495,31.124888],[0.377778951,30.795237],[0.381949224,30.438405],[0.386119265,30.046872],
  [0.390289071,29.620061],[0.394458628,29.156237],[0.398429317,28.667026],[0.402101919,28.171814],
  [0.405575791,27.671923],[0.408850832,27.152054],[0.411927197,26.635738],[0.414804830,26.114196],
  [0.417483840,25.603971],[0.419964152,25.093724],[0.422345048,24.573512],[0.424329200,24.150764]
];

function interpolateHead(flow, curve) {
  if (flow <= curve[0][0]) return curve[0][1];
  if (flow >= curve[curve.length-1][0]) return curve[curve.length-1][1];
  for (let i = 0; i < curve.length - 1; i++) {
    if (flow >= curve[i][0] && flow <= curve[i+1][0]) {
      const x1 = curve[i][0], y1 = curve[i][1];
      const x2 = curve[i+1][0], y2 = curve[i+1][1];
      return y1 + (y2 - y1) * (flow - x1) / (x2 - x1);
    }
  }
  return curve[curve.length-1][1];
}

// ================== SIMULASI ==================
let mode = 'warm';
const canvas = document.getElementById('c');
const ctx = canvas.getContext('2d');
const W = canvas.width, H = canvas.height;
const CY = H / 2;

let angle = 0, speed = 0, targetSpeed = 0;
let nozzle = 77, bypass = 0;

function switchMode(m) {
  mode = m;
  document.getElementById('btn-warm').className = 'tgl-btn' + (m === 'warm' ? ' active' : '');
  document.getElementById('btn-cold').className = 'tgl-btn' + (m === 'cold' ? ' active' : '');
  const d = data[m];
  document.getElementById('spec-exp').innerHTML = `P inlet: ${d.exp.pin.toFixed(2)} bar abs<br>P outlet: ${d.exp.pout.toFixed(2)} bar abs<br>ER: ${d.exp.er} &nbsp;|&nbsp; T in: ${d.exp.tin.toFixed(1)} °C`;
  document.getElementById('spec-shaft').innerHTML = `Speed: ${d.speed.toLocaleString('id-ID')} RPM<br>Bearing losses: ${d.loss} kW<br>Medium: Pure N₂`;
  document.getElementById('spec-bst').innerHTML = `P inlet: ${d.bst.pin.toFixed(2)} bar abs<br>P outlet: ${d.bst.pout.toFixed(2)} bar abs<br>CR: ${d.bst.cr} &nbsp;|&nbsp; Power: ${d.bst.pwr.toLocaleString('id-ID')} kW`;
  document.getElementById('bl-val').textContent = `${d.loss} kW`;
  document.getElementById('bl-bar').style.width = `${d.bLossPct}%`;
  document.getElementById('design-note').textContent = `${d.badge} · Design point: nozzle ${d.designNozzle}%`;

  nozzle = d.designNozzle;
  document.getElementById('nozzle').value = nozzle;
  document.getElementById('nozzle-out').textContent = nozzle.toFixed(1) + '%';
  speed = 0;
}

document.getElementById('nozzle').oninput = function () { nozzle = +this.value; document.getElementById('nozzle-out').textContent = nozzle + '%'; };
document.getElementById('bypass').oninput = function () { bypass = +this.value; document.getElementById('bypass-out').textContent = bypass + '%'; };

function lerp(a, b, t) { return a + (b - a) * t; }

// ================== DRAWING FUNCTIONS ==================
function drawImpeller(cx, cy, r, blades, ang, color, active) {
  ctx.save(); ctx.translate(cx, cy); ctx.rotate(ang);
  for (let i = 0; i < blades; i++) {
    ctx.save(); ctx.rotate((i / blades) * Math.PI * 2);
    ctx.beginPath(); ctx.moveTo(0, 0);
    ctx.bezierCurveTo(r*0.25, -r*0.18, r*0.65, -r*0.32, r, -r*0.12);
    ctx.bezierCurveTo(r*0.82, r*0.06, r*0.25, r*0.09, 0, 0);
    ctx.fillStyle = active ? color+'bb' : color+'55';
    ctx.strokeStyle = color; ctx.lineWidth = 1; ctx.fill(); ctx.stroke();
    ctx.restore();
  }
  ctx.beginPath(); ctx.arc(0, 0, r*0.16, 0, Math.PI*2);
  ctx.fillStyle = color; ctx.fill(); ctx.restore();
}

function drawCasing(cx, cy, r, color) {
  ctx.beginPath(); ctx.arc(cx, cy, r + 14, 0, Math.PI*2);
  ctx.strokeStyle = color; ctx.lineWidth = 2; ctx.setLineDash([]); ctx.stroke();
}

function drawShaft(x1, x2, cy, spd, dSpeed) {
  const alpha = Math.min(1, spd / dSpeed);
  ctx.save();
  ctx.beginPath();
  ctx.moveTo(x1, cy-7); ctx.lineTo(x2, cy-7);
  ctx.lineTo(x2, cy+7); ctx.lineTo(x1, cy+7); ctx.closePath();
  ctx.fillStyle = `rgba(136,135,128,${0.25 + alpha*0.5})`; ctx.fill();
  ctx.strokeStyle = '#888780'; ctx.lineWidth = 1; ctx.stroke();
  const n = 10;
  for (let i = 0; i < n; i++) {
    const raw = x1 + ((i/n)*(x2-x1) + (angle*28) % (x2-x1));
    const px = ((raw - x1) % (x2-x1)) + x1;
    ctx.beginPath(); ctx.moveTo(px, cy-7); ctx.lineTo(px-10, cy+7);
    ctx.strokeStyle = `rgba(95,94,90,${0.3 + alpha*0.3})`; ctx.lineWidth = 1; ctx.stroke();
  }
  ctx.restore();
}

function drawFlow(cx, cy, r, dir, color, intensity) {
  if (intensity < 0.05) return;
  const t = (Date.now() / 450) % 1;
  for (let i = 0; i < 4; i++) {
    const frac = ((t + i/4) % 1);
    const sx = cx + dir * (r + 16);
    const ex = sx + dir * 50 * frac;
    const yo = (i - 1.5) * 11;
    ctx.beginPath(); ctx.moveTo(sx, cy + yo); ctx.lineTo(ex, cy + yo);
    ctx.strokeStyle = color + Math.floor(intensity*160).toString(16).padStart(2,'0');
    ctx.lineWidth = 1.5; ctx.setLineDash([4,3]); ctx.stroke(); ctx.setLineDash([]);
    if (frac > 0.7) {
      ctx.beginPath();
      ctx.moveTo(ex, cy+yo-4); ctx.lineTo(ex + dir*6, cy+yo); ctx.lineTo(ex, cy+yo+4);
      ctx.strokeStyle = color + 'cc'; ctx.lineWidth = 1.5; ctx.stroke();
    }
  }
}

function drawBypass(bstX, r, frac) {
  if (frac < 0.02) return;
  const t = (Date.now() / 850) % 1;
  ctx.beginPath(); ctx.setLineDash([5,4]);
  ctx.moveTo(bstX + r + 10, CY - 12);
  ctx.bezierCurveTo(bstX + r + 55, CY - 72, bstX - r - 55, CY - 72, bstX - r - 10, CY - 12);
  ctx.strokeStyle = `rgba(186,117,23,${frac*0.85})`; ctx.lineWidth = 2; ctx.stroke(); ctx.setLineDash([]);
  const bpx = bstX + r + 10 + t * (-r*2 - 20);
  const bpy = CY - 12 - Math.sin(t*Math.PI)*62;
  ctx.beginPath(); ctx.arc(bpx, bpy, 3.5, 0, Math.PI*2);
  ctx.fillStyle = `rgba(186,117,23,${frac*0.9})`; ctx.fill();
  ctx.font = '10px sans-serif'; ctx.fillStyle = `rgba(186,117,23,${frac*0.9})`;
  ctx.textAlign = 'center'; ctx.fillText('recycle', bstX, CY - 80);
}

function frame() {
  requestAnimationFrame(frame);
  ctx.clearRect(0, 0, W, H);

  const d = data[mode];
  const nFrac = nozzle / 100;
  const bFrac = bypass / 100;
  const designFrac = d.designNozzle / 100;

  const performanceFactor = Math.min(1.25, Math.max(0, nFrac / designFrac));
  const effectiveFactor = Math.max(0, performanceFactor - bFrac * 0.45);

  targetSpeed = effectiveFactor * d.speed;
  speed = lerp(speed, targetSpeed, 0.04);
  const spd = speed / d.speed;
  angle += spd * 0.11;

  const expX = 130, bstX = 490, impR = 65;

  // === PERHITUNGAN BERDASARKAN PERFORMANCE CURVE VENDOR ===
  const designFlow = d.designFlow;
  let actualFlow = designFlow * performanceFactor * (1 - bFrac * 0.65);
  const curve = (mode === 'warm') ? warmCompressorCurve : coldCompressorCurve;
  const actualHead = interpolateHead(actualFlow, curve);

  const loadFactor = Math.max(0, performanceFactor * (1 - bFrac * 0.6));
  const powerEst = Math.round(d.bst.pwr * (actualFlow / designFlow) * (actualHead / d.designHead) * loadFactor * 0.92);
  const coldEst = Math.round(d.cold * performanceFactor);

  const erActual = (d.exp.er * performanceFactor).toFixed(2);
  const crActual = Math.max(1, d.bst.cr * loadFactor).toFixed(2);
  const rpm = Math.round(speed / 100) * 100;

  // === ANIMASI ===
  drawFlow(expX, CY, impR, -1, '#378ADD', performanceFactor * 0.9);
  drawFlow(bstX, CY, impR, 1, '#EF9F27', Math.max(0, performanceFactor * 0.9 - bFrac * 0.5));
  drawBypass(bstX, impR, bFrac);
  drawShaft(expX + impR + 14, bstX - impR - 14, CY, speed, d.speed);
  drawCasing(expX, CY, impR, '#185FA5');
  drawImpeller(expX, CY, impR, 8, -angle * 1.3, '#378ADD', true);
  drawCasing(bstX, CY, impR, '#BA7517');
  drawImpeller(bstX, CY, impR, 7, angle * 1.2, '#EF9F27', bFrac < 0.05);

  // Label
  ctx.font = '10px sans-serif'; ctx.textAlign = 'center';
  ctx.fillStyle = '#666';
  ctx.fillText(`N₂ · ${d.exp.pin.toFixed(2)} bar · ${d.exp.tin.toFixed(0)} °C`, expX, CY - impR - 22);
  ctx.fillText(`N₂ · ${d.bst.pin.toFixed(2)} bar · ${d.bst.tin.toFixed(0)} °C`, bstX, CY - impR - 22);
  ctx.fillStyle = '#378ADDcc';
  ctx.fillText(`→ ${d.exp.pout.toFixed(2)} bar · ${d.exp.tout} °C`, expX, CY + impR + 26);
  ctx.fillStyle = '#BA7517cc';
  ctx.fillText(`→ ${d.bst.pout.toFixed(2)} bar · ${d.bst.tout} °C`, bstX, CY + impR + 26);

  // Update UI
  document.getElementById('ebar').style.width = Math.min(100, performanceFactor * 100).toFixed(0) + '%';
  document.getElementById('ep-val').textContent = coldEst.toLocaleString('id-ID') + ' kW';
  document.getElementById('bbar').style.width = Math.min(100, loadFactor * 100).toFixed(0) + '%';
  document.getElementById('bp-val').textContent = powerEst.toLocaleString('id-ID') + ' kW';
  document.getElementById('sv').textContent = rpm.toLocaleString('id-ID') + ' RPM';
  document.getElementById('er').textContent = erActual + ' / ' + d.exp.er;
  document.getElementById('cr').textContent = crActual + ' / ' + d.bst.cr;

  // Status
  const st = document.getElementById('st');
  const pct = speed / d.speed;
  if ((mode === 'warm' && speed < 23850) || (mode === 'cold' && speed < 20950) || pct < 0.2) {
    st.textContent = 'Underspeed'; st.className = 'sv danger';
  } else if ((mode === 'warm' && speed > 29550) || (mode === 'cold' && speed > 25900) || pct > 1.1) {
    st.textContent = 'Overspeed'; st.className = 'sv danger';
  } else if (bFrac > 0.25) {
    st.textContent = 'Boros energi'; st.className = 'sv warn';
  } else if (Math.abs(nozzle - d.designNozzle) <= 3 && bFrac < 0.05) {
    st.textContent = 'Design point'; st.className = 'sv ok';
  } else if (pct > 0.75) {
    st.textContent = 'Normal'; st.className = 'sv ok';
  } else {
    st.textContent = 'Partial load'; st.className = 'sv warn';
  }
}

switchMode('warm');
frame();
</script>
</body>
</html>

<!--kg-card-end: html-->
<hr />

<h2 id="keseimbangan-energi-dan-dampaknya-di-lapangan">Keseimbangan Energi dan Dampaknya di Lapangan</h2>
<p>Secara fundamental:</p>
<p>$$W_{expander} = W_{booster} + W_{losses}$$</p>
<p>Dimana losses meliputi:</p>
<ul>
<li>losses mekanis (bearing, seal, leakage)</li>
<li>losses aerodinamis internal</li>
</ul>
<p>Namun operator tidak melihat persamaan ini secara langsung. Yang terlihat adalah manifestasinya:</p>
<ul>
<li>vibrasi meningkat</li>
<li>speed tidak stabil</li>
<li>mesin terasa tidak "smooth"</li>
<li>bahkan trip</li>
</ul>
<p>Ketika keseimbangan energi terganggu, sistem keluar dari design point dan memicu:</p>
<ul>
<li>perubahan pola aliran di impeller</li>
<li>munculnya unbalanced aerodynamic forces</li>
<li>berkembang menjadi rotor instability</li>
</ul>
<p>Dalam jangka panjang:</p>
<blockquote>
<p>Kondisi ini mempercepat keausan bearing dan menurunkan keandalan mesin.</p>
</blockquote>
<p>Vibrasi sering didiagnosis sebagai masalah mekanis — bearing, alignment, atau balancing. Padahal di lapangan, vibrasi pada booster expander sangat sering berakar dari energy mismatch di sisi aerodinamis, bukan dari komponen mekanis itu sendiri. Mengejar solusi mekanis tanpa memeriksa keseimbangan energi proses adalah langkah yang bisa membuang waktu dan biaya.</p>
<p>Dengan kata lain, menjaga keseimbangan energi bukan hanya soal performa — tetapi juga umur equipment.</p>
<hr />

<h2 id="power-torsi-dan-speed-batasan-yang-tidak-bisa-dinegosiasikan">Power, Torsi, dan Speed: Batasan yang Tidak Bisa Dinegosiasikan</h2>
<p>$$W = \tau \times \omega$$</p>
<p>Karena expander dan booster berada pada satu shaft:</p>
<ul>
<li>kecepatan rotasi selalu sama</li>
<li>keseimbangan torsi harus terpenuhi</li>
</ul>
<p>$$\tau_{expander} = \tau_{booster} + \tau_{losses}$$</p>
<p>Implikasi paling penting:</p>
<blockquote>
<p>Ini bukan batasan kontrol — ini batasan fisika. Booster tidak bisa dipaksa bekerja melebihi energi yang disediakan expander.</p>
</blockquote>
<p>Jika batas ini dilanggar, sistem tidak langsung berhenti — ia akan bereaksi dengan cara tertentu sebelum akhirnya tidak stabil:</p>
<ul>
<li>flow di kedua sisi berubah secara otomatis</li>
<li>rasio ekspansi dan kompresi bergeser dari design point</li>
<li>titik operasi berpindah ke zona yang kurang efisien atau tidak stabil</li>
<li>speed turun, vibrasi meningkat, dan potensi trip meningkat</li>
</ul>
<p>Memahami mekanisme ini membantu operator mengenali tanda-tanda awal ketidakseimbangan sebelum sistem mencapai kondisi kritis.</p>
<hr />

<h2 id="parameter-utama-rasio-ekspansi-dan-rasio-kompresi">Parameter Utama: Rasio Ekspansi dan Rasio Kompresi</h2>
<p>Catatan krusial:</p>
<blockquote>
<p>Semua perhitungan harus menggunakan tekanan absolut (bar abs / psia). Menggunakan tekanan gauge akan menghasilkan rasio yang salah dan interpretasi kondisi operasi yang keliru.</p>
</blockquote>
<p><strong>Rasio Ekspansi (Expander):</strong></p>
<p>$$ER = \frac{P_{inlet}}{P_{outlet}}$$</p>
<p><strong>Rasio Kompresi (Booster):</strong></p>
<p>$$CR = \frac{P_{discharge}}{P_{suction}}$$</p>
<p><strong>Mengapa bukan differential pressure (ΔP)?</strong></p>
<p>ΔP hanya menunjukkan selisih absolut tanpa memperhitungkan kondisi suction.</p>
<table>
<thead>
<tr>
<th>Suction (bar abs)</th>
<th>Discharge (bar abs)</th>
<th>ΔP (bar)</th>
<th>CR</th>
</tr>
</thead>
<tbody>
<tr>
<td>5.0</td>
<td>6.0</td>
<td>1.0</td>
<td>1.20</td>
</tr>
<tr>
<td>4.0</td>
<td>5.0</td>
<td>1.0</td>
<td>1.25</td>
</tr>
</tbody>
</table>
<blockquote>
<p>ΔP yang sama tidak selalu mencerminkan kondisi operasi yang sama.</p>
</blockquote>
<p>Dengan sistem DCS, rasio dapat dihitung secara real-time, sehingga lebih representatif dibanding ΔP.</p>
<hr />

<h2 id="temperatur-adalah-konsekuensi-bukan-target">Temperatur Adalah Konsekuensi, Bukan Target</h2>
<p>$$T_{outlet} = T_{inlet} \times \left(\frac{P_{outlet}}{P_{inlet}}\right)^{\frac{\gamma-1}{\gamma}}$$</p>
<p>Temperatur outlet adalah fungsi langsung dari rasio tekanan.</p>
<blockquote>
<p>Rasio adalah penyebab. Temperatur adalah akibat.</p>
</blockquote>
<p>Jika rasio sesuai design dan kondisi inlet normal, maka temperatur akan mengikuti secara alami.</p>
<blockquote>
<p>Mengejar temperatur tanpa memperhatikan rasio sama seperti memperbaiki gejala tanpa menyentuh penyebabnya.</p>
</blockquote>
<hr />

<h2 id="opening-nozzle-expander-satu-tuas-untuk-seluruh-sistem">Opening Nozzle Expander: Satu Tuas untuk Seluruh Sistem</h2>
<p>Opening nozzle (pada beberapa vendor dikenal sebagai VIGV atau segmental nozzle) adalah satu-satunya manipulated variable utama. Lebih tepat dipahami bukan sebagai pengatur flow semata, melainkan sebagai <strong>pengatur energi</strong> — karena yang sesungguhnya dikendalikan adalah enthalpy drop di sisi expander, yang menentukan berapa besar energi tersedia untuk memutar shaft dan menggerakkan booster. Perubahannya mempengaruhi seluruh sistem:</p>
<div style="overflow-x: auto; margin: 1em 0;">
  <div class="mermaid">
    ---
    config:
      theme: neutral
    ---
    flowchart TD
        A("Opening Nozzle ↑"):::nozzle
        B("Flow Expander ↑"):::expander
        C("Energi Expander ↑"):::expander
        D("Torsi Shaft ↑"):::shaft
        E("Speed ↑"):::shaft
        F("Booster Work ↑"):::booster
        G("Flow Booster ↑"):::booster
        H("Rasio Kompresi Berubah"):::output
        A --&gt; B
        B --&gt; C
        C --&gt;|Menghasilkan| D
        D --&gt; E
        E --&gt; F
        F --&gt; G
        G --&gt; H
        classDef nozzle fill:#fff2cc,stroke:#bf9000,stroke-width:2px,color:#000
        classDef expander fill:#cfe2f3,stroke:#1155cc,stroke-width:2px,color:#000
        classDef shaft fill:#d9ead3,stroke:#38761d,stroke-width:2px,color:#000
        classDef booster fill:#fce5cd,stroke:#e69138,stroke-width:2px,color:#000
        classDef output fill:#d9d2e9,stroke:#351c75,stroke-width:2px,color:#000
  </div>
  <figcaption style="text-align:center; font-size:14px; color:#555;">
    Pengaruh Opening Nozzle terhadap Keseimbangan Sistem Booster Expander
  </figcaption>
</div>
<blockquote>
<p>Tidak ada perubahan kecil di sistem ini — satu adjustment akan menggeser seluruh keseimbangan sistem.</p>
</blockquote>
<p><strong>Profil Vendor sebagai Peta Energi</strong></p>
<p>Vendor biasanya menyediakan tabel performa yang mencakup speed, flow, tekanan, temperatur, dan posisi nozzle.</p>
<blockquote>
<p>Setiap titik dalam tabel tersebut adalah kondisi di mana keseimbangan energi tercapai. Profil vendor adalah peta keseimbangan energi sistem.</p>
</blockquote>
<p>Vendor umumnya tidak hanya menyediakan data untuk 100% pembebanan, tetapi juga untuk beberapa titik lain — misalnya 90% dan 110%. Setiap titik pembebanan memiliki profil keseimbangan energi tersendiri dengan rasio, speed, flow, dan posisi nozzle yang berbeda. Pendekatan monitoring berbasis rasio berlaku di semua titik pembebanan tersebut — operator tinggal mengacu ke profil yang sesuai dengan kondisi operasi aktual, tanpa perlu mengekstrapolasi sendiri.</p>
<hr />

<h2 id="bypass-valve-booster-anti-surge-dan-implikasinya-terhadap-energi">Bypass Valve Booster: Anti-Surge dan Implikasinya terhadap Energi</h2>
<p>Dalam sistem booster, bypass valve merupakan bagian dari sistem <strong>anti-surge protection</strong>, yang berfungsi menjaga kompresor tetap berada pada daerah operasi yang stabil.</p>
<p>Fungsinya meliputi:</p>
<ul>
<li>menjaga flow minimum melalui booster</li>
<li>mencegah surge akibat aliran yang terlalu rendah</li>
<li>melindungi impeller dari instabilitas aerodinamis</li>
</ul>
<blockquote>
<p>Bypass valve bekerja dalam domain <strong>perilaku aliran (flow stability)</strong>, bukan dalam domain keseimbangan energi sistem.</p>
</blockquote>
<p>Namun dari sudut pandang energi, ada implikasi yang sangat penting.</p>
<p>Dalam kondisi operasi normal:</p>
<blockquote>
<p>Bypass valve seharusnya berada pada posisi <strong>full close</strong>.</p>
</blockquote>
<p>Ini bukan sekadar prosedur, tetapi konsekuensi dari sistem yang sudah seimbang:</p>
<ul>
<li>sistem tidak lagi membutuhkan recirculation untuk menjaga stabilitas</li>
<li>seluruh energi dari expander diserap oleh booster</li>
<li>tidak ada flow yang “diputar ulang” tanpa kontribusi proses</li>
</ul>
<p>Jika bypass tetap terbuka:</p>
<ul>
<li>energi kompresi terbuang</li>
<li>efisiensi menurun</li>
<li>sebagian flow hanya bersirkulasi tanpa menghasilkan kerja proses</li>
<li>kondisi operasi menjadi bias terhadap design</li>
</ul>
<blockquote>
<p>Sistem yang stabil karena bypass terbuka belum tentu sistem yang benar secara energi.</p>
</blockquote>
<p><strong>Fenomena Lapangan</strong></p>
<p>Sering ditemukan bypass yang tidak pernah benar-benar full close dan dianggap sebagai kondisi normal. Dalam banyak kasus, hal ini berawal dari fase startup yang kurang terkoordinasi:</p>
<ul>
<li>nozzle dinaikkan terlalu cepat</li>
<li>energi expander meningkat sebelum sistem siap</li>
<li>speed melonjak</li>
<li>bypass dibiarkan terbuka sebagai solusi sementara</li>
</ul>
<p>Yang menjadi masalah, kondisi sementara ini kemudian bertahan dan diwariskan sebagai “kenormalan”.</p>
<blockquote>
<p>Jika sistem hanya stabil saat bypass terbuka, kemungkinan besar sistem belum berada pada titik operasi yang benar.</p>
</blockquote>
<hr />

<h2 id="shut-off-valve-expander-isolasi-sumber-energi-sistem">Shut-Off Valve Expander: Isolasi Sumber Energi Sistem</h2>
<p>Jika bypass valve bekerja dalam menjaga stabilitas aliran selama operasi normal, maka shut-off valve berada pada level yang berbeda: <strong>isolasi total sumber energi sistem</strong>.</p>
<blockquote>
<p>Shut-off valve bukan lagi bagian dari kontrol proses, tetapi bagian dari sistem keselamatan yang memutus hubungan antara sumber energi dan rotating equipment.</p>
</blockquote>
<p>Pada kondisi trip, fokus sistem berubah dari <em>stability control</em> menjadi <em>energy isolation</em>.</p>
<p>Shut-off valve pada inlet expander berfungsi untuk:</p>
<ul>
<li>menghentikan aliran gas ke expander</li>
<li>mengisolasi sumber energi dari sistem shaft</li>
<li>menghilangkan driving force utama pada turbin expander</li>
<li>memastikan proses rundown terjadi secara terkendali dan terprediksi</li>
</ul>
<p>Secara konsep energi:</p>
<div style="overflow-x: auto; margin: 1em 0;">
  <div class="mermaid">
    ---
    config:
      theme: neutral
    ---
    flowchart TD
    RUN([RUN]):::state --&gt; N
    N --&gt; STOP([STOP]):::state
    STOP --&gt; T
    subgraph N["Normal Operation"]
        direction LR
        A("Gas"):::expander
        B("Expander"):::expander
        C("Energy Extraction"):::expander
        D("Shaft"):::shaft
        E("Booster"):::booster
        A --&gt; B --&gt; C --&gt; D --&gt; E
    end
    subgraph T["Trip / Shutdown Transient"]
        direction LR
        G("Gas Flow Isolated"):::nozzle
        H("Energy Supply Cut"):::nozzle
        I("Shaft Decays Naturally"):::shaft
        G --&gt; H --&gt; I
    end
    classDef state fill:#eeeeee,stroke:#666,stroke-width:2px,color:#000
    classDef nozzle fill:#fff2cc,stroke:#bf9000,stroke-width:2px,color:#000
    classDef expander fill:#cfe2f3,stroke:#1155cc,stroke-width:2px,color:#000
    classDef shaft fill:#d9ead3,stroke:#38761d,stroke-width:2px,color:#000
    classDef booster fill:#fce5cd,stroke:#e69138,stroke-width:2px,color:#000
    classDef output fill:#d9d2e9,stroke:#351c75,stroke-width:2px,color:#000
    classDef alert fill:#f4cccc,stroke:#cc0000,stroke-width:2px,color:#000
  </div>
  <figcaption style="text-align:center; font-size:14px; color:#555;">
    Konsep Energi Normal Operation dan Trip Condition
  </figcaption>
</div>
<p>Yang penting dipahami adalah bahwa tanpa shut-off valve, expander masih dapat “menerima energi residual” dari sistem upstream meskipun kondisi trip sudah aktif. Dalam kondisi tertentu, ini dapat menyebabkan:</p>
<ul>
<li>rundown yang tidak terkontrol</li>
<li>beban dinamis tambahan pada shaft</li>
<li>peningkatan stress pada bearing selama deceleration</li>
<li>potensi secondary mechanical issue akibat transien yang tidak terisolasi</li>
</ul>
<blockquote>
<p>Shutdown yang aman bukan hanya menghentikan operasi, tetapi memastikan tidak ada lagi energi baru yang masuk ke sistem.</p>
</blockquote>
<hr />

<h2 id="perbedaan-konseptual-yang-perlu-dipahami">Perbedaan Konseptual yang Perlu Dipahami</h2>
<table>
<thead>
<tr>
<th>Aspek</th>
<th>Bypass Valve</th>
<th>Shut-Off Valve</th>
</tr>
</thead>
<tbody>
<tr>
<td>Peran utama</td>
<td>Stabilitas aliran (anti-surge)</td>
<td>Isolasi energi</td>
</tr>
<tr>
<td>Domain</td>
<td>Flow dynamics</td>
<td>Energy boundary</td>
</tr>
<tr>
<td>Kondisi normal</td>
<td>Menutup (ideal)</td>
<td>Terbuka</td>
</tr>
<tr>
<td>Kondisi trip</td>
<td>Tidak utama</td>
<td>Menutup cepat dan pasti</td>
</tr>
</tbody>
</table>
<hr />

<h2 id="penegasan-arsitektur-sistem">Penegasan Arsitektur Sistem</h2>
<blockquote>
<p>Bypass valve menjaga sistem tetap stabil dalam domain operasi.<br />
Shut-off valve memastikan sistem benar-benar terputus dari sumber energi saat keluar dari domain operasi.</p>
</blockquote>
<p>Dengan kata lain:</p>
<ul>
<li>bypass valve bekerja <strong>di dalam sistem</strong></li>
<li>shut-off valve bekerja <strong>di batas sistem</strong></li>
</ul>
<p>Keduanya tidak saling menggantikan, karena bekerja pada dua level yang berbeda: <em>operational stability vs energy isolation boundary</em>.</p>
<hr />

<h2 id="seal-gas-dan-lube-oil-parameter-pendukung-yang-tidak-boleh-diabaikan">Seal Gas dan Lube Oil: Parameter Pendukung yang Tidak Boleh Diabaikan</h2>
<p>Di luar keseimbangan energi proses, ada dua sistem pendukung yang dapat menghasilkan gejala yang sama di lapangan — khususnya pada vibrasi dan bearing temperature — dan sering luput dari perhatian dalam diagnostik awal.</p>
<p>Dengan kata lain:</p>
<blockquote>
<p>Tidak semua vibrasi berasal dari ketidakseimbangan energi, tetapi semua kemungkinan harus dipisahkan dengan jelas sebelum tindakan diambil.</p>
</blockquote>
<p><strong>Seal gas pressure:</strong></p>
<p>Seal gas berfungsi mencegah process gas masuk ke area bearing. Jika tekanan seal gas tidak mencukupi atau tidak stabil:</p>
<ul>
<li>process gas dapat merembes masuk ke bearing area</li>
<li>karakteristik pelumasan terganggu</li>
<li>bearing temperature naik dan vibrasi meningkat</li>
</ul>
<p><strong>Lube oil:</strong></p>
<p>Tekanan dan kondisi oli secara langsung menentukan kualitas film pelumasan di bearing. Jika tekanan oli terlalu rendah atau oli terkontaminasi:</p>
<ul>
<li>film oli tidak terbentuk sempurna</li>
<li>terjadi kontak metal-to-metal</li>
<li>bearing temperature naik dan vibrasi meningkat</li>
</ul>
<p>Perlu diperhatikan bahwa gejala yang muncul dari masalah seal gas atau lube oil dapat sangat mirip dengan gejala akibat ketidakseimbangan energi, seperti:</p>
<ul>
<li>peningkatan vibrasi</li>
<li>kenaikan bearing temperature</li>
<li>operasi yang terasa tidak stabil</li>
</ul>
<blockquote>
<p>Sebelum menyimpulkan bahwa vibrasi berasal dari ketidakseimbangan energi atau masalah mekanis struktural, kondisi seal gas dan lube oil perlu diperiksa terlebih dahulu — keduanya adalah variabel independen yang dapat menghasilkan gejala serupa.</p>
</blockquote>
<hr />

<h2 id="prosedur-startup-melewati-critical-speed-dengan-benar">Prosedur Startup: Melewati Critical Speed dengan Benar</h2>
<p>Contoh sistem dengan dua critical speed (misal 15.500 dan 19.000 RPM):</p>
<p><strong>Fase 1 — Menuju Critical Speed Pertama</strong></p>
<ul>
<li>Naikkan nozzle dengan cepat</li>
<li>Lewati critical speed pertama sesegera mungkin</li>
<li>Bypass masih terbuka</li>
</ul>
<p><strong>Fase 2 — Antar Critical Speed</strong></p>
<ul>
<li>Mulai koordinasi nozzle dan bypass secara proporsional</li>
<li>Hindari berlama-lama di zona ini</li>
</ul>
<p><strong>Fase 3 — Setelah Critical Speed Kedua</strong></p>
<ul>
<li>Semua critical speed terlewati</li>
<li>Koordinasi penuh, nozzle naik proporsional dengan bypass closing</li>
<li>Target: bypass full close</li>
</ul>
<blockquote>
<p>Yang berbahaya bukan melewati critical speed, tetapi terlalu lama berada di dalamnya.</p>
</blockquote>
<p>Untuk sistem dengan satu critical speed, prosedur menjadi dua fase — cepat melewati critical speed, lalu koordinasi penuh hingga bypass full close.</p>
<hr />

<h2 id="monitoring-berbasis-rasio">Monitoring Berbasis Rasio</h2>
<p>Pendekatan monitoring terbaik adalah membandingkan rasio aktual dengan design secara bersamaan untuk kedua sisi:</p>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Formula</th>
<th>Makna</th>
</tr>
</thead>
<tbody>
<tr>
<td>Rasio Ekspansi</td>
<td>$ER = P_{inlet} / P_{outlet}$</td>
<td>Performa expander</td>
</tr>
<tr>
<td>Rasio Kompresi</td>
<td>$CR = P_{discharge} / P_{suction}$</td>
<td>Performa booster</td>
</tr>
</tbody>
</table>
<p>Namun yang lebih powerful adalah melihat <strong>hubungan antara ER dan CR</strong>, bukan hanya masing-masing secara terpisah. Pola korelasi keduanya memberikan informasi diagnostik yang jauh lebih kaya:</p>
<table>
<thead>
<tr>
<th>Pola</th>
<th>Interpretasi</th>
</tr>
</thead>
<tbody>
<tr>
<td>ER naik, CR tidak mengikuti</td>
<td>Energy mismatch — energi expander tidak terserap optimal oleh booster</td>
</tr>
<tr>
<td>ER stabil, CR naik</td>
<td>Kemungkinan masalah downstream booster</td>
</tr>
<tr>
<td>ER turun, CR turun bersamaan</td>
<td>Pergeseran kondisi operasi secara keseluruhan — periksa inlet expander dan nozzle</td>
</tr>
<tr>
<td>ER &amp; CR keduanya menyimpang dari design</td>
<td>Sistem di luar design envelope — kembalikan ke profil vendor</td>
</tr>
</tbody>
</table>
<p>Pendekatan berbasis pola korelasi ini adalah langkah menuju condition-based monitoring yang lebih proaktif.</p>
<hr />

<h2 id="panduan-interpretasi-untuk-operator">Panduan Interpretasi untuk Operator</h2>
<table>
<thead>
<tr>
<th>Kondisi</th>
<th>Kemungkinan Penyebab</th>
<th>Indikasi Vibrasi</th>
<th>Tindakan</th>
</tr>
</thead>
<tbody>
<tr>
<td>ER tinggi</td>
<td>P inlet tinggi / outlet rendah</td>
<td>Meningkat</td>
<td>Periksa upstream</td>
</tr>
<tr>
<td>CR tinggi</td>
<td>Discharge tinggi</td>
<td>Meningkat</td>
<td>Periksa downstream</td>
</tr>
<tr>
<td>ER &amp; CR menyimpang</td>
<td>Di luar design envelope</td>
<td>Instability</td>
<td>Kembali ke profil vendor</td>
</tr>
<tr>
<td>Speed fluktuatif</td>
<td>Ketidakseimbangan energi</td>
<td>Fluktuatif</td>
<td>Evaluasi nozzle &amp; bypass</td>
</tr>
</tbody>
</table>
<hr />

<h2 id="estimasi-flow">Estimasi Flow</h2>
<p>Pendekatan berbasis keseimbangan energi dengan asumsi proses isentropik dan efisiensi konstan:</p>
<p>$$\dot{m}_{expander} = \frac{W_{expander}}{\Delta h} \times \frac{1}{\eta_{expander}}$$</p>
<p>$$\dot{m}_{booster} = \frac{W_{booster}}{\Delta h} \times \eta_{booster}$$</p>
<p>Catatan penting:</p>
<ul>
<li>Formula ini valid dengan asumsi <strong>medium gas yang digunakan konsisten dengan kondisi design</strong>. Jika terjadi perubahan komposisi gas yang signifikan, diperlukan koreksi terhadap density atau molecular weight.</li>
<li>Estimasi paling akurat di sekitar design point.</li>
<li>Efisiensi berubah terhadap flow dan speed — pada kondisi low load, estimasi menjadi kurang presisi.</li>
</ul>
<hr />

<h2 id="implementasi-di-dcs">Implementasi di DCS</h2>
<h3 id="python">Python</h3>
<pre><code class="language-python"># Input
P_exp_inlet     = 6.0   # bar abs
P_exp_outlet    = 1.4   # bar abs
P_bst_suction   = 5.5   # bar abs
P_bst_discharge = 6.2   # bar abs

# Design
ER_design = 6.0 / 1.4
CR_design = 6.2 / 5.5

# Rasio aktual (dengan proteksi division by zero)
ER_actual = P_exp_inlet / P_exp_outlet if P_exp_outlet &gt; 0 else 0
CR_actual = P_bst_discharge / P_bst_suction if P_bst_suction &gt; 0 else 0

# Deviasi terhadap design (%)
ER_deviation = (ER_actual - ER_design) / ER_design * 100 if ER_design &gt; 0 else 0
CR_deviation = (CR_actual - CR_design) / CR_design * 100 if CR_design &gt; 0 else 0

print(f"ER Aktual : {ER_actual:.3f} (Design: {ER_design:.3f}, Deviasi: {ER_deviation:.2f}%)")
print(f"CR Aktual : {CR_actual:.3f} (Design: {CR_design:.3f}, Deviasi: {CR_deviation:.2f}%)")
</code></pre>
<p>📎 Bisa langsung dicoba di: 👉 <a href="https://onecompiler.com/python?ref=blog.kiiota.com">Python Online Compiler</a></p>
<h3 id="structured-text-plc-dcs">Structured Text (PLC / DCS)</h3>
<pre><code class="language-pascal">(* Input Variables *)
VAR
    P_EXP_INLET     : REAL;  (* Tekanan inlet expander, bar abs *)
    P_EXP_OUTLET    : REAL;  (* Tekanan outlet expander, bar abs *)
    P_BST_SUCTION   : REAL;  (* Tekanan suction booster, bar abs *)
    P_BST_DISCHARGE : REAL;  (* Tekanan discharge booster, bar abs *)
    ER_DESIGN       : REAL;  (* Rasio ekspansi design *)
    CR_DESIGN       : REAL;  (* Rasio kompresi design *)
END_VAR

(* Output Variables *)
VAR
    ER_ACTUAL    : REAL;  (* Rasio ekspansi aktual *)
    CR_ACTUAL    : REAL;  (* Rasio kompresi aktual *)
    ER_DEVIATION : REAL;  (* Deviasi ER, % *)
    CR_DEVIATION : REAL;  (* Deviasi CR, % *)
END_VAR

(* Kalkulasi Rasio *)
IF P_EXP_OUTLET &gt; 0.0 THEN
    ER_ACTUAL := P_EXP_INLET / P_EXP_OUTLET;
END_IF;

IF P_BST_SUCTION &gt; 0.0 THEN
    CR_ACTUAL := P_BST_DISCHARGE / P_BST_SUCTION;
END_IF;

(* Deviasi terhadap design *)
IF ER_DESIGN &gt; 0.0 THEN
    ER_DEVIATION := (ER_ACTUAL - ER_DESIGN) / ER_DESIGN * 100.0;
END_IF;

IF CR_DESIGN &gt; 0.0 THEN
    CR_DEVIATION := (CR_ACTUAL - CR_DESIGN) / CR_DESIGN * 100.0;
END_IF;
</code></pre>
<hr />

<h2 id="kesimpulan">Kesimpulan</h2>
<p>Booster expander bukan dua mesin terpisah, melainkan satu sistem energi yang saling terikat.</p>
<p>Expander adalah sumber energi. Booster adalah beban yang mengikuti. Energi dari expander adalah batas atas yang tidak bisa dilanggar — ini bukan soal kontrol, tetapi hukum fisika.</p>
<p>Parameter utama yang harus dijaga adalah rasio — rasio ekspansi menentukan performa expander, rasio kompresi menentukan performa booster. Temperatur bukan target utama, melainkan konsekuensi dari rasio yang tercapai.</p>
<p>Opening nozzle adalah satu tuas yang menggeser seluruh keseimbangan sistem — mempengaruhi speed, flow, rasio, dan temperatur secara bersamaan.</p>
<p>Bypass valve harus berada dalam kondisi full close saat operasi normal. Jika tidak, energi terbuang dan kondisi operasi yang sebenarnya menjadi tidak terlihat.</p>
<p>Profil vendor bukan sekadar referensi, melainkan peta keseimbangan energi yang harus dijaga.</p>
<p>Dengan memahami hubungan ini dan mengimplementasikan monitoring berbasis rasio di DCS, operator tidak hanya membaca angka — tetapi memahami kondisi sistem secara menyeluruh.</p>
<p>Booster expander bukan sistem yang bisa dikontrol secara bebas — ia adalah sistem yang harus dipahami batas energinya. Operator yang memahami energi tidak menunggu alarm untuk bereaksi; mereka membaca perilaku mesin dan mengenali ketidakseimbangan sebelum menjadi masalah.</p>
<blockquote>
<p>Pada akhirnya, yang dijaga bukan sekadar parameter — tetapi keseimbangan energi sistem secara keseluruhan.</p>
</blockquote>]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="practical-engineering" /><category term="Practical Engineering" /><category term="Field Experience" /><category term="Distributed Control System" /><category term="Air Separation Unit" /><summary type="html"><![CDATA[Booster expander bukan dua mesin yang bekerja berdampingan. Ini adalah satu sistem energi — di mana expander menentukan batas, dan booster hanya mengikuti. Memahami ini mengubah cara kita membaca performa, vibrasi, dan stabilitas mesin di lapangan.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1605141313002-fde711766543?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDl8fGJhc2ljJTIwa25vd2xlZGdlfGVufDB8fHx8MTc3NjU2MjYyMHww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1605141313002-fde711766543?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDl8fGJhc2ljJTIwa25vd2xlZGdlfGVufDB8fHx8MTc3NjU2MjYyMHww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Distribusi Flow Expander dan Booster dalam Sistem Cryogenic</title><link href="https://kumajaya.github.io/kiiota-blog/air-separation-unit/2026/02/18/distribusi-flow-expander-dan-booster-dalam-sistem-cryogenic.html" rel="alternate" type="text/html" title="Distribusi Flow Expander dan Booster dalam Sistem Cryogenic" /><published>2026-02-18T14:32:30+00:00</published><updated>2026-02-18T14:32:30+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/air-separation-unit/2026/02/18/distribusi-flow-expander-dan-booster-dalam-sistem-cryogenic</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/air-separation-unit/2026/02/18/distribusi-flow-expander-dan-booster-dalam-sistem-cryogenic.html"><![CDATA[<p>Dalam sistem cryogenic atau gas separation modern, <strong>expander</strong> dan <strong>booster</strong> bekerja sebagai satu kesatuan mekanis. Expander berfungsi sebagai penggerak (motor) yang menghasilkan energi dari ekspansi gas dingin, sementara booster bertindak sebagai beban berupa centrifugal compressor yang mengonsumsi energi tersebut. Keseimbangan keduanya menentukan <strong>stabilitas operasi, efisiensi energi, dan umur peralatan</strong>.</p>
<h2 id="landasan-teori">Landasan Teori</h2>
<ul>
<li><strong>Expander</strong>: menurunkan temperatur gas melalui ekspansi isentropik, sekaligus menghasilkan energi mekanis pada shaft. Energi ini digunakan untuk menggerakkan booster.</li>
<li><strong>Booster</strong>: menaikkan tekanan gas (umumnya recycle nitrogen atau udara kering) agar sesuai dengan kebutuhan proses. Beban booster harus seimbang dengan energi expander agar tidak terjadi mismatch.</li>
<li><strong>Distribusi Flow</strong>: Rasio flow expander terhadap booster menjadi indikator utama apakah energi yang dihasilkan expander cukup, berlebih, atau kurang dibandingkan kebutuhan booster.</li>
<li><strong>Rasio Kompresi Booster</strong>: perbandingan <strong>tekanan keluar absolute (discharge abs)</strong> dan <strong>tekanan masuk absolute (suction abs)</strong> booster. Rasio ini menentukan beban kerja booster. Jika terlalu tinggi sementara energi expander kurang, booster bisa mendekati surge dan menimbulkan vibrasi.</li>
<li><strong>Rasio Ekspansi Expander</strong>: perbandingan <strong>tekanan masuk absolute</strong> dan <strong>tekanan keluar absolute</strong> expander. Rasio ini menentukan seberapa besar energi mekanis yang dihasilkan expander. Jika terlalu tinggi, energi berlebih bisa memicu vibrasi akibat torsi berlebihan pada shaft.</li>
</ul>
<p>📌 <em>Catatan: semua rasio kompresi dan ekspansi harus dihitung dari tekanan absolut, bukan tekanan gauge.</em></p>
<p>Dengan demikian, <strong>matching energi</strong> harus dilihat secara holistik: flow ratio, rasio kompresi, dan rasio ekspansi.</p>
<h2 id="contoh-data-operasi-dan-analisis-flow">Contoh Data Operasi dan Analisis Flow</h2>
<table>
<thead>
<tr>
<th>Mode</th>
<th>Flow Expander (Nm³/h)</th>
<th>Flow Booster (Nm³/h)</th>
<th>Rasio Exp/Booster</th>
<th>Interpretasi Utama</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>38.300</td>
<td>56.100</td>
<td>0,683</td>
<td>Expander dominan, energi spesifik tinggi, perlu monitoring vibrasi</td>
</tr>
<tr>
<td>2</td>
<td>37.000</td>
<td>57.473</td>
<td>0,644</td>
<td>Rasio terendah, booster lebih dominan, efisiensi expander menurun</td>
</tr>
<tr>
<td>3</td>
<td>36.700</td>
<td>55.964</td>
<td>0,656</td>
<td>Kondisi menengah, relatif stabil</td>
</tr>
<tr>
<td>4</td>
<td>35.800</td>
<td>55.547</td>
<td>0,645</td>
<td>Flow expander terendah, booster stabil, efisiensi sistem sedikit turun</td>
</tr>
</tbody>
</table>
<h3 id="catatan-penting">Catatan Penting</h3>
<ul>
<li>Rasio <strong>&lt;1</strong> dalam contoh ini adalah kondisi normal: booster selalu menerima flow lebih besar dibanding expander.</li>
<li>Rasio <strong>0,64–0,68</strong> sesuai dengan desain dalam contoh ini, di mana expander tidak boleh terlalu dominan.</li>
<li><strong>Energi berlebih (expander dominan)</strong> → vibrasi karena torsi berlebihan.</li>
<li><strong>Energi kurang (booster dominan)</strong> → vibrasi karena booster mendekati surge.</li>
<li><strong>Rasio kompresi dan ekspansi</strong> harus dijaga di sekitar nilai desain agar matching energi tetap terjaga.</li>
</ul>
<h2 id="kesimpulan">Kesimpulan</h2>
<ol>
<li><strong>Distribusi flow expander–booster</strong> adalah indikator utama keseimbangan energi, lebih penting daripada sekadar melihat flow absolut di booster.</li>
<li><strong>Rasio kompresi booster</strong> dan <strong>rasio ekspansi expander</strong> harus selalu diperhatikan bersama flow ratio, karena ketiganya membentuk neraca energi yang menjaga stabilitas operasi.</li>
<li>Vibrasi bisa muncul baik saat energi expander berlebih maupun kurang, sehingga pemantauan harus dilakukan secara holistik: flow ratio, kompresi, ekspansi, serta kondisi mekanis (bearing, shaft).</li>
<li>Dengan menjaga distribusi flow dan rasio sesuai desain, sistem cryogenic dapat beroperasi stabil, efisien, dan aman.</li>
</ol>]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="air-separation-unit" /><category term="Air Separation Unit" /><category term="Engineering Lessons" /><category term="Field Experience" /><summary type="html"><![CDATA[Dalam sistem cryogenic, keseimbangan energi antara expander dan booster bukan hanya soal flow total. Rasio flow, rasio kompresi, dan rasio ekspansi adalah kunci menjaga stabilitas operasi, efisiensi energi, dan mencegah vibrasi.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1728403295457-57cf37d59a27?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIzfHx0dXJiaW5lfGVufDB8fHx8MTc3MTQyNDkyM3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1728403295457-57cf37d59a27?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIzfHx0dXJiaW5lfGVufDB8fHx8MTc3MTQyNDkyM3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Menyiapkan Advantech UNO-220 sebagai Edge Device Industri</title><link href="https://kumajaya.github.io/kiiota-blog/edge-computing/2026/01/08/menyiapkan-advantech-uno-220-sebagai-edge-device-industri.html" rel="alternate" type="text/html" title="Menyiapkan Advantech UNO-220 sebagai Edge Device Industri" /><published>2026-01-08T01:51:59+00:00</published><updated>2026-01-08T01:51:59+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/edge-computing/2026/01/08/menyiapkan-advantech-uno-220-sebagai-edge-device-industri</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/edge-computing/2026/01/08/menyiapkan-advantech-uno-220-sebagai-edge-device-industri.html"><![CDATA[<h2 id="1-pendahuluan">1. Pendahuluan</h2>
<p>Dokumentasi ini menyajikan panduan lengkap untuk menyiapkan <strong>Advantech UNO-220-P4N2AE</strong> — sebuah industrial <strong>gateway kit</strong> (chassis + HAT I/O) yang dirancang untuk dipasangi Raspberry Pi 4 Model B — agar siap berfungsi sebagai <strong>edge device industri</strong>.</p>
<p>Panduan ini dirancang untuk memastikan UNO‑220 mampu:</p>
<ul>
<li>Beroperasi secara <strong>mandiri di lapangan</strong>, tanpa ketergantungan pada infrastruktur tambahan,</li>
<li>Terhubung <strong>aman</strong> ke server pusat melalui jaringan terenkripsi,</li>
<li>Menjalankan fungsi <strong>pengolahan data real‑time</strong> sekaligus <strong>visualisasi</strong> menggunakan <strong>Node‑RED</strong> (v4.x dengan Node.js v22 LTS) dan <strong>Rapid SCADA 6.4.3</strong>.</li>
</ul>
<div style="overflow-x: auto; margin: 1em 0;">
  <div class="mermaid">
    ---
    config:
      theme: neutral
    ---
    flowchart TD
            A["DCS / PLC<br />(Modbus RTU)"]:::legacy
            subgraph Integrasi
                direction LR
                B["Modbus Gateway"]:::gateway
                C["Node-RED"]:::nodered
                D["Rapid SCADA"]:::scada
                E["SCADA Grafana Proxy"]:::proxy
            end
            F["OS &amp; Hardening"]:::os
            G["Backup &amp; Recovery"]:::backup
            H["Deployment"]:::deploy
            I["ZeroTier"]:::network
            J["Server Integrasi"]:::server
            A --&gt; B
            B --&gt; C --&gt; I
            B --&gt; D --&gt; E
            Integrasi --&gt; F --&gt; G --&gt; H --&gt; Integrasi
            E --&gt; I --&gt; J
            classDef legacy fill:#efefef,stroke:#999,stroke-width:2px,color:#000
            classDef hardware fill:#f4cccc,stroke:#cc0000,stroke-width:2px,color:#000
            classDef os fill:#cfe2f3,stroke:#1155cc,stroke-width:2px,color:#000
            classDef nodered fill:#d9ead3,stroke:#38761d,stroke-width:2px,color:#000
            classDef scada fill:#fff2cc,stroke:#bf9000,stroke-width:2px,color:#000
            classDef proxy fill:#ead1dc,stroke:#741b47,stroke-width:2px,color:#000,stroke-dasharray:4 3
            classDef gateway fill:#e2efd9,stroke:#274e13,stroke-width:2px,color:#000,stroke-dasharray:4 3
            classDef network fill:#d0e0e3,stroke:#134f5c,stroke-width:2px,color:#000
            classDef backup fill:#e6e6e6,stroke:#666666,stroke-width:2px,color:#000
            classDef deploy fill:#fce5cd,stroke:#e69138,stroke-width:2px,color:#000
            classDef server fill:#d9d2e9,stroke:#351c75,stroke-width:2px,color:#000
  </div>
  <figcaption style="text-align:center; font-size:14px; color:#555;">
    Alur Terpadu UNO-220 untuk Integrasi Edge Industri yang Andal
  </figcaption>
</div>
<p>Seluruh tahapan — mulai dari aktivasi fitur perangkat keras, penguatan keamanan sistem operasi, hingga instalasi perangkat lunak produksi — telah digabungkan dalam satu dokumen terpadu. Dengan demikian, panduan ini dapat dijadikan <strong>standar operasional</strong> untuk deployment UNO‑220 di lingkungan industri, tanpa perlu merujuk ke dokumen eksternal tambahan.</p>
<div style="display:flex; flex-direction:column; align-items:center;">
  <img src="https://advanbuy.com/wp-content/uploads/UNO-220-P4N1AE.jpg" alt="Advantech UNO-220" style="width:75%; display:block;" />
  <figcaption style="text-align:center; font-size:14px; color:#555;">
    Advantech UNO‑220 sebagai edge device industri
  </figcaption>
</div>
<hr />

<h2 id="2-persiapan-perangkat">2. Persiapan Perangkat</h2>
<h3 id="21-perangkat-keras">2.1 Perangkat Keras</h3>
<table>
<thead>
<tr>
<th>Komponen</th>
<th>Spesifikasi / Catatan</th>
<th>Alasan / Risiko</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Main Unit</strong></td>
<td>Advantech UNO‑220 (kit untuk Raspberry Pi 4 Model B, IP40, varian P4N2AE mendukung PoE)</td>
<td>Form factor industri, rugged, siap dipasang di panel; casing melindungi dari debu &amp; getaran.</td>
</tr>
<tr>
<td><strong>Media Penyimpanan</strong></td>
<td>MicroSD <strong>industrial‑grade</strong> ≥ 32 GB. Pilih model dengan endurance pSLC/SLC, PLP/ECC bila tersedia.</td>
<td>Endurance tinggi, tahan suhu ekstrem, mencegah korupsi data akibat siklus tulis intensif.</td>
</tr>
<tr>
<td><strong>Catu Daya</strong></td>
<td>12–24 VDC atau PoE (802.3at/PoE+ bila beban tinggi). Rencanakan margin 20–30% di atas beban terukur.</td>
<td>Konsumsi bergantung konfigurasi (model RPi4, addon USB/serial, beban CPU).</td>
</tr>
<tr>
<td><strong>RTC</strong></td>
<td>Epson RX‑8010SJ‑B (dengan battery backup)</td>
<td>Menjamin timestamp akurat meski tanpa NTP; penting untuk audit log &amp; histori data.</td>
</tr>
<tr>
<td><strong>I/O Expander</strong></td>
<td>TI TCA9554 (alamat I²C 0x27)</td>
<td>Menambah GPIO untuk kontrol/monitoring eksternal.</td>
</tr>
<tr>
<td><strong>TPM</strong></td>
<td>Infineon OPTIGA TPM SLB9670</td>
<td>Mendukung secure boot, enkripsi, integritas sistem.</td>
</tr>
<tr>
<td><strong>Jaringan</strong></td>
<td>Ethernet LAN (1 GbE) untuk konfigurasi awal; <strong>ZeroTier</strong> untuk manajemen jarak jauh.</td>
<td>Ethernet stabil untuk setup awal; ZeroTier memberi VPN overlay aman tanpa port publik.</td>
</tr>
</tbody>
</table>
<hr />

<h3 id="22-perangkat-lunak">2.2 Perangkat Lunak</h3>
<ul>
<li><strong>Ubuntu Server arm64 terbaru</strong> (contoh: 25.10 dengan kernel 6.17+ saat penulisan).<br />
Untuk commissioning/testing gunakan rilis interim; untuk produksi gunakan rilis LTS (24.04 LTS yang tersedia, atau 26.04 LTS setelah rilis stabil pada 23 April 2026).</li>
<li><strong>Tool flashing</strong>: Raspberry Pi Imager atau Balena Etcher → tulis image OS ke microSD.</li>
<li><strong>Akses jaringan &amp; SSH dari komputer host</strong> → konfigurasi awal headless (tanpa monitor/keyboard).</li>
</ul>
<blockquote>
<p><em>Referensi tambahan:</em> periksa juga <a href="https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi?ref=blog.kiiota.com#1-overview">panduan resmi Ubuntu untuk Raspberry Pi</a> untuk memastikan image, kernel, dan metode flashing sesuai dengan rilis terbaru.</p>
</blockquote>
<p><strong>Upgrade ke Ubuntu 26.04 LTS</strong><br />
Setelah rilis stabil tersedia (<code>sudo do-release-upgrade -c</code>):</p>
<ol>
<li>Backup penuh sistem (lihat Bab 11) dan uji di staging.</li>
<li>Update paket: <code>sudo apt update &amp;&amp; sudo apt full-upgrade</code>.</li>
<li>Pastikan tool upgrade: <code>sudo apt install update-manager-core</code>.</li>
<li>Jalankan upgrade: <code>sudo do-release-upgrade</code> → konfirmasi.</li>
<li>Reboot, lalu verifikasi:
<ul>
<li><code>lsb_release -a</code> (versi Ubuntu)</li>
<li><code>uname -r</code> (kernel ARM64)</li>
<li>test service (Node‑RED, ZeroTier, Rapid SCADA).</li>
</ul>
</li>
</ol>
<p><strong>Catatan:</strong> Hindari opsi <code>-d</code> (development). Tunggu path resmi Canonical agar kernel &amp; driver ARM64 tetap kompatibel dengan UNO‑220.</p>
<h3 id="23-struktur-deployment-timeline-5-hari">2.3 Struktur Deployment (Timeline 5 Hari)</h3>
<p>Untuk memastikan proses commissioning berjalan konsisten dan dapat diaudit, berikut struktur deployment UNO‑220 selama 5 hari. Setiap langkah telah disusun agar modular, dapat direplikasi, dan mendukung validasi bertahap.</p>
<div class="mermaid" style="width:100%;">
    ---
    config:
      theme: neutral
    ---
    timeline
        title Timeline Deployment UNO-220 (Hari 1–4)
        section Hari 1 - Dasar dan Strukturisasi
            2025-11-03 : Persiapan perangkat &amp; verifikasi PoE (UNO-220 casing industrial, microSD pSLC/SLC, Raspberry Pi 4B)
            : Flash Ubuntu Server 25.10 + aktifkan SSH
            : Boot awal, login SSH, ubah password, set zona waktu
            : Update sistem + pasang overlay RTC, TPM, Expander
            : Edit config.txt, reboot, uji RTC/I²C/TPM
            : Nonaktifkan serial console ttyS0 (untuk RTU)
            : Instal ZeroTier + join network, uji ping antar node
        section Hari 2 - Tools dan Integrasi
            2025-11-04 : Setup GPIO rules + grup gpio
            : Uji LED PL1 manual via gpioset
            : Instal Node-RED v4.x + konfigurasi logging
            : Flow monitoring sistem + heartbeat LED PL1
            : Instal Rapid SCADA 6.4.3 + Nginx reverse proxy
            : Integrasi CSV monitoring + test curl localhost
            : Instal SCADA Grafana proxy + verifikasi endpoint JSON
            : Instal mbusd sebagai gateway Modbus TCP–RTU via RS-485
        section Hari 3 - Hardening, Backup, &amp; Validasi
            2025-11-05 : Setup SSH key-based login, nonaktifkan login password
            : Konfigurasi UFW + Fail2Ban (whitelist IP ZeroTier)
            : Sinkronisasi RTC + aktifkan unattended-upgrades + hold kernel
            : Nonaktifkan service tidak terpakai
            : Atur EEPROM boot order
            : Manual backup + auto backup + cron : Uji rsync ke USB/NAS + logrotate
            : Uji recovery Node-RED/SCADA/ZeroTier : Checklist audit end-to-end
        section Hari 4 - Deployment
            2025-11-06 : Pasang fisik UNO-220 di panel lapangan
            : Koneksi RS-485, ethernet, dan power PoE/DC
            : Uji dashboard Node-RED, SCADA, Modbus TCP, Grafana full
            : Dokumentasi akhir + handover checklist
</div>
<hr />

<h2 id="3-instalasi-ubuntu-server-2510">3. Instalasi Ubuntu Server 25.10</h2>
<h3 id="rekomendasi-spesifikasi-microsd-industrial%E2%80%91grade">Rekomendasi Spesifikasi microSD Industrial‑Grade</h3>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Nilai Minimum</th>
</tr>
</thead>
<tbody>
<tr>
<td>Kelas Speed</td>
<td>Class 10 / UHS‑I</td>
</tr>
<tr>
<td>Kapasitas</td>
<td>≥ 32 GB</td>
</tr>
<tr>
<td>NAND Type</td>
<td>pSLC / Industrial SLC</td>
</tr>
<tr>
<td>Operating Temp.</td>
<td>‑40°C hingga +85°C</td>
</tr>
<tr>
<td>Endurance</td>
<td>≥ 30K write cycles, Power-Loss Protection (PLP) atau ECC</td>
</tr>
<tr>
<td>Brand</td>
<td>Transcend Industrial, Swissbit, Apacer Industrial, Innodisk</td>
</tr>
</tbody>
</table>
<h3 id="langkah-instalasi">Langkah Instalasi</h3>
<ol>
<li>
<p><strong>Unduh image OS</strong><br />
Ambil <em>image</em> <strong>Ubuntu Server 25.10 (arm64)</strong> dari <a href="https://cdimage.ubuntu.com/releases/25.10/release/?ref=blog.kiiota.com">situs resmi Ubuntu</a>.</p>
</li>
<li>
<p><strong>Tulis image ke microSD</strong><br />
Gunakan Raspberry Pi Imager atau Balena Etcher.</p>
</li>
<li>
<p><strong>Aktifkan SSH</strong><br />
Setelah flashing selesai, mount partisi <code>boot</code> lalu buat file kosong bernama <code>ssh</code>:</p>
<pre><code class="language-bash">touch /media/&lt;user&gt;/boot/ssh
</code></pre>
</li>
<li>
<p><strong>Pasang microSD &amp; hubungkan perangkat</strong><br />
Masukkan microSD ke UNO‑220, hubungkan kabel Ethernet dan catu daya.</p>
</li>
<li>
<p><strong>Temukan alamat IP</strong></p>
<ul>
<li>Via router/DHCP lease</li>
<li>Atau gunakan:<pre><code class="language-bash">sudo nmap -sn 192.168.1.0/24
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>Login pertama via SSH</strong></p>
<pre><code class="language-bash">ssh ubuntu@&lt;ip_address&gt;
</code></pre>
<p>Password default: <code>ubuntu</code> (akan diminta ganti saat login pertama).</p>
</li>
<li>
<p><strong>Set zona waktu</strong><br />
Pilih sesuai lokasi operasional:</p>
<table>
<thead>
<tr>
<th>Wilayah</th>
<th>Zona Waktu</th>
<th>Pilihan</th>
</tr>
</thead>
<tbody>
<tr>
<td>Sumatra, Jawa, Kalimantan Barat/Tengah</td>
<td>WIB (UTC+7)</td>
<td>Asia/Jakarta</td>
</tr>
<tr>
<td>Bali, Nusa Tenggara, Kalimantan Selatan/Timur</td>
<td>WITA (UTC+8)</td>
<td>Asia/Makassar</td>
</tr>
<tr>
<td>Maluku, Papua</td>
<td>WIT (UTC+9)</td>
<td>Asia/Jayapura</td>
</tr>
</tbody>
</table>
<p>Contoh:</p>
<pre><code class="language-bash">sudo timedatectl set-timezone Asia/Jakarta
timedatectl status
</code></pre>
</li>
<li>
<p><strong>Update sistem</strong></p>
<pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt upgrade -y
sudo apt autoremove -y &amp;&amp; sudo apt clean
</code></pre>
</li>
</ol>
<h3 id="troubleshooting">Troubleshooting</h3>
<ul>
<li><strong>IP tidak terdeteksi</strong> → gunakan <code>arp -a</code> atau <code>nmap</code> untuk scanning subnet.</li>
<li><strong>SSH gagal</strong> → pastikan file <code>ssh</code> ada di partisi boot, atau gunakan monitor + keyboard sementara.</li>
<li><strong>MicroSD lambat</strong> → uji dengan:<pre><code class="language-bash">sudo hdparm -tT /dev/mmcblk0
</code></pre>
</li>
</ul>
<hr />

<h2 id="4-aktivasi-fitur-hardware-uno-220">4. Aktivasi Fitur Hardware UNO-220</h2>
<p>Sebelum mengaktifkan fitur hardware UNO-220, pastikan sistem memiliki paket dasar untuk kompilasi dan pengambilan kode sumber. Jalankan perintah berikut untuk menginstal semua dependensi penting:</p>
<pre><code class="language-bash">sudo apt update
sudo apt install -y build-essential git curl device-tree-compiler
</code></pre>
<p>Kloning terlebih dahulu repository yang berisi berkas <em>device tree overlay</em> untuk hardware UNO-220:</p>
<pre><code class="language-bash">git clone --depth=1 https://github.com/kumajaya/uno-220-poe.git
cd uno-220-poe
</code></pre>
<h3 id="41-kompilasi-semua-overlay">4.1 Kompilasi Semua Overlay</h3>
<p>Compile kedua overlay secara berurutan:</p>
<pre><code class="language-bash">sudo dtc -@ -I dts -O dtb dts/i2c-rtc-overlay.dts -o /boot/firmware/current/overlays/i2c-rtc-mod.dtbo
sudo dtc -@ -I dts -O dtb dts/tpm-slb9670-overlay.dts -o /boot/firmware/current/overlays/tpm-slb9670-mod.dtbo
</code></pre>
<blockquote>
<p>I/O Expander TCA9554 gunakan overlay standar <code>pca953x</code>.</p>
</blockquote>
<p><strong>Verifikasi:</strong></p>
<pre><code class="language-bash">ls /boot/firmware/current/overlays/ | grep -E 'i2c-rtc-mod|tpm-slb9670-mod'
</code></pre>
<h3 id="42-update-configtxt">4.2 Update config.txt</h3>
<blockquote>
<p><strong>Catatan:</strong> Editor teks <code>nano</code> digunakan untuk mengedit file konfigurasi di terminal.</p>
<ul>
<li>Gunakan <strong>panah arah</strong> untuk berpindah baris.</li>
<li>Tekan <strong>Ctrl + O</strong> untuk menyimpan, lalu <strong>Enter</strong>, dan <strong>Ctrl + X</strong> untuk keluar.</li>
</ul>
</blockquote>
<p>Edit <code>/boot/firmware/config.txt</code>:</p>
<pre><code class="language-bash">sudo nano /boot/firmware/config.txt
</code></pre>
<p>Tambahkan baris-baris ini di akhir file:</p>
<pre><code># RTC Epson RX-8010
dtoverlay=i2c-rtc-mod,rx8010
# TI TCA9554
dtoverlay=pca953x,addr=0x27
# Infineon TPM SLB9670
dtoverlay=tpm-slb9670-mod,cs=0x00
</code></pre>
<p>Simpan, lalu reboot:</p>
<pre><code class="language-bash">sudo reboot
</code></pre>
<h3 id="43-uji-rtc-epson-rx-8010sj-b">4.3 Uji RTC (Epson RX-8010SJ-B)</h3>
<pre><code class="language-bash">sudo apt install util-linux-extra -y
sudo hwclock -r --verbose
sudo hwclock -w --verbose
timedatectl status
</code></pre>
<h3 id="44-uji-io-expander-ti-tca9554">4.4 Uji I/O Expander (TI TCA9554)</h3>
<p>Uji (hubungkan kabel dari GPIO 0 ke 1 untuk loopback):</p>
<pre><code class="language-bash">sudo apt install gpiod -y
gpiodetect
gpioinfo
gpioset 2 0=0 &amp;&amp; gpioget 2 1  # Off
gpioset 2 0=1 &amp;&amp; gpioget 2 1  # On
</code></pre>
<p><em>Note:</em> Jika ingin mengakses TCA9554 langsung dari Node-RED menggunakan <code>node-red-contrib-tca9554</code>, pastikan driver kernel <code>gpio_pca953x</code> tidak aktif.</p>
<ul>
<li>Untuk akses sementara:<pre><code class="language-bash">sudo modprobe -r gpio_pca953x
</code></pre>
</li>
<li>Untuk menonaktifkan permanen, tambahkan tanda <code>#</code> di depan baris <code>dtoverlay=pca953x,addr=0x27</code> pada <code>/boot/firmware/config.txt</code>.</li>
</ul>
<h3 id="45-uji-trusted-platform-module-slb9670">4.5 Uji Trusted Platform Module (SLB9670)</h3>
<pre><code class="language-bash">sudo apt install tpm2-tools -y
tpm2_getrandom 8 | xxd -p
tpm2_getrandom 16 | xxd -p
tpm2_getrandom 32 | xxd -p
</code></pre>
<h3 id="46-gpio-led-pl1">4.6 GPIO &amp; LED PL1</h3>
<p>Untuk dapat mengendalikan <strong>PL1 GPIO LED</strong> di UNO‑220 dibutuhkan kombinasi konfigurasi <strong>udev rules</strong> + dependensi Python agar Node‑RED dapat melakukan <strong>akses GPIO tanpa hak <code>root</code></strong>.</p>
<ul>
<li>
<p>Tambahkan aturan udev di <code>/etc/udev/rules.d/45-gpio.rules</code>:</p>
<pre><code class="language-udev">KERNEL=="gpiochip*", GROUP="gpio", MODE="0660"
KERNEL=="gpiomem",   GROUP="gpio", MODE="0660"
</code></pre>
<p>Reload rules:</p>
<pre><code class="language-bash">sudo udevadm control --reload-rules &amp;&amp; sudo udevadm trigger
</code></pre>
</li>
<li>
<p>Tambahkan user ke grup <code>gpio</code>:</p>
<pre><code class="language-bash">sudo usermod -aG gpio ubuntu
</code></pre>
</li>
<li>
<p>Install dependensi Python untuk Node‑RED GPIO node:</p>
<pre><code class="language-bash">sudo apt install python3-rpi.gpio -y  # Untuk Node-RED GPIO
</code></pre>
</li>
</ul>
<p>LED <strong>PL1</strong> (GPIO12, pin 32 pada header Raspberry Pi, terhubung ke <code>gpiochip0</code>) dapat dikendalikan via Node‑RED node <code>rpi-gpio out</code>.<br />
Pengujian manual dapat dilakukan dengan perintah:</p>
<pre><code class="language-bash">gpioset 0 12=1   # LED ON
gpioset 0 12=0   # LED OFF
</code></pre>
<h3 id="47-serial-console-rs%E2%80%91232rs%E2%80%91485">4.7 Serial Console (RS‑232/RS‑485)</h3>
<p>UNO‑220 mendukung koneksi fisik RS‑232 dan RS‑485 yang dipetakan ke <code>/dev/ttyS0</code>. Secara default, <code>/dev/ttyS0</code> digunakan sebagai <strong>console debug</strong> oleh kernel. Agar port ini dapat digunakan aplikasi lain (misalnya komunikasi dengan perangkat eksternal atau Modbus RTU, termasuk <em>classic</em> DCS), hapus parameter berikut dari <code>/boot/firmware/cmdline.txt</code>:</p>
<pre><code class="language-text">console=serial0,115200
</code></pre>
<p>Simpan perubahan lalu reboot.</p>
<p><strong>Pengujian koneksi serial:</strong></p>
<pre><code class="language-bash">sudo apt install minicom -y
minicom -D /dev/ttyS0 -b 115200
</code></pre>
<p><strong>Troubleshooting Hardware:</strong></p>
<ul>
<li>Jika overlay gagal terpasang:<pre><code class="language-bash">dmesg | grep i2c
i2cdetect -y 1
</code></pre>
</li>
<li>Setelah melakukan perubahan pada <code>config.txt</code>, lakukan reboot agar overlay aktif.</li>
<li>Gunakan <code>ls /boot/firmware/current/overlays/</code> untuk memastikan file <code>.dtbo</code> hasil compile tersedia.</li>
</ul>
<hr />

<h2 id="5-instalasi-zerotier">5. Instalasi ZeroTier</h2>
<p>ZeroTier digunakan untuk menyediakan konektivitas aman antar perangkat tanpa perlu membuka port publik. UNO‑220 akan bergabung ke jaringan virtual ZeroTier dan dapat diakses menggunakan alamat IP internal ZeroTier.</p>
<ol>
<li>
<p><strong>Instalasi Paket</strong></p>
<pre><code class="language-bash">curl -s https://install.zerotier.com | sudo bash
sudo systemctl enable zerotier-one
sudo systemctl start zerotier-one
</code></pre>
<p>Verifikasi instalasi:</p>
<pre><code class="language-bash">zerotier-cli info
</code></pre>
<p>Output normal: <code>200 info &lt;node_id&gt; &lt;version&gt; ONLINE</code></p>
</li>
<li>
<p><strong>Join ke Network</strong></p>
<pre><code class="language-bash">sudo zerotier-cli join &lt;network_id&gt;
</code></pre>
<ul>
<li><code>&lt;network_id&gt;</code> adalah ID jaringan yang sudah dibuat di controller (publik atau self‑hosted).</li>
<li>Cek status:<pre><code class="language-bash">zerotier-cli listnetworks
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>Otorisasi Node</strong></p>
<ul>
<li><strong>Jika menggunakan controller publik (<code>my.zerotier.com</code>)</strong>: login ke dashboard, pilih network, lalu authorize <code>&lt;node_id&gt;</code>.</li>
<li><strong>Jika menggunakan controller self‑hosted</strong>: lakukan otorisasi node melalui web UI atau API controller internal. Pastikan node muncul di daftar anggota network, lalu tandai sebagai authorized.</li>
</ul>
</li>
<li>
<p><strong>Verifikasi Koneksi</strong></p>
<ul>
<li>Cek interface ZeroTier:<pre><code class="language-bash">ip addr show zt*
</code></pre>
</li>
<li>Gunakan IP ZeroTier untuk SSH:<pre><code class="language-bash">ssh ubuntu@&lt;ip_zerotier&gt;
</code></pre>
</li>
<li>Uji konektivitas antar node:<pre><code class="language-bash">ping &lt;ip_zerotier_peer&gt;
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>Catatan Keamanan</strong></p>
<ul>
<li>Gunakan <strong>IP ZeroTier</strong> untuk remote SSH, bukan IP publik.</li>
<li>Pastikan firewall <code>ufw</code> (lihat Bab 10) hanya membuka port yang diperlukan (22, 80, 443, 9993, 1880, 10002, 3000).</li>
<li>ZeroTier menggunakan UDP port 9993; pastikan tidak diblokir di perangkat maupun firewall jaringan.</li>
<li>Untuk self‑hosted controller, pastikan server controller terlindungi dengan TLS/HTTPS dan hanya dapat diakses oleh admin.</li>
</ul>
</li>
<li>
<p><strong>Troubleshooting</strong></p>
<ul>
<li>Jika join gagal:<pre><code class="language-bash">journalctl -u zerotier-one -f
</code></pre>
</li>
<li>Jika node tidak muncul di controller:
<ul>
<li>Pastikan network ID benar.</li>
<li>Pastikan perangkat dapat menjangkau server controller (cek UDP 9993).</li>
</ul>
</li>
<li>Jika IP ZeroTier tidak muncul:<pre><code class="language-bash">sudo systemctl restart zerotier-one
zerotier-cli listnetworks
</code></pre>
</li>
</ul>
</li>
</ol>
<hr />

<h2 id="6-instalasi-node%E2%80%91red">6. Instalasi Node‑RED</h2>
<ol>
<li>
<p><strong>Update sistem</strong></p>
<pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt upgrade -y
</code></pre>
</li>
<li>
<p><strong>Jalankan installer resmi Node‑RED</strong><br />
Script ini akan menghapus instalasi lama, memasang Node.js sesuai versi yang dipilih, menginstal Node‑RED terbaru, serta menyiapkan service systemd.</p>
<p>Pilih Node.js 22 LTS dengan opsi <code>--node22</code> dan tambahkan opsi <code>--pi</code> untuk sekaligus memasang node khusus Raspberry Pi (GPIO, I²C, dsb.):</p>
<pre><code class="language-bash">bash &lt;(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) --confirm-root --node22 --pi
</code></pre>
</li>
<li>
<p><strong>Aktifkan service</strong></p>
<pre><code class="language-bash">sudo systemctl enable nodered.service
sudo systemctl start nodered.service
</code></pre>
</li>
<li>
<p><strong>Akses editor</strong><br />
Buka browser ke alamat:<br />
<code>http://&lt;ip&gt;:1880</code></p>
</li>
</ol>
<h3 id="61-amankan-akses-node%E2%80%91red">6.1 Amankan Akses Node‑RED</h3>
<p>Edit file <code>~/.node-red/settings.js</code>:</p>
<pre><code class="language-js">adminAuth: {
    type: "credentials",
    users: [{
        username: "admin",
        password: "&lt;hash&gt;",
        permissions: "*"
    }]
},
</code></pre>
<p>Untuk mengisi nilai <code>&lt;hash&gt;</code> pada konfigurasi <code>settings.js</code>, jalankan perintah berikut:</p>
<pre><code class="language-bash">node-red admin hash-pw
</code></pre>
<p>Salin hasil hash ke field <code>password</code> pada konfigurasi <code>adminAuth</code>.</p>
<p>Setelah itu, restart service agar perubahan aktif:</p>
<pre><code class="language-bash">sudo systemctl restart nodered.service
</code></pre>
<h3 id="62-aktivasi-logging-untuk-monitoring-io-dan-deteksi-error-hardware">6.2 Aktivasi Logging untuk Monitoring I/O dan Deteksi Error Hardware</h3>
<p>Edit <code>~/.node-red/settings.js</code> untuk mengaktifkan logging detail. Logging ini berguna untuk:</p>
<ul>
<li><strong>Monitoring I/O</strong>: menangkap event GPIO, I²C expander (TCA9554), dan komunikasi serial.</li>
<li><strong>Deteksi error hardware</strong>: misalnya kegagalan RTC (RX‑8010) atau TPM (SLB9670).</li>
<li><strong>Audit</strong>: mencatat perubahan konfigurasi dan akses API.</li>
</ul>
<pre><code class="language-js">logging: {
    console: {
        // Gunakan "info" untuk operasi normal
        // Naikkan ke "debug" saat commissioning
        // Gunakan "trace" hanya untuk troubleshooting detail
        level: "info",   // "debug" untuk detail commissioning, "trace" untuk troubleshooting mendalam
        metrics: true,   // Log node events (receive/send) dan memory usage (monitoring resource hardware)
        audit: true      // Log API access untuk melacak perubahan konfigurasi
    }
}
</code></pre>
<p><strong>Catatan Operasional:</strong></p>
<ul>
<li><strong>Metrics</strong>: mencatat event inject/receive/send, misalnya perubahan status GPIO expander.</li>
<li><strong>Memory logs</strong>: setiap 15 detik, Node‑RED mencatat heap usage. Berguna untuk mendeteksi potensi overload pada RPi4B ARM64.</li>
<li><strong>Level rekomendasi</strong>:
<ul>
<li><code>info</code> → operasi normal (default).</li>
<li><code>debug</code> → commissioning, validasi hardware.</li>
<li><code>trace</code> → troubleshooting detail, gunakan hanya sementara karena log akan sangat besar.</li>
</ul>
</li>
</ul>
<p><strong>Restart service agar konfigurasi aktif:</strong></p>
<pre><code class="language-bash">sudo systemctl restart nodered.service
</code></pre>
<p><strong>Melihat log:</strong></p>
<pre><code class="language-bash">sudo journalctl -u nodered.service -f
# atau
node-red-log
</code></pre>
<p><strong>Filter hardware issues:</strong></p>
<pre><code class="language-bash">sudo journalctl -u nodered.service | grep "error\|I/O"
</code></pre>
<p><strong>Troubleshooting:</strong></p>
<ul>
<li>Jika terjadi error npm terkait memori, jalankan Node‑RED dengan opsi:<pre><code class="language-bash">node-red-pi --max-old-space-size=512
</code></pre>
</li>
<li>Semua log tersimpan di journal systemd, sehingga tetap terintegrasi dengan mekanisme logrotate.</li>
</ul>
<h3 id="63-system-resource-monitoring-cpu-temperature-memory-usage-cpu-load-disk-usage-uptime-dengan-node%E2%80%91red">6.3 System Resource Monitoring (CPU Temperature, Memory Usage, CPU Load, Disk Usage, Uptime) dengan Node‑RED</h3>
<p>Untuk memantau metrik sistem secara real‑time (CPU Temperature, Memory Usage, CPU Load, Disk Usage, Uptime), kita gunakan <strong>exec node</strong> di Node‑RED untuk menjalankan perintah Linux, lalu visualisasikan hasilnya di dashboard dan simpan ke file CSV untuk integrasi dengan Rapid SCADA (lihat 7.2).</p>
<p><strong>Threshold alert yang disarankan:</strong></p>
<ul>
<li>Temperature &gt; 80 °C</li>
<li>CPU Load &gt; 2.0 (1‑min average)</li>
<li>Memory Usage &gt; 80%</li>
<li>Disk Usage &gt; 80%</li>
</ul>
<ol>
<li>
<p><strong>Setup <code>visudo</code> untuk <code>vcgencmd</code></strong><br />
Agar Node‑RED bisa membaca suhu CPU via <code>sudo vcgencmd</code> tanpa prompt password:</p>
<pre><code class="language-bash">sudo visudo
</code></pre>
<p>Tambahkan di akhir:</p>
<pre><code>ubuntu ALL=(ALL) NOPASSWD: /usr/bin/vcgencmd
</code></pre>
<p>Simpan → keluar. Uji:</p>
<pre><code class="language-bash">sudo vcgencmd measure_temp
# contoh output: temp=45.2°C
</code></pre>
</li>
<li>
<p><strong>Instal Node Tambahan</strong><br />
Di editor Node‑RED (<code>http://&lt;ip&gt;:1880</code>), buka <strong>Menu → Manage palette → Install</strong>:</p>
<ul>
<li><code>node-red-dashboard</code> (untuk UI gauge/chart)</li>
</ul>
<p>Restart Node‑RED setelah instalasi.</p>
</li>
<li>
<p><strong>Flow Lengkap</strong><br />
Flow berikut melakukan polling setiap 10 detik, mengeksekusi perintah sistem, menggabungkan hasil, menuliskannya ke CSV, dan menampilkan di dashboard.</p>
<p><strong>Langkah Import:</strong></p>
<ol>
<li>Salin JSON di bawah.</li>
<li>Di Node‑RED editor, pilih <strong>Menu → Import → Clipboard</strong>.</li>
<li>Paste JSON, lalu klik <strong>Import</strong>.</li>
</ol>
<pre><code class="language-json">[{"id":"fe919f4f898a361a","type":"inject","z":"2aa78c88.04da44","name":"Poll 10s","props":[{"p":"payload","v":"","vt":"str"},{"p":"topic","v":"","vt":"str"}],"repeat":"10","once":true,"onceDelay":"5","x":180,"y":240,"wires":[["fca6b8400889d4f3","27f74b0ccf05dca3","231f57b96b131413","450425f381c32b46","01694ddd54ec6a73"]]},{"id":"f1188809e56ab2de","type":"exec","z":"2aa78c88.04da44","command":"nproc --all","addpay":"","append":"","timer":"","winHide":false,"name":"Get CPU Cores","x":400,"y":220,"wires":[["d204093578cae4b4"],[],[]]},{"id":"fca6b8400889d4f3","type":"exec","z":"2aa78c88.04da44","command":"bash -c 'if sudo command -v vcgencmd &gt;/dev/null 2&gt;&amp;1; then sudo vcgencmd measure_temp | grep -o \"[0-9]*\\.[0-9]*\"; else awk \"{printf(\\\"%.1f\\\", \\$1/1000)}\" /sys/class/thermal/thermal_zone0/temp; fi'","addpay":"","append":"","timer":"","winHide":false,"name":"CPU Temp","x":390,"y":100,"wires":[["23fd137e13f7dd24"],[],[]]},{"id":"23fd137e13f7dd24","type":"change","z":"2aa78c88.04da44","name":"Set Topic Temp","rules":[{"t":"set","p":"topic","pt":"msg","to":"Temperature","tot":"str"}],"x":620,"y":100,"wires":[["71d65c821a231f67"]]},{"id":"27f74b0ccf05dca3","type":"exec","z":"2aa78c88.04da44","command":"awk '{print $1}' /proc/loadavg","addpay":"","append":"","timer":"","winHide":false,"name":"CPU Load","x":390,"y":160,"wires":[["a75ecd76131c54e9"],[],[]]},{"id":"a75ecd76131c54e9","type":"change","z":"2aa78c88.04da44","name":"Set Topic Load","rules":[{"t":"set","p":"topic","pt":"msg","to":"Load","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"($number($trim(payload)) ? $number($trim(payload)) : 0) / ($flowContext(\"cpu_cores\") ? $flowContext(\"cpu_cores\") : 4) * 100.0 ~&gt; $round(2)\t","tot":"jsonata"}],"x":620,"y":160,"wires":[["71d65c821a231f67"]]},{"id":"231f57b96b131413","type":"exec","z":"2aa78c88.04da44","command":"free | awk '/Mem/ {printf(\"%.2f\", $3/$2 * 100.0)}'","addpay":"","append":"","timer":"","winHide":false,"name":"Memory Usage","x":400,"y":280,"wires":[["fe468f39b7e6bb81"],[],[]]},{"id":"fe468f39b7e6bb81","type":"change","z":"2aa78c88.04da44","name":"Set Topic Mem","rules":[{"t":"set","p":"topic","pt":"msg","to":"Memory","tot":"str"}],"x":620,"y":280,"wires":[["71d65c821a231f67"]]},{"id":"450425f381c32b46","type":"exec","z":"2aa78c88.04da44","command":"df -h / | awk 'NR==2 {print $5}' | tr -d '%' | awk '{print $1 + 0}'","addpay":"","append":"","timer":"","winHide":false,"name":"Disk Usage","x":390,"y":400,"wires":[["49baac92701386dd"],[],[]]},{"id":"49baac92701386dd","type":"change","z":"2aa78c88.04da44","name":"Set Topic Disk","rules":[{"t":"set","p":"topic","pt":"msg","to":"Disk","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"$trim(payload)","tot":"jsonata"}],"x":620,"y":400,"wires":[["71d65c821a231f67"]]},{"id":"01694ddd54ec6a73","type":"exec","z":"2aa78c88.04da44","command":"awk '{print $1}' /proc/uptime","addpay":"","append":"","timer":"","winHide":false,"name":"Uptime","x":380,"y":340,"wires":[["198a0c0ac2416c0c"],[],[]]},{"id":"198a0c0ac2416c0c","type":"change","z":"2aa78c88.04da44","name":"Set Topic Uptime","rules":[{"t":"set","p":"topic","pt":"msg","to":"Uptime","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"($number($trim(payload)) ? $number($trim(payload)) : 0) / 3600 ~&gt; $round(2)","tot":"jsonata"}],"x":630,"y":340,"wires":[["71d65c821a231f67"]]},{"id":"71d65c821a231f67","type":"join","z":"2aa78c88.04da44","name":"Join Metrics","mode":"manual","build":"object","property":"payload","timeout":"10","count":"5","x":890,"y":260,"wires":[["a7f8cf77487b9a83","891b1b27.c66998","30378886.4cc918","500cb64f.5bd7c8","70e60250.56125c","2280e8e0.31af58","f70a49af60753879","26b5ccd1c2d785e9"]]},{"id":"a7f8cf77487b9a83","type":"function","z":"2aa78c88.04da44","name":"Format CSV","func":"let ts = moment().utc().format('YYYY.MM.DD HH:mm:ss');\nlet p = msg.payload;\nlet row = `${ts},${p.Temperature},${p.Load},${p.Memory},${p.Uptime},${p.Disk}`;\nmsg.payload = row;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[{"var":"moment","module":"moment"}],"x":1130,"y":360,"wires":[["375bd16453cc4dd0"]]},{"id":"375bd16453cc4dd0","type":"file","z":"2aa78c88.04da44","name":"Append CSV","filename":"/home/ubuntu/uno220_stat.csv","filenameType":"str","appendNewline":true,"createDir":true,"overwriteFile":"false","x":1330,"y":360,"wires":[[]]},{"id":"8f5767ef7b5ad18c","type":"change","z":"2aa78c88.04da44","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Timestamp,Temperature,Load,Memory,Uptime,Disk","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1140,"y":400,"wires":[["6aef7d561dd3b777"]]},{"id":"3668be62b36e7593","type":"inject","z":"2aa78c88.04da44","name":"Clear","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":950,"y":400,"wires":[["8f5767ef7b5ad18c"]]},{"id":"6aef7d561dd3b777","type":"file","z":"2aa78c88.04da44","name":"Clear CSV","filename":"/home/ubuntu/uno220_stat.csv","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1330,"y":400,"wires":[[]]},{"id":"891b1b27.c66998","type":"ui_gauge","z":"2aa78c88.04da44","name":"","group":"dafb9311.e6497","order":1,"width":6,"height":4,"gtype":"gage","title":"Temperature","label":"","format":"{{msg.payload.Temperature}}°C","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","diff":false,"className":"","x":1130,"y":120,"wires":[]},{"id":"30378886.4cc918","type":"ui_template","z":"2aa78c88.04da44","group":"dafb9311.e6497","name":"CPU Load","order":3,"width":6,"height":2,"format":"&lt;link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\"&gt;\n&lt;div&gt;\n    &lt;b&gt;CPU Load:&lt;/b&gt;\n    &lt;div class=\"w3-light-grey w3-xlarge w3-border w3-round-medium\"&gt;\n        &lt;div class=\"w3-container w3-green w3-round-medium\" style=\"width:{{msg.payload.Load}}%;color: #000!important;\"&gt;{{msg.payload.Load}}%&lt;/div&gt;\n    &lt;/div&gt;\n&lt;/div&gt;","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":1130,"y":160,"wires":[[]]},{"id":"500cb64f.5bd7c8","type":"ui_gauge","z":"2aa78c88.04da44","name":"","group":"d597c1ca.fe019","order":1,"width":6,"height":4,"gtype":"gage","title":"Memory Usage","label":"","format":"{{msg.payload.Memory}}%","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","diff":false,"className":"","x":1140,"y":200,"wires":[]},{"id":"70e60250.56125c","type":"ui_text","z":"2aa78c88.04da44","group":"d597c1ca.fe019","order":2,"width":6,"height":1,"name":"","label":"Uptime","format":"{{msg.payload.Uptime}}hour(s)","layout":"row-center","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1120,"y":240,"wires":[]},{"id":"2280e8e0.31af58","type":"ui_template","z":"2aa78c88.04da44","group":"d597c1ca.fe019","name":"Disk Usage","order":3,"width":6,"height":2,"format":"&lt;link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\"&gt;\n&lt;div&gt;\n    &lt;b&gt;Disk Usage:&lt;/b&gt;\n    &lt;div class=\"w3-light-grey w3-xlarge w3-border w3-round-medium\"&gt;\n        &lt;div class=\"w3-container w3-green w3-round-medium\" style=\"width:{{msg.payload.Disk}}%;color: #000!important;\"&gt;{{msg.payload.Disk}}%&lt;/div&gt;\n    &lt;/div&gt;\n&lt;/div&gt;","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":1130,"y":320,"wires":[[]]},{"id":"d204093578cae4b4","type":"change","z":"2aa78c88.04da44","name":"Store Cores","rules":[{"t":"set","p":"cpu_cores","pt":"flow","to":"$number($trim(payload)) ? $number($trim(payload)) : 4","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":220,"wires":[[]]},{"id":"ebf66d26260831f1","type":"inject","z":"2aa78c88.04da44","name":"Init 3s","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"3","topic":"","payload":"","payloadType":"str","x":190,"y":180,"wires":[["f1188809e56ab2de"]]},{"id":"f70a49af60753879","type":"debug","z":"2aa78c88.04da44","name":"Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1110,"y":80,"wires":[]},{"id":"26b5ccd1c2d785e9","type":"ui_template","z":"2aa78c88.04da44","group":"dafb9311.e6497","name":"Spacer","order":2,"width":0,"height":0,"format":"&lt;link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\"&gt;\n&lt;div&gt;\n&lt;/div&gt;","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":1120,"y":280,"wires":[[]]},{"id":"dafb9311.e6497","type":"ui_group","name":"Temperature Group","tab":"d7c34f92.385aa","order":1,"disp":false,"width":6,"collapse":false,"className":""},{"id":"d597c1ca.fe019","type":"ui_group","name":"Memory Group","tab":"d7c34f92.385aa","order":2,"disp":false,"width":6,"collapse":false,"className":""},{"id":"d7c34f92.385aa","type":"ui_tab","name":"UNO-220","icon":"dashboard","disabled":false,"hidden":false},{"id":"11c630d0f7478e8b","type":"global-config","env":[],"modules":{"node-red-dashboard":"3.6.6"}}]
</code></pre>
</li>
<li>
<p><strong>Penjelasan Flow</strong></p>
<ul>
<li><strong>Inject node</strong>: trigger setiap 10 detik.</li>
<li><strong>Exec nodes</strong>: jalankan perintah Linux untuk ambil metrik.</li>
<li><strong>Join node</strong>: gabungkan hasil menjadi satu objek (<code>msg.payload.Temperature</code>, <code>Load</code>, <code>Memory</code>, <code>Disk</code>, <code>Uptime</code>).</li>
<li><strong>Function node</strong>: format ke CSV dengan timestamp UTC ISO 8601 seperti yang diharapkan Rapid SCADA.</li>
<li><strong>File node</strong>: append ke <code>/home/ubuntu/uno220_stat.csv</code>.</li>
<li><strong>Dashboard nodes</strong>: gauge untuk Temp, Load, Memory, Disk; text untuk Uptime.</li>
</ul>
<p><strong>Catatan:</strong> File CSV berfungsi sebagai buffer sementara, sedangkan trending historis sepenuhnya ditangani oleh Rapid SCADA.</p>
</li>
<li>
<p><strong>Akses Dashboard</strong><br />
Buka:<br />
<code>http://&lt;ip&gt;:1880/ui</code></p>
</li>
<li>
<p><strong>Troubleshooting</strong></p>
<ul>
<li>Jika <code>vcgencmd</code> tidak tersedia di Ubuntu, flow otomatis fallback ke <code>/sys/class/thermal/thermal_zone0/temp</code>.</li>
<li>Jika <code>join</code> timeout, naikkan <code>timeout</code> ke 15 detik.</li>
<li>Cek hasil CSV:<pre><code class="language-bash">tail -f /home/ubuntu/uno220_stat.csv
</code></pre>
</li>
</ul>
</li>
</ol>
<h3 id="64-indikator-heartbeat-led-pl1-dengan-node%E2%80%91red">6.4 Indikator Heartbeat LED PL1 dengan Node‑RED</h3>
<p>Untuk memastikan Node‑RED service aktif sekaligus memverifikasi sistem operasi berjalan normal, LED PL1 pada UNO‑220 dapat digunakan sebagai indikator heartbeat dengan pola berkedip periodik.</p>
<ol>
<li>
<p><strong>Flow Lengkap</strong><br />
Flow berikut mengendalikan LED PL1 (GPIO12, pin 32) agar berkedip dengan siklus penuh: 2 detik ON dan 2 detik OFF. Langkah import sama seperti JSON monitoring pada seksi 6.3.</p>
<pre><code class="language-json">[{"id":"659d98c5338c2aa4","type":"inject","z":"2aa78c88.04da44","name":"Blink Trigger","props":[{"p":"payload"}],"repeat":"2","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":200,"y":480,"wires":[["5a0f6bca78144bc7"]]},{"id":"5a0f6bca78144bc7","type":"delay","z":"2aa78c88.04da44","name":"1s Delay","pauseType":"rate","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":400,"y":480,"wires":[["ca0e3b91a72ed37c"]]},{"id":"ca0e3b91a72ed37c","type":"change","z":"2aa78c88.04da44","name":"Toggle LED State (0/1)","rules":[{"t":"set","p":"payload","pt":"msg","to":"$number($not($flowContext(\"led_state\") ? $flowContext(\"led_state\") : 0))","tot":"jsonata"},{"t":"set","p":"led_state","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":620,"y":480,"wires":[["c23f25c34982533f"]]},{"id":"c23f25c34982533f","type":"rpi-gpio out","z":"2aa78c88.04da44","name":"LED PL1 Output","pin":"12","set":"","level":"msg.payload","freq":"","out":"out","bcm":true,"x":860,"y":480,"wires":[]},{"id":"b1892e385a988550","type":"global-config","env":[],"modules":{"node-red-node-pi-gpio":"2.0.6"}}]
</code></pre>
</li>
<li>
<p><strong>Penjelasan Flow</strong></p>
<ul>
<li><strong>Inject node</strong>: memicu alur setiap 2 detik.</li>
<li><strong>Delay node</strong>: menahan pesan 1 detik untuk menjaga pola stabil.</li>
<li><strong>Change node</strong>: membalik nilai 0/1 dengan menyimpan status terakhir di flow context <code>led_state</code>.</li>
<li><strong>rpi-gpio out</strong>: mengirim nilai 0/1 ke GPIO12 (pin 32), yang terhubung ke LED PL1.</li>
</ul>
</li>
<li>
<p><strong>Hasil</strong><br />
LED PL1 berkedip dengan siklus penuh: 2 detik ON dan 2 detik OFF, menandakan  Node‑RED dan sistem operasi berjalan normal. Pola blink dapat diubah (misalnya ON 200 ms, OFF 800 ms) dengan menyesuaikan konfigurasi inject/delay.</p>
</li>
<li>
<p><strong>Troubleshooting</strong></p>
<ul>
<li><strong>LED tidak berkedip:</strong> Pastikan udev rules dan grup gpio aktif (lihat 4.5), lalu uji manual:
<ul>
<li>gpioset 0 12=1 → LED ON</li>
<li>gpioset 0 12=0 → LED OFF</li>
</ul>
</li>
<li><strong>Izin Node‑RED GPIO:</strong> Pastikan paket python3‑rpi.gpio terpasang dan user service Node‑RED termasuk grup gpio.</li>
<li><strong>Mapping pin:</strong> Verifikasi GPIO12 berada di gpiochip0 dan terhubung ke PL1:</li>
<li>gpioinfo | grep -E "gpiochip0|BCM12"</li>
</ul>
</li>
</ol>
<hr />

<h2 id="7-instalasi-rapid-scada-643-nginx">7. Instalasi Rapid SCADA 6.4.3 &amp; Nginx</h2>
<p>Di era integrasi OT–IT, <strong>OPC UA telah menjadi de facto standar komunikasi industri modern</strong>, terutama saat sistem perlu terhubung dengan <strong>MES, ERP, maupun platform IIoT</strong>.</p>
<p>Dalam konteks ini, <strong>Rapid SCADA tidak hanya berfungsi sebagai SCADA tradisional</strong>, tetapi juga sebagai <strong>data concentrator</strong> yang mengekspor seluruh tag dari berbagai driver (Modbus, SNMP, CSV, MQTT, dll.) melalui <strong>OPC UA Gateway</strong>. Dengan begitu, sistem eksternal seperti PLC, DCS, Historian, atau Grafana dapat langsung mengakses data tanpa perlu memahami protokol aslinya.</p>
<p>Kombinasi berikut membentuk <strong>arsitektur edge yang ideal dan future‑proof</strong>:</p>
<ul>
<li><strong>Rapid SCADA</strong> → data concentrator &amp; middleware OT–IT</li>
<li><strong>OPC UA</strong> → standar komunikasi universal</li>
<li><strong>Node‑RED</strong> → logika automasi &amp; integrasi fleksibel</li>
<li><strong>Grafana</strong> → visualisasi modern dan analitik real‑time</li>
</ul>
<h3 id="71-net-80-runtime">7.1 .NET 8.0 Runtime</h3>
<p>Rapid SCADA 6.4.3 membutuhkan <strong>ASP.NET Core Runtime 8.0.x</strong>.<br />
Instalasi di Ubuntu 25.10 ARM64:</p>
<pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt install -y aspnetcore-runtime-8.0
dotnet --info   # pastikan versi 8.0.x tampil
</code></pre>
<h3 id="72-rapid-scada">7.2 Rapid SCADA</h3>
<h4 id="opsi-a-%E2%80%93-instalasi-via-paket-deb-disarankan">Opsi A – Instalasi via Paket <code>.deb</code> (disarankan)</h4>
<ol>
<li>Unduh dan ekstrak paket ZIP resmi:<pre><code class="language-bash">mkdir -p /home/ubuntu/scada
cd /home/ubuntu/scada
wget https://rapidscada.org/download/https://rapidscada.org/download/rapidscada_6.4.3_linux_en.zip
unzip rapidscada_6.4.3_linux_en.zip -d scada
cd scada
</code></pre>
</li>
<li>Instal paket <code>.deb</code>:<pre><code class="language-bash">sudo dpkg -i rapidscada_6.4.3-1_all.deb
</code></pre>
</li>
<li>Aktifkan dan jalankan service:<pre><code class="language-bash">sudo systemctl enable scadaagent6 scadaserver6 scadacomm6 scadaweb6
sudo systemctl start scadaagent6 scadaserver6 scadacomm6 scadaweb6
</code></pre>
</li>
</ol>
<h4 id="opsi-b-%E2%80%93-instalasi-manual-opsional">Opsi B – Instalasi Manual (opsional)</h4>
<p>Digunakan jika <code>.deb</code> gagal atau butuh kustomisasi.</p>
<pre><code class="language-bash">sudo cp -r scada/* /opt/scada/
sudo chmod +x /opt/scada/make_executable.sh
sudo /opt/scada/make_executable.sh
sudo cp daemons/* /etc/systemd/system/
sudo systemctl enable scadaagent6 scadaserver6 scadacomm6 scadaweb6
sudo systemctl start scadaagent6 scadaserver6 scadacomm6 scadaweb6
</code></pre>
<h4 id="catatan-integrasi-system-resource-monitoring">Catatan Integrasi System Resource Monitoring</h4>
<ul>
<li>Driver: <strong>CSV Reader</strong></li>
<li>DecimalSeparator: <code>.</code></li>
<li>DemoPeriod: <code>OneHour</code></li>
<li>FieldDelimiter: <code>FieldDelimiter</code></li>
<li>FileName: <code>/home/ubuntu/uno220_stat.csv</code></li>
<li>ReadMode: <code>RealTime</code></li>
<li>TagCount: <code>5</code></li>
<li>Map kolom → tag: <code>Timestamp</code>, <code>Temperature</code>, <code>Load</code>, <code>Memory</code>, <code>Uptime</code>, <code>Disk</code></li>
</ul>
<h3 id="73-ram-drive-untuk-log">7.3 RAM Drive untuk Log</h3>
<pre><code class="language-bash">sudo mkdir /var/log/scada
sudo cp /etc/fstab /etc/fstab.bak
echo "tmpfs /var/log/scada tmpfs defaults,noatime,size=100m,mode=1777 0 0" | sudo tee -a /etc/fstab
sudo mount -a
</code></pre>
<h3 id="74-nginx-reverse-proxy">7.4 Nginx Reverse Proxy</h3>
<p>Instalasi:</p>
<pre><code class="language-bash">sudo apt install nginx -y
sudo systemctl enable nginx
</code></pre>
<p>Salin konfigurasi bawaan:</p>
<pre><code class="language-bash">sudo cp /home/ubuntu/scada/scada/nginx/default /etc/nginx/sites-available/scada
sudo ln -s /etc/nginx/sites-available/scada /etc/nginx/sites-enabled/
</code></pre>
<p>Validasi &amp; restart:</p>
<pre><code class="language-bash">sudo nginx -t
sudo systemctl restart nginx
</code></pre>
<p><strong>SSL:</strong></p>
<ul>
<li>Self‑signed:<pre><code class="language-bash">sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt
</code></pre>
</li>
<li>Produksi: gunakan Let’s Encrypt (<code>sudo certbot --nginx</code>).</li>
</ul>
<h3 id="75-keamanan">7.5 Keamanan</h3>
<ul>
<li>Gunakan <strong>UFW</strong> untuk membatasi akses port ScadaAgent (10002) hanya dari jaringan ZeroTier agar remote programming tetap aman:<pre><code class="language-bash">sudo ufw allow from &lt;zerotier_subnet&gt; to any port 10002 proto tcp comment 'Rapid SCADA Agent'
</code></pre>
</li>
<li>Jangan buka port 10002 ke publik (WAN).</li>
</ul>
<h3 id="76-verifikasi">7.6 Verifikasi</h3>
<p>Cek status service:</p>
<pre><code class="language-bash">systemctl status scadaserver6 scadacomm6 scadaweb6
</code></pre>
<p>Akses web:</p>
<ul>
<li><code>http://&lt;ip_zerotier&gt;</code> atau <code>https://&lt;ip_zerotier&gt;</code></li>
<li>Login default: <strong>admin / scada</strong></li>
</ul>
<hr />

<h2 id="8-instalasi-modbus-tcp-to-rtu-gateway">8. Instalasi Modbus TCP to RTU Gateway</h2>
<p><code>mbusd</code> memungkinkan UNO‑220 menjembatani perangkat Modbus RTU (RS‑232/RS‑485) ke Modbus TCP server. Dengan ini, Node‑RED maupun Rapid SCADA bisa membaca data RTU melalui TCP port 502.</p>
<ol>
<li>
<p><strong>Instalasi</strong></p>
<pre><code class="language-bash">sudo apt update
sudo apt install -y build-essential git cmake
git clone https://github.com/3cky/mbusd.git
cd mbusd
mkdir build &amp;&amp; cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
sudo make install
</code></pre>
</li>
<li>
<p><strong>Konfigurasi</strong><br />
Buat file <code>/etc/mbusd/mbusd-ttyS0.conf</code>:</p>
<pre><code>device   = /dev/ttyS0
speed    = 9600
mode     = 8N1
rs485    = yes
address  = 0.0.0.0
port     = 502
maxconn  = 32
retries  = 3
pause    = 100
wait     = 500
timeout  = 60
logfile  = /var/log/mbusd.log
verbosity = 2
</code></pre>
</li>
<li>
<p><strong>Jalankan sebagai service</strong></p>
<pre><code class="language-bash">sudo systemctl start mbusd@ttyS0.service
sudo systemctl enable mbusd@ttyS0.service
sudo systemctl status mbusd@ttyS0.service
</code></pre>
</li>
<li>
<p><strong>Uji koneksi</strong><br />
Dari host lain:</p>
<pre><code class="language-bash">modpoll -m tcp -t 3 -r 1 -c 10 &lt;ip_uno220&gt;
</code></pre>
<p>→ Harus mendapat respons register dari slave RTU.</p>
</li>
<li>
<p><strong>Integrasi</strong></p>
<ul>
<li><strong>Node‑RED</strong>: gunakan node <code>node-red-contrib-modbus</code> → Modbus TCP client ke <code>tcp://&lt;ip_uno220&gt;:502</code>.</li>
<li><strong>Rapid SCADA</strong>: tambahkan channel Modbus TCP pointing ke UNO‑220.</li>
</ul>
</li>
<li>
<p><strong>Keamanan</strong></p>
<ul>
<li>Gunakan <strong>UFW</strong> untuk membatasi akses port Modbus TCP (502) hanya dari jaringan ZeroTier:<pre><code class="language-bash">sudo ufw allow from &lt;zerotier_subnet&gt; to any port 502 proto tcp comment 'Modbus TCP'
</code></pre>
</li>
<li>Jangan buka port 502 ke publik (WAN).</li>
</ul>
</li>
</ol>
<hr />

<h2 id="9-instalasi-scada-grafana-proxy">9. Instalasi Scada Grafana Proxy</h2>
<p><code>scada-grafana-proxy</code> adalah server proxy ringan berbasis Node.js yang:</p>
<ul>
<li>Mengambil data dari <strong>Rapid SCADA 6</strong> maupun <strong>Rapid SCADA 5</strong> via REST API.</li>
<li>Mengubah format respons menjadi seragam dan kompatibel dengan <strong>Grafana Infinity Datasource</strong>.</li>
<li>Menyediakan <strong>Basic Authentication</strong> untuk keamanan.</li>
<li>Mendukung konfigurasi berbasis environment (<code>.env</code>).</li>
<li>Menyediakan <strong>health check endpoint</strong> untuk monitoring.</li>
</ul>
<ol start="2">
<li>
<p><strong>Instalasi</strong></p>
<pre><code class="language-bash"># Clone repo
git clone https://github.com/kumajaya/scada-grafana-proxy.git
cd scada-grafana-proxy

# Install dependensi
npm install
</code></pre>
</li>
<li>
<p><strong>Konfigurasi</strong><br />
Salin contoh environment:</p>
<pre><code class="language-bash">cp env-example .env
nano .env
</code></pre>
<p>Isi variabel sesuai kebutuhan, misalnya:</p>
<pre><code>PROXY_PORT=3000
PROXY_USER=admin
PROXY_PASS=admin
SCADA_BASE_URL=http://localhost:10008
SCADA_USERNAME=admin
SCADA_PASSWORD=admin
SCADA_ARCHIVEBIT_THRESHOLD=24
SCADA5_BASE_URL=http://localhost/grafanadataprovider
</code></pre>
</li>
<li>
<p><strong>Jalankan</strong></p>
<pre><code class="language-bash">npm start
</code></pre>
<p>Akses proxy di:<br />
<code>http://&lt;ip_uno220&gt;:3000</code></p>
</li>
<li>
<p><strong>Systemd Service</strong><br />
File <code>scada-grafana-proxy.service</code> sudah disediakan. Install:</p>
<pre><code class="language-bash">sudo cp scada-grafana-proxy.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable scada-grafana-proxy
sudo systemctl start scada-grafana-proxy
</code></pre>
<p>Cek status:</p>
<pre><code class="language-bash">systemctl status scada-grafana-proxy
</code></pre>
<p>Uji health check:</p>
<pre><code class="language-bash">curl -u admin:admin http://&lt;ip_uno220&gt;:3000/health
</code></pre>
</li>
<li>
<p><strong>Integrasi dengan Grafana</strong></p>
<ul>
<li>Tambahkan <strong>Infinity Datasource</strong> di Grafana.</li>
<li>Atur URL ke <code>http://&lt;ip_uno220&gt;:3000</code>.</li>
<li>Gunakan Basic Auth sesuai <code>.env</code>.</li>
<li>Query data Rapid SCADA langsung dari Grafana dashboard.</li>
</ul>
</li>
<li>
<p><strong>Keamanan</strong></p>
<ul>
<li>Gunakan <strong>UFW</strong> untuk membatasi akses port 3000 hanya dari host Grafana:<pre><code class="language-bash">sudo ufw allow from &lt;ip_grafana&gt; to any port 3000 proto tcp comment 'SCADA Grafana Proxy'
</code></pre>
</li>
<li>Jika Grafana berjalan di server terpisah, gunakan <strong>ZeroTier</strong> agar komunikasi tetap terenkripsi.</li>
</ul>
</li>
</ol>
<p>Dengan penambahan ini, UNO‑220 berevolusi dari sekadar gateway dan server SCADA menjadi <strong>penyedia data terintegrasi untuk Grafana maupun ERP</strong>. Membawa visibilitas real‑time melalui dashboard modern dan tinjauan histori kinerja secara komprehensif, sementara sistem ERP menerima aliran data SCADA yang sudah dinormalisasi. Alur ini tidak hanya memperkaya analitik dan pengambilan keputusan, tetapi juga memastikan integrasi berlangsung dengan cara yang <strong>aman, konsisten, dan mudah</strong>.</p>
<hr />

<h2 id="10-hardening-optimisasi">10. Hardening &amp; Optimisasi</h2>
<h3 id="101-ssh-secure-shell">10.1 SSH (Secure Shell)</h3>
<blockquote>
<p><strong>PERINGATAN: Risiko Penguncian Akses Permanen</strong><br />
Mengaktifkan autentikasi berbasis kunci SSH meningkatkan keamanan, tetapi juga meniadakan akses melalui password. Jika kunci privat hilang, perangkat tidak dapat diakses kembali tanpa koneksi fisik ke serial console.<br />
Pastikan autentikasi menggunakan <code>PubkeyAuthentication</code> telah diuji dan berfungsi dengan baik <strong>sebelum</strong> menonaktifkan <code>PasswordAuthentication</code>.</p>
</blockquote>
<ol>
<li>
<p><strong>Generate Key di Host Admin</strong></p>
<ul>
<li>Linux:<pre><code class="language-bash">ssh-keygen -t ed25519 -C "admin@uno220"
</code></pre>
</li>
<li>Windows (PowerShell, OpenSSH bawaan):<pre><code class="language-powershell">ssh-keygen -t ed25519 -C "admin@uno220"
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>Copy Public Key ke UNO‑220</strong></p>
<ul>
<li>Linux:<pre><code class="language-bash">ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@&lt;ip_zerotier&gt;
</code></pre>
</li>
<li>Windows PowerShell:<pre><code class="language-powershell">type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh ubuntu@&lt;ip_zerotier&gt; "mkdir -p ~/.ssh &amp;&amp; cat &gt;&gt; ~/.ssh/authorized_keys"
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>Uji Login Key‑Based</strong></p>
<pre><code class="language-bash">ssh ubuntu@&lt;ip_zerotier&gt;
</code></pre>
<p>→ Harus langsung masuk tanpa password.</p>
</li>
<li>
<p><strong>Aktifkan Hardening SSH</strong> (setelah uji berhasil)<br />
Edit <code>/etc/ssh/sshd_config</code>:</p>
<pre><code>PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
</code></pre>
<p>Restart:</p>
<pre><code class="language-bash">sudo systemctl restart ssh
</code></pre>
</li>
</ol>
<h3 id="102-firewall-ufw">10.2 Firewall (UFW)</h3>
<blockquote>
<p><strong>PERINGATAN: Risiko Kehilangan Akses Remote</strong><br />
Aturan firewall yang terlalu ketat dapat memblokir port penting seperti <strong>ZeroTier (9993/UDP)</strong> atau <strong>SSH (22/TCP)</strong>. Jika port ini tertutup, perangkat tidak dapat diakses dari jarak jauh, dan pemulihan hanya dapat dilakukan melalui <strong>serial console fisik</strong>.<br />
Pastikan konfigurasi <code>ufw</code> telah diuji dengan hati-hati sebelum menerapkan aturan baru secara permanen.</p>
</blockquote>
<p>Konfigurasi dasar:</p>
<pre><code class="language-bash">sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh/tcp      # Port 22
sudo ufw allow 80/tcp       # Nginx HTTP
sudo ufw allow 443/tcp      # Nginx HTTPS
sudo ufw allow 9993/udp comment 'ZeroTier'
sudo ufw allow 1880/tcp comment 'Node-RED'
sudo ufw allow from &lt;zerotier_subnet&gt; to any port 10002 proto tcp comment 'Rapid SCADA Agent'
sudo ufw allow from &lt;zerotier_subnet&gt; to any port 3000 proto tcp comment 'SCADA Grafana Proxy'
sudo ufw enable
</code></pre>
<p>Verifikasi port terbuka:</p>
<pre><code class="language-bash">sudo ss -tuln
</code></pre>
<p>→ Hanya 22, 80, 443, 9993, 1880, 10002, 3000 yang aktif.</p>
<h3 id="103-fail2ban-proteksi-ssh">10.3 Fail2Ban (Proteksi SSH)</h3>
<blockquote>
<p><strong>PERINGATAN: Hindari Penguncian Akses Sendiri</strong><br />
Mekanisme ini melindungi perangkat dari serangan <em>brute-force</em> pada SSH, namun berisiko memblokir <strong>IP admin atau tim</strong> jika terjadi beberapa kali kegagalan login beruntun. Akibatnya, akses remote dapat terputus sementara (default 10 menit).<br />
Pastikan alamat IP tepercaya dimasukkan ke daftar pengecualian sebelum fitur ini diaktifkan di lingkungan produksi.</p>
</blockquote>
<ol>
<li>Instalasi:<pre><code class="language-bash">sudo apt install fail2ban -y
</code></pre>
</li>
<li>Konfigurasi <code>/etc/fail2ban/jail.local</code>:<pre><code>[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
</code></pre>
Tambahkan <code>ignoreip = 127.0.0.1/8 &lt;your_ip&gt;</code> untuk whitelist.</li>
<li>Restart:<pre><code class="language-bash">sudo systemctl restart fail2ban
</code></pre>
</li>
<li>Verifikasi:<pre><code class="language-bash">sudo fail2ban-client status sshd
</code></pre>
</li>
</ol>
<h3 id="104-auto-security-updates">10.4 Auto Security Updates</h3>
<blockquote>
<p><strong>PERINGATAN: Keseimbangan antara Keamanan dan Stabilitas</strong><br />
Menahan (<em>hold</em>) kernel mencegah pembaruan otomatis yang dapat memicu reboot tak terjadwal, menjaga <strong>uptime</strong> sistem industri tetap stabil. Namun, risiko muncul jika kernel tertahan terlalu lama: perangkat dapat kehilangan patch keamanan penting.<br />
Lakukan pemantauan manual terhadap rilis kernel baru dan lakukan pembaruan terencana bila tersedia pembaruan kritis.</p>
</blockquote>
<ol>
<li>Instalasi:<pre><code class="language-bash">sudo apt install unattended-upgrades -y
</code></pre>
</li>
<li>Enable:<pre><code class="language-bash">sudo dpkg-reconfigure unattended-upgrades
</code></pre>
Pilih <strong>Yes</strong>.</li>
<li>Edit <code>/etc/apt/apt.conf.d/50unattended-upgrades</code> → pastikan baris berikut aktif:<pre><code>Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};
</code></pre>
</li>
<li>Uji:<pre><code class="language-bash">sudo unattended-upgrades --dry-run
</code></pre>
</li>
<li>Untuk mencegah upgrade kernel otomatis yang memerlukan reboot, jalankan:<pre><code class="language-bash">sudo apt-mark hold linux-image-* raspberrypi-kernel
</code></pre>
</li>
</ol>
<h3 id="105-sinkronisasi-rtc-real-time-clock">10.5 Sinkronisasi RTC (Real-Time Clock)</h3>
<ul>
<li>Pastikan NTP aktif:<pre><code class="language-bash">timedatectl status
</code></pre>
</li>
<li>Tambahkan cron job:<pre><code class="language-bash">sudo crontab -e
</code></pre>
Isi:<pre><code>@daily /usr/sbin/hwclock -w &amp;&amp; logger "RTC updated from system clock"
@reboot /usr/sbin/hwclock -s &amp;&amp; logger "System clock initialized from RTC"
</code></pre>
</li>
<li>Uji manual:<pre><code class="language-bash">sudo hwclock -s &amp;&amp; hwclock -r
</code></pre>
</li>
</ul>
<h3 id="106-disable-unused-services">10.6 Disable Unused Services</h3>
<p>Matikan service yang tidak diperlukan:</p>
<pre><code class="language-bash">sudo systemctl disable bluetooth avahi-daemon
</code></pre>
<h3 id="107-disable-usb-boot-optional-keamanan-fisik-untuk-lapangan-rentan">10.7 Disable USB Boot (Optional, Keamanan Fisik untuk Lapangan Rentan)</h3>
<blockquote>
<p><strong>PERINGATAN: Risiko Gagal Boot Permanen</strong><br />
Langkah ini meningkatkan <strong>keamanan fisik</strong> dengan membatasi jalur boot hanya dari kartu SD. Namun, konfigurasi EEPROM yang salah dapat menyebabkan <strong>kegagalan boot total</strong>.<br />
Pemulihan memerlukan <strong>akses fisik langsung</strong> dan <strong>flashing ulang bootloader</strong> menggunakan Raspberry Pi Imager.</p>
</blockquote>
<p>Disarankan untuk selalu menyertakan SD card dalam urutan BOOT_ORDER. Hal ini untuk memastikan dapat melakukan recovery dengan mudah menggunakan image rescue di microSD, jika konfigurasi boot lain gagal.</p>
<p>Untuk mencegah perangkat <strong>boot dari USB eksternal</strong> (risiko tampering di lapangan), lakukan konfigurasi EEPROM bootloader agar hanya mengizinkan boot dari microSD.</p>
<ol>
<li>
<p><strong>Install tool EEPROM</strong></p>
<pre><code class="language-bash">sudo apt install rpi-eeprom -y
</code></pre>
</li>
<li>
<p><strong>Edit konfigurasi EEPROM</strong></p>
<pre><code class="language-bash">sudo rpi-eeprom-config --edit
</code></pre>
<p>Ubah atau tambahkan baris:</p>
<pre><code class="language-ini">BOOT_ORDER=0xf41
</code></pre>
<ul>
<li><code>0xF41</code> → SD → USB → ulangi (default modern Pi, aman karena SD tetap ada).</li>
<li><code>0xF0</code>  → hanya SD card (paling ketat, tanpa fallback).</li>
</ul>
<p>Simpan dan keluar dari editor.</p>
</li>
<li>
<p><strong>Update EEPROM &amp; reboot</strong></p>
<pre><code class="language-bash">sudo rpi-eeprom-update -a
sudo reboot
</code></pre>
</li>
<li>
<p><strong>Verifikasi konfigurasi</strong></p>
<pre><code class="language-bash">sudo vcgencmd bootloader_config | grep BOOT_ORDER
</code></pre>
<p>Output harus menampilkan <code>0xF41</code> atau <code>0xF0</code>.</p>
</li>
</ol>
<p><strong>Contoh nilai BOOT_ORDER umum:</strong></p>
<table>
<thead>
<tr>
<th>Nilai</th>
<th>Urutan Boot</th>
<th>Catatan</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0xF41</code></td>
<td>SD → USB → ulangi</td>
<td>Default modern Pi, aman</td>
</tr>
<tr>
<td><code>0xF14</code></td>
<td>USB → SD → ulangi</td>
<td>Masih aman, SD tetap ada</td>
</tr>
<tr>
<td><code>0xF461</code></td>
<td>SD → NVMe → USB → ulangi</td>
<td>Cocok untuk CM4/Pi 5 dengan SSD</td>
</tr>
<tr>
<td><code>0xF21</code></td>
<td>SD → Network (TFTP) → ulangi</td>
<td>Aman untuk network boot, SD tetap ada</td>
</tr>
<tr>
<td><code>0xF0</code></td>
<td>SD only</td>
<td>Paling ketat, tanpa fallback</td>
</tr>
</tbody>
</table>
<p><strong>Catatan:</strong></p>
<ul>
<li>Gunakan microSD industrial‑grade, karena setelah USB boot dinonaktifkan, recovery hanya bisa dilakukan via <strong>Raspberry Pi Imager</strong> dengan flashing ulang bootloader image.</li>
<li>Jika update EEPROM gagal, fallback ke metode resmi Raspberry Pi Imager untuk restore bootloader.</li>
</ul>
<h3 id="108-verifikasi-hardening">10.8 Verifikasi Hardening</h3>
<ul>
<li>SSH hanya menerima key‑based login:<pre><code class="language-bash">ssh ubuntu@&lt;ip_zerotier&gt;
</code></pre>
</li>
<li>Firewall hanya membuka port yang diizinkan:<pre><code class="language-bash">sudo ss -tuln
</code></pre>
</li>
<li>Fail2Ban aktif:<pre><code class="language-bash">sudo fail2ban-client status sshd
</code></pre>
</li>
<li>Update otomatis aktif:<pre><code class="language-bash">systemctl status unattended-upgrades
</code></pre>
</li>
<li>RTC sinkron:<pre><code class="language-bash">hwclock -r
</code></pre>
</li>
</ul>
<h3 id="109-troubleshooting">10.9 Troubleshooting</h3>
<ul>
<li><strong>Fail2Ban gagal start</strong> → cek log:<pre><code class="language-bash">sudo journalctl -u fail2ban
</code></pre>
</li>
<li><strong>SSH terkunci</strong> → login via ZeroTier console atau akses fisik, lalu aktifkan kembali <code>PasswordAuthentication yes</code> sementara.</li>
<li><strong>UFW blokir ZeroTier</strong> → pastikan <code>sudo ufw allow 9993/udp</code>.</li>
</ul>
<hr />

<h2 id="11-backup-recovery">11. Backup &amp; Recovery</h2>
<h3 id="111-backup-manual">11.1 Backup Manual</h3>
<p><strong>Node‑RED</strong></p>
<pre><code class="language-bash">cd ~/.node-red &amp;&amp; tar czvf nodered_config_backup_$(date +%F).tar.gz flows.json settings.js package.json
</code></pre>
<p><strong>Rapid SCADA</strong></p>
<pre><code class="language-bash">sudo tar czvf scada_backup_$(date +%F).tar.gz /opt/scada /etc/systemd/system/scada*.service
</code></pre>
<p><strong>ZeroTier</strong></p>
<pre><code class="language-bash">sudo tar czvf zerotier_backup_$(date +%F).tar.gz /var/lib/zerotier-one
</code></pre>
<h3 id="112-backup-rutin-otomatis-cron-rsync-ke-usbnas">11.2 Backup Rutin Otomatis (Cron + rsync ke USB/NAS)</h3>
<ol>
<li>
<p><strong>Setup Mount USB/NAS</strong></p>
<ul>
<li>USB:<pre><code class="language-bash">sudo mkdir -p /mnt/usb
sudo mount /dev/sda1 /mnt/usb   # ganti sda1 sesuai device
</code></pre>
</li>
<li>NAS (NFS):<pre><code class="language-bash">sudo mkdir -p /mnt/nas
sudo mount -t nfs &lt;nas_ip&gt;:/share /mnt/nas
</code></pre>
</li>
<li>NAS (SMB/CIFS):<pre><code class="language-bash">sudo mkdir -p /mnt/nas
sudo mount -t cifs //&lt;nas_ip&gt;/share /mnt/nas -o username=user,password=pass
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>Buat Script Backup</strong><br />
Simpan sebagai <code>/usr/local/bin/backup_routine.sh</code>:</p>
<pre><code class="language-bash">#!/bin/bash
set -euo pipefail

DATE="$(date +%Y%m%d_%H%M%S)"
SRC_DIRS="/home/ubuntu/.node-red /var/lib/zerotier-one /etc /home/ubuntu/uno220_stat.csv"
DEST="/mnt/usb/backups"   # atau /mnt/nas/backups
LOG="/var/log/backup.log"
 
if ! mountpoint -q /mnt/usb; then
  echo "$(date) - USB tidak ter-mount, backup dibatalkan" | tee -a "$LOG"
  exit 1
fi

mkdir -p "$DEST/$DATE"
rsync -avz --delete --log-file="$LOG" $SRC_DIRS "$DEST/$DATE"

# Hapus backup &gt;7 hari
find "$DEST" -maxdepth 1 -mindepth 1 -type d -mtime +7 -exec rm -rf {} +

# Mirror khusus Rapid SCADA
mkdir -p /mnt/usb/scada_backup
rsync -av --delete /opt/scada /mnt/usb/scada_backup/
</code></pre>
<p>Buat executable:</p>
<pre><code class="language-bash">sudo chmod +x /usr/local/bin/backup_routine.sh
</code></pre>
</li>
<li>
<p><strong>Jadwalkan Cron Job</strong></p>
<pre><code class="language-bash">sudo crontab -e
</code></pre>
<p>Tambahkan:</p>
<pre><code>0 2 * * * /usr/local/bin/backup_routine.sh   # Harian jam 2 pagi
</code></pre>
<p>Verifikasi:</p>
<pre><code class="language-bash">sudo crontab -l
</code></pre>
<p>Log tersimpan di <code>/var/log/backup.log</code>.</p>
</li>
</ol>
<h3 id="113-log-retention-dengan-logrotate">11.3 Log Retention dengan Logrotate</h3>
<p>Cegah log backup membengkak di microSD.</p>
<ol>
<li>Pastikan logrotate terpasang:<pre><code class="language-bash">sudo apt install logrotate -y
</code></pre>
</li>
<li>Buat config <code>/etc/logrotate.d/backup_logs</code>:<pre><code>/var/log/backup.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
    postrotate
        /usr/bin/killall -q -HUP rsyslogd 2&gt; /dev/null || true
    endscript
}
</code></pre>
</li>
<li>Uji:<pre><code class="language-bash">sudo logrotate -d /etc/logrotate.d/backup_logs
</code></pre>
</li>
<li>Jalankan manual:<pre><code class="language-bash">sudo logrotate -f /etc/logrotate.conf
</code></pre>
</li>
</ol>
<h3 id="114-recovery">11.4 Recovery</h3>
<ul>
<li>
<p><strong>Restore Node‑RED</strong>:</p>
<pre><code class="language-bash">tar xzvf nodered_config_backup_*.tar.gz -C ~/.node-red
</code></pre>
</li>
<li>
<p><strong>Restore Rapid SCADA</strong>:</p>
<pre><code class="language-bash">sudo tar xzvf scada_backup_*.tar.gz -C /
sudo systemctl daemon-reload
sudo systemctl restart scadaagent6 scadaserver6 scadacomm6 scadaweb6
</code></pre>
</li>
<li>
<p><strong>Restore ZeroTier</strong>:</p>
<pre><code class="language-bash">sudo systemctl stop zerotier-one
sudo tar xzvf zerotier_backup_*.tar.gz -C /
sudo systemctl start zerotier-one
</code></pre>
</li>
<li>
<p><strong>Restore dari USB/NAS</strong>:</p>
<pre><code class="language-bash">sudo rsync -avz /mnt/usb/backups/&lt;tanggal&gt;/ /
</code></pre>
</li>
</ul>
<h3 id="115-troubleshooting">11.5 Troubleshooting</h3>
<ul>
<li><strong>rsync gagal ke NAS</strong> → pastikan mount sukses (<code>df -h</code>), gunakan SSH keyless (<code>ssh-keygen &amp;&amp; ssh-copy-id user@nas_ip</code>).</li>
<li><strong>USB tidak terdeteksi</strong> → cek <code>lsblk</code> atau <code>dmesg | grep sd</code>.</li>
<li><strong>Logrotate error permission</strong> → sesuaikan baris <code>create 644 root root</code> di config.</li>
</ul>
<hr />

<h2 id="12-testing-validasi">12. Testing &amp; Validasi</h2>
<h3 id="121-verifikasi-node%E2%80%91red">12.1 Verifikasi Node‑RED</h3>
<pre><code class="language-bash">systemctl status nodered.service
</code></pre>
<ul>
<li>Status harus <code>active (running)</code>.</li>
<li>Akses editor: <code>http://&lt;ip&gt;:1880</code></li>
<li>Akses dashboard: <code>http://&lt;ip&gt;:1880/ui</code></li>
</ul>
<p><strong>Contoh Output:</strong></p>
<pre><code>● nodered.service - Node-RED
     Loaded: loaded (/lib/systemd/system/nodered.service; enabled; preset: enabled)
     Active: active (running) since Tue 2025-10-22 10:00:00 UTC; 2h ago
   Main PID: 1234 (node)
      Tasks: 15 (limit: 4915)
     Memory: 45.2M
        CPU: 1min 23.456s
     CGroup: /system.slice/nodered.service
             └─1234 /usr/bin/node /usr/lib/node_modules/node-red/red.js
</code></pre>
<h3 id="122-verifikasi-rapid-scada">12.2 Verifikasi Rapid SCADA</h3>
<pre><code class="language-bash">systemctl status scadaserver6.service scadacomm6.service scadaweb6.service
</code></pre>
<ul>
<li>Semua service harus <code>active (running)</code>.</li>
<li>Akses web: <code>http://&lt;ip&gt;</code> atau <code>https://&lt;ip&gt;</code></li>
<li>Login default: <strong>admin / scada</strong></li>
</ul>
<h3 id="123-uji-koneksi-zerotier">12.3 Uji Koneksi ZeroTier</h3>
<pre><code class="language-bash">ping &lt;IP_ZeroTier_peer&gt;
</code></pre>
<ul>
<li>Harus ada balasan ICMP.</li>
<li>Jika gagal: cek <code>zerotier-cli listnetworks</code> dan pastikan node authorized.</li>
</ul>
<h3 id="124-uji-hardware">12.4 Uji Hardware</h3>
<ul>
<li>
<p><strong>RTC</strong></p>
<pre><code class="language-bash">hwclock -r
</code></pre>
<p><strong>Contoh Output:</strong></p>
<pre><code>2025-10-22 12:34:56.789012 UTC
</code></pre>
<p>→ Bandingkan dengan <code>date</code> untuk memastikan sinkron.</p>
</li>
<li>
<p><strong>GPIO Expander</strong></p>
<pre><code class="language-bash">gpiodetect
</code></pre>
<p><strong>Contoh Output:</strong></p>
<pre><code>gpiochip0 [pinctrl-bcm2835] (58 lines)
gpiochip1 [raspberrypi-exp-gpio] (8 lines)
gpiochip2 [pca953x] (8 lines, tca9554@27)
</code></pre>
</li>
<li>
<p><strong>LED PL1</strong></p>
<pre><code class="language-bash">gpioset 0 12=1   # LED ON
gpioset 0 12=0   # LED OFF
</code></pre>
</li>
<li>
<p><strong>TPM</strong></p>
<pre><code class="language-bash">tpm2_getrandom 16 | xxd -p
</code></pre>
<p><strong>Contoh Output:</strong></p>
<pre><code>a1b2c3d4e5f6789012345678abcdef90
</code></pre>
</li>
<li>
<p><strong>Serial Port</strong></p>
<pre><code class="language-bash">minicom -D /dev/ttyS0 -b 115200
</code></pre>
<p>→ Pastikan komunikasi serial berjalan.</p>
</li>
</ul>
<h3 id="125-checklist">12.5 Checklist</h3>
<ul>
<li>[ ] Node‑RED dashboard dapat diakses via browser</li>
<li>[ ] Rapid SCADA menampilkan halaman login</li>
<li>[ ] ZeroTier peer dapat saling ping</li>
<li>[ ] RTC terbaca dengan benar (<code>hwclock -r</code>)</li>
<li>[ ] LED PL1 dapat dikendalikan (ON/OFF)</li>
<li>[ ] Port serial berfungsi (<code>minicom</code>)</li>
<li>[ ] Hanya port 22/80/443/9993/1880/10002/3000 terbuka (<code>ss -tuln</code>)</li>
<li>[ ] Fail2Ban aktif (<code>fail2ban-client status sshd</code>)</li>
<li>[ ] Node‑RED logs capture I/O errors (<code>journalctl -u nodered</code>)</li>
<li>[ ] Backup cron berjalan (cek <code>/var/log/backup.log</code>)</li>
<li>[ ] Logrotate config valid (<code>logrotate -d /etc/logrotate.d/backup_logs</code>)</li>
<li>[ ] System metrics dashboard tampil (CPU &lt;80%, RAM &lt;70%, Temp &lt;80°C)</li>
<li>[ ] CSV file update (<code>tail -f uno220_stat.csv</code>) &amp; Rapid SCADA trend visible</li>
</ul>
<h3 id="126-troubleshooting-cepat">12.6 Troubleshooting Cepat</h3>
<ul>
<li><strong>Node‑RED tidak jalan</strong> → cek <code>journalctl -u nodered -f</code></li>
<li><strong>SCADA 502 Bad Gateway</strong> → cek <code>journalctl -u scadaweb6 -f</code></li>
<li><strong>ZeroTier tidak connect</strong> → cek <code>zerotier-cli info</code></li>
<li><strong>RTC error</strong> → pastikan overlay aktif (<code>dmesg | grep rtc</code>)</li>
<li><strong>GPIO/LED gagal</strong> → cek <code>gpioinfo</code> untuk mapping pin</li>
<li><strong>TPM error</strong> → pastikan modul kernel TPM aktif (<code>lsmod | grep tpm</code>)</li>
</ul>
<hr />

<h2 id="13-deployment">13. Deployment</h2>
<ol>
<li>
<p><strong>Penempatan Perangkat</strong></p>
<ul>
<li>Tempatkan UNO‑220 di lokasi lapangan sesuai rencana instalasi.</li>
<li>Pastikan lingkungan sesuai spesifikasi industri (suhu, kelembaban, getaran).</li>
</ul>
</li>
<li>
<p><strong>Koneksi Daya &amp; Jaringan</strong></p>
<ul>
<li>Hubungkan ke catu daya <strong>12–24 VDC</strong> atau <strong>PoE+ (802.3at)</strong>.</li>
<li>Catatan: hindari PoE 802.3af karena tidak stabil saat beban tinggi (Node‑RED + SCADA dapat menarik 15–20W).</li>
</ul>
</li>
<li>
<p><strong>Verifikasi ZeroTier</strong></p>
<ul>
<li>Pastikan device muncul di jaringan ZeroTier:<pre><code class="language-bash">zerotier-cli listnetworks
</code></pre>
</li>
<li>Cek status ONLINE di controller.</li>
</ul>
</li>
<li>
<p><strong>Akses Aplikasi</strong></p>
<ul>
<li>Node‑RED: <code>http://&lt;ip_zerotier&gt;:1880</code></li>
<li>Rapid SCADA: <code>http://&lt;ip_zerotier&gt;</code> atau <code>https://&lt;ip_zerotier&gt;</code></li>
</ul>
</li>
<li>
<p><strong>Validasi Fungsi I/O &amp; Flow</strong></p>
<ul>
<li>Uji dashboard Node‑RED (sensor, GPIO, expander, serial).</li>
<li>Uji trending Rapid SCADA (CSV file update → grafik tampil).</li>
<li>Simulasikan skenario logika industri (misalnya alarm, interlock).</li>
</ul>
</li>
<li>
<p><strong>Label Fisik Unit</strong></p>
<ul>
<li>Tempel label berisi:
<ul>
<li><strong>ID ZeroTier</strong></li>
<li><strong>IP lokal</strong></li>
<li><strong>Tanggal deployment</strong></li>
</ul>
</li>
<li>Gunakan label tahan panas &amp; kelembaban.</li>
</ul>
</li>
<li>
<p><strong>Proteksi Daya</strong></p>
<ul>
<li>Gunakan <strong>UPS mini DC</strong> atau supply redundant untuk menjaga kestabilan.</li>
<li>Catat kapasitas UPS (misalnya 12V/24V, 30–60 menit backup).</li>
</ul>
</li>
</ol>
<hr />

<h2 id="14-penutup">14. Penutup</h2>
<p>UNO‑220 kini siap beroperasi sebagai <strong>edge device industri</strong> yang tangguh, dengan konfigurasi yang <strong>aman, modular, dan audit‑ready</strong>. Seluruh tahapan — mulai dari instalasi sistem operasi, aktivasi fitur perangkat keras, pengamanan layanan, hingga integrasi aplikasi — telah dirancang agar konsisten, mudah direplikasi, dan dapat diaudit.</p>
<p>Komponen utama yang terintegrasi:</p>
<ul>
<li><strong>Node‑RED</strong> → automasi dan dashboard lokal, lengkap dengan logging I/O dan monitoring sistem ke CSV.</li>
<li><strong>Rapid SCADA 6.4.3</strong> → server SCADA dengan integrasi trending CSV untuk histori data yang akurat.</li>
<li><strong>ZeroTier</strong> → konektivitas aman dan fleksibel untuk remote management tanpa membuka port publik.</li>
<li><strong>RAM drive &amp; hardening</strong> (UFW + Fail2Ban) → perlindungan sistem sekaligus memperpanjang umur media penyimpanan.</li>
<li><strong>Backup rutin + logrotate</strong> → memastikan recovery cepat dan manajemen log yang efisien.</li>
</ul>
<p>Dengan rancangan ini, UNO‑220 dapat dijadikan <strong>standar operasional deployment</strong> di seluruh fasilitas industri, menjamin <strong>konsistensi, keamanan, dan keandalan</strong>.</p>
<p>Lebih jauh lagi, kombinasi <strong>Rapid SCADA</strong> (data concentrator) + <strong>OPC UA</strong> (standar komunikasi) + <strong>Node‑RED</strong> (logic) + <strong>Grafana</strong> (visualisasi) membentuk <strong>arsitektur edge yang future‑proof</strong>. Dengan pendekatan ini, UNO‑220 tidak hanya berfungsi sebagai gateway lokal, tetapi juga sebagai <strong>middleware OT–IT</strong> yang siap menghubungkan lapisan produksi dengan MES, ERP, maupun platform IIoT modern.</p>
<blockquote>
<p><strong>Catatan:</strong> Untuk menjaga keberlanjutan, lakukan validasi berkala (service status, backup, update keamanan) dan selalu cek versi terbaru software dari sumber resmi sebelum upgrade.</p>
</blockquote>
<p>Sebagai penutup, Advantech UNO‑220 dapat menjadi fondasi fleksibel bagi evolusi sistem automasi industri. Selain fungsi gateway, perangkat ini bisa diperluas dengan runtime <strong>Eclipse 4diac FORTE</strong> (IEC 61499) untuk soft logic non‑critical, <strong>CODESYS Runtime</strong> (IEC 61131‑3) sebagai SoftPLC komersial ringan, maupun <strong>OpenPLC Runtime</strong> (IEC 61131‑3) sebagai alternatif open source untuk edukasi dan prototyping. Integrasi ini dapat dipadukan dengan <strong>TensorFlow Lite</strong> untuk predictive maintenance, di mana output dari FORTE, CODESYS, atau OpenPLC diolah oleh model AI untuk deteksi fault real‑time, sehingga UNO‑220 berperan sebagai <strong>hybrid edge device</strong> yang efisien, modular, dan compliant.</p>]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="edge-computing" /><category term="Edge Computing" /><category term="Distributed Control System" /><category term="Field Experience" /><category term="Practical Engineering" /><summary type="html"><![CDATA[UNO‑220 siap beroperasi sebagai edge device industri: Node‑RED untuk automasi & dashboard lokal, Rapid SCADA 6.4.3 untuk trending historis, ZeroTier untuk konektivitas aman, serta hardening + backup rutin agar sistem modular, audit‑ready, dan andal.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1631553127988-36343ac5bb0c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHJhc3BiZXJyeSUyMHBpfGVufDB8fHx8MTc2NzgzNzA1Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1631553127988-36343ac5bb0c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHJhc3BiZXJyeSUyMHBpfGVufDB8fHx8MTc2NzgzNzA1Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Menghindari Masalah Grounding dan Petir dengan Fiber Optic</title><link href="https://kumajaya.github.io/kiiota-blog/cost-optimization/2025/12/24/menghindari-masalah-grounding-dan-petir-dengan-fiber-optic.html" rel="alternate" type="text/html" title="Menghindari Masalah Grounding dan Petir dengan Fiber Optic" /><published>2025-12-24T18:05:59+00:00</published><updated>2025-12-24T18:05:59+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/cost-optimization/2025/12/24/menghindari-masalah-grounding-dan-petir-dengan-fiber-optic</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/cost-optimization/2025/12/24/menghindari-masalah-grounding-dan-petir-dengan-fiber-optic.html"><![CDATA[<h2 id="latar-belakang">Latar Belakang</h2>
<p>Dalam lingkungan industri, jaringan komunikasi antar perangkat umumnya menggunakan kabel tembaga (Ethernet). Walaupun praktis, kabel tembaga memiliki kelemahan mendasar karena bersifat konduktif. Hal ini menimbulkan risiko:</p>
<ul>
<li><strong>Gangguan grounding</strong> akibat perbedaan potensial antar panel atau perangkat.</li>
<li><strong>Induksi elektromagnetik (EMI)</strong> dari peralatan berdaya besar seperti motor atau inverter.</li>
<li><strong>Sambaran petir</strong> yang dapat merambat melalui kabel dan merusak perangkat sensitif.</li>
</ul>
<p>Dampak dari gangguan tersebut tidak hanya berupa kerusakan perangkat, tetapi juga berpotensi menyebabkan downtime operasional yang signifikan serta risiko keselamatan.</p>
<hr />

<h2 id="fiber-optic-sebagai-solusi">Fiber Optic sebagai Solusi</h2>
<p>Fiber optic merupakan media komunikasi yang sepenuhnya <strong>non-konduktif</strong>, sehingga tidak menghantarkan arus listrik. Keunggulan utama yang ditawarkan antara lain:</p>
<ul>
<li>
<p><strong>Isolasi Galvanik Total</strong><br />
Menghilangkan jalur arus listrik antar perangkat, aman dari perbedaan grounding maupun sambaran petir.</p>
</li>
<li>
<p><strong>Ketahanan terhadap EMI/RFI</strong><br />
Sinyal berbasis cahaya tidak terpengaruh oleh medan elektromagnetik, sehingga komunikasi tetap stabil.</p>
</li>
<li>
<p><strong>Perlindungan Alami dari Petir</strong><br />
Tidak adanya konduksi listrik membuat fiber optic aman dari energi petir.</p>
</li>
<li>
<p><strong>Kecepatan dan Jangkauan</strong><br />
Mendukung komunikasi gigabit dengan jarak hingga puluhan kilometer tanpa degradasi berarti.</p>
</li>
</ul>
<hr />

<h2 id="penerapan-di-industri">Penerapan di Industri</h2>
<p>Fiber optic dapat diterapkan pada berbagai sistem komunikasi industri, antara lain:</p>
<ul>
<li><strong>SCADA dan DCS</strong> untuk komunikasi antar panel kontrol.</li>
<li><strong>Flowmeter, power meter, atau sensor</strong> dalam pengiriman data ke server.</li>
<li><strong>Koneksi antar gedung atau panel</strong> untuk mengatasi beda potensial grounding.</li>
<li><strong>Integrasi OPC UA / Modbus TCP</strong> yang membutuhkan komunikasi real-time stabil.</li>
</ul>
<h3 id="topologi-sistem">Topologi Sistem</h3>
<div style="width: 100%; text-align: center; margin: 0.5em auto; max-width: 800px;">
  <div class="mermaid" style="width: 100%; max-width: 800px;">
graph TD
    classDef danger fill:#ffebee,stroke:#c62828,stroke-width:2px,color:#b71c1c,rx:15,ry:15
    classDef converter fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,color:#e65100,rx:15,ry:15
    A["⚡ Zona Eksternal<br />Perangkat Lapangan<br />(Area Rentan)"]
    B["🛡️ Media Converter<br />FC311A-20<br />(Pelindung)"]
    C["🛡️ Media Converter<br />FC311B-20<br />(Pelindung)"]
    D["🏢 Zona Internal<br />Server / Data Center<br />(Area Rentan)"]
    A --&gt; B
    B --&gt; C
    C --&gt; D
    class A danger
    class D danger
    class B,C converter
    linkStyle 1 stroke-dasharray: 5 5
  </div>
    <figcaption style="font-style: italic; margin-top: 0.5em; color: #555; font-size: 0.9em;">
    Topologi Sistem Rancangan Jaringan Fiber Optic
    </figcaption>
</div>
<h3 id="media-converter">Media Converter</h3>
<ul>
<li><strong>TP-Link FC311A-20</strong> (sisi perangkat)</li>
<li><strong>TP-Link FC311B-20</strong> (sisi server/switch)</li>
</ul>
<figure style="text-align: center;">
  <img src="/kiiota-blog/assets/media/dcac0bb9-2815-4d0a-9ae6-fa614bf4ccb3-FC311A-20-TL-FC311A-20-_normal_20250208074142m-1-.jpg" alt="TP-Link FC311A-20" width="400" style="display: block; margin: 0 auto;" />
  <figcaption>FC311A-20 - Gigabit WDM Media Converter</figcaption>
</figure>
<p>Spesifikasi utama:</p>
<ul>
<li>Ethernet RJ45 10/100/1000 Mbps</li>
<li>Fiber optic single-mode WDM (BiDi)</li>
<li>Connector SC/UPC, mode simplex (1 core)</li>
<li>Jarak dukung hingga 20 km</li>
<li>Power supply DC 12–48 V</li>
<li>Plug &amp; play tanpa konfigurasi</li>
</ul>
<h3 id="kabel-fiber-optic">Kabel Fiber Optic</h3>
<ul>
<li>Single-mode OS2, simplex (1 core)</li>
<li>Connector SC/UPC – SC/UPC</li>
<li>Panjang ±300 m (outdoor, UV resistant)</li>
<li>❌ Tidak boleh multimode</li>
<li>❌ Tidak boleh SC/APC (hijau)</li>
</ul>
<figure style="text-align: center;">
  <img src="/kiiota-blog/assets/media/dcac0bb9-2815-4d0a-9ae6-fa614bf4ccb3-40494.B-1-.jpg" alt="Patch cord single-mode OS2 SC/UPC simplex" width="400" style="display: block; margin: 0 auto;" />
  <figcaption>Patch cord single-mode OS2 simplex dengan konektor SC/UPC</figcaption>
</figure>
<h3 id="kabel-ethernet">Kabel Ethernet</h3>
<ul>
<li>Cat5e/Cat6, panjang ≤5 m</li>
<li>Digunakan hanya di sisi converter (Perangkat → FC311A, FC311B → Server)</li>
</ul>
<h3 id="power-panel">Power &amp; Panel</h3>
<ul>
<li>Supply DC 12/24 V untuk masing-masing converter</li>
<li>Converter ditempatkan dalam panel tertutup dengan grounding chassis</li>
<li>Fiber optic masuk panel menggunakan strain relief/gland</li>
</ul>
<hr />

<h2 id="keunggulan-sistem">Keunggulan Sistem</h2>
<ul>
<li><strong>Isolasi galvanik penuh</strong> → aman dari EMI dan petir.</li>
<li><strong>Komunikasi stabil</strong> → mendukung protokol OPC UA atau Modbus TCP secara terus-menerus.</li>
<li><strong>Konfigurasi sederhana</strong> → point-to-point tanpa kebutuhan pengaturan tambahan.</li>
<li><strong>Siap audit</strong> → BOM jelas dan spesifikasi terdokumentasi, memudahkan proses pengadaan dan inspeksi.</li>
</ul>
<hr />

<h2 id="bill-of-materials-bom">Bill of Materials (BOM)</h2>
<table>
<thead>
<tr>
<th>No</th>
<th>Item</th>
<th>Spesifikasi</th>
<th>Qty</th>
<th>Catatan</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Media Converter FC311A-20</td>
<td>RJ45 1G, FO WDM SC/UPC</td>
<td>1</td>
<td>Sisi perangkat lapangan</td>
</tr>
<tr>
<td>2</td>
<td>Media Converter FC311B-20</td>
<td>RJ45 1G, FO WDM SC/UPC</td>
<td>1</td>
<td>Sisi server/switch</td>
</tr>
<tr>
<td>3</td>
<td>Kabel FO Outdoor OS2</td>
<td>Simplex SC/UPC–SC/UPC ±300 m</td>
<td>1 roll</td>
<td>Sesuai site</td>
</tr>
<tr>
<td>4</td>
<td>Patch Cable RJ45 Cat5e/Cat6</td>
<td>≤5 m</td>
<td>2 pcs</td>
<td>Perangkat &amp; Server</td>
</tr>
<tr>
<td>5</td>
<td>Panel / Enclosure</td>
<td>Metal, DIN rail</td>
<td>1 set</td>
<td>Opsional</td>
</tr>
<tr>
<td>6</td>
<td>Cable Gland / Strain Relief</td>
<td>Untuk FO</td>
<td>2 pcs</td>
<td>Masuk panel</td>
</tr>
<tr>
<td>7</td>
<td>Grounding Accessories</td>
<td>Lug, kabel grounding</td>
<td>1 set</td>
<td>Panel &amp; chassis</td>
</tr>
<tr>
<td>8</td>
<td>Label Kabel</td>
<td>FO &amp; Ethernet</td>
<td>1 set</td>
<td>Identifikasi</td>
</tr>
</tbody>
</table>
<hr />

<h2 id="best-practice-instalasi">Best Practice Instalasi</h2>
<p>Untuk memastikan sistem fiber optic bekerja optimal dan tahan lama, disarankan:</p>
<ul>
<li><strong>Manajemen kabel</strong>: gunakan tray/ducting, hindari tekukan tajam (radius min. 30 mm).</li>
<li><strong>Proteksi panel</strong>: gunakan enclosure dengan rating IP sesuai lingkungan (≥IP54 untuk outdoor).</li>
<li><strong>Grounding konsisten</strong>: converter, PSU, dan panel tetap digrounding dengan kabel tembaga memadai.</li>
<li><strong>Label &amp; dokumentasi</strong>: beri label jelas pada kabel, dokumentasikan jalur dan titik terminasi.</li>
<li><strong>Strain relief/gland</strong>: gunakan gland saat kabel masuk panel untuk mencegah kerusakan mekanis.</li>
<li><strong>Pemeriksaan konektor</strong>: bersihkan konektor SC/UPC sebelum instalasi untuk menghindari loss.</li>
</ul>
<hr />

<h2 id="kesimpulan">Kesimpulan</h2>
<p>Penggunaan fiber optic dalam sistem komunikasi industri bukan sekadar peningkatan teknologi, melainkan langkah strategis untuk <strong>menghindari masalah grounding dan petir</strong>. Dengan isolasi total, ketahanan terhadap EMI, serta keandalan tinggi, fiber optic memastikan komunikasi tetap aman, stabil, dan berkelanjutan.</p>
<h2></h2>]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="cost-optimization" /><category term="Cost Optimization" /><category term="Automation" /><category term="Engineering Lessons" /><summary type="html"><![CDATA[Fiber optic memberikan isolasi galvanik total, bebas EMI, dan aman dari petir. Solusi komunikasi industri yang stabil untuk menghindari risiko downtime operasional.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1594915440248-1e419eba6611?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE4fHxmaWJlciUyMHxlbnwwfHx8fDE3NjY1OTc4NTd8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1594915440248-1e419eba6611?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE4fHxmaWJlciUyMHxlbnwwfHx8fDE3NjY1OTc4NTd8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Zero-Cost Engineering: Workflow FOSS untuk Hasil Profesional</title><link href="https://kumajaya.github.io/kiiota-blog/cost-optimization/2025/08/09/zero-cost-engineering-workflow-foss-untuk-hasil-profesional.html" rel="alternate" type="text/html" title="Zero-Cost Engineering: Workflow FOSS untuk Hasil Profesional" /><published>2025-08-09T08:31:13+00:00</published><updated>2025-08-09T08:31:13+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/cost-optimization/2025/08/09/zero-cost-engineering-workflow-foss-untuk-hasil-profesional</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/cost-optimization/2025/08/09/zero-cost-engineering-workflow-foss-untuk-hasil-profesional.html"><![CDATA[<div class="kg-card kg-audio-card"><img src="" alt="audio-thumbnail" class="kg-audio-thumbnail kg-audio-hide" /><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"></path></svg></div><div class="kg-audio-player-container"><audio src="https://blog.kiiota.com/content/media/2025/08/zero-cost_engineering.mp3" preload="metadata"></audio><div class="kg-audio-title">Workflow FOSS untuk Hasil Profesional</div><div class="kg-audio-player"><button class="kg-audio-play-icon" aria-label="Play audio"><svg viewBox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"></path></svg></button><button class="kg-audio-pause-icon kg-audio-hide" aria-label="Pause audio"><svg viewBox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">5.184</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0" /><button class="kg-audio-playback-rate" aria-label="Adjust playback speed">1×</button><button class="kg-audio-unmute-icon" aria-label="Unmute"><svg viewBox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"></path></svg></button><button class="kg-audio-mute-icon kg-audio-hide" aria-label="Mute"><svg viewBox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"></path></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100" /></div></div></div>
<h2 id="pendahuluan"><strong>Pendahuluan</strong></h2>
<p>"<strong>Apakah kita benar-benar perlu membayar mahal untuk perangkat lunak, jika hasil teknikal yang sama — bahkan lebih baik — bisa dicapai secara gratis?</strong>"</p>
<p>Di banyak industri, optimalisasi performa peralatan sering diasosiasikan dengan perangkat lunak berbayar, lisensi berlapis, dan perangkat keras kelas atas. Namun kenyataannya, <strong>hasil profesional tidak selalu bergantung pada biaya lisensi</strong>. Melalui pendekatan <strong>Zero-Cost Engineering</strong> — rekayasa berbasis FOSS (Free and Open Source Software) dan metodologi modular — kita dapat menghasilkan output teknis berkualitas tinggi tanpa biaya tambahan. Bayangkan: menyelesaikan analisis teknikal level industri tanpa mengeluarkan biaya lisensi perangkat lunak sama sekali. Ini bukan sekadar teori — studi kasus nyata telah membuktikannya.</p>
<hr />

<h2 id="filosofi-zero-cost-engineering"><strong>Filosofi Zero-Cost Engineering</strong></h2>
<p>Zero-Cost Engineering bukan berarti kompromi terhadap kualitas. Yang dimaksud di sini adalah: <strong>maksimalkan alat yang tersedia, hilangkan biaya lisensi</strong>, dan investasikan waktu untuk memahami proses secara lebih mendalam.</p>
<p>Prinsipnya:</p>
<ul>
<li><strong>Satu bahasa untuk semuanya</strong> → Python</li>
<li><strong>Satu editor untuk semuanya</strong> → Visual Studio Code + Jupyter Notebook</li>
<li><strong>Satu alur kerja yang terdokumentasi penuh</strong> → mudah direplikasi, modular, dan siap diuji ulang</li>
<li><strong>Satu platform publikasi</strong> → Markdown + Joplin + Ghost CMS</li>
</ul>
<p>Dengan pendekatan ini, kita bukan hanya menghemat biaya — kita membangun ekosistem kerja yang transparan, audit-ready, dan siap dibagikan ke komunitas. Setelah memahami filosofinya, mari kita telusuri alur kerja end-to-end yang digunakan.</p>
<hr />

<h2 id="workflow-foss-end-to-end"><strong>Workflow FOSS End-to-End</strong></h2>
<h3 id="digitalisasi-data"><strong>Digitalisasi Data</strong></h3>
<ul>
<li><strong>Input</strong>: Kurva performa vendor (PDF/JPEG/PNG)</li>
<li><strong>Tool</strong>: <a href="https://automeris.io/?ref=blog.kiiota.com">WebPlotDigitizer</a> (gratis, berbasis web)</li>
<li><strong>Hasil</strong>: Ekstraksi kurva performa dari gambar statis menjadi dataset numerik siap analisis</li>
<li><strong>Alternatif berbayar</strong>: OriginLab Digitizer, MATLAB Toolbox</li>
</ul>
<h3 id="analisis-dan-visualisasi"><strong>Analisis dan Visualisasi</strong></h3>
<ul>
<li><strong>Tool</strong>: <a href="https://www.python.org/?ref=blog.kiiota.com">Python</a> (<code>pandas</code>, <code>numpy</code>, <code>matplotlib</code>)</li>
<li><strong>Hasil</strong>: Grafik hubungan IGV vs. tekanan/flow, identifikasi zona efisiensi, dan titik operasi aktual</li>
<li><strong>Alternatif berbayar</strong>: MATLAB, OriginPro, JMP</li>
</ul>
<h3 id="draft-konten-modular"><strong>Draft Konten Modular</strong></h3>
<ul>
<li><strong>Tool</strong>: Markdown di <a href="https://code.visualstudio.com/?ref=blog.kiiota.com">Visual Studio Code</a> atau <a href="https://joplinapp.org/?ref=blog.kiiota.com">Joplin</a>, diagram alir dengan <a href="https://mermaid.live/?ref=blog.kiiota.com">Mermaid</a>, diagram teknikal statis di <a href="https://www.drawio.com/?ref=blog.kiiota.com">draw.io</a></li>
<li><strong>Hasil</strong>: Naskah teknis yang rapi, modular, dan siap dikonversi</li>
<li><strong>Alternatif berbayar</strong>: MS Word + EndNote + Visio, Adobe FrameMaker</li>
</ul>
<h3 id="konversi-dan-layout-pdf"><strong>Konversi dan Layout PDF</strong></h3>
<ul>
<li><strong>Tool</strong>: <a href="https://pandoc.org/?ref=blog.kiiota.com">Pandoc</a> (Markdown → LaTeX) + <a href="https://www.overleaf.com/?ref=blog.kiiota.com">Overleaf</a></li>
<li><strong>Hasil</strong>: Whitepaper PDF siap cetak dan distribusi, bahkan reproduksi</li>
<li><strong>Alternatif berbayar</strong>: Adobe InDesign, Scientific Word</li>
</ul>
<h3 id="narasi-audio"><strong>Narasi Audio</strong></h3>
<ul>
<li><strong>Tool</strong>: Python TTS (<a href="https://github.com/nateshmbhat/pyttsx3/?ref=blog.kiiota.com"><code>pyttsx3</code></a>, <a href="https://github.com/pndurette/gTTS/?ref=blog.kiiota.com"><code>gTTS</code></a>)</li>
<li><strong>Hasil</strong>: Narasi audio untuk presentasi atau podcast teknis</li>
<li><strong>Alternatif berbayar</strong>: Adobe Audition + TTS API</li>
</ul>
<h3 id="distribusi"><strong>Distribusi</strong></h3>
<ul>
<li><strong>Tool</strong>: <a href="https://ghost.org/?ref=blog.kiiota.com">Ghost CMS</a> (self-hosted) + PDF distribusi</li>
<li><strong>Hasil</strong>: Blog post untuk pembaca umum, whitepaper PDF untuk pembaca teknis</li>
<li><strong>Alternatif berbayar</strong>: CMS enterprise + Adobe Acrobat Pro DC</li>
</ul>
<hr />

<h2 id="hasil-nyata-studi-kasus-kompresor-sentrifugal"><strong>Hasil Nyata: Studi Kasus Kompresor Sentrifugal</strong></h2>
<p>Workflow ini bukan sekadar teori — ia telah digunakan dalam proyek nyata untuk menganalisis performa kompresor sentrifugal yang gagal mencapai target tekanan. Dengan pendekatan berbasis FOSS, seluruh proses — dari data mentah hingga publikasi — dapat dijalankan secara mandiri, transparan, dan tanpa biaya lisensi.</p>
<p>Hasilnya:</p>
<ul>
<li>Masalah operasional berhasil diidentifikasi tanpa bantuan perangkat lunak berbayar atau perangkat analisis khusus</li>
<li>Rekomendasi teknis disusun berdasarkan kurva performa yang didigitalisasi dan divisualisasikan secara mandiri</li>
<li>Output akhir berupa blog post yang komunikatif dan whitepaper PDF yang siap diuji ulang — semuanya dibuat dengan alat gratis dan terbuka</li>
</ul>
<p>Studi kasus ini membuktikan bahwa dengan workflow yang rapi dan alat yang tepat, <strong>kreativitas teknis dapat melampaui keterbatasan biaya</strong>. Dalam banyak kasus, biaya tidak perlu dialokasikan untuk perangkat lunak berbayar, melainkan lebih baik difokuskan pada perangkat keras, pelatihan operator, dan sumber daya lainnya yang berdampak langsung pada kualitas hasil.</p>
<blockquote>
<p>Studi kasus ini membuktikan bahwa hanya dengan satu laptop, satu bahasa, dan satu editor, kita tidak hanya menghemat biaya — kita membangun ekosistem kerja yang siap diuji ulang, dibagikan, dan dikembangkan bersama tim.</p>
</blockquote>
<hr />

<h2 id="diagram-alir-workflow-foss"><strong>Diagram Alir Workflow FOSS</strong></h2>
<!--figure style="text-align: center; margin: 2em auto; max-width: 600px;">
  <img src="/kiiota-blog/assets/media/ba453585-0b56-4766-897f-7993886a8a9e-zero_cost_workflow.svg" 
       alt="Diagram alir Zero-Cost Engineering dari data ke publikasi" 
       style="width: 100%; height: auto;">
  <figcaption style="font-style: italic; margin-top: 0.5em; color: #555; font-size: 0.9em;">
    Gambar 1: Alur kerja Zero-Cost Engineering — dari data mentah hingga publikasi menggunakan FOSS tools (dirender menggunakan Mermaid)
  </figcaption>
</figure-->
<p>Diagram berikut dirender langsung menggunakan Mermaid — bukan grafis hasil perangkat lunak eksternal apalagi berbayar, melainkan teks yang bisa direproduksi dan direvisi langsung.</p>
<div style="text-align: center; margin: 0.5em auto; max-width: 600px;">
  <div class="mermaid" style="width: 100%; max-width: 800px;">
    flowchart TB
      subgraph Workspace["Zero-Cost Engineering"]
        direction TB
          A["Digitalisasi Data<br />(WebPlotDigitizer)"]:::Sky
          B["Analisis &amp; Visualisasi<br />(Python: matplotlib, numpy)"]:::Sky
          C["Penulisan &amp; Naskah<br />(Joplin, Ghost, Mermaid, draw.io)"]:::Sky
          D1["Blog Post<br />(Ghost CMS)"]:::Sky
          D2["Whitepaper PDF<br />(Pandoc + Overleaf)"]:::Sky
          D3["Narasi Audio<br />(Python TTS)"]:::Sky
      end
      A --&gt; B
      B --&gt; C
      C --&gt; D1 &amp; D2 &amp; D3
      D1 --&gt; E["Distribusi Akhir"]:::Pine
      D2 --&gt; E
      D3 --&gt; E
    classDef Sky fill:#F4F8FF,stroke:#2C3E50,color:#2C3E50,stroke-width:1.5px,rx:6px,ry:6px;
    classDef Pine fill:#2E8B57,stroke:#1E5F3F,color:#FFFFFF,stroke-width:1.5px,rx:6px,ry:6px;
    classDef Alert fill:#FFF5F5,stroke:#D32F2F,color:#D32F2F,stroke-width:1.5px,rx:6px,ry:6px;
    style Workspace stroke:#757575,fill:#F5F5F5,rx:8px,ry:8px
  </div>
    <figcaption style="font-style: italic; margin-top: 0.5em; color: #555; font-size: 0.9em;">
    Gambar 1: Alur kerja Zero-Cost Engineering — dari data mentah hingga publikasi menggunakan FOSS tools
    </figcaption>
</div>
<p>Salah satu kekuatan dari alur kerja ini adalah kemampuannya untuk mengintegrasikan ekspresi teknikal tingkat lanjut langsung ke dalam publikasi. Dengan menggunakan alat FOSS seperti \(\text{\LaTeX}\), rumus teknik yang kompleks dapat dirender dengan kualitas profesional.<br />
Sebagai contoh:</p>
<div style="text-align: center; margin: 0.5em auto; max-width: 600px;">
    <figure style="text-align: center; margin: 2em auto; max-width: 800px;">
      <div style="font-size: 1.0em; /*margin: 2.5rem auto; padding: 1.8rem; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05), 0 10px 15px -3px rgba(0,0,0,0.08);*/">$$ Q_{real} = Q_{design} \times \sqrt{\left( \frac{T_{design}}{T_{real}} \cdot \frac{P_{real}}{P_{design}} \right)} $$</div>
    </figure>
</div>
<p>Ini memastikan bahwa dokumentasi ilmiah tetap presisi dan siap dipresentasikan tanpa bergantung pada editor persamaan komersial.</p>
<hr />

<h2 id="perbandingan-biaya-foss-vs-software-komersial"><strong>Perbandingan Biaya: FOSS vs Software Komersial</strong></h2>
<table>
<thead>
<tr>
<th>Tahap</th>
<th>FOSS</th>
<th>Software Komersial</th>
<th>Harga Lisensi / Tahun</th>
</tr>
</thead>
<tbody>
<tr>
<td>Digitalisasi data</td>
<td>WebPlotDigitizer</td>
<td>OriginLab Digitizer, MATLAB Toolbox</td>
<td>USD 500–2.000</td>
</tr>
<tr>
<td>Analisis &amp; visualisasi</td>
<td>Python</td>
<td>MATLAB, OriginPro</td>
<td>USD 1.000–2.500</td>
</tr>
<tr>
<td>Draft konten</td>
<td>Markdown + Joplin</td>
<td>MS Word + Visio</td>
<td>USD 150–1.000</td>
</tr>
<tr>
<td>Konversi &amp; layout</td>
<td>Pandoc + Overleaf</td>
<td>Adobe InDesign</td>
<td>USD 250–1.200</td>
</tr>
<tr>
<td>Audio narasi</td>
<td>Python TTS</td>
<td>Adobe Audition + TTS API</td>
<td>USD 200–1.000</td>
</tr>
<tr>
<td>Distribusi</td>
<td>Ghost CMS</td>
<td>CMS enterprise + Acrobat Pro DC</td>
<td>USD 200–600</td>
</tr>
<tr>
<td><strong>Total Estimasi</strong></td>
<td><strong>± USD 0</strong></td>
<td><strong>USD 2.300–8.300</strong></td>
<td>—</td>
</tr>
<tr>
<td><strong>Selisih Estimasi</strong></td>
<td>—</td>
<td>—</td>
<td><strong>± Rp 35–125 juta</strong></td>
</tr>
</tbody>
</table>
<figcaption style="text-align: left; font-style: italic; margin-top: 0.5em; color: #555; font-size: 0.9em;">
Catatan: Estimasi harga lisensi bersifat indikatif dan dapat berubah tergantung wilayah, diskon institusi, dan versi. Tidak termasuk biaya pelatihan, integrasi, atau perangkat keras.
</figcaption>
<hr />

<h2 id="diagram-alur-keputusan"><strong>Diagram Alur Keputusan</strong></h2>
<div style="width: 100%; text-align: center; margin: 0.5em auto; max-width: 800px;">
  <div class="mermaid" style="width: 100%; max-width: 800px;">
    flowchart TD
        A["Mulai Proyek Teknikal"] --&gt; B{"Pilih Workflow"}
        B -- FOSS --&gt; C["Zero-Cost Engineering"]
        B -- Komersial --&gt; D["Software Berbayar"]
        C --&gt; E1["Biaya Lisensi: ± USD 0"] &amp; G1["Investasi: Waktu, Dokumentasi, Pelatihan"] &amp; H1["Hasil: Whitepaper, Blog, Audio, Diagram"]
        D --&gt; E2["Biaya Lisensi: USD 2.300–8.300"] &amp; G2["Investasi: Lisensi, Integrasi, Pelatihan"] &amp; H2["Hasil: Sama, tergantung lisensi &amp; platform"]
        E2 --&gt; F["Rugi Potensial: Rp 35–125 juta"]
        A@{ shape: rounded}
        C@{ shape: rounded}
        D@{ shape: rounded}
        E1@{ shape: rounded}
        G1@{ shape: rounded}
        H1@{ shape: rounded}
        E2@{ shape: rounded}
        G2@{ shape: rounded}
        H2@{ shape: rounded}
        F@{ shape: rounded}
         A:::Sky
         A:::Sky
         B:::Sky
         C:::Aqua
         C:::Pine
         D:::Ash
         E1:::Sky
         G1:::Sky
         H1:::Sky
         E2:::Sky
         G2:::Sky
         H2:::Sky
         F:::Rose
        classDef Ash stroke-width:1px, stroke-dasharray:none, stroke:#999999, fill:#999999, color:#FFFFFF
        classDef Peach stroke-width:1px, stroke-dasharray:none, stroke:#FBB35A, fill:#FFEFDB, color:#8F632D
        classDef Pine stroke-width:1px, stroke-dasharray:none, stroke:#254336, fill:#27654A, color:#FFFFFF
        classDef Rose stroke-width:1px, stroke-dasharray:none, stroke:#FF5978, fill:#FF5978, color:#FFFFFF
        classDef Sky stroke-width:1px, stroke-dasharray:none, stroke:#374D7C, fill:#E2EBFF, color:#374D7C
  </div>
    <figcaption style="font-style: italic; margin-top: 0.5em; color: #555; font-size: 0.9em;">
    Gambar 2: Diagram alur keputusan teknikal — memilih antara workflow FOSS dan software komersial, beserta dampak biaya dan hasilnya
    </figcaption>
</div>
<hr />

<h2 id="kesimpulan"><strong>Kesimpulan</strong></h2>
<p>Saat pertama kali menggunakan Linux di tahun 2000, saya membayangkan masa depan di mana alat open-source menjadi tulang punggung alur kerja industri dan rekayasa. Dua dekade kemudian, Zero-Cost Engineering membuktikan bahwa visi ini bukan hanya mungkin — tapi sedang terjadi.</p>
<p><strong>Zero-Cost Engineering</strong> adalah filosofi bahwa <em>keterbatasan biaya tidak membatasi kualitas hasil</em> — bukan sekadar strategi hemat, melainkan pendekatan sistemik untuk membangun ekosistem kerja yang transparan, modular, dan siap diuji ulang. Hasil teknis yang kompleks bisa disampaikan dengan profesional — setara (bahkan melampaui) workflow berbasis solusi berbayar. Meskipun membutuhkan adaptasi bagi tim yang terbiasa dengan perangkat lunak berbayar, manfaat jangka panjangnya signifikan.</p>
<p>Selain solusi yang digunakan di sini, saya juga mengandalkan Rapid SCADA untuk pemantauan industri, Node-RED untuk otomasi alur kerja, 4diac FORTE untuk kontrol IEC 61499, serta alat lain seperti ZeroTier untuk jaringan virtual yang aman, RutOS/OpenWrt untuk manajemen perangkat edge, mbusd untuk komunikasi Modbus TCP/RTU, dan sistem berbasis Ubuntu atau turunan Debian untuk integrasi IIoT. Semua ini memperkuat filosofi Zero-Cost Engineering — bahwa hasil profesional dapat dicapai tanpa lisensi berbayar, dengan ekosistem kerja yang terbuka, modular, dan siap diuji ulang.</p>
<p>"<strong>Siap mencoba Zero-Cost Engineering? Gunakan alat FOSS ini dan mulai proyek Anda dengan efisiensi maksimal.</strong>"</p>
<hr />]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="cost-optimization" /><category term="Cost Optimization" /><category term="Engineering Lessons" /><summary type="html"><![CDATA[Sebuah alur kerja adaptif, berlandaskan tanggung jawab, yang mendorong inovasi, menanamkan pola pikir berusaha, dan membuat proses tetap menyenangkan—memberikan hasil profesional tanpa beban biaya lisensi.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1553729459-efe14ef6055d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGNvc3R8ZW58MHx8fHwxNzU0NzI4MDAwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1553729459-efe14ef6055d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGNvc3R8ZW58MHx8fHwxNzU0NzI4MDAwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kolom Bawah: Terlalu Dingin Bisa Membuat Nitrogen Tercemar Oksigen?</title><link href="https://kumajaya.github.io/kiiota-blog/cryogenic/2025/07/27/kolom-bawah-terlalu-dingin-bisa-membuat-nitrogen-tercemar-oksigen.html" rel="alternate" type="text/html" title="Kolom Bawah: Terlalu Dingin Bisa Membuat Nitrogen Tercemar Oksigen?" /><published>2025-07-27T18:57:54+00:00</published><updated>2025-07-27T18:57:54+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/cryogenic/2025/07/27/kolom-bawah-terlalu-dingin-bisa-membuat-nitrogen-tercemar-oksigen</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/cryogenic/2025/07/27/kolom-bawah-terlalu-dingin-bisa-membuat-nitrogen-tercemar-oksigen.html"><![CDATA[<div class="kg-card kg-audio-card"><img src="" alt="audio-thumbnail" class="kg-audio-thumbnail kg-audio-hide" /><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"></path></svg></div><div class="kg-audio-player-container"><audio src="https://blog.kiiota.com/content/media/2025/07/kolom_bawah_id_ID.mp3" preload="metadata"></audio><div class="kg-audio-title">Terlalu Dingin Bisa Membuat Nitrogen Tercemar Oksigen?</div><div class="kg-audio-player"><button class="kg-audio-play-icon" aria-label="Play audio"><svg viewBox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"></path></svg></button><button class="kg-audio-pause-icon kg-audio-hide" aria-label="Pause audio"><svg viewBox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">5.064</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0" /><button class="kg-audio-playback-rate" aria-label="Adjust playback speed">1×</button><button class="kg-audio-unmute-icon" aria-label="Unmute"><svg viewBox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"></path></svg></button><button class="kg-audio-mute-icon kg-audio-hide" aria-label="Mute"><svg viewBox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"></path></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100" /></div></div></div>
<p>Pernahkah kamu bertanya, bagaimana udara diubah menjadi oksigen murni atau nitrogen murni? Teknologi di baliknya disebut <strong>distilasi kriogenik</strong>. Tapi proses ini bukan cuma sekadar membekukan — ia harus dikendalikan dengan sangat presisi.</p>
<p><strong>Distilasi kriogenik</strong> adalah jantung dari proses pemisahan udara menjadi oksigen, nitrogen, dan argon. Proses ini sangat bergantung pada <strong>suhu dan tekanan yang tepat</strong>, karena pemisahan terjadi berdasarkan <strong>perbedaan titik didih</strong> tiap komponen.</p>
<p>Salah satu bagian paling penting dari proses distilasi kriogenik adalah <strong>kolom distilasi bagian bawah</strong>. Di sinilah udara cair dipisahkan menjadi dua komponen utama: <strong>nitrogen naik ke atas, dan oksigen terkonsentrasi turun ke bawah</strong>.</p>
<p>Ya, kita sedang bicara <strong>kolom bawah</strong> — tempat pertama pemisahan terjadi sebelum masuk ke kolom atas untuk pemurnian lebih lanjut.</p>
<blockquote>
<p>Tapi di kolom bawah ini, ada satu hal yang sering membingungkan:<br />
<strong>“Kenapa suhu yang terlalu rendah justru membuat produk nitrogen tetap tercemar oksigen?”</strong></p>
</blockquote>
<p>Mari kita bahas dengan cara yang masuk akal dan mudah diingat.</p>
<hr />

<h3 id="kolom-seperti-tangga">Kolom Seperti Tangga</h3>
<p>Bayangkan kolom distilasi sebagai <strong>tangga vertikal</strong>:</p>
<ul>
<li><strong>Uap naik dari bawah</strong>, membawa nitrogen, karena nitrogen paling mudah menguap.</li>
<li><strong>Cairan turun dari atas</strong>, membawa oksigen, karena oksigen lebih sulit menguap.</li>
</ul>
<p>Di setiap <strong>tray</strong> (semacam lantai kecil di dalam kolom), uap dan cairan bertemu dan saling bertukar komponen. Nitrogen cenderung menguap dan terus naik, sedangkan oksigen lebih mudah mengembun dan terus turun.</p>
<hr />

<h3 id="apa-yang-terjadi-jika-kolom-terlalu-dingin">Apa yang Terjadi Jika Kolom Terlalu Dingin?</h3>
<p>Saat kolom bawah terlalu dingin:</p>
<ul>
<li><strong>Uap nitrogen tidak terbentuk cukup banyak</strong> karena terlalu banyak yang terkondensasi jadi cair.</li>
<li>Aliran naik melemah — <strong>tidak ada dorongan uap yang cukup untuk menolak oksigen naik</strong>.</li>
</ul>
<p>Akibatnya:</p>
<blockquote>
<p><strong>Oksigen ikut naik ke bagian atas</strong>, dan mencemari produk nitrogen.</p>
</blockquote>
<hr />

<h3 id="logika-tekanan-parsial">Logika Tekanan Parsial</h3>
<p>Secara termodinamika:</p>
<ul>
<li>Di bagian atas kolom bawah, dominasi uap nitrogen menciptakan <strong>tekanan parsial nitrogen yang tinggi</strong>.</li>
<li>Ini seperti “penghalang molekul” yang <strong>mencegah oksigen untuk ikut menguap dan naik</strong>.</li>
</ul>
<p>Namun, jika suhu terlalu rendah:</p>
<ul>
<li>Uap nitrogen tidak cukup kuat.</li>
<li><strong>Penghalang itu melemah</strong>, dan oksigen bisa ikut naik ke atas.</li>
</ul>
<table>
<thead>
<tr>
<th>Komponen</th>
<th>Titik Didih @ 5.45 barA</th>
<th>Fase pada −170 °C</th>
</tr>
</thead>
<tbody>
<tr>
<td>Nitrogen</td>
<td>−177.97 °C</td>
<td>Uap</td>
</tr>
<tr>
<td>Argon</td>
<td>−166.12 °C</td>
<td>Campuran</td>
</tr>
<tr>
<td>Oksigen</td>
<td>−163.27 °C</td>
<td>Cair</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Biasanya suhu operasi kolom bawah dijaga sedikit di bawah titik didih nitrogen, misalnya sekitar −175 °C, tergantung tekanan operasi (misalnya 5.45 barA), untuk memastikan nitrogen mendidih dan oksigen mengembun secara selektif.</p>
</blockquote>
<hr />

<h3 id="bagaimana-jika-terlalu-hangat">Bagaimana Jika Terlalu Hangat?</h3>
<p>Sebaliknya, jika kolom bawah terlalu hangat:</p>
<ul>
<li><strong>Oksigen tidak cukup mengembun ke bentuk cair</strong>, sehingga gagal tertahan di bawah.</li>
<li><strong>Oksigen bisa tetap dalam fase uap</strong> dan ikut naik bersama nitrogen.</li>
</ul>
<p>Akibatnya:</p>
<blockquote>
<p>Produk nitrogen tetap tercemar oksigen — tapi kali ini karena <strong>oksigen gagal turun</strong>, bukan karena <strong>naik secara pasif</strong>.</p>
</blockquote>
<hr />

<h3 id="visualisasi-sederhana">Visualisasi Sederhana</h3>
<p>Bayangkan <strong>tiga kondisi suhu</strong> di kolom bawah:</p>
<ol>
<li>
<p><strong>Terlalu Dingin</strong><br />
Uap nitrogen lemah — oksigen ikut naik — nitrogen tidak murni.</p>
</li>
<li>
<p><strong>Terlalu Hangat</strong><br />
Oksigen gagal mengembun — tetap dalam uap — ikut naik — nitrogen tercemar.</p>
</li>
<li>
<p><strong>Normal (Ideal)</strong><br />
Tray bekerja optimal — nitrogen naik, oksigen turun — pemisahan sempurna.</p>
</li>
</ol>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/d510a781-de17-4e42-b4a7-ff9ce0cd774f-distillation_column.gif" alt="distillation_column.gif" style="max-width:75%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Gambar 1. Animasi pemisahan oksigen dan nitrogen dalam kondisi terlalu dingin, normal, dan terlalu hangat.
  </figcaption>
</div>
<blockquote>
<p>Keseimbangan suhu = pemisahan optimal.</p>
</blockquote>
<hr />

<h3 id="mnemonik-mudah">Mnemonik Mudah</h3>
<p>Jika kamu ingin mengingatnya dengan cepat, cukup ingat ini:</p>
<blockquote>
<p><strong>“Terlalu dingin, tak ada yang naik. Terlalu hangat, tak ada yang turun.”</strong></p>
</blockquote>
<hr />

<h3 id="apa-yang-terjadi-pada-liquid-air">Apa yang Terjadi pada Liquid Air?</h3>
<p>Cairan di dasar kolom bawah sering disebut sebagai <strong>liquid air</strong>, karena masih merupakan campuran oksigen, nitrogen, dan argon — belum sepenuhnya terpisah. Komposisinya mencerminkan seberapa baik proses pemisahan berlangsung di kolom bawah.</p>
<p>Suhu dasar kolom sangat mempengaruhi <strong>jumlah nitrogen</strong> yang tertahan dalam cairan ini:</p>
<ul>
<li>
<p><strong>Terlalu Dingin</strong><br />
Terlalu banyak nitrogen ikut mengembun — <strong>volume liquid air meningkat</strong>, tapi kandungannya lebih kaya nitrogen. Ini pertanda bahwa <strong>nitrogen tidak sepenuhnya menguap</strong> dan malah tertahan di dasar kolom.</p>
</li>
<li>
<p><strong>Terlalu Hangat</strong><br />
Nitrogen sudah menguap sempurna, tapi <strong>oksigen dan argon belum cukup banyak yang mengembun</strong>.<br />
Akibatnya: liquid air jadi lebih sedikit, tetap kaya oksigen, tapi miskin argon.<br />
Sebagian oksigen ikut naik ke bagian atas, <strong>menurunkan kemurnian nitrogen</strong> di puncak kolom bawah.</p>
</li>
</ul>
<p>Dalam praktik, <strong>komposisi liquid air</strong> (dari sensor inline atau analisis laboratorium) sering digunakan sebagai <strong>indikator tidak langsung</strong> apakah suhu dasar kolom sudah berada pada titik optimal.</p>
<blockquote>
<p>Jika cairan di bawah terlalu "encer" (kaya nitrogen), kolom bisa terlalu dingin.<br />
Jika cairannya terlalu "berat" (kaya oksigen), kolom bisa terlalu hangat.</p>
</blockquote>
<hr />

<h3 id="kesimpulan">Kesimpulan</h3>
<ul>
<li>Jangan kira semakin dingin itu semakin baik.</li>
<li>Jangan juga membiarkan kolom terlalu hangat.</li>
<li>Di kolom distilasi kriogenik, <strong>suhu yang terlalu ekstrem ke salah satu arah bisa membuat pemisahan gagal</strong>.</li>
<li>Jaga keseimbangan antara <strong>penguapan dan kondensasi</strong> agar nitrogen dan oksigen tetap di jalur masing-masing.</li>
</ul>
<hr />]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="cryogenic" /><category term="Cryogenic" /><summary type="html"><![CDATA[Suhu di kolom bawah distilasi kriogenik menentukan pemisahan nitrogen & oksigen. Terlalu dingin, nitrogen gagal menguap, liquid air kaya nitrogen. Terlalu hangat, oksigen ikut naik, cemari nitrogen. Komposisi liquid air sebagai indikator: keseimbangan suhu, kunci kemurnian.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1603126857599-f6e157fa2fe6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxveHlnZW58ZW58MHx8fHwxNzUzNjM0NDU2fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1603126857599-f6e157fa2fe6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxveHlnZW58ZW58MHx8fHwxNzUzNjM0NDU2fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Surging pada Kompresor Sentrifugal: Ketika Masalah Besar Berawal dari Modifikasi Kecil</title><link href="https://kumajaya.github.io/kiiota-blog/engineering-lessons/2025/07/21/surging-pada-kompresor-sentrifugal-ketika-masalah-besar-berawal-dari-modifikasi-kecil.html" rel="alternate" type="text/html" title="Surging pada Kompresor Sentrifugal: Ketika Masalah Besar Berawal dari Modifikasi Kecil" /><published>2025-07-21T15:56:15+00:00</published><updated>2025-07-21T15:56:15+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/engineering-lessons/2025/07/21/surging-pada-kompresor-sentrifugal-ketika-masalah-besar-berawal-dari-modifikasi-kecil</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/engineering-lessons/2025/07/21/surging-pada-kompresor-sentrifugal-ketika-masalah-besar-berawal-dari-modifikasi-kecil.html"><![CDATA[<div class="kg-card kg-audio-card"><img src="" alt="audio-thumbnail" class="kg-audio-thumbnail kg-audio-hide" /><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"></path></svg></div><div class="kg-audio-player-container"><audio src="https://blog.kiiota.com/content/media/2025/07/surging_id_ID.mp3" preload="metadata"></audio><div class="kg-audio-title">Ketika Masalah Besar Berawal dari Modifikasi Kecil</div><div class="kg-audio-player"><button class="kg-audio-play-icon" aria-label="Play audio"><svg viewBox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"></path></svg></button><button class="kg-audio-pause-icon kg-audio-hide" aria-label="Pause audio"><svg viewBox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">6.312</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0" /><button class="kg-audio-playback-rate" aria-label="Adjust playback speed">1×</button><button class="kg-audio-unmute-icon" aria-label="Unmute"><svg viewBox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"></path></svg></button><button class="kg-audio-mute-icon kg-audio-hide" aria-label="Mute"><svg viewBox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"></path></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100" /></div></div></div>
<h2 id="pendahuluan">Pendahuluan</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/01_surging_pada_kompresor_sentrifugal_ketika_masalah_besar_berawal_dari_modifikasi_kecil.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>Masalah kronis pada <strong>Kompresor Resirkulasi Nitrogen</strong> dan <strong>Booster Ekspander</strong> di unit <strong>Pabrik Pemisah Udara</strong> sudah muncul sejak commissioning, dipicu oleh modifikasi instalasi yang awalnya dimaksudkan untuk memberikan informasi kecepatan ekspander ke ruang kontrol untuk kepentingan operasional, namun berujung pada dampak teknis jangka panjang.</p>
<p>Perlu hampir sepuluh tahun—sejak saya mulai bekerja di industri ini pada 2007 hingga akhirnya terpecahkan di 2017—untuk benar-benar memahami dan menyelesaikan masalah ini. Dalam kurun waktu tersebut dan pasti juga sebelumnya, berbagai upaya telah dilakukan, namun sebagian besar hanya menyentuh gejalanya—bukan akarnya. Dari perspektif saya, artikel ini merekam perjalanan panjang—dari kecurigaan awal, eksperimen lapangan, hingga penyelesaian yang akhirnya mengembalikan sistem ke logika desain aslinya. Silakan memberikan sanggahan jika dirasa ada yang kurang tepat.</p>
<hr />

<h2 id="awal-mula-masalah">Awal Mula Masalah</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/02_awal_mula_masalah.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>Sejak awal, masalah ini seperti dipahami dengan premis yang keliru: hampir semua perhatian tertuju pada <strong>kompresor resirkulasi nitrogen</strong>, seolah-olah ia selalu menjadi biang keladi. Namun sejak awal, saya mencurigai ada yang tidak beres—terutama dalam urutan <em>shutdown</em> antara <strong>kompresor resirkulasi nitrogen</strong> dan <strong>booster ekspander</strong>.</p>
<p><strong>DCS menunjukkan bahwa kompresor resirkulasi nitrogen trip terlebih dahulu</strong>, tetapi saya meragukan kebenaran data ini. Ada <strong>kabel interlock</strong> yang memungkinkan kompresor resirkulasi nitrogen trip <strong>atas permintaan dari booster ekspander</strong>, sementara DCS—yang memproses ratusan I/O—bisa mengalami latensi dalam mencatat urutan kejadian, terutama yang terjadi dalam skala milidetik. Ini karena DCS melakukan <em>siklus pemindaian</em> terhadap I/O secara sekuensial, sedangkan sinyal trip bisa muncul <em>tidak sinkron</em>, baik di depan maupun di belakang jalannya siklus.</p>
<p>Demi memastikan urutan <em>shutdown</em> yang sebenarnya, saya merakit sendiri sebuah <strong>PLC Siemens S7</strong> sebagai <em>pencatan even</em> berkecepatan tinggi. Resolusi tinggi menjadi satu-satunya cara untuk secara obyektif membuktikan siapa yang benar-benar lebih dulu trip. Hasil pengujiannya <strong>konsisten</strong>: <strong>100% kejadian menunjukkan bahwa booster-lah yang lebih dulu trip</strong>. Ini disebabkan oleh <strong>pembukaan <em>bypass</em> booster secara mendadak</strong>, yang memicu <strong>surging pada kompresor resirkulasi nitrogen</strong>, akhirnya kompresor resirkulasi nitrogen ikut trip juga melalui perintah interlock. Tentu tidak semua langsung setuju dengan kesimpulan ini—karena memahami cara kerja DCS dan PLC memang memerlukan keahlian teknis yang mendalam.</p>
<blockquote>
<p><strong>Logika Ladder – Deteksi Trip yang Adil</strong></p>
<p>Logika ladder di bawah ini menerapkan sistem deteksi trip yang deterministik dengan menggunakan deteksi <em>rising edge</em> dan penanda memori.<br />
Sistem ini memastikan bahwa input mana pun—kompresor resirkulasi nitrogen atau booster ekspander—yang memicu trip pertama akan dicatat secara objektif, tanpa dipengaruhi oleh urutan pemindaian PLC.</p>
</blockquote>
<details>
<summary>Klik untuk membuka Logika Ladder dan Tabel Simbol PLC</summary>
<pre><code class="language-plaintext">// =====================================================
// First Trip Logic - Ladder Implementation
// Author: Ketut Kumajaya (with tweaks from Grok on 02 November 2025)
// Scope: Detect &amp; latch first trip antara C60 (I0.0) &amp; CD10 (I0.1)
// Fitur: Rising edge, latch tripped/first, lock first, manual reset
// Extendable: Duplikat rung 1-4 &amp; 5-6 untuk channel 3-8 (I0.2-I0.7, M0.5+, Q0.4+)
// =====================================================

// Rising Edge Detection untuk C60 (I0.0)
Rung 1:
|----[ I0.0 ]----[/ M0.3 ]----------------( M0.1 )  // Pulse C60 rising edge

Rung 2:
|----[ I0.0 ]-----------------------------( M0.3 )  // Latch state C60 (untuk tripped output)

// Rising Edge Detection untuk CD10 (I0.1)
Rung 3:
|----[ I0.1 ]----[/ M0.4 ]----------------( M0.2 )  // Pulse CD10 rising edge

Rung 4:
|----[ I0.1 ]-----------------------------( M0.4 )  // Latch state CD10 (untuk tripped output)

// Tripped Status Outputs (Latched dari state M)
Rung 5:
|----[ M0.3 ]-----------------------------( Q0.2 )  // C60 tripped (latched)

Rung 6:
|----[ M0.4 ]-----------------------------( Q0.3 )  // CD10 tripped (latched)

// Determine &amp; Latch First Trip (dengan lock M0.0)
Rung 7:
|----[ M0.1 ]----[/ M0.0 ]----------------( SET Q0.0 )  // Set first C60 jika pulse &amp; no lock
|                                     ----( M0.0 )  // Set lock

Rung 8:
|----[ M0.2 ]----[/ M0.0 ]----------------( SET Q0.1 )  // Set first CD10 jika pulse &amp; no lock
|                                     ----( M0.0 )  // Set lock (jika belum)

// Latch First Outputs (parallel hold, biar stay ON)
Rung 7a (parallel ke Rung 7 output):
|----[ Q0.0 ]-----------------------------( Q0.0 )  // Hold first C60

Rung 8a (parallel ke Rung 8 output):
|----[ Q0.1 ]-----------------------------( Q0.1 )  // Hold first CD10

// Manual Reset (clear semua latch &amp; lock)
Rung 9:
|----[ I0.2 ]---------------------------[RST M0.0]  // Reset lock
|                                       [RST M0.3]  // Reset state C60
|                                       [RST M0.4]  // Reset state CD10
|                                       [RST Q0.0]  // Reset first C60
|                                       [RST Q0.1]  // Reset first CD10
|                                       [RST Q0.2]  // Reset tripped C60
|                                       [RST Q0.3]  // Reset tripped CD10

</code></pre>
<table>
<thead>
<tr>
<th><strong>Symbol</strong></th>
<th><strong>Type</strong></th>
<th><strong>Function Description</strong></th>
<th><strong>Usage Notes</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>I0.0</code></td>
<td>Digital Input</td>
<td>Trip signal from compressor C60</td>
<td>Aktif HIGH saat trip; rising edge detected via M0.1. Inversi jika sinyal asli LOW.</td>
</tr>
<tr>
<td><code>I0.1</code></td>
<td>Digital Input</td>
<td>Trip signal from booster expander CD10</td>
<td>Sama seperti I0.0; rising edge via M0.2. Prioritas scan: C60 duluan (deterministik).</td>
</tr>
<tr>
<td><code>I0.2</code></td>
<td>Digital Input</td>
<td>Manual reset button to clear all trip flags</td>
<td>Edge-triggered; clear lock &amp; latches di Rung 9. Tambah debounce jika noisy.</td>
</tr>
<tr>
<td><code>Q0.0</code></td>
<td>Digital Output</td>
<td>Indicates C60 tripped first</td>
<td>Latched via SET; ON jika C60 first &amp; locked. Hubung ke HMI alarm.</td>
</tr>
<tr>
<td><code>Q0.1</code></td>
<td>Digital Output</td>
<td>Indicates CD10 tripped first</td>
<td>Latched via SET; ON hanya jika CD10 first (blokir jika lock sudah ON).</td>
</tr>
<tr>
<td><code>Q0.2</code></td>
<td>Digital Output</td>
<td>Status output: C60 has tripped</td>
<td>Latched dari M0.3; stay ON post-trip untuk monitoring.</td>
</tr>
<tr>
<td><code>Q0.3</code></td>
<td>Digital Output</td>
<td>Status output: CD10 has tripped</td>
<td>Latched dari M0.4; sama seperti Q0.2.</td>
</tr>
<tr>
<td><code>M0.0</code></td>
<td>Memory Bit</td>
<td>Trip detection flag—only one trip allowed per scan</td>
<td>Lock flag; SET saat first pulse, blokir others. Reset via I0.2.</td>
</tr>
<tr>
<td><code>M0.1</code></td>
<td>Memory Bit</td>
<td>Rising edge detected on C60</td>
<td>Pulse momentary (1 scan); trigger SET Q0.0 jika !M0.0.</td>
</tr>
<tr>
<td><code>M0.2</code></td>
<td>Memory Bit</td>
<td>Rising edge detected on CD10</td>
<td>Pulse momentary; trigger SET Q0.1 jika !M0.0.</td>
</tr>
<tr>
<td><code>M0.3</code></td>
<td>Memory Bit</td>
<td>Previous input state of C60 (for edge detection)</td>
<td>Latch I0.0 state; digunakan di [/M0.3] untuk rising edge.</td>
</tr>
<tr>
<td><code>M0.4</code></td>
<td>Memory Bit</td>
<td>Previous input state of CD10 (for edge detection)</td>
<td>Latch I0.1 state; sama seperti M0.3.</td>
</tr>
</tbody>
</table>
</details>
<p>Sejak awal commissioning, untuk menurunkan risiko surging, <strong>kompresor resirkulasi nitrogen tidak pernah dijalankan pada performa maksimal</strong>. <em>Bypass</em>-nya cenderung tetap terbuka, dan demi menjaga kestabilan operasi, operator mengembangkan rutinitas harian: <strong>menurunkan kecepatan ekspander</strong> saat suhu lingkungan mulai naik di pagi hari, dan <strong>menaikkannya kembali ketika malam lebih sejuk</strong>—sebuah seni bertahan di antara batas aman desain dan realitas operasional yang terus berubah. Strategi ini cukup efektif: malam hari yang lebih dingin dimanfaatkan untuk meningkatkan performa booster. Sementara siang hari yang panas dijaga agar tetap stabil—karena pada suhu tinggi, risiko <strong>surging</strong> dan <strong>trip</strong> jauh lebih besar.</p>
<p>Namun, mengoperasikan kompresor sentrifugal dengan <em>bypass</em> yang tidak sepenuhnya tertutup membuat seluruh plant menjadi <strong>sangat bising</strong>. Ini adalah kompromi performa yang mahal—menggerus efisiensi energi sekaligus menurunkan kenyamanan kerja akibat kebisingan konstan.</p>
<hr />

<h2 id="eksperimen-dan-investigasi">Eksperimen dan Investigasi</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/03_eksperimen_dan_investigasi.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>Strategi operasional dinamis yang diterapkan berdasarkan penilaian terhadap kondisi lingkungan <strong>tidak selalu memberikan hasil yang diharapkan</strong>. Ketika penilaian lingkungan kurang tepat—terlalu cepat atau terlalu lambat dalam merespons perubahan—penyesuaian kecepatan ekspander berulang kali <strong>gagal mencegah surging maupun trip</strong> pada sistem.</p>
<p>Masalah ini justru makin memburuk pada akhir 2016, meskipun sebelumnya telah dilakukan berbagai perbaikan, termasuk penggantian sejumlah komponen kontrol dan sensor. Upaya-upaya tersebut <strong>ternyata hanya menyentuh gejalanya, bukan akar permasalahannya</strong>. Situasinya seperti <strong>berkutat dengan penyakit yang tidak jelas diagnosanya, lalu mencoba berbagai obat yang tidak pernah benar-benar menyembuhkan</strong>.</p>
<p>Manajemen kemudian memutuskan untuk melakukan overhaul total pada kedua mesin—<strong>kompresor resirkulasi nitrogen dan booster ekspander</strong>. Namun, karena keterbatasan personel dari pihak vendor, hanya kompresor resirkulasi nitrogen yang dikerjakan.</p>
<p>Saat dilakukan uji coba pengoperasian kompresor resirkulasi nitrogen tanpa booster ekspander, <strong>mesin mampu berjalan hingga performa maksimal tanpa kendala</strong>. Hasil ini semakin memperkuat keyakinan saya bahwa <strong>kompresor resirkulasi nitrogen bukanlah akar dari permasalahan yang selama ini terjadi</strong>. Hanya beberapa hari setelah plant kembali beroperasi penuh, surging dan trip kembali terjadi—membawa kami kembali ke titik awal kebingungan.</p>
<p>Saya kemudian memutuskan membentuk <strong>tim kecil</strong>, terdiri dari teknisi kontrol, instrumentasi, dan mekanik terpilih—hanya mereka yang boleh terlibat dan mereka hanya menerima perintah dari saya. Bersama-sama, kami menjalankan serangkaian investigasi intensif:</p>
<ul>
<li><strong>Perekaman local panel</strong> menggunakan video real-time secara bergantian, meski sangat tidak nyaman</li>
<li><strong>Pemodelan ulang sinyal trip</strong>, setelah kami memperoleh rekaman berharga dari saat terjadinya gangguan</li>
<li><strong>Evaluasi rangkaian sinyal 4–20</strong>, yang ternyata dibebani tiga perangkat, bukan dua seperti seharusnya</li>
<li><strong>Simulasi dugaan</strong>, dan kami berhasil merekonstruksi ulang akar permasalahannya dengan presisi!</li>
</ul>
<p>Temuan paling krusial datang dari satu hal yang luput sejak awal: <strong>sinyal analog ternyata berasal dari sumber tegangan 5 volt DC</strong>, bukan 24 volt DC seperti saya kira. Ini bukan sekadar perbedaan angka—melainkan perbedaan mendasar dalam kapasitas daya dan toleransi terhadap beban. Ini saya temukan saat dokumen perangkat kontrol kecepatan lama saya bawa pulang dan baca di rumah.</p>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/fe18e9c7-d3ea-4542-b701-83a46cb36702-surging_design_violation.svg" alt="surging_design_violation" style="max-width:100%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Gambar 1. Pelanggaran Desain—sinyal analog kelebihan beban
  </figcaption>
</div>
<p>Lebih lanjut, <strong>output tersebut ternyata dibebani tiga perangkat</strong>, padahal dalam desain awal hanya dirancang untuk dua. Kombinasi tegangan rendah dan jumlah beban berlebih ini menimbulkan <strong>distorsi sinyal</strong> yang nyata. Semakin tinggi kecepatan operasi, semakin besar arus yang ditarik, dan <strong>tegangan mulai merosot</strong> akibat drop tegangan di tiap beban.</p>
<p>Hingga pada titik tertentu, <strong>sumber 5 volt DC tak mampu lagi mempertahankan level tegangan minimum</strong>, dan sinyal analog tiba-tiba anjlok. Di sinilah masalah puncaknya muncul—<strong>kontrol anti surging pada booster ekspander membaca kondisi ini sebagai gangguan serius</strong>, dan merespons secara agresif meski sebenarnya tidak diperlukan.</p>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/fe18e9c7-d3ea-4542-b701-83a46cb36702-Voltage_vs_Speed.svg" alt="Voltage_vs_Speed" style="max-width:100%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Gambar 2. Pelanggaran Desain—penurunan kecepatan memicu respon anti surge yang tidak perlu
  </figcaption>
</div>
<details>
<summary>Klik untuk membuka skrip plotting Python di atas</summary>
<pre><code class="language-javascript">import numpy as np
import matplotlib.pyplot as plt

# Current range (mA)
current_mA = np.linspace(4, 20, 1000)

# Convert to RPM (0–45000 RPM)
rpm = (current_mA - 4) / 16 * 45000

# Load resistances (ohms)
resistors = [125, 250, 350]
colors = ['tab:blue', 'tab:orange', 'tab:red']

# Output voltage for each resistance
voltages = {R: current_mA / 1000 * R for R in resistors}

plt.figure(figsize=(10, 6))

for i, R in enumerate(resistors):
    voltage = voltages[R]
    label = f'{R} Ω Load' if R &lt; 350 else f'{R} Ω Load (design violation)'
    linestyle = '-' if R &lt; 350 else '--'  # Dashed line indicates thermal shift or excessive load

    plt.plot(rpm, voltage, label=label, color=colors[i], linestyle=linestyle)

    # Find where voltage reaches 5V
    idx_5 = np.argmin(np.abs(voltage - 5))
    rpm_at_5V = rpm[idx_5]
    plt.axvline(rpm_at_5V, color=colors[i], linestyle=':', alpha=0.6)
    plt.text(rpm_at_5V, 5.3, f'{int(rpm_at_5V)} RPM', rotation=90,
             verticalalignment='bottom', horizontalalignment='right',
             fontsize=8, color=colors[i])

# Find where voltage reaches 4.8V
idx_4 = np.argmin(np.abs(voltage - 4.8))
rpm_at_4 = rpm[idx_4]
plt.axvline(rpm_at_4, color=colors[2], linestyle=':', alpha=0.6)
plt.text(rpm_at_4, 5.3, f'{int(rpm_at_4)} RPM', rotation=90,
            verticalalignment='bottom', horizontalalignment='right',
            fontsize=8, color=colors[2])

# Compliance limit line
plt.axhline(5, color='black', linestyle='--', label='Maximum Voltage (5 V)')

# Warning voltage line
plt.axhline(4.8, color='red', linestyle='--', label='Voltage Drop Due to Load (4.8 V)')

# Labels and titles
plt.title('Analog Speed Signal Distortion Due to Voltage Drop')
plt.xlabel('Expander Speed (RPM)')
plt.ylabel('Analog Voltage (V)')
plt.grid(True)
plt.legend()
plt.xlim(0, 45000)
plt.ylim(0, 7)
plt.tight_layout()

# Export as SVG
plt.savefig("Voltage_vs_Speed.svg", format='svg')
plt.show()
</code></pre>
</details>
<p>Akhirnya jelas: <strong>modifikasi rangkaian awal—yang niatnya hanya untuk menampilkan informasi di ruang kontrol—secara tidak sengaja menciptakan anomali pengukuran</strong>. Gangguan kecil ini, yang selama bertahun-tahun tersembunyi di balik asumsi dan rutinitas, justru menjadi penyebab utama gangguan sistemik yang kompleks dan mahal.</p>
<hr />

<h2 id="modifikasi-kecil-hasil-besar">Modifikasi Kecil, Hasil Besar</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/04_modifikasi_kecil_hasil_besar.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>Setelah berhasil merekonstruksi akar masalahnya, saya menyusun presentasi singkat untuk menjelaskan apa yang sebenarnya terjadi, disertai solusi yang sangat sederhana: <strong>mengembalikan rangkaian ke desain awalnya</strong>. Solusi ini saya yakini aman dan tepat, karena tidak melibatkan perubahan logika atau perangkat, melainkan hanya mengoreksi modifikasi rangkaian yang terbukti keliru.</p>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/fe18e9c7-d3ea-4542-b701-83a46cb36702-surging_fix.svg" alt="surging_fix" style="max-width:100%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Gambar 3. Koreksi yang Diusulkan—konsep pemisahan sinyal untuk mengurangi risiko kelebihan beban analog
  </figcaption>
</div>
<p>Dengan penuh keyakinan, saya sampaikan proposal ini dalam rapat manajemen. Namun, yang terjadi justru di luar dugaan: <strong>saya tidak diizinkan melakukan eksekusi</strong>, dan diarahkan untuk menunggu teknisi dari vendor datang melakukan klarifikasi dan perbaikan. Padahal, selama bertahun-tahun, pihak vendor maupun pihak lain tidak pernah berhasil menyelesaikan masalah ini secara tuntas.</p>
<p>Saya mencoba kembali, kali ini lewat pendekatan personal setelah rapat, untuk menjelaskan duduk perkaranya secara teknis. Tetapi hasilnya tetap sama: tidak diberi ruang untuk bertindak.</p>
<p>Pada titik ini, saya mulai merasa bahwa <strong>hambatan yang saya hadapi bukan lagi teknis, tetapi politis</strong>. Sebuah ironi, ketika pemahaman yang mendalam terhadap masalah justru bukan menjadi dasar kepercayaan.</p>
<p>Karena dukungan dari vendor tak kunjung pasti, saya sudah menetapkan dalam hati: kapan pun plant kembali trip, maka solusi yang saya siapkan akan langsung saya eksekusi. Dan tentu hari itu benar-benar datang. Tetap dengan prosedur, saya meminta izin kepada atasan langsung sebelum bertindak. Untungnya, perangkat kontrol kecepatan yang belum lama saya ganti memiliki dua kanal output–menghilangkan kebutuhan splitter sinyal yang sempat direncanakan sebelumnya. Dengan sedikit modifikasi program, saya set keduanya untuk mengeluarkan sinyal identik—satu untuk kontrol anti surging, dan satu lagi dipakai bersama untuk tampilan lokal serta sinyal ke DCS. Modifikasi rangkaian menjadi <strong>jauh lebih sederhana—dan lebih aman</strong>.</p>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/fe18e9c7-d3ea-4542-b701-83a46cb36702-surging_final.svg" alt="surging_final" style="max-width:100%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Gambar 4. Implementasi Final—output analog ganda menyelesaikan distorsi sinyal
  </figcaption>
</div>
<p>Hanya dengan <strong>seutas kabel 30 cm</strong> dan satu <strong>obeng kecil</strong>, saya menyambung ulang output analog yang selama ini menjadi sumber masalah tersembunyi.<br />
Setelah diperbaiki, <em>kontrol anti surging</em> pada booster ekspander saya uji ulang — dan hasilnya tak terbantahkan: <strong>sistem pulih total</strong>, <strong>tanpa anomali</strong>.</p>
<blockquote>
<p>"Kadang, perbaikan besar dimulai dari hal yang tampak sepele—asal kita cukup gigih mencarinya dan tidak menganggap sebuah masalah pasti abadi."</p>
</blockquote>
<hr />

<h2 id="efek-langsung-dan-tidak-langsung">Efek Langsung dan Tidak Langsung</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/05_efek_langsung_dan_tidak_langsung.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>Modifikasi kecil ini membawa dampak besar terhadap performa plant, baik secara teknis maupun ekonomis:</p>
<ul>
<li><strong>Kompresor resirkulasi nitrogen kini dapat beroperasi dengan <em>bypass</em> tertutup sepenuhnya</strong>, memungkinkan sistem berjalan mendekati performa desain. Nitrogen tak lagi berputar-putar tanpa tujuan, sekaligus mengurangi beban pada sistem pendingin.</li>
<li><strong>Kompresor sentrifugal menjadi senyap</strong>, tidak ada lagi suara khas peluit dari aliran <em>bypass</em>—sebuah <em>keheningan yang menandakan efisiensi</em>.</li>
<li><strong>Konsumsi energi dan dengan demikian tagihan listrik menurun drastis</strong>, karena siklus nitrogen yang tidak efektif telah dieliminasi, dan kebutuhan untuk start ulang mesin jauh berkurang.</li>
<li><strong>Produksi nitrogen dan argon meningkat</strong>, seiring proses yang berjalan lebih stabil dan optimal sesuai rancangan awal.</li>
</ul>
<p>Tentu saja, perubahan ini tidak langsung terasa seketika. Butuh waktu untuk <strong>membongkar pola operasi</strong> yang sudah terbentuk selama bertahun-tahun dan <strong>membangun keyakinan terhadap perubahan</strong> yang sudah dilakukan memerlukan perubahan lanjutan pada proses.</p>
<p>Saya sendiri saat itu belum memiliki kemampuan untuk menghitung kapasitas plant secara independen. Tapi menurut informasi, modifikasi ini <em>disebut-sebut memberikan dampak nyata</em>:</p>
<blockquote>
<p><strong>Penghematan lebih dari 1 miliar rupiah per bulan</strong><br />
Kombinasi dari penurunan konsumsi listrik dan peningkatan output produksi.</p>
</blockquote>
<p>Angka pastinya bisa diperdebatkan. Tapi suara kompresor yang tak lagi menjerit—itu bukti paling nyata bahwa perubahan sudah terjadi.</p>
<hr />

<h2 id="tantangan-budaya-dan-persepsi">Tantangan Budaya dan Persepsi</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/06_tantangan_budaya_dan_persepsi.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>Tantangan terbesar dalam menyelesaikan masalah sering kali bukanlah teknis, melainkan budaya kerja dan struktur pengambilan keputusan. Dalam sistem yang kompleks dan telah lama beroperasi, tidak jarang <strong>tak ada satu pun individu yang benar-benar memahami persoalan secara utuh</strong>. Pemahaman tersebar dan terfragmentasi — sebagian ada di engineer, sebagian di operator, sebagian lagi tersembunyi dalam dokumentasi yang jarang disentuh kembali.</p>
<p>Dalam kondisi seperti ini, arah <em>troubleshooting</em> lebih banyak ditentukan oleh siapa yang memiliki kewenangan, bukan oleh siapa yang paling memahami persoalan. Solusi pun kerap dibentuk oleh intuisi, kebiasaan, atau tekanan untuk segera “memulihkan operasi” — bukan oleh hasil diagnosa yang mendalam.</p>
<p>Bukan karena sistem sengaja dibiarkan menyimpang dari desain, melainkan karena <strong>upaya-upaya menemukan akar masalah berulang kali menemui jalan buntu</strong>. Ketika berbagai pendekatan tak kunjung membuahkan hasil, organisasi akhirnya memilih jalan yang dianggap paling aman: bertahan pada konfigurasi yang stabil meskipun menyimpang. Selama sistem masih berjalan dan tidak terjadi kerusakan fatal, kondisi ini perlahan diterima sebagai kenormalan baru.</p>
<p>Namun ketika gangguan makin sering terjadi, rutinitas penanganan tak lagi cukup. <strong>Diperlukan keberanian untuk mengajukan narasi tandingan</strong> — membuka kemungkinan bahwa akar masalah belum benar-benar tersentuh, bahwa ada sesuatu yang selama ini luput dari pemahaman kolektif kita.</p>
<p>Perubahan sejati biasanya baru memiliki ruang ketika tekanan sudah cukup tinggi, data sudah cukup kuat, dan rasa frustrasi sudah cukup mendalam. Di titik ini, pendekatan baru akhirnya punya peluang untuk dicoba — dan perbaikan yang nyata bisa mulai terjadi.</p>
<hr />

<h2 id="penutup">Penutup</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/07_penutup.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>Ini bukan semata urusan memperbaiki rangkaian atau logika kontrol, melainkan <strong>upaya menata ulang kepercayaan terhadap desain awal</strong>—dan lebih dari itu, <strong>keberanian untuk mengoreksi sistem yang selama ini dianggap sudah final</strong>.</p>
<p>Saya bahkan sempat berpikir, <em>“Kalau saja output perangkat kontrol kecepatan baru kebetulan 12 volt atau 24 volt, mungkin masalah ini selesai dengan sendirinya.”</em> Tapi bisa jadi, saya tidak akan pernah tahu sumber masalah yang sebenarnya.</p>
<p>Setelah dua dekade berjalan dalam kondisi yang menyimpang, akhirnya sistem ini bekerja sebagaimana mestinya. Bukan karena alatnya berubah, tapi karena cara kita memahaminya yang berubah. Sebuah proses panjang yang menghadirkan <strong>pembelajaran teknis sekaligus manajerial yang tak ternilai</strong>.</p>
<hr />

<p><strong>Catatan Penulis</strong></p>
<p>Tulisan ini bukan hanya soal teknis, tapi juga tentang <strong>manajemen perubahan</strong>, <strong>analisis historis</strong>, dan <strong>ketangguhan menghadapi resistensi</strong>.</p>
<blockquote>
<p>Massa otot bukan segalanya —  neuronlah yang membuat otak bekerja lebih cepat. 🧠⚡</p>
</blockquote>
<p style="text-align:center; font-size:0.95em; color:#555; margin-top:2em;">
  Dan jika semuanya gagal...
</p>
<p><a href="https://www.youtube.com/watch?v=BGednQsQ-h8&amp;ref=blog.kiiota.com" target="_blank" rel="noopener noreferrer" style="display:inline-block; position:relative; text-decoration:none; margin-top:2em;" onmouseover="this.firstElementChild.style.filter='brightness(0.8) contrast(1.2)'" onmouseout="this.firstElementChild.style.filter='none'">
  <img src="https://img.youtube.com/vi/BGednQsQ-h8/hqdefault.jpg" alt="Limp Bizkit - The Truth" style="width:100%; max-width:200px; border:0; display:block; margin:0 auto; border-radius:8px;" />
  <img src="https://upload.wikimedia.org/wikipedia/commons/7/75/YouTube_play_button_icon_%282017%29.svg" alt="Play" style="position:absolute; top:50%; left:50%; width:36px; height:36px; transform:translate(-50%,-50%); opacity:0.85;" />
</a></p>
<figcaption style="text-align:center; font-size:0.9em; font-style:italic; margin-top:6px; color:#444;">
  Terkadang, satu-satunya keadilan yang tersisa... adalah menyampaikan <strong>kebenaran</strong>.
</figcaption>]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="engineering-lessons" /><category term="Engineering Lessons" /><category term="Troubleshooting" /><summary type="html"><![CDATA[Tulisan ini bukan hanya soal teknis, tapi juga tentang manajemen perubahan, analisis historis, dan ketangguhan menghadapi resistensi.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1630941150115-ae465f29ece0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIyfHxzdHJlc3N8ZW58MHx8fHwxNzUzMDI2Nzk3fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1630941150115-ae465f29ece0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIyfHxzdHJlc3N8ZW58MHx8fHwxNzUzMDI2Nzk3fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Surging on Centrifugal Compressor: When Big Problems Start from Small Modifications</title><link href="https://kumajaya.github.io/kiiota-blog/engineering-lessons/2025/07/18/surging-on-centrifugal-compressor-when-big-problems-start-from-small-modifications.html" rel="alternate" type="text/html" title="Surging on Centrifugal Compressor: When Big Problems Start from Small Modifications" /><published>2025-07-18T19:23:19+00:00</published><updated>2025-07-18T19:23:19+00:00</updated><id>https://kumajaya.github.io/kiiota-blog/engineering-lessons/2025/07/18/surging-on-centrifugal-compressor-when-big-problems-start-from-small-modifications</id><content type="html" xml:base="https://kumajaya.github.io/kiiota-blog/engineering-lessons/2025/07/18/surging-on-centrifugal-compressor-when-big-problems-start-from-small-modifications.html"><![CDATA[<div class="kg-card kg-audio-card"><img src="" alt="audio-thumbnail" class="kg-audio-thumbnail kg-audio-hide" /><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"></path></svg></div><div class="kg-audio-player-container"><audio src="https://blog.kiiota.com/content/media/2025/07/surging_en_US.mp3" preload="metadata"></audio><div class="kg-audio-title">When Big Problems Start from Small Modifications</div><div class="kg-audio-player"><button class="kg-audio-play-icon" aria-label="Play audio"><svg viewBox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"></path></svg></button><button class="kg-audio-pause-icon kg-audio-hide" aria-label="Pause audio"><svg viewBox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">6.84</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0" /><button class="kg-audio-playback-rate" aria-label="Adjust playback speed">1×</button><button class="kg-audio-unmute-icon" aria-label="Unmute"><svg viewBox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"></path></svg></button><button class="kg-audio-mute-icon kg-audio-hide" aria-label="Mute"><svg viewBox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"></path></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100" /></div></div></div>
<h2 id="introduction">Introduction</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/01_surging_on_centrifugal_compressor_when_big_problems_start_from_small_modifications.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>Chronic issues with the <strong>Recycle Nitrogen Compressor</strong> and <strong>Booster Expander</strong> in the <strong>Air Separation Plant</strong> unit have been present since commissioning, triggered by installation modifications initially intended to provide expander speed information to the control room for operational purposes, but ultimately leading to long-term technical impacts.</p>
<p>It took nearly ten years—from when I started working in this industry in 2007 until the problem was finally resolved in 2017—to truly understand and solve this issue. During that time, and certainly before, various efforts were made, but most only addressed the symptoms—not the root cause. From my perspective, this article records a long journey—from initial suspicions, field experiments, to the resolution that finally restored the system to its original design logic. Please feel free to provide counterarguments if you feel there are inaccuracies.</p>
<hr />

<h2 id="the-beginning-of-the-problem">The Beginning of the Problem</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/02_the_beginning_of_the_problem.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>From the start, this problem seemed to be understood with a flawed premise: almost all attention was focused on the <strong>recycle nitrogen compressor</strong>, as if it was always the culprit. However, from the beginning, I suspected something was amiss—especially in the shutdown sequence between the <strong>recycle nitrogen compressor</strong> and <strong>booster expander</strong>.</p>
<p><strong>DCS showed that the recycle nitrogen compressor tripped first</strong>, but I doubted the accuracy of this data. There was a <strong>hardwired interlock</strong> that allowed the recycle nitrogen compressor to trip <strong>upon request from the booster expander</strong>, while DCS—which processes hundreds of I/Os—could experience latency in recording the sequence of events, especially those occurring within milliseconds. This is because DCS performs a <em>cyclic scan</em> of I/Os sequentially, whereas trip signals can appear <em>asynchronously</em>, either ahead of or behind the <em>scan</em> cycle.</p>
<p>To ensure the actual shutdown sequence, I assembled a <strong>Siemens S7 PLC</strong> as a high-speed <em>event logger</em>. High resolution was the only way to objectively prove who actually tripped first. The test results were <strong>consistent</strong>: <strong>100% of events showed that the booster tripped first</strong>. This was caused by the <strong>sudden opening of the booster bypass</strong>, which triggered <strong>surging on the recycle nitrogen compressor</strong>, eventually causing the recycle nitrogen compressor to trip as well through interlock commands. Of course, not everyone immediately agreed with this conclusion—because understanding how DCS and PLC work requires deep technical expertise.</p>
<blockquote>
<p><strong>Ladder Logic – Fair Trip Detection</strong></p>
<p>The ladder logic below implements a deterministic trip detection system using rising edge recognition and memory flags.<br />
It ensures that whichever input (recycle nitrogen compressor or booster expander) triggers a trip first is recorded objectively—regardless of PLC scan order.</p>
</blockquote>
<details>
<summary>Click to reveal for Ladder Logic and PLC Symbol Table</summary>
<pre><code class="language-plaintext">// =====================================================
// First Trip Logic - Ladder Implementation
// Author: Ketut Kumajaya (with tweaks from Grok on November 02, 2025)
// Scope: Detect &amp; latch first trip between C60 (I0.0) &amp; CD10 (I0.1)
// Features: Rising edge detection, latch tripped/first status, lock first trip, manual reset
// Extendable: Duplicate rungs 1-4 &amp; 5-6 for channels 3-8 (I0.2-I0.7, M0.5+, Q0.4+)
// =====================================================

// Rising Edge Detection for C60 (I0.0)
Rung 1:
|----[ I0.0 ]----[/ M0.3 ]----------------( M0.1 )  // C60 rising edge pulse

Rung 2:
|----[ I0.0 ]-----------------------------( M0.3 )  // Latch C60 state (for tripped output)

// Rising Edge Detection for CD10 (I0.1)
Rung 3:
|----[ I0.1 ]----[/ M0.4 ]----------------( M0.2 )  // CD10 rising edge pulse

Rung 4:
|----[ I0.1 ]-----------------------------( M0.4 )  // Latch CD10 state (for tripped output)

// Tripped Status Outputs (Latched from state M)
Rung 5:
|----[ M0.3 ]-----------------------------( Q0.2 )  // C60 tripped (latched)

Rung 6:
|----[ M0.4 ]-----------------------------( Q0.3 )  // CD10 tripped (latched)

// Determine &amp; Latch First Trip (with lock M0.0)
Rung 7:
|----[ M0.1 ]----[/ M0.0 ]----------------( SET Q0.0 )  // Set first C60 if pulse &amp; no lock
|                                     ----( M0.0 )  // Set lock

Rung 8:
|----[ M0.2 ]----[/ M0.0 ]----------------( SET Q0.1 )  // Set first CD10 if pulse &amp; no lock
|                                     ----( M0.0 )  // Set lock (if not already set)

// Latch First Outputs (parallel hold to keep ON)
Rung 7a (parallel to Rung 7 output):
|----[ Q0.0 ]-----------------------------( Q0.0 )  // Hold first C60

Rung 8a (parallel to Rung 8 output):
|----[ Q0.1 ]-----------------------------( Q0.1 )  // Hold first CD10

// Manual Reset (clear all latches &amp; lock)
Rung 9:
|----[ I0.2 ]---------------------------[RST M0.0]  // Reset lock
|                                       [RST M0.3]  // Reset C60 state
|                                       [RST M0.4]  // Reset CD10 state
|                                       [RST Q0.0]  // Reset first C60
|                                       [RST Q0.1]  // Reset first CD10
|                                       [RST Q0.2]  // Reset tripped C60
|                                       [RST Q0.3]  // Reset tripped CD10

</code></pre>
<table>
<thead>
<tr>
<th><strong>Symbol</strong></th>
<th><strong>Type</strong></th>
<th><strong>Function Description</strong></th>
<th><strong>Usage Notes</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>I0.0</code></td>
<td>Digital Input</td>
<td>Trip signal from compressor C60</td>
<td>Active HIGH on trip; rising edge detected via M0.1. Invert if original signal LOW.</td>
</tr>
<tr>
<td><code>I0.1</code></td>
<td>Digital Input</td>
<td>Trip signal from booster expander CD10</td>
<td>Same as I0.0; rising edge via M0.2. Scan priority: C60 first (deterministic).</td>
</tr>
<tr>
<td><code>I0.2</code></td>
<td>Digital Input</td>
<td>Manual reset button to clear all trip flags</td>
<td>Edge-triggered; clears lock &amp; latches in Rung 9. Add debounce if noisy.</td>
</tr>
<tr>
<td><code>Q0.0</code></td>
<td>Digital Output</td>
<td>Indicates C60 tripped first</td>
<td>Latched via SET; ON if C60 first &amp; locked. Connect to HMI alarm.</td>
</tr>
<tr>
<td><code>Q0.1</code></td>
<td>Digital Output</td>
<td>Indicates CD10 tripped first</td>
<td>Latched via SET; ON only if CD10 first (blocked if lock already ON).</td>
</tr>
<tr>
<td><code>Q0.2</code></td>
<td>Digital Output</td>
<td>Status output: C60 has tripped</td>
<td>Latched from M0.3; stays ON post-trip for monitoring.</td>
</tr>
<tr>
<td><code>Q0.3</code></td>
<td>Digital Output</td>
<td>Status output: CD10 has tripped</td>
<td>Latched from M0.4; same as Q0.2.</td>
</tr>
<tr>
<td><code>M0.0</code></td>
<td>Memory Bit</td>
<td>Trip detection flag—only one trip allowed per scan</td>
<td>Lock flag; SET on first pulse, blocks others. Reset via I0.2.</td>
</tr>
<tr>
<td><code>M0.1</code></td>
<td>Memory Bit</td>
<td>Rising edge detected on C60</td>
<td>Momentary pulse (1 scan); triggers SET Q0.0 if !M0.0.</td>
</tr>
<tr>
<td><code>M0.2</code></td>
<td>Memory Bit</td>
<td>Rising edge detected on CD10</td>
<td>Momentary pulse; triggers SET Q0.1 if !M0.0.</td>
</tr>
<tr>
<td><code>M0.3</code></td>
<td>Memory Bit</td>
<td>Previous input state of C60 (for edge detection)</td>
<td>Latches I0.0 state; used in [/M0.3] for rising edge.</td>
</tr>
<tr>
<td><code>M0.4</code></td>
<td>Memory Bit</td>
<td>Previous input state of CD10 (for edge detection)</td>
<td>Latches I0.1 state; same as M0.3.</td>
</tr>
</tbody>
</table>
</details>
<p>Since commissioning, to reduce the risk of surging, <strong>the recycle nitrogen compressor has never been operated at maximum performance</strong>. Its bypass tends to remain open, and to maintain operational stability, operators developed a daily routine: <strong>reducing expander speed</strong> when ambient temperatures began to rise in the morning, and <strong>increasing it again when the night was cooler</strong>—an art of survival between the safe design limits and the ever-changing operational realities. This strategy was quite effective: cooler nights were utilized to boost booster performance. Meanwhile, hot days were kept stable—because at high temperatures, the risk of <strong>surging</strong> and <strong>tripping</strong> was much greater.</p>
<p>However, operating a centrifugal compressor with a bypass that is not fully closed made the entire plant <strong>very noisy</strong>. This was a costly performance compromise—eroding energy efficiency while reducing work comfort due to constant noise.</p>
<hr />

<h2 id="experiments-and-investigations">Experiments and Investigations</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/03_experiments_and_investigations.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>The dynamic operational strategy applied based on environmental condition assessments <strong>did not always yield the expected results</strong>. When environmental assessments were inaccurate—too early or too late in responding to changes—adjustments to expander speed repeatedly <strong>failed to prevent surging or tripping</strong> in the system.</p>
<p>This problem worsened at the end of 2016, despite various improvements previously made, including replacing several control components and sensors. These efforts <strong>turned out to only address the symptoms, not the root cause</strong>. The situation was like <strong>dealing with a disease with an unclear diagnosis, then trying various medications that never truly cured it</strong>.</p>
<p>Management then decided to conduct a total overhaul of both machines—<strong>recycle nitrogen compressor and booster expander</strong>. However, due to personnel limitations from the vendor, only the recycle nitrogen compressor was worked on.</p>
<p>When testing the operation of the recycle nitrogen compressor without the booster expander, <strong>the machine was able to run at maximum performance without any issues</strong>. This result further strengthened my belief that <strong>the recycle nitrogen compressor was not the root cause of the problems that had been occurring</strong>. Just a few days after the plant resumed full operation, surging and tripping occurred again—bringing us back to the initial confusion.</p>
<p>I then decided to form a <strong>small team</strong>, consisting of selected control, instrumentation, and mechanical technicians—only those who were allowed to be involved and they only received orders from me. Together, we conducted a series of intensive investigations:</p>
<ul>
<li><strong>Recording local panels</strong> using real-time video alternately, although very uncomfortable</li>
<li><strong>Remodeling trip signals</strong>, after we obtained valuable recordings from the time of the disturbance</li>
<li><strong>Evaluating 4–20 mA signal wiring</strong>, which turned out to be loaded with three devices, not two as it should have been</li>
<li><strong>Simulating assumptions</strong>, and we successfully reconstructed the root cause with precision!</li>
</ul>
<p>The most crucial finding came from one thing that had been overlooked from the start: <strong>the analog signal actually came from a 5V DC voltage source</strong>, not 24V DC as I had assumed. This was not just a numerical difference—but a fundamental difference in power capacity and tolerance to load. I discovered this when I brought home and read the old speed controller document.</p>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/fe18e9c7-d3ea-4542-b701-83a46cb36702-surging_design_violation.svg" alt="surging_design_violation" style="max-width:100%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Figure 1. Design Violation—analog signal overloaded by excessive output load
  </figcaption>
</div>
<p>Furthermore, <strong>the output was actually loaded with three devices</strong>, whereas in the original design it was only designed for two. The combination of low voltage and excessive load caused <strong>significant signal distortion</strong>. The higher the operating speed, the greater the current drawn, and <strong>the voltage began to drop</strong> due to voltage drop at each load.</p>
<p>At a certain point, <strong>the 5V DC source could no longer maintain the minimum voltage level</strong>, and the analog signal suddenly plummeted. This is where the peak problem emerged—<strong>the anti-surge controller on the booster expander read this condition as a serious disturbance</strong>, and responded aggressively even though it was not actually necessary.</p>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/fe18e9c7-d3ea-4542-b701-83a46cb36702-Voltage_vs_Speed.svg" alt="Voltage_vs_Speed" style="max-width:100%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Figure 2. Design Violation—speed drop triggered unnecessary surge control
  </figcaption>
</div>
<details>
<summary>Click to reveal for above Python plotting script</summary>
<pre><code class="language-javascript">import numpy as np
import matplotlib.pyplot as plt

# Current range (mA)
current_mA = np.linspace(4, 20, 1000)

# Convert to RPM (0–45000 RPM)
rpm = (current_mA - 4) / 16 * 45000

# Load resistances (ohms)
resistors = [125, 250, 350]
colors = ['tab:blue', 'tab:orange', 'tab:red']

# Output voltage for each resistance
voltages = {R: current_mA / 1000 * R for R in resistors}

plt.figure(figsize=(10, 6))

for i, R in enumerate(resistors):
    voltage = voltages[R]
    label = f'{R} Ω Load' if R &lt; 350 else f'{R} Ω Load (design violation)'
    linestyle = '-' if R &lt; 350 else '--'  # Dashed line indicates thermal shift or excessive load

    plt.plot(rpm, voltage, label=label, color=colors[i], linestyle=linestyle)

    # Find where voltage reaches 5V
    idx_5 = np.argmin(np.abs(voltage - 5))
    rpm_at_5V = rpm[idx_5]
    plt.axvline(rpm_at_5V, color=colors[i], linestyle=':', alpha=0.6)
    plt.text(rpm_at_5V, 5.3, f'{int(rpm_at_5V)} RPM', rotation=90,
             verticalalignment='bottom', horizontalalignment='right',
             fontsize=8, color=colors[i])

# Find where voltage reaches 4.8V
idx_4 = np.argmin(np.abs(voltage - 4.8))
rpm_at_4 = rpm[idx_4]
plt.axvline(rpm_at_4, color=colors[2], linestyle=':', alpha=0.6)
plt.text(rpm_at_4, 5.3, f'{int(rpm_at_4)} RPM', rotation=90,
            verticalalignment='bottom', horizontalalignment='right',
            fontsize=8, color=colors[2])

# Compliance limit line
plt.axhline(5, color='black', linestyle='--', label='Maximum Voltage (5 V)')

# Warning voltage line
plt.axhline(4.8, color='red', linestyle='--', label='Voltage Drop Due to Load (4.8 V)')

# Labels and titles
plt.title('Analog Speed Signal Distortion Due to Voltage Drop')
plt.xlabel('Expander Speed (RPM)')
plt.ylabel('Analog Voltage (V)')
plt.grid(True)
plt.legend()
plt.xlim(0, 45000)
plt.ylim(0, 7)
plt.tight_layout()

# Export as SVG
plt.savefig("Voltage_vs_Speed.svg", format='svg')
plt.show()
</code></pre>
</details>
<p>Finally, it became clear: <strong>the initial circuit modification—which was intended only to display information in the control room—accidentally created measurement anomalies</strong>. This small disturbance, which for years was hidden behind assumptions and routines, turned out to be the main cause of complex and costly systemic disturbances.</p>
<hr />

<h2 id="small-modifications-big-results">Small Modifications, Big Results</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/04_small_modifications_big_results.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>After successfully reconstructing the root cause, I prepared a brief presentation to explain what actually happened, along with a very simple solution: <strong>returning the circuit to its original design</strong>. I was confident this solution was safe and appropriate, as it did not involve changes to logic or devices, but merely corrected the proven faulty circuit modification.</p>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/fe18e9c7-d3ea-4542-b701-83a46cb36702-surging_fix.svg" alt="surging_fix" style="max-width:100%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Figure 3. Proposed Correction—conceptual signal splitting to mitigate analog overload risk
  </figcaption>
</div>
<p>With full confidence, I presented this proposal in a management meeting. However, what happened was beyond expectations: <strong>I was not allowed to execute</strong>, and was directed to wait for vendor technicians to come for clarification and repairs. Yet, for years, neither the vendor nor others had ever successfully resolved this issue completely.</p>
<p>I tried again, this time through a personal approach after the meeting, to explain the situation technically. But the result was the same: no room to act.</p>
<p>At this point, I began to feel that <strong>the obstacles I faced were no longer technical, but political</strong>. An irony, when deep understanding of the problem was not the basis of trust.</p>
<p>Because vendor support remained uncertain, I had already decided in my heart: whenever the plant tripped again, the solution I had prepared would be immediately executed. And of course, that day truly came. Still following procedures, I asked for permission from my direct superior before acting. Fortunately, the speed controller I had recently replaced had two output channels—eliminating the need for the previously planned signal splitter. With a slight program modification, I set both to output identical signals—one for the anti-surge controller, and one shared for local display and signals to DCS. The circuit modification became <strong>much simpler—and safer</strong>.</p>
<div style="display: flex; flex-direction: column; align-items: center;">
  <img src="/kiiota-blog/assets/media/fe18e9c7-d3ea-4542-b701-83a46cb36702-surging_final.svg" alt="surging_final" style="max-width:100%; height:auto;" />
  <figcaption style="text-align:center; margin-top: 8px;">
    Figure 4. Final Implementation—dual analog outputs resolve prior signal load distortion
  </figcaption>
</div>
<p>With just <strong>a 30 cm cable</strong> and one <strong>small screwdriver</strong>, I reconnected the analog output that had been the source of the hidden problem. After the repair, the booster expander's <em>anti-surge controller</em> was retested—and the results were undeniable: <strong>the system fully recovered</strong>, <strong>without anomalies</strong>.</p>
<blockquote>
<p>"Sometimes, major repairs start from things that seem trivial—as long as we are persistent enough to find them and do not assume a problem is eternal."</p>
</blockquote>
<hr />

<h2 id="direct-and-indirect-effects">Direct and Indirect Effects</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/05_direct_and_indirect_effects.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>This small modification brought significant impacts on plant performance, both technically and economically:</p>
<ul>
<li><strong>The recycle nitrogen compressor can now operate with its bypass fully closed</strong>, allowing the system to run close to design performance. Nitrogen no longer circulates aimlessly, while also reducing the load on the cooling system.</li>
<li><strong>The centrifugal compressor became silent</strong>, no longer producing the characteristic whistle sound from bypass flow—a <em>silence that signifies efficiency</em>.</li>
<li><strong>Energy consumption—and as a result, electricity bills—have dropped drastically</strong>, as ineffective nitrogen cycles were eliminated, and the need for machine restarts was greatly reduced.</li>
<li><strong>LIN and LAR production increased</strong>, as processes ran more stably and optimally according to the original design.</li>
</ul>
<p>Of course, these changes were not immediately felt. It took time to <strong>dismantle operational patterns</strong> that had been formed over years and <strong>build confidence in the changes</strong> that had been made, requiring further changes to the process.</p>
<p>At that time, I did not yet have the ability to independently calculate plant capacity. But according to information, this modification <em>was said to have a tangible impact</em>:</p>
<blockquote>
<p><strong>Savings of over 1 billion rupiah per month</strong> A combination of reduced electricity consumption and increased production output.</p>
</blockquote>
<p>The exact figures can be debated. But the compressor's silence—no longer screaming—that is the most tangible proof that change has occurred.</p>
<hr />

<h2 id="cultural-and-perception-challenges">Cultural and Perception Challenges</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/06_cultural_and_perception_challenges.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>The biggest challenge in solving problems is often not technical, but work culture and decision-making structures. In complex systems that have been operating for a long time, it is not uncommon for <strong>no single individual to truly understand the problem completely</strong>. Understanding is scattered and fragmented—some lies with engineers, some with operators, and some hidden in documentation that is rarely revisited.</p>
<p>In such conditions, the direction of troubleshooting is more often determined by who has authority, not by who understands the problem best. Solutions are often shaped by intuition, habits, or pressure to quickly “restore operations”—not by deep diagnostic results.</p>
<p>Not because the system is deliberately left to deviate from the design, but because <strong>efforts to find the root cause repeatedly hit dead ends</strong>. When various approaches fail to yield results, the organization eventually chooses the path considered safest: sticking to a stable configuration even if it deviates. As long as the system is still running and no fatal damage occurs, this condition is gradually accepted as the new normal.</p>
<p>But when disturbances become more frequent, routine handling is no longer sufficient. <strong>Courage is needed to propose a counter-narrative</strong>—opening the possibility that the root cause has not been truly addressed, that there is something that has been overlooked in our collective understanding.</p>
<p>True change usually only has room when the pressure is high enough, the data is strong enough, and the frustration is deep enough. At this point, a new approach finally has a chance to be tried—and real improvements can begin to happen.</p>
<hr />

<h2 id="closing">Closing</h2>
<audio controls="">
  <source src="https://blog.kiiota.com/content/media/2025/07/07_closing.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>
<p>This is not merely about repairing circuits or control logic, but <strong>an effort to reorganize trust in the original design</strong>—and more than that, <strong>the courage to correct a system that has long been considered final</strong>.</p>
<p>I even thought to myself, <em>“If the output of the new speed controller had just happened to be 12V or 24V, maybe the issue would’ve resolved itself.”</em> But then again, I might never have discovered the real root cause.</p>
<p>After two decades of operating in a deviated condition, this system finally works as it should. Not because the tools changed, but because our understanding of them changed. A long process that brought <strong>invaluable technical and managerial lessons</strong>.</p>
<hr />

<p><strong>Author's Note</strong></p>
<p>This writing is not just about technical matters, but also about <strong>change management</strong>, <strong>historical analysis</strong>, and <strong>resilience in facing resistance</strong>.</p>
<blockquote>
<p>Muscle mass isn't everything —  neurons fire faster. 🧠⚡</p>
</blockquote>
<p style="text-align:center; font-size:0.95em; color:#555; margin-top:2em;">
  And if all else fails...
</p>
<p><a href="https://www.youtube.com/watch?v=BGednQsQ-h8&amp;ref=blog.kiiota.com" target="_blank" rel="noopener noreferrer" style="display:inline-block; position:relative; text-decoration:none; margin-top:2em;" onmouseover="this.firstElementChild.style.filter='brightness(0.8) contrast(1.2)'" onmouseout="this.firstElementChild.style.filter='none'">
  <img src="https://img.youtube.com/vi/BGednQsQ-h8/hqdefault.jpg" alt="Limp Bizkit - The Truth" style="width:100%; max-width:200px; border:0; display:block; margin:0 auto; border-radius:8px;" />
  <img src="https://upload.wikimedia.org/wikipedia/commons/7/75/YouTube_play_button_icon_%282017%29.svg" alt="Play" style="position:absolute; top:50%; left:50%; width:36px; height:36px; transform:translate(-50%,-50%); opacity:0.85;" />
</a></p>
<figcaption style="text-align:center; font-size:0.9em; font-style:italic; margin-top:6px; color:#444;">
  Sometimes, the only justice left... is to tell <strong>the truth</strong>.
</figcaption>]]></content><author><name>[&quot;Ketut Putu Kumajaya&quot;]</name></author><category term="engineering-lessons" /><category term="Engineering Lessons" /><category term="Troubleshooting" /><summary type="html"><![CDATA[This writing is not just about technical matters, but also about change management, historical analysis, and resilience in facing resistance.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://images.unsplash.com/photo-1629144152968-50627249db14?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHRyb3VibGV8ZW58MHx8fHwxNzUyODYyODYxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" /><media:content medium="image" url="https://images.unsplash.com/photo-1629144152968-50627249db14?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHRyb3VibGV8ZW58MHx8fHwxNzUyODYyODYxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>