Instruksi Matematika PLC: ADD, SUB, MUL, DIV untuk Scaling dan Totalizer
Apa Itu Instruksi Matematika pada PLC?
Instruksi matematika pada PLC adalah blok fungsi standar IEC 61131-3 yang melakukan operasi aritmatika dasar seperti ADD (tambah), SUB (kurang), MUL (kali), dan DIV (bagi) terhadap nilai numerik yang tersimpan di memori PLC. Instruksi ini dipakai jauh lebih sering daripada kelihatannya: setiap kali sinyal analog dari transmitter diubah menjadi satuan teknik (kg, bar, °C), setiap kali biaya produksi dihitung otomatis, dan setiap kali nilai rata-rata sebuah proses ditampilkan di HMI, di baliknya ada rangkaian ADD/SUB/MUL/DIV yang bekerja.
Berbeda dengan instruksi bit logic (AND, OR, NOT) yang hanya mengenal dua kondisi ON/OFF, instruksi matematika bekerja pada word atau register — bisa berupa bilangan bulat (INT, DINT) maupun bilangan pecahan (REAL/Floating-Point). Hampir semua merek PLC modern menerapkan pola EN/ENO (Enable In / Enable Out) atau flag error setara: instruksi hanya dieksekusi ketika input EN aktif, dan bit ENO (atau flag error seperti ER, M8067, %S0.0) menandakan apakah hasil perhitungan tersebut valid atau terjadi kegagalan (overflow, pembagian dengan nol, tipe data tidak sesuai).
Dua penerapan yang paling sering ditemui di lapangan adalah scaling (mengubah sinyal analog mentah menjadi nilai bermakna) dan totalizer/akumulator (menjumlahkan nilai dari waktu ke waktu untuk laporan produksi). Artikel ini membahas keduanya lewat satu studi kasus yang sama, diimplementasikan pada lima merek PLC berbeda.
Empat Instruksi Dasar yang Perlu Dibedakan
Sebelum masuk ke studi kasus, kenali dulu empat instruksi matematika dasar dan satu instruksi pendukung yang sering dilupakan.
| Instruksi | Operasi | Contoh Pemakaian di Lapangan |
|---|---|---|
| ADD | Penjumlahan (A + B) | Menjumlahkan berat dua hopper, menjumlahkan akumulasi produksi per shift |
| SUB | Pengurangan (A − B) | Menghitung selisih berat terhadap target, menghitung sisa stok dari kapasitas awal |
| MUL | Perkalian (A × B) | Menghitung biaya bahan (berat × harga per kg), konversi satuan dengan faktor pengali |
| DIV | Pembagian (A ÷ B) | Menghitung rata-rata produksi (akumulasi ÷ jumlah batch), menghitung debit dari volume/waktu |
| ABS | Nilai mutlak (|A|) | Mengubah selisih yang bisa positif/negatif menjadi nilai mutlak untuk dibandingkan dengan toleransi |
Satu hal yang sering luput: ABS bukan instruksi bawaan di semua merek. Di beberapa platform, nilai mutlak harus dibuat manual dengan kondisi IF Selisih < 0 THEN Selisih := Selisih × (−1). Detailnya dibahas pada tabel perbandingan di bagian bawah.
Studi Kasus: Sistem Penimbangan dan Pencampuran Bahan
Untuk melihat instruksi matematika bekerja secara nyata, kita pakai satu studi kasus yang sama di kelima merek PLC: sistem penimbangan dan pencampuran dua bahan baku (Bahan A dan Bahan B) memakai load cell. Sinyal analog dari load cell diubah menjadi nilai REAL bersatuan kg, lalu diproses lewat enam network matematika berurutan.

Urutan kerjanya:
- Network 1 — ADD: Total_Berat = Berat_A + Berat_B. Dua nilai load cell dijumlahkan menjadi berat total campuran.
- Network 2 — SUB: Selisih = Total_Berat − Target_Berat. Selisih bisa positif (kelebihan bahan) atau negatif (kekurangan bahan).
- Network 3 — ABS + Perbandingan Toleransi: Selisih diubah ke nilai mutlak, lalu dibandingkan terhadap toleransi (misalnya ±0,5 kg) untuk menentukan status BATCH_OK atau BATCH_REJECT.
- Network 4 — MUL: Biaya_Batch = Total_Berat × Harga_Per_Kg. Biaya bahan baku dihitung otomatis untuk setiap batch yang lolos toleransi.
- Network 5 — Akumulasi (ADD berantai): Jika batch OK, Akumulasi_Berat ditambah Total_Berat, dan Jumlah_Batch ditambah 1 — keduanya berfungsi sebagai totalizer.
- Network 6 — DIV: Rata_Rata = Akumulasi_Berat ÷ Jumlah_Batch, dieksekusi hanya jika Jumlah_Batch > 0 untuk menghindari pembagian dengan nol.
Contoh perhitungan numerik yang dipakai konsisten di kelima merek: Berat_A 12,4 kg, Berat_B 8,1 kg → Total_Berat 20,5 kg. Target_Berat 20,0 kg → Selisih 0,5 kg, tepat di batas toleransi 0,5 kg sehingga BATCH_OK. Dengan Harga_Per_Kg Rp1.500, Biaya_Batch menjadi Rp30.750. Setelah 5 batch OK dengan Akumulasi_Berat 102,6 kg, Rata_Rata = 102,6 ÷ 5 = 20,52 kg.
Implementasi pada Lima Merek PLC
Logika di atas sama persis di semua merek, tapi nama instruksi, cara membaca error, dan keterbatasan tiap platform berbeda. Berikut implementasinya satu per satu.
Allen-Bradley Micro820 (Connected Components Workbench)

Micro820 memakai instruksi IEC 61131-3 standar: ADD, SUB, ABS, MUL, DIV, ditambah LEQ untuk perbandingan toleransi. Setiap blok punya pin EN (Enable) dan ENO (Enable Output) — ENO baru bernilai TRUE bila instruksi berhasil dieksekusi tanpa error aritmatika (overflow, pembagian dengan nol, operand tidak valid).
Polanya berantai: ENO dari Network 1 (ADD) menjadi EN untuk Network 2 (SUB), ENO Network 2 menjadi EN Network 3 (ABS), dan seterusnya sampai DIV. Jika satu instruksi gagal (ENO = FALSE), seluruh rantai berikutnya berhenti — mekanisme interlock ini mencegah nilai tidak valid diteruskan ke perhitungan berikutnya.
Satu hal khas Micro820: Jumlah_Batch disimpan sebagai DINT (integer), sehingga sebelum dipakai di DIV harus dikonversi dulu ke REAL memakai instruksi TO_REAL. Melewatkan konversi ini adalah kesalahan umum yang membuat program gagal di-compile.
Siemens S7-1200/1500 (TIA Portal)

Di TIA Portal, blok ADD, SUB, MUL, DIV dipilih tipe datanya lewat dropdown (Int, DInt, atau Real) — jadi satu instruksi generik dipakai untuk semua tipe data, tinggal disesuaikan. Sama seperti Micro820, S7-1200 memakai pola EN/ENO; OUT akan freeze pada nilai terakhir bila EN = FALSE.
Karena S7-1200 tidak selalu menyediakan blok ABS siap pakai tergantung versi TIA Portal, studi kasus ini memakai kombinasi CMP (Compare) dan instruksi negasi untuk menghasilkan nilai mutlak Selisih secara manual. Catatan penting dari implementasinya: sinyal analog dari modul input (misalnya SM 1231) umumnya masuk sebagai integer 0–27648, sehingga perlu diproses lewat NORM_X lalu SCALE_X terlebih dulu sebelum masuk ke Network 1 — dibahas lebih lanjut di bagian scaling.
Omron CP Series (CX-Programmer)

Omron CP Series (CP1E/CP1L/CP1H/CP2E) memakai instruksi floating-point berkode angka: +F (454) untuk ADD, −F (455) untuk SUB, *F (456) untuk MUL, dan /F (457) untuk DIV. Bukannya ENO per instruksi, Omron memakai flag ER (Error Flag) sebagai sinyal global bahwa instruksi terakhir yang dieksekusi mengalami error — flag ini perlu dicek segera setelah instruksi dijalankan karena sifatnya bisa tertimpa instruksi berikutnya.
Sama seperti S7-1200, CP Series (terutama CP1E) tidak memiliki instruksi ABS floating-point bawaan, sehingga nilai mutlak dibuat manual lewat kombinasi CMP dan pengalian dengan −1. Instruksi yang dipakai untuk counter REAL pada Network 5 juga bukan INC biasa (yang berbasis integer 16-bit), melainkan +F dengan konstanta 1.0 — detail ini sering terlewat oleh yang baru belajar Omron.
Schneider Modicon TM221CE (EcoStruxure Machine Expert – Basic)

TM221CE tidak punya blok ADD/SUB/MUL/DIV terpisah seperti merek lain. Semua operasi aritmatika ditulis sebagai ekspresi tunggal di dalam blok OPERATE, misalnya %MF104 := %MF100 + %MF102. Pendekatan ini justru membuat program lebih ringkas karena satu blok OPERATE bisa memuat beberapa operasi sekaligus.
Validitas hasil dicek lewat system bit %S0.0 (Arithmetic Error), yang aktif satu scan setelah OPERATE mengalami error aritmatika — karena hanya aktif satu scan, pembacaan status error idealnya dilakukan di scan berikutnya juga. Sama seperti S7-1200 dan Omron, TM221CE tidak memiliki instruksi ABS terpisah, sehingga nilai mutlak Selisih dibuat dengan kondisi IF %MF112 < 0.0 THEN %MF112 := −%MF112; END_IF.
Mitsubishi FX Series (GX Works2)

FX Series (FX3U/FX3G/FX3S) membedakan instruksi integer dan floating-point dengan awalan huruf E: EADD (FNC120), ESUB (FNC121), EMUL (FNC102), dan EDIV (FNC123) khusus untuk tipe data REAL. Validitas hasil dicek lewat kontak NC dari bit sistem M8067 (Operation Error) setelah setiap instruksi.
Dua jebakan klasik di FX Series: pertama, konstanta untuk operand floating-point harus ditulis dengan awalan E (misalnya E1.0), bukan K yang berarti konstanta integer — menulis K1 pada operand REAL akan menghasilkan nilai yang salah tanpa peringatan compile. Kedua, alamat register D untuk data REAL 32-bit harus dialokasikan kelipatan 4 agar tidak overlap dengan tag lain, karena satu nilai REAL memakai 2 word (D dan D+1) sekaligus.
Tabel Perbandingan Instruksi Matematika Antar Merek
| Operasi | Siemens S7-1200 | Omron CP Series | Mitsubishi FX | Schneider TM221CE | Allen-Bradley Micro820 |
|---|---|---|---|---|---|
| Tambah | ADD (Real) | +F (454) | EADD (FNC120) | OPERATE: A:=B+C | ADD |
| Kurang | SUB (Real) | −F (455) | ESUB (FNC121) | OPERATE: A:=B−C | SUB |
| Kali | MUL (Real) | *F (456) | EMUL (FNC102) | OPERATE: A:=B*C | MUL |
| Bagi | DIV (Real) | /F (457) | EDIV (FNC123) | OPERATE: A:=B/C | DIV |
| Nilai mutlak (ABS) | Tidak selalu tersedia — manual CMP + negasi | Tidak tersedia — manual CMP + negasi | Tidak tersedia — manual IF/negasi | Tidak tersedia — manual IF…THEN | ABS (tersedia langsung) |
| Indikator error | ENO (bit per instruksi) | ER (flag sistem global) | M8067 (Operation Error) | %S0.0 (Arithmetic Error) | ENO (bit per instruksi) |
| Konstanta REAL | Ditulis langsung (mis. 0.5) | Ditulis langsung (mis. 0.5) | Awalan E (mis. E1.0), bukan K | Ditulis langsung (mis. 1.0) | Ditulis langsung (mis. 1.0) |
Yang paling penting dari tabel ini: hanya Allen-Bradley Micro820 yang punya instruksi ABS bawaan. Empat merek lainnya wajib membuat logika nilai mutlak secara manual — melewatkan ini adalah penyebab paling umum status toleransi batch yang salah di lapangan.
Kesalahan Umum saat Memakai Instruksi Matematika PLC
Beberapa kesalahan berikut berulang kali ditemukan pada program yang sudah berjalan di lapangan, bukan hanya program latihan.
1. Mengabaikan ENO/ER/flag error setelah instruksi dieksekusi
Banyak program hanya mengambil nilai OUT dari instruksi matematika tanpa mengecek ENO, ER, M8067, atau %S0.0 terlebih dulu. Padahal saat terjadi overflow atau pembagian dengan nol, OUT bisa berisi nilai lama (freeze) atau nilai tidak valid (NaN/Inf pada REAL), yang bila dipakai lebih lanjut bisa menggerakkan aktuator berdasarkan data salah.
2. Pembagian dengan nol (DIV/0) tanpa interlock
Rata_Rata = Akumulasi_Berat ÷ Jumlah_Batch akan gagal ketika Jumlah_Batch masih 0 — kondisi yang pasti terjadi saat sistem baru dinyalakan sebelum ada satu batch pun yang selesai. Solusinya selalu sama di semua merek: beri kondisi Jumlah_Batch > 0 sebagai syarat EN sebelum instruksi DIV dieksekusi.
3. Salah pilih tipe data untuk counter
Menambah nilai REAL dengan instruksi increment berbasis integer (seperti INC pada beberapa merek) akan menghasilkan nilai yang salah atau bahkan error compile. Counter REAL harus ditambah memakai instruksi ADD/EADD/+F/OPERATE dengan konstanta bertipe float (1.0, bukan 1 atau K1).
4. Mengasumsikan ABS tersedia di semua platform
Seperti terlihat di tabel perbandingan, empat dari lima merek pada studi kasus ini tidak memiliki blok ABS siap pakai. Program yang ditulis mengikuti satu manual merek lalu dipindah ke merek lain tanpa penyesuaian akan gagal compile atau, lebih berbahaya, tetap ter-compile tapi menghasilkan status toleransi yang salah.
5. Memakai data analog mentah tanpa scaling
Nilai integer mentah dari modul analog (misalnya 0–27648 pada Siemens, atau rentang ADC lain pada merek lain) langsung dipakai dalam operasi matematika tanpa dikonversi ke satuan teknik lebih dulu. Hasilnya bisa benar secara instruksi tapi salah secara satuan — dibahas lebih detail di bagian berikutnya.
6. Alamat REAL tidak dialokasikan sesuai kelipatan
Data REAL 32-bit menempati 4 byte (2 word). Mengalokasikan alamat tanpa memperhitungkan kelipatan ini (misalnya menaruh tag REAL berikutnya di D101 padahal D100 sudah dipakai REAL 4 byte) menyebabkan overlap memori antar tag yang sulit dilacak.
Scaling Sinyal Analog dengan Instruksi Matematika
Scaling adalah penerapan paling umum dari instruksi matematika di PLC industri. Transmitter tekanan, load cell, atau flow meter mengirim sinyal 4–20 mA yang oleh modul analog PLC diubah menjadi angka mentah (raw value) — misalnya 0–27648 pada modul Siemens, atau rentang ADC lain tergantung merek dan resolusi modul. Angka mentah ini perlu diubah menjadi nilai bersatuan teknik (kg, bar, °C) sebelum bisa dipakai dalam logika kontrol.
Rumus scaling linear yang berlaku universal di semua merek:
Nilai_EU = ((Raw − Raw_Min) / (Raw_Max − Raw_Min)) × (EU_Max − EU_Min) + EU_Min
Di mana Raw adalah nilai mentah dari modul analog, Raw_Min/Raw_Max adalah rentang mentah (misalnya 0 dan 27648), dan EU_Min/EU_Max adalah rentang satuan teknik sesuai kalibrasi transmitter (misalnya 0 kg dan 50 kg). Rumus ini pada dasarnya adalah rangkaian SUB, MUL, dan DIV yang sama seperti dibahas sepanjang artikel ini — hanya susunannya berbeda.
Sebagian merek menyediakan blok siap pakai untuk mempermudah scaling: TIA Portal punya pasangan NORM_X (menormalkan raw value ke rentang 0.0–1.0) dan SCALE_X (memetakan hasil normalisasi ke rentang satuan teknik). Merek lain umumnya tidak menyediakan blok khusus, sehingga rumus di atas ditulis manual memakai SUB, MUL, dan DIV berurutan — prinsipnya tetap sama meski instruksinya berbeda nama.
Totalizer dan Rata-Rata untuk Laporan Produksi
Selain scaling, penerapan kedua yang paling umum adalah totalizer — akumulasi nilai dari waktu ke waktu untuk kebutuhan laporan. Pada studi kasus di atas, Akumulasi_Berat dan Jumlah_Batch adalah totalizer sederhana: setiap kali satu batch dinyatakan OK, ADD menambahkan Total_Berat batch tersebut ke akumulasi, dan counter jumlah batch bertambah 1. Rata_Rata dihitung lewat DIV setiap kali dibutuhkan, tanpa perlu menyimpan riwayat tiap batch satu per satu.
Pola ini bisa diperluas untuk kebutuhan pelaporan produksi yang lebih luas: totalizer produk baik dan produk cacat menjadi dasar komponen Quality pada perhitungan OEE, sementara akumulasi waktu berjalan mesin dibagi waktu total shift menjadi dasar komponen Availability. Karena nilai-nilai ini tersimpan di register memori PLC, sistem lain bisa membacanya lewat protokol komunikasi seperti Modbus untuk ditampilkan di dashboard produksi — misalnya lewat ESP32 sebagai Modbus master, dikirim lewat Modbus TCP ke Raspberry Pi, lalu diolah dan divisualisasikan memakai Node-RED dan MQTT broker Mosquitto.
Satu catatan praktis yang sering terlewat: tentukan sejak awal kapan Akumulasi_Berat dan Jumlah_Batch direset (per shift, per hari, atau tidak pernah). Totalizer yang tidak pernah direset akan terus bertambah sampai mendekati batas nilai maksimum tipe data REAL — untuk laporan jangka panjang, jauh lebih aman memindahkan nilai totalizer ke sistem pencatatan terpisah lalu mereset akumulasi di PLC secara berkala.
Kesimpulan dan Tips Praktis
Instruksi matematika ADD, SUB, MUL, DIV adalah fondasi dari hampir semua perhitungan bernilai bisnis di PLC — mulai dari scaling sinyal analog, penentuan status toleransi batch, perhitungan biaya, sampai totalizer untuk laporan produksi. Logikanya sama di semua merek, tapi detail implementasi (nama instruksi, cara membaca error, ketersediaan ABS, cara menulis konstanta) berbeda-beda dan menjadi sumber bug paling umum ketika program dipindah antar platform. Beberapa tips praktis untuk diterapkan:
- Selalu cek indikator error (ENO/ER/M8067/%S0.0) sebelum memakai hasil OUT dari instruksi matematika di logika berikutnya.
- Beri interlock pada DIV untuk menghindari pembagian dengan nol, terutama pada totalizer yang bisa bernilai 0 saat sistem baru dinyalakan.
- Jangan asumsikan ABS tersedia — cek dulu manual instruksi merek yang dipakai, siapkan logika manual bila tidak ada.
- Pisahkan konstanta integer dan floating-point sesuai aturan merek (misalnya E1.0 vs K1 pada Mitsubishi FX).
- Rencanakan alokasi alamat REAL sesuai kelipatan yang disyaratkan merek agar tidak overlap dengan tag lain.
- Scaling dulu, hitung kemudian — pastikan sinyal analog sudah dalam satuan teknik sebelum masuk ke rangkaian ADD/SUB/MUL/DIV.
Setelah memahami instruksi matematika, langkah berikutnya yang berkaitan erat adalah mempelajari instruksi data handling (MOV, COP, FILL) untuk memindahkan dan menyalin nilai antar register, serta instruksi bit logic dasar sebagai fondasi logika kontrol secara keseluruhan.
Baca Juga:
— Instruksi Bit Logic PLC: LD, AND, OR, OUT dan Cara Membaca Ladder Diagram
— Timer PLC Lengkap: Beda TON, TOF, dan Retentive Timer serta Kapan Dipakai
— Counter PLC: CTU, CTD, CTUD untuk Hitung Produksi dan Kontrol Level
— Training PLC Lengkap: Pelatihan Online & Offline Bersertifikat
FAQ Instruksi Matematika PLC
Apa perbedaan instruksi matematika dengan instruksi MOVE (MOV) pada PLC?
Instruksi matematika (ADD/SUB/MUL/DIV) mengubah nilai lewat operasi aritmatika dan menghasilkan nilai baru, sedangkan MOVE hanya menyalin nilai dari satu alamat ke alamat lain tanpa mengubah isinya.
Kenapa hasil DIV saya error atau menghasilkan nilai aneh?
Penyebab paling umum adalah pembagian dengan nol — pembaginya (misalnya Jumlah_Batch) masih bernilai 0 saat instruksi pertama kali dieksekusi. Tambahkan interlock agar DIV hanya berjalan saat pembagi lebih besar dari nol.
Apakah semua PLC punya instruksi ABS?
Tidak. Dari lima merek pada studi kasus ini, hanya Allen-Bradley Micro820 yang memiliki instruksi ABS siap pakai. Siemens, Omron, Schneider, dan Mitsubishi memerlukan logika manual (kondisi IF atau CMP + negasi) untuk mendapatkan nilai mutlak.
Bagaimana cara scaling sinyal analog 4–20 mA menjadi nilai kg atau bar yang sebenarnya?
Gunakan rumus scaling linear: Nilai_EU = ((Raw − Raw_Min) / (Raw_Max − Raw_Min)) × (EU_Max − EU_Min) + EU_Min. Sebagian merek seperti Siemens menyediakan blok siap pakai (NORM_X + SCALE_X); merek lain menulis rumus ini manual dengan SUB, MUL, dan DIV.
Kenapa harus pakai tipe data REAL, bukan INT, untuk perhitungan ini?
Berat, harga per kg, dan rata-rata produksi umumnya memerlukan nilai pecahan (misalnya 20,52 kg), yang tidak bisa disimpan akurat dalam tipe data INT/DINT. REAL (floating-point 32-bit) menyimpan nilai pecahan dengan presisi yang cukup untuk kebanyakan aplikasi industri.
Bagaimana cara menghitung rata-rata produksi otomatis di PLC?
Buat dua totalizer: satu untuk akumulasi nilai (misalnya total berat), satu untuk jumlah kejadian (misalnya jumlah batch). Rata-rata dihitung dengan DIV: Akumulasi ÷ Jumlah, dengan interlock agar tidak dijalankan saat Jumlah masih 0.
Apakah nilai hasil perhitungan matematika hilang saat PLC restart?
Tergantung area memori tempat nilai tersebut disimpan. Sebagian besar merek menyediakan area memori retentive yang mempertahankan nilai saat power hilang; nilai di area non-retentive akan kembali ke default (biasanya 0) saat PLC restart. Untuk totalizer produksi yang tidak boleh hilang, pastikan tag disimpan di area retentive sesuai konfigurasi merek yang dipakai.



