Seri tulisan saya kali ini akan membahas tentang protokol komunikasi pada industri yang masih de facto menjadi standar disana. Standar MODBUS yang diperkenalkan oleh modicom (kemudian menjadi schneider) pada tahun 1979 sebagai sistem kendali pada mesin industri dimana saat itu kontrol dari pusat PLC (Programmable Logic Unit) dihubungkan menuju RTU (remote terminal unit) melalui komunikasi serial RS 232/485. Untuk memudahkan pemahaman kali ini saya akan menekankan praktek langsung menggunakan mikrokontroller arduino.
Salah satu contoh alat berbasis modbus yang lagi naik daun adalah PZEM dimana saat musim pengiritan energi sangat dibutuhkan kontrol pengaturan daya listrik melalui monitoring yang akurat. Terdapat satu blog pada internet karya mas asep kurniawan (semesin dot com) membahas penggunaan alat ini tanpa menggunakan library pzem pada sketch arduino. Secara sederhana pembacaan datanya digambarkan seperti ini :
courtesy semesin dot com
Pola pikir orang jaman dulu saat mendesain protokol modbus menggunakan pola ADDRESS-DATA, jadi sebuah lokasi alamat memori memiliki data yang dapat dibaca atau ditulis dan dari perubahan register ini maka akan mendapatkan kondisi yang diharapkan. Alamat address yang standar modbus sebagai berikut :
Object type | Access | Size | Address Space |
---|---|---|---|
Coil | Read-write | 1 bit | 00001 - 09999 |
Discrete input | Read-only | 1 bit | 10001 - 19999 |
Input register | Read-only | 16 bits | 30001 - 39999 |
Holding register | Read-write | 16 bits | 40001 - 49999 |
Coil merupakan istilah output relay, Discrete input merupakan istilah untuk switch, Input register merupakan data sensor analog dan Holding register sebagai alamat memory umum yang dapat digunakan menampung parameter/variabel. Ada istilah lainnya yang perlu diketahui yaitu function code yang menjelaskan perintah yang dikirim akan mengerjakan apa.
FUNCTION CODE | VALUE TYPE |
01 (0x01) | Read Coil Status |
02 (0x02) | Read Input Status |
03 (0x03) | Read Holding Registers |
04 (0x04) | Read Input Registers |
05 (0x05) | Force Single Coil |
06 (0x06) | Preset Single Register |
15 (0x0F) | Force Multiple Coils |
16 (0x10) | Preset Multiple Registers |
Yang sering digunakan pada alat berbasis modbus adalah fungsi 02, 03, 04 dan 05.
Karena di tempat saya tidak memiliki alat berbasis modbus maka pada praktek part 1 ini kita akan membuat alat seperti pada skematik diatas tujuannya menjadikan arduino dengan I/O berupa dht11, led dan tombol menjadi berbasis modbus. Script nya seperti dibawah ini :
//Library modbus slave: https://code.google.com/archive/p/arduino-modbus-slave/downloads #include <modbus.h> #include <modbusDevice.h> #include <modbusRegBank.h> #include <modbusSlave.h> #include "DHT.h" /* Cara Mudah Menjadikan arduino menjadi alat modbus Alamat device ID 5 pada 9600 baud. */ #define LED 2 #define TOMBOL 3 #define dhtPin 4 #define DHTTYPE DHT11 DHT dht(dhtPin, DHTTYPE); unsigned long previousMillis = 0; const long interval = 5000; //Setup register bank //semua data ditulis dan disimpan disini modbusDevice regBank; //mode slave modbusSlave slave; void setup() { pinMode(LED, OUTPUT); pinMode(TOMBOL, INPUT); //menentukan device ID. regBank.setId(5); dht.begin(); /* modbus registers format seperti berikut 00001-09999 Digital Outputs, master dapat menulis dan membaca data 10001-19999 Digital Inputs, master hanya bisa baca data 30001-39999 Analog Inputs, master hanya bisa membaca nilai pada register 40001-49999 Analog Outputs, master dapat tulis baca register */ //tambahkan alamat LED pada register bank regBank.add(1); //LED //Tombol sebagai Input registers 10001 regBank.add(10001); //TOMBOL //Analog Input registers 30001-30003 untuk DHT11 regBank.add(30001); //DHT11 - suhu puluhan regBank.add(30002); //DHT11 - suhu desimal regBank.add(30003); //DHT11 - kelembaban //Coba simpan register umum 40001-40015 regBank.add(40001); // w regBank.add(40002); // w regBank.add(40003); // w regBank.add(40004); // . regBank.add(40005); // a regBank.add(40006); // i regBank.add(40007); // s regBank.add(40008); // i regBank.add(40009); // 5 regBank.add(40010); // 5 regBank.add(40011); // 5 regBank.add(40012); // . regBank.add(40013); // c regBank.add(40014); // o regBank.add(40015); // m /* protocol handler yang akan menulis dan membaca register data. */ slave._device = ®Bank; // Serial pada 9600 slave.setBaud(9600); //isi register umum diawal regBank.set(40001,'w'); regBank.set(40002,'w'); regBank.set(40003,'w'); regBank.set(40004,'.'); regBank.set(40005,'a'); regBank.set(40006,'i'); regBank.set(40007,'s'); regBank.set(40008,'i'); regBank.set(40009,'5'); regBank.set(40010,'5'); regBank.set(40011,'5'); regBank.set(40012,'.'); regBank.set(40013,'c'); regBank.set(40014,'o'); regBank.set(40015,'m'); } //fungsi memecah angka dibelakang koma dht11 int ExtractDecimalPart(float Value, int numberOfDecimals) { float temp = Value - (long)(Value); long p = 1; for (int i=0; i< numberOfDecimals; i++) p*=10; long DecimalPart = p * temp; return DecimalPart; } void loop() { //Melihat data register 1 dan lempar ke LED digitalWrite(LED,regBank.get(1)); //Membaca input tombol dan lempar ke register 10001 regBank.set(10001, digitalRead(TOMBOL)); //membaca dht11 tiap 5 detik unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { // save the last time you read the sensor previousMillis = currentMillis; int h = dht.readHumidity(); float t= dht.readTemperature(); int t1 = t; int t2 = ExtractDecimalPart(t,2); //pecah desimal regBank.set(30001,1000); // tulis suhu depan koma regBank.set(30002,1000); // tulis suhu belakang koma regBank.set(30003,1000); // tulis kelembaban } // loop terus sebagai slave slave.run(); }
Pergunakan software monitoring modbus yang banyak ada di internet untuk melakukan pengecekan apakah alat yang kita buat sudah terbukti menggunakan modbus, yang saya gunakan adalah radzio modbus.
Dengan menggunakan USB to Serial langsung ke PC maka telah terbukti device modbus arduino dengan ID 5 dapat dibaca datanya dan dilakukan kontrol LED terhadapnya. Kita juga bisa mengetest data apa sih yang dikirimkan secara serial dan format yang benar melalui terminal real term yang akan dibahas pada video selanjutnya, dan selengkapnya bisa dilihat pada video berikut :
Komentar ini telah dihapus oleh pengarang.
BalasHapusTerimakasih Banyak Ilmunya buat Master kita
BalasHapusBagaimana cara mengambil value yang di write oleh master, dan value tersebut akan digunakan slave untuk men drive sebuah relay ech.
BalasHapusDalam modbus selalu master mengirim command ke slave, sedangkan slave hanya menterjemahkan kodenya mau ON atau OFF kan relay. atau apapun. Slave jika sudah berbasis modbus hanya menerima perintah tidak perlu mengambil value dari sang master
Hapus