Data Handling PLC: MOV, COP, FILL, SWAP untuk Mengelola Register

Apa Itu Instruksi Data Handling PLC?
Instruksi data handling PLC adalah kelompok instruksi yang tidak mengubah nilai secara matematis, melainkan memindahkan, menyalin, menginisialisasi, atau menyusun ulang data di antara register. Kalau instruksi matematika (ADD, SUB, MUL, DIV) menjawab pertanyaan “berapa hasilnya”, instruksi data handling menjawab pertanyaan “data ini ada di mana, dan bagaimana caranya sampai ke sana”.
Kebutuhan akan instruksi data handling PLC ini muncul di hampir setiap sistem yang membaca banyak sensor sekaligus. Ambil contoh sistem akuisisi data Oil & Gas yang memantau empat besaran lapangan — tekanan, suhu, level, dan flow — lalu mengirimkannya ke SCADA setiap detik. Nilai-nilai itu perlu disalin dari area input ke area kerja, dikemas jadi satu paket data berurutan supaya bisa dibaca sekali jalan lewat Modbus, dan kadang perlu disusun ulang urutan byte-nya karena SCADA/gateway di sisi lain membaca susunan byte yang berbeda dari PLC. Semua itu dikerjakan instruksi data handling, bukan instruksi matematika.
Empat Instruksi Dasar yang Perlu Dibedakan
| Instruksi | Fungsi | Contoh Pemakaian di Lapangan |
|---|---|---|
| MOVE | Memindahkan (menyalin) satu nilai dari satu register ke register lain | Menyalin nilai sensor dari area input ke area kerja sebelum diproses |
| Block Copy (MOVE_BLK/COP/XFER/BMOV/BLKMOV) | Menyalin beberapa register sekaligus secara berurutan | Menyalin empat pembacaan sensor (P, T, L, F) ke area kerja dalam satu instruksi |
| Block Fill (FILL_BLK/FLL/BSET/FMOV/FILL) | Mengisi beberapa register sekaligus dengan satu nilai yang sama | Menginisialisasi paket data ke 0 sebelum diisi ulang, membersihkan buffer |
| SWAP | Menukar urutan byte di dalam satu word/dword (byte order/endianness) | Menyesuaikan urutan byte data REAL agar terbaca benar oleh Modbus master pihak ketiga |
Satu kesalahpahaman yang paling sering terjadi: SWAP tidak menukar isi dua register yang berbeda. SWAP hanya membalik urutan byte tinggi dan byte rendah di dalam satu register/word yang sama. Untuk menukar isi dua register berbeda, dibutuhkan instruksi terpisah (XCH/XCHG) atau — di merek yang tidak menyediakannya — pola MOVE tiga langkah lewat register bantu (temp). Perbedaan ini dibahas lebih detail di bagian perbandingan.
Studi Kasus Data Handling PLC: Akuisisi Data Sensor untuk Sistem Oil & Gas
Studi kasus yang dipakai konsisten di kelima merek: sistem akuisisi data lapangan Oil & Gas yang membaca empat sensor — Tekanan_P, Suhu_T, Level_L, dan Flow_F, semuanya bertipe REAL (32-bit Float) — lalu mengelolanya lewat enam langkah data handling sebelum dikirim ke SCADA.
- Salin 1 register (MOVE): Menyalin satu nilai sensor (misalnya Tekanan_P) dari area input ke area kerja.
- Salin 4 register sekaligus (Block Copy): Menyalin keempat pembacaan sensor sekaligus ke area kerja dalam satu instruksi, jauh lebih ringkas daripada empat kali MOVE terpisah.
- Inisialisasi paket data (Block Fill): Mengisi area Data_Paket (array 4 REAL) dengan nilai 0 terlebih dulu, memastikan tidak ada sisa data lama sebelum diisi nilai baru.
- Koreksi byte order (SWAP): Menukar urutan byte satu register agar sesuai dengan urutan yang diharapkan Modbus master di sisi SCADA.
- Tukar isi dua register (Tekanan_P ↔ Suhu_T): Menukar isi dua register lewat register bantu, atau lewat instruksi exchange langsung bila tersedia.
- Update status sistem: Mengaktifkan bit status (Normal/Alarm-Ready) setelah seluruh proses data handling selesai.
Struktur register yang dipakai di semua merek juga sama secara konsep: empat register input analog (Tekanan_P, Suhu_T, Level_L, Flow_F bertipe REAL), satu array/blok Data_Paket berisi 4 REAL untuk dikirim ke SCADA, dan satu bit Status_Sistem. Yang berbeda hanyalah cara penamaan alamatnya — dibahas satu per satu di bagian berikutnya.
Implementasi pada Lima Merek PLC
Konsep data handling PLC di atas sama di semua merek, tapi nama instruksi, format operand, dan cara menghitung panjang blok berbeda-beda. Berikut implementasinya.
Allen-Bradley Micro820 (Connected Components Workbench)

Micro820 memakai penamaan tag (bukan alamat absolut) dan instruksi IEC standar: MOV (pindah satu nilai, format Source-Dest), COP (menyalin blok data, format Source-Dest-Length), FLL (mengisi blok dengan nilai sama, format Source-Dest-Length), dan SWAP (koreksi byte order, format Source-Dest). Tukar isi dua register (Tekanan_P dan Suhu_T) dilakukan manual lewat tiga langkah MOV berantai memakai satu register bantu (Temp_Reg) — Micro820 tidak menyediakan instruksi exchange langsung.
Karena berbasis tag, penamaan di Micro820 paling mudah dibaca: parameter Length pada COP dan FLL langsung menyatakan jumlah elemen array (4), bukan jumlah word mentah seperti pada merek berbasis alamat word.
Siemens S7-1200/1500 (TIA Portal)

TIA Portal menyediakan empat blok data handling standar: MOVE (satu register), MOVE_BLK (blok beberapa register sekaligus, dengan parameter COUNT), FILL_BLK (mengisi blok dengan nilai sama, juga dengan COUNT), dan SWAP (satu pasang IN-OUT untuk membalik byte order). Semua alamat ditulis dalam format data block (DB), misalnya DB1.DBD100 untuk register REAL.
Sama seperti Micro820, S7-1200 tidak memiliki instruksi exchange langsung — menukar isi dua register (Tekanan_P dan Suhu_T) dilakukan lewat tiga kali MOVE dengan register bantu bertipe REAL. Satu catatan penting dari implementasinya: pastikan ukuran data pada COUNT dihitung sesuai tipe data (REAL = 32-bit), dan pastikan area register yang dipakai MOVE_BLK/FILL_BLK tidak tumpang tindih dengan tag lain.
Omron CP Series (CX-Programmer)

Omron CP Series memakai instruksi berkode angka seperti pada instruksi matematika: MOVL(498) untuk memindahkan satu data 32-bit (cocok untuk REAL), XFER(070) untuk menyalin blok word berurutan (parameter N = jumlah word), BSET(071) untuk mengisi rentang word dengan nilai sama, dan SWAP(637) untuk mengoreksi byte order sejumlah word sekaligus dalam satu instruksi (parameter N).
Yang membedakan Omron dari Siemens dan Micro820: CP Series punya instruksi XCHG(073) untuk menukar isi dua word secara langsung, tanpa register bantu. Karena satu data REAL menempati 2 word, menukar dua register REAL (Tekanan_P dan Suhu_T) memerlukan XCHG dijalankan dua kali — sekali untuk word rendah, sekali untuk word tinggi.
Schneider Modicon TM221CE (EcoStruxure Machine Expert – Basic)

Sama seperti instruksi matematika, TM221CE menulis semua operasi data handling sebagai ekspresi di dalam blok OPERATE: MOVE ditulis sebagai assignment langsung (%MF200 := %MF100), block copy lewat notasi rentang (%MW200:16 := %MW100:16), block fill dengan cara serupa (%MW200:16 := 0), dan SWAP dipanggil sebagai fungsi (%MW30 := SWAP(%MW20)).
TM221CE juga tidak memiliki instruksi exchange langsung, sehingga tukar isi dua register REAL memakai pola tiga langkah assignment lewat register bantu, persis seperti Siemens dan Micro820. Semua alamat di TM221CE wajib memakai prefix % (%MW untuk word 16-bit, %MF untuk float 32-bit, %M untuk bit) — melupakan prefix ini adalah kesalahan penulisan paling umum bagi yang baru pindah dari merek lain.
Mitsubishi FX Series (GX Works2)

FX Series membedakan instruksi 16-bit dan 32-bit lewat awalan D: MOV (FNC 12) untuk satu word, DMOV untuk satu data 32-bit/REAL. Block copy memakai BMOV (FNC 15) dan block fill memakai FMOV (FNC 16), keduanya dengan parameter n = jumlah word yang diproses. SWAP (FNC 147) membalik byte order satu register 16-bit — untuk register REAL (32-bit, 2 word) perlu dipanggil dua kali, biasanya di dalam loop FOR…NEXT bila jumlah register yang dikoreksi banyak.
Seperti Omron, FX Series punya instruksi XCH (FNC 17) untuk menukar isi dua register secara langsung. Menukar dua data REAL (Tekanan_P dan Suhu_T) tetap memerlukan XCH dijalankan dua kali — satu untuk word rendah, satu untuk word tinggi — karena satu instruksi XCH hanya menangani satu word 16-bit.
Tabel Perbandingan Instruksi Data Handling Antar Merek
| Operasi | Siemens S7-1200 | Omron CP Series | Mitsubishi FX | Schneider TM221CE | Allen-Bradley Micro820 |
|---|---|---|---|---|---|
| Pindah 1 nilai | MOVE | MOVL (498) | MOV / DMOV (FNC 12) | Assignment (:=) | MOV |
| Salin blok/array | MOVE_BLK | XFER (070) | BMOV (FNC 15) | Assignment rentang (%MW:len) | COP |
| Isi blok dengan nilai sama | FILL_BLK | BSET (071) | FMOV (FNC 16) | Assignment rentang (%MW:len := nilai) | FLL |
| Koreksi byte order | SWAP | SWAP (637) | SWAP (FNC 147) | Fungsi SWAP() | SWAP |
| Tukar isi dua register | Tidak ada — manual via MOVE + register bantu | XCHG (073) | XCH (FNC 17) | Tidak ada — manual via assignment + register bantu | Tidak ada — manual via MOV + register bantu |
Insight paling praktis dari tabel ini: hanya Omron dan Mitsubishi yang menyediakan instruksi exchange langsung untuk menukar isi dua register. Di Siemens, Schneider, dan Allen-Bradley, pola tukar-menukar register harus dibuat manual lewat register bantu (temp) dan tiga langkah MOVE — sesuatu yang sering dilewatkan programmer yang terbiasa dengan salah satu platform saja.
Kesalahan Umum saat Mengelola Register dengan Data Handling PLC
1. Mengira SWAP menukar dua register yang berbeda
Ini kesalahan konsep paling umum. SWAP hanya membalik byte tinggi dan byte rendah di dalam satu word/dword yang sama, bukan menukar isi dua alamat berbeda. Untuk menukar isi dua register, pakai instruksi exchange (XCHG/XCH) bila tersedia, atau pola tiga langkah lewat register bantu bila tidak.
2. Salah menghitung panjang blok untuk data REAL
Satu nilai REAL (32-bit) menempati 2 word, bukan 1. Menghitung parameter COUNT/Length/N dengan asumsi 1 word per nilai — sering terjadi saat memindah kebiasaan dari tipe data INT ke REAL — menyebabkan block copy atau block fill memproses separuh data yang dimaksud, atau malah menimpa register di luar rentang yang direncanakan.
3. Overlap alamat antar blok data
Block copy dan block fill bekerja pada rentang alamat berurutan. Tanpa perencanaan alamat yang jelas, rentang satu instruksi bisa menimpa tag lain yang kebetulan berada di alamat berikutnya — bug yang sulit dilacak karena gejalanya muncul di tag yang tidak berhubungan langsung dengan instruksi yang salah.
4. Mengabaikan byte order/endianness saat integrasi Modbus
Setiap merek PLC bisa menyimpan data REAL dengan urutan byte/word yang berbeda secara internal, sementara SCADA, gateway, atau Modbus master pihak ketiga punya asumsi urutannya sendiri. Melewatkan langkah SWAP saat diperlukan membuat nilai yang dibaca di sisi SCADA tampak acak atau salah, padahal PLC-nya sendiri menyimpan nilai yang benar.
5. Tidak menginisialisasi area kerja sebelum dipakai
Area seperti Data_Paket yang dipakai berulang tiap siklus sebaiknya diinisialisasi (di-fill dengan nilai default) sebelum diisi data baru, terutama saat program pertama kali dijalankan atau setelah PLC restart, agar tidak ada sisa nilai lama yang terbawa ke pembacaan berikutnya.
SWAP dan Byte Order: Kunci Integrasi Data Handling PLC dengan Modbus
SWAP sering dianggap instruksi sepele, padahal ia adalah kunci dari salah satu masalah integrasi paling umum: nilai REAL yang terbaca “acak” di HMI/SCADA pihak ketiga padahal PLC menyimpan nilai yang benar. Penyebabnya adalah perbedaan urutan byte dan word antara cara PLC menyimpan data REAL secara internal dengan cara Modbus master di sisi lain menginterpretasikan dua register 16-bit sebagai satu nilai 32-bit.
Ada empat variasi urutan yang umum ditemui di ekosistem Modbus: Big-Endian (ABCD), Little-Endian (DCBA), dan dua variasi campuran word-swapped (BADC dan CDAB). Bila urutan yang dipakai PLC tidak sama dengan yang diharapkan Modbus master, nilai yang terbaca akan meleset jauh — bukan sekadar salah beberapa digit, tapi bisa jadi angka yang sama sekali tidak masuk akal. Instruksi SWAP dipakai untuk menyesuaikan urutan byte satu register agar cocok dengan konvensi yang dipakai sistem penerima, biasanya diterapkan pada register yang akan dibaca lewat komunikasi eksternal, bukan pada register kerja internal PLC.
Praktik yang disarankan: tentukan dulu urutan byte yang diharapkan oleh Modbus master atau software SCADA yang akan membaca data (biasanya tercantum di dokumentasi gateway/driver), lalu terapkan SWAP hanya pada register yang memang akan diekspos lewat komunikasi tersebut — bukan menyapu semua register secara membabi buta.
Menyiapkan Data Packet untuk SCADA, Historian, dan Cloud
Salah satu alasan block copy dan block fill begitu penting adalah efisiensi komunikasi. Membaca empat register terpisah lewat Modbus berarti empat request-response terpisah, masing-masing dengan overhead komunikasi sendiri. Dengan menyusun keempat nilai sensor menjadi satu blok berurutan (Data_Paket) lewat instruksi block copy, Modbus master di sisi luar cukup melakukan satu kali pembacaan blok register untuk mendapatkan seluruh data sekaligus — jauh lebih efisien, terutama saat jumlah titik data yang dipantau mencapai puluhan atau ratusan.
Pola ini menyambung langsung ke pembahasan totalizer dan scaling pada instruksi matematika: setelah data mentah discaling dan dihitung, hasilnya disusun jadi satu paket data lewat instruksi data handling, baru kemudian dibaca oleh perangkat lain lewat Modbus — misalnya ESP32 sebagai Modbus master, diteruskan lewat Modbus TCP ke Raspberry Pi, lalu divisualisasikan memakai Node-RED dan MQTT broker Mosquitto.
Kesimpulan dan Tips Praktis
Instruksi data handling PLC — MOVE, block copy, block fill, dan SWAP — adalah instruksi “logistik” yang memastikan data sensor sampai ke tempat yang tepat, dalam bentuk yang tepat, sebelum diproses lebih lanjut atau dikirim ke sistem lain. Sama seperti instruksi matematika, logikanya seragam di semua merek tapi detail penamaan dan format operand berbeda-beda. Beberapa tips praktis:
- Jangan samakan SWAP dengan exchange — SWAP membalik byte dalam satu register, bukan menukar dua register berbeda.
- Hitung panjang blok sesuai tipe data — data REAL 32-bit menempati 2 word, bukan 1, pada merek yang beralamat word.
- Rencanakan peta alamat register sebelum menulis block copy/block fill agar tidak overlap dengan tag lain.
- Terapkan SWAP hanya pada register yang diekspos ke komunikasi eksternal, sesuai urutan byte yang diharapkan Modbus master di sisi penerima.
- Susun data jadi satu blok berurutan sebelum dikirim ke SCADA/gateway supaya bisa dibaca sekali jalan, bukan register per register.
- Inisialisasi area kerja dengan block fill sebelum dipakai, terutama setelah PLC restart.
Setelah memahami instruksi data handling dan instruksi matematika, langkah berikutnya yang berkaitan adalah mempelajari instruksi program control (SET, RST, JMP, LBL) untuk mengatur alur eksekusi program secara lebih terstruktur.
Baca Juga:
— Instruksi Bit Logic PLC: LD, AND, OR, OUT dan Cara Membaca Ladder Diagram
— Instruksi Matematika PLC: ADD, SUB, MUL, DIV untuk Scaling dan Totalizer
— Counter PLC: CTU, CTD, CTUD untuk Hitung Produksi dan Kontrol Level
— Training PLC Lengkap: Pelatihan Online & Offline Bersertifikat
FAQ Instruksi Data Handling PLC
Apa perbedaan MOVE dengan instruksi matematika seperti ADD?
MOVE hanya menyalin nilai dari satu alamat ke alamat lain tanpa mengubah isinya, sedangkan ADD (dan instruksi matematika lain) menghitung nilai baru dari operasi aritmatika.
Apakah SWAP bisa dipakai untuk menukar isi dua register berbeda?
Tidak. SWAP hanya membalik urutan byte di dalam satu register/word yang sama. Untuk menukar isi dua register berbeda, gunakan instruksi exchange (XCHG di Omron, XCH di Mitsubishi) atau pola manual lewat register bantu di merek yang tidak menyediakannya.
Kenapa nilai REAL yang saya baca lewat Modbus terlihat acak padahal PLC menyimpan nilai yang benar?
Kemungkinan besar karena perbedaan urutan byte/word (endianness) antara cara PLC menyimpan data REAL dan cara Modbus master di sisi penerima menginterpretasikannya. Terapkan instruksi SWAP pada register yang diekspos ke komunikasi eksternal, disesuaikan dengan urutan yang diharapkan penerima.
Berapa banyak word yang dibutuhkan satu instruksi block copy untuk menyalin 4 data REAL?
Karena satu REAL (32-bit) menempati 2 word, menyalin 4 data REAL memerlukan parameter panjang setara 8 word pada merek yang beralamat word (seperti Mitsubishi dan Omron). Pada merek berbasis tag (seperti Allen-Bradley), parameter length biasanya cukup dinyatakan sebagai jumlah elemen array (4).
Apakah semua merek PLC punya instruksi untuk menukar isi dua register langsung?
Tidak. Dari lima merek pada studi kasus ini, hanya Omron (XCHG) dan Mitsubishi (XCH) yang punya instruksi exchange langsung. Siemens, Schneider, dan Allen-Bradley memerlukan pola manual tiga langkah lewat register bantu.
Kapan sebaiknya memakai block copy dibanding MOVE satu per satu?
Ketika memindahkan beberapa register yang alamatnya berurutan sekaligus, misalnya menyalin hasil beberapa sensor ke area kerja atau menyusun paket data untuk dikirim ke SCADA. Selain lebih ringkas, block copy juga mengurangi jumlah baris program dibanding menulis MOVE berulang kali.
Apakah instruksi data handling memengaruhi waktu scan PLC?
Instruksi data handling umumnya sangat cepat dieksekusi dibanding instruksi komunikasi, tapi block copy/fill dengan jumlah data sangat besar tetap menambah waktu eksekusi per scan. Untuk blok data yang sangat besar, pertimbangkan memecahnya lewat loop bertahap agar tidak membebani satu siklus scan.


