"Kembali Ke Dasar Elektronika Digital ... "

Selasa, 21 Juli 2020

MODBUS - Komunikasi Industri Jaman dulu [part 1] Membuat Arduino Modbus Slave




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 typeAccessSizeAddress Space
CoilRead-write1 bit00001 - 09999
Discrete inputRead-only1 bit10001 - 19999
Input registerRead-only16 bits30001 - 39999
Holding registerRead-write16 bits40001 - 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 = &regBank;  

// 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 :


Share:

0 komentar:

Posting Komentar

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (6) 7 segmen (3) adc (4) amplifier (2) analog (10) android (11) antares (3) arduino (14) attiny (1) attiny2313 (17) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (35) display (3) esp8266 (3) gcc (1) iklan (1) infrared (2) Input Output (3) iot (16) jam (6) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (12) komputer (3) komunikasi (1) kontrol (4) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (55) mikrokontroller (7) mikrotik (5) ninmedia (1) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (29) pcb (2) praktek (2) project (33) proyek (1) python (1) radio (3) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sms (6) software (18) tachometer (2) telepon (7) televisi (58) television (2) transistor (1) troubleshoot (3) tulisan (55) tutorial (78) tvri (1) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika