MODBUS MEMANG GILAAAA!!!!! | INSTRUMENT PART 13
Protokol komunikasi apa yang paling gila dalam trilogi protokol komunikasi?
Saya akan menjawab MODBUS.
Ini didasarkan pada sisi pemrograman PLC MODBUS yang membutuhkan lebih banyak waktu dipelajari, dipahami, dan diresapi wkwkwk. Pada bagian ini, saya akan menjelaskan percobaan yang telah saya coba bersama mentor saya (walau yang lebih banyak berpikir sebenarnya bukan saya sih wkwkwkwkwkwk).
The most insane Protocol
Dulu saya berpikir bahwa ilmu dan seni PLC itu sederhana wkwkwk, ya paling intinya buat program berdasarkan kasus lah wkwk. Setelah saya diajari lebih dalam oleh mentor saya, saya mulai sadar bahwa PLC itu bukan soal pemrograman melulu. Saya diajari cara konfigurasi PLC (power supply yang dibutuhkan berapa ampere, modul komunikasi yang dibutuhkan seri apa, modul analog digital Input/outputnya seri apa) juga diajari cara pengkabelan PLC (PLC nya sebagai sinking atau sourcing ke transmitter, wiring relay dari PLC seperti apa) dan inti dari segala inti adalah terkait pemrograman (cara pemrograman analog input/digital input/digital output/analog output gimana, pemrograman menggunakan trilogi protokol komunikasi gimana) wkwkwk. Intinya PLC itu rumit lah wkwkwkwk.
![]() |
Master and Slave Analogy |
Salah satu analogi yang paling sering digunakan adalah istilah master-slave. Master disini tentunya merupakan PLC (karena seperti yang kita tahu otaknya ya PLC). Satu master (PLC) bisa punya banyak slave, ataupun 2 master/lebih bisa punya banyak slave (redundant system). Slave hanya akan menuruti semua perintah mastrer hanya jika komunikasi diantara master dan slave terjadi secara benar.
Kali ini saya akan sharing pengetahuan mengenai komunikasi menggunakan protokol MODBUS. Jika sebelumnya pada protokol HART lebih difokuskan pada variabel apa yang ingin ditarik, pada MODBUS lebih difokuskan pada slave address and parameter address apa yang ingin kita tarik. Pada percobaan kali ini saya menggunakan 2 buah slave (instrument) yang support untuk komunikasi MODBUS. Disini saya memilih Level Transmitter MultiRanger dengan sensornya Probe LU untuk slave 1, dan powermeter SENTRON PAC 3100 untuk slave 2. Jikalau pada part sebelumnya saya sudah mencoba menggunakan SENTRON PAC dan berhasil untuk membaca data MODBUS, maka disini saya menambah parameter berupa :
1. penambahan slave menjadi 2 slave
2. tidak hanya bisa membaca data dari slave (read), tapi saya akan mencoba memberikan perintah ke slave (write)
Oke langsung saja masuk ke intinya.....
1. Wiring
wiring modul profibus, slave 1, slave 2 |
Dalam kabel MODBUS seperti yang pernah saya bilang, walaupun portnya menggunakan konektor DB9, namun jumlah kabel data nya hanya 2. Perlu selalu diingat, bahwa dalam komunikasi MODBUS, wiring slave dikoneksikan secara serial. Jadi urutannya PLC --> slave x --> slave y --> slave z. Tidak bisa slave x --> plc ; slave y --> plc ; slave z --> plc (tidak bisa paralel). Lebih jelasnya seperti gambar di bawah
![]() |
Modbus wiring from master to N-Slave |
2. Program PLC
2A. Blok diagram MAIN
![]() |
main-1 |
![]() |
main-2 |
![]() |
main-3 |
2B. Blok Diagram Status
![]() |
Blok diagram status |
2C. Blok Diagram Receive Data
![]() |
Blok Diagram Receive Data |
Blok Diagram Receive Data merupakan blok dimana data-data yang akan di read ataupun di write akan disimpan. Data ini merupakan fungsi yang diarahkah ke data_ptr setiap blok diagram modbus_master pada main program. Data-data ini sejatinya mengandung data address dari masing-masing slaveHal terpenting disini juga adalah tipe datanya disesuaikan dengan datasheet. Misalnya pada datasheet powermeter ditulikan tipe data Real, maka kita harus membuat tipe data Real juga.
3 Penjelasan Program Ladder
![]() |
Flowchart Modbus dengan 2 slave |
3A. Program Main
Setiap kali kita ingin menggunakan MODBUS, kita ambil blok diagram MODBUS RTU pada blok komunikasi di sebelah kanan
Function Block Modbus RTU |
Blok yang dibutuhkan adalah Modbus_Com_Load dan Modbus_Master.
Penjelasan Ladder Diagram bagian 2.A MAIN adalah sebagai berikut :
SLAVE 1 = POWERMETER SENTRON , SLAVE 2 = MULTI RANGER XPS LEVEL TRANS
# network_1 setup modbus (blok Modbus_Com_Load)
penjelasan blok modbus_com_load |
req = merupakan request atau input apa yang bisa memproses blok tersebut. Disini saya menggunakan fisrt scan yang artinya ketika program dieksekusi PLC, maka program akan berjalan terus tanpa ada kondisi yang menghentikan
port = diisi dengan port komunikasi RS-485
baudrate = diisi dengan 9600, baudrate ini harus diinput ke semua slave PLC dengan nilai yang sama agar komunikasi bisa terjadi
MB_DB, DONE, ERROR, STATUS diisi dengan variabel yang dibuat dari fumction blok lain.
# network_2 slave 2 data level
penjelasan blok modbus-com_master |
Blok program ini untuk memanggil slave-2 (multiranger level transmitter)
en = 1, artinya blok program multiranger aktif setelah counter up bernilai 1 atau setelah PLC mengambil semua data power meter (slave-1)
mb_addr = 2, karena xps (level transmitter) dalam percobaan ini merupakan slave-2.
mode = 1, mode 1 merupakan perintah write ke slave, sementara mode = 0 merupakan perintah read data dari slave
data addr = diisi dengan 41010 sesuai dengan datasheet Multiranger
Multiranger data address |
data ptr = diisi dengan fungsi xps yang telah didefinisikan di blok receive data 2C. Tipe data diisi dengan integer.
Done, Busy, Error, Status diisi dengan fungsi yang telah didefinisikan di blok status 2B.
# network_3 slave 1 data kWh
Salah satu data utama dari power meter adalah data pengukuran kWh.
en = 0, artinya blok program POWERMETER aktif sesaat setelah PLC dinyalakan.
mb_addr = 1, karena power meter dalam percobaan ini merupakan slave-1
mode = 0, karena kita ingin read data dari slave power meter
data addr = diisi dengan 40802 sesuai dengan datasheet power meter (data addr = offset + initial value)
kebanyakan initial value bernilai 40000/40001, jadi 40001+802 = 40802
power meter kWh data address |
data len = 4, karena jumlah register pada data kWh di atas tertulis 4
data ptr = diisi dengan fungsi kWh yang telah didefinisikan di blok receive data 2C. Tipe data diisi dengan LReal. Disini lah letak seni PLC, untuk menentukan tipe data saja kita harus mencoba berkali-kali. Karena beda tipe data, beda pula hasil yang akan ditampilkan.
# network_4 slave 1 data kvarh
network 4 sama dengan network 3, yang beda tentunya adalah data_addr = 40805 dan data_ptr disimpan pada fungsi yang berbeda
# network_5 slave 1 27 data
Disini saya akan mengambil langsung data power sebanyak 27 data sekaligus.
en = 0, artinya blok program POWERMETER aktif sesaat setelah PLC dinyalakan.
mb_addr = 1, karena power meter dalam percobaan ini merupakan slave-1
mode = 0, karena kita ingin read data dari slave power meter
data addr = merupakan data address pertama yang diisi dengan 40002 sesuai dengan datasheet power meter (data addr = offset + initial value = 40001 + 1)
kebanyakan initial value bernilai 40000/40001, untuk powermeter bernilai 40001... jadi 40001+1 = 40002
power meter important data address |
data len = 53, karena jumlah register (offset) pada data powermeter diatas sebanyak 53
data ptr = diisi dengan fungsi powermeter yang telah didefinisikan di blok receive data 2C. Tipe data diisi dengan Array. Array [0....53] memiliki arti bahwa pengambilan data dilakukan dari ofset 0 hingga 53 secara langsung. Karena data yang ditarik lumayan banyak, maka membutuhkan waktu yang sedikit lama. Selama PLC mengambil 26 data ini, maka fungsi status_comm_master_busy = 1 atau aktif. Jikalau sudah selesai, maka status _comm_master_done = 1.
# network_6 write to powermeter
Jika sebelumnya kita hanya membaca nilai dari slave, sekarang kita akan memberikan perintah ke slave (mode write). Karena kita tahu bahwa variabel kWh merupakan active energi total (total konsumsi energi listrik yang terpakai), maka kita akan mencoba mereset nilai kWh tersebut. Kebetulan pada SENTRON PAC 3100 memiliki mode reset yang bisa diberikan dari PLC. Dapat dilihat pada kolom paling kanan, mode W memiliki arti mode write dari PLC ke Powermeter.
power meter reset function data address |
en = 0, artinya blok program POWERMETER aktif sesaat setelah PLC dinyalakan.
mb_addr = 1, karena power meter dalam percobaan ini merupakan slave-1
mode = 1, karena kita ingin write data dari master (plc) ke power meter
data addr = diisi dengan 460005 sesuai dengan datasheet power meter (data addr = offset + initial value)
Ada yang aneh disini, kenapa data addr bukan 60004, 60005 atau 100005 (40001 + 60004)?
Jawaban singkatnya sebenarnya hanya bisa try and error. Namun ketika sudah buntu seperti saya, kita bisa lihat penjelalasan pada TIA Portal. Sesuai dengan datasheet address di atas, tertulis function code 0 x 06. Maka dapat dilihat initial valuenya bisa berupa 40001 atau 400001. Setelah saya coba memasukkan address 100005, fungsi reset tidak berfungsi. Kemudian kita ganti dengan initial valu 400001, sehingga address nya menjadi 460005 dan boooommmmmm, fungsi resetnya berfungsi. Disinilah letak kegilaan MODBUS, banyak nilai-nilai yang susah untuk dijelaskan disini wkwkwk.
Penjelasan TIA Portal untuk offset data |
data len = 1 karena register yang dibutuhkan hanya 1.
data_ptr = diisi dengan fungsi reset yang telah didefinisikan di blok receive data 2C.
# network_7
network 7 merupakan blok move biasa, dimana ketika PLC dinyalakan, maka fungsi move akan bernilai 0.
# network_8
Ketika step = 0, maka PLC akan mengeksekusi pengambilan semua data pada slave-1. Ketika Status_com_master_busy slave-1 = tidak, maka coil akan close, dan step kemudian akan bernilai 1. Ketika step bernilai 1, PLC akan mengeksekusi blok pengambilan data slave-2.
# network_9
Ketika step bernilai 1, dan pengambilan data slave-2 (XPS) sudah done, maka akan mentriger output %M10.0. %M10.0 ini nanti akan mentrigger blok CTU Network 10.
# network_10
Disetting nilai reset = 2 karena hanya ada 2 slave. Ketika PLC selesai mengambil data slave 1 (step = 0 ), kemudian gantian mengambil data slave 2 (step =1), maka step akan te-reset kembali menjadi 0 (kembali mengambil data slave 1), begitu seterusnya secara bergantian dan real time.
# network_11 reset kWh powermeter
Ketika kita memberikan perintah reset ke powermeter melalui PLC, maka data address reset 460005 (pada data_ptr) akan mendapat nilai 0. Sesuai dengan datasheet, reset = 0 menanadakan bahwa semua data penggunaan energi akan ter-reset menjadi 0.
# network_12 nonaktifkan reset kWh powermeter
Ketika perintah reset tidak diberikan PLC, maka data_ptr_reset akan mendapat nilai 7. Nilai ini sebenarnya bebas, asalkan diluar rentang nilai reset powermeter
reset value start from 0 - 4 |
Hasil
Saya kebetulan tidak sempat untuk mendokunmentasikan hasil percobaannya, namun kira-kira hasilnya persis seperti ini. Namun bedanya percobaan kali ini sudah digunakan untuk pembacaan data 2 slave dan sudah mampu memberikan perintah ke slave untuk me-reset nilai di bawah menjadi 0
Pembacaan data PowerMeter |
Bisa saya simpulkan komunikasi dengan protokol MODBUS ini sedikit begitu rumit. Alasan saya ada 2 ;
1. Data address terkadang mengandung initial value yang nilainya sedikit abstrak wkwk
2. Tipe data juga harus di try and error, karena terkadang beda tipe data beda pula hasil pembacaan wkwk
Thankyouu.....
Comments
Post a Comment