Cara Mengakses Alamat Memori Work Area PLC Omron Menggunakan WebSocket dan PHP

🧠 Pendahuluan

Dalam era Industrial Internet of Things (IIoT), kebutuhan untuk mengakses data dari PLC (Programmable Logic Controller) secara real-time melalui web semakin meningkat. Salah satu caranya adalah dengan menggunakan WebSocket, protokol komunikasi dua arah (full-duplex) yang efisien, dikombinasikan dengan PHP untuk pengelolaan logika dan tampilan web.

Pada artikel ini, kita akan membahas bagaimana mengakses alamat memori PLC Omron (misalnya D0, D100, CIO, dll) dengan protokol FINS menggunakan WebSocket dan PHP.

🎯 Tujuan Pembelajaran

Setelah mengikuti artikel ini, Anda akan memahami:

  • Struktur alamat memori di PLC Omron (CIO, D, W, H, dll)
  • Cara kerja komunikasi FINS
  • Membangun WebSocket server dengan PHP
  • Mengakses dan menampilkan data memori PLC secara real-time di web

🧱 1. Struktur Alamat Memori PLC Omron

Omron menggunakan berbagai area memori, beberapa yang sering digunakan:

Area Fungsi Contoh Alamat
CIO Input/output digital CIO 0.00, CIO 100
D Data Memory (biasa digunakan untuk penyimpanan variabel) D0, D100
W Work memory W0
H Holding relay H0

Alamat biasanya ditulis dalam bentuk byte atau bit. Misalnya:

  • D0: byte
  • CIO 0.00: bit ke-0 dari word CIO 0

📡 2. Komunikasi FINS dengan PLC Omron

Protokol FINS (Factory Interface Network Service) adalah protokol buatan Omron untuk berkomunikasi dengan PLC. FINS memungkinkan membaca dan menulis ke memori PLC melalui berbagai media (Ethernet, Serial, dll).

Contoh komunikasi FINS melalui Ethernet:

  • Host: 192.168.250.1 (komputer)
  • PLC: 192.168.250.2
  • Port: 9600

FINS request dikirim dalam frame hex tertentu, misalnya untuk membaca D0–D1.

⚙️ 3. Arsitektur Sistem

Sistem kita terdiri dari:

Browser (WebSocket Client)

PHP WebSocket Server

PLC Omron (via FINS TCP)

  • Frontend: WebSocket JavaScript
  • Backend: PHP WebSocket Server
  • Komunikasi ke PLC: Menggunakan socket TCP dengan frame FINS

🧪 4. Contoh Implementasi PHP dan WebSocket

4.1 WebSocket Server (PHP)

Install library via Composer:

composer require cboden/ratchet

server.php

<?php
$ip = '192.168.240.200'; // Ganti dengan IP PLC Anda
$port = 9600;

// Fungsi BACA BIT (misalnya W0.00)
function finsUdpReadBit($ip, $port, $mem_area, $bit_address, $bit_offset) {
$clientNode = 0x0A;
$plcNode = 0x01;
$sid = 0x01;

$header = pack('C*', 0x80, 0x00, 0x02, 0x00, $plcNode, 0x00, 0x00, $clientNode, 0x00, $sid);
$addr = pack('n', $bit_address) . chr($bit_offset); // Offset 0-15
$command = pack('C*', 0x01, 0x01) . chr($mem_area) . $addr . pack('n', 1);
$frame = $header . $command;

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_sendto($socket, $frame, strlen($frame), 0, $ip, $port);
socket_recvfrom($socket, $buf, 2048, 0, $ip, $port);
socket_close($socket);

$status = ord(substr($buf, -1));
return $status === 1 ? 1 : 0;
}

// Fungsi TULIS BIT (misalnya W0.00)
function finsUdpWriteBit($ip, $port, $mem_area, $bit_address, $bit_offset, $value) {
$clientNode = 0x0A;
$plcNode = 0x01;
$sid = 0x02;

$header = pack('C*', 0x80, 0x00, 0x02, 0x00, $plcNode, 0x00, 0x00, $clientNode, 0x00, $sid);
$addr = pack('n', $bit_address) . chr($bit_offset);
$data = $value ? chr(0x01) : chr(0x00);
$command = pack('C*', 0x01, 0x02) . chr($mem_area) . $addr . pack('n', 1) . $data;
$frame = $header . $command;

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_sendto($socket, $frame, strlen($frame), 0, $ip, $port);
socket_recvfrom($socket, $buf, 2048, 0, $ip, $port);
socket_close($socket);

return true;
}

// Handler AJAX
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$mode = $_POST['mode'];
$val = isset($_POST['value']) ? intval($_POST['value']) : 0;
$bit_address = 0; // W0
$bit_offset = 0; // .00
$mem_area = 0x31; // W area

if ($mode === 'read') {
echo finsUdpReadBit($ip, $port, $mem_area, $bit_address, $bit_offset);
} elseif ($mode === 'write') {
echo finsUdpWriteBit($ip, $port, $mem_area, $bit_address, $bit_offset, $val) ? 'OK' : 'FAIL';
}
}
?>
4.2 Client (index.html)
<!DOCTYPE html>
<html>
<head>
<title>Control W0.00 (ON/OFF)</title>
<style>
body { font-family: Arial; text-align: center; margin-top: 50px; }
button { font-size: 20px; padding: 10px 20px; margin: 10px; }
.lamp { width: 40px; height: 40px; border-radius: 50%; display: inline-block; background: gray; margin-top: 20px; }
.on { background: green; }
.off { background: red; }
</style>
</head>
<body>

<h1>Kontrol Bit W0.00 (FINS UDP)</h1>
<button onclick="setBit(1)">ON</button>
<button onclick="setBit(0)">OFF</button>

<div>
<h3>Status Lampu:</h3>
<div class="lamp" id="lampu"></div>
</div>

<script>
function setBit(val) {
fetch('fins_bit.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'mode=write&value=' + val
}).then(res => res.text()).then(updateLampu);
}

function getBit() {
fetch('fins_bit.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'mode=read'
})
.then(res => res.text())
.then(updateLampu);
}

function updateLampu(val) {
const lampu = document.getElementById('lampu');
lampu.className = 'lamp ' + (val.trim() === '1' ? 'on' : 'off');
}

// Auto polling setiap 1 detik
setInterval(getBit, 1000);
</script>

</body>
</html>

5. Keuntungan Menggunakan WebSocket

  • Real-time: Tidak perlu refresh untuk mendapatkan data terbaru
  • Responsif: Cocok untuk SCADA berbasis web
  • Ringan: Lebih hemat bandwidth dibanding polling AJAX

🔐 6. Tips Keamanan

  • Gunakan HTTPS + WSS
  • Implementasi token-based authentication
  • Validasi alamat memori sebelum dikirim ke PLC
  • Gunakan middleware firewall (misal: Nginx proxy)

📘 Kesimpulan

Mengakses alamat memori PLC Omron dengan WebSocket dan PHP memungkinkan kita membangun sistem monitoring atau kontrol berbasis web yang real-time, efisien, dan scalable. Dengan memanfaatkan protokol FINS dan WebSocket, proses komunikasi menjadi lebih cepat dan responsif dibanding metode polling biasa.

🔧 Latihan Lanjutan (Exercise)

  1. Modifikasi sistem untuk menulis nilai ke PLC (misal menyalakan lampu)
  2. Integrasikan dengan front-end framework seperti Vue.js atau React
  3. Tambahkan fitur alarm/logging jika nilai melebihi ambang batas

 

Kuasai keterampilan otomasi yang paling dibutuhkan industri dengan mengikuti Training PLC Omron dari bisaioti.com. Dalam pelatihan ini, Anda akan mempelajari pemrograman PLC mulai dari logika dasar, penggunaan fungsi timer dan counter, hingga komunikasi antar perangkat menggunakan protokol Modbus RTU. Materi disusun secara sistematis dan dilengkapi dengan praktik langsung.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *