"Kembali Ke Dasar Elektronika Digital ... "

Rabu, 22 Juli 2020

Cara Mudah Belajar MODBUS - Komunikasi Industri Jaman dulu [part 3] Arduino Sebagai Modbus Master



Dalam sebuah piramida Internet Of Things, bagi developer kelas rumahan seperti penulis yang tukang solder ini, ruang geraknya terbatas pada 2  tingkat  yaitu piramida paling bawah pembacaan sensor via microcontroller dan piramida paling atas pada tampilan hasil IOT melalui grafik web dan apps smartphone. Level priramida "connectivity" umumnya merupakan posisi yang hanya bisa dikerjakan oleh dunia telekomunikasi sedangkan level "platforms" merupakan ranah para raksasa IT. 

Standar komunikasi MODBUS bisa digambarkan berada pada perbatasan piramida 1 dan 2 dimana para pengembang modbus mulai mengeluarkan standar modbus TCP untuk meng-akomodir standar jaman now yang serba IP. Lalu alat berbasis modbus yang masih menggunakan standar serial com membutuhkan sebuah bridge IOT yang akan membuat loncatan dari piramida 1 ke piramida 3. Tulisan saya serial pembahasan modbus yang ke-3 dan selanjutnya akan membahas perancangan dan praktek arduino sebagai bridge MQTT sederhana yang akan menghubungkan modbus ke dalam piramida IOT.


Jika anda memerlukan sensor suhu kelembaban standar modbus untuk industri yang harganya terjangkau maka gambar diatas merupakan salah satu pilihan. Diperlukan pembacaan datasheet atau manual yang didapat dari produsennya yang merupakan ciri khas dari alat ber-Protokol modbus. Tiap desainer alat menggunakan alamat register bebas dimanapun sesuai pemahaman mereka begitu juga pemetaan data yang dikirim seperti apa prosedurnya dilakukan tanpa pola yang seragam antar alat yang berbeda. Seperti biasa saya lebih suka menjelaskan dengan praktek langsung dimana kali ini saya berusaha menduplikasi alat SHT20 modbus diatas dengan menggunakan sensor sejuta umat DHT11.



Langkah awal yang perlu diperhatikan adalah mengukur kemampuan microcontoller arduino sebagai bridge IOT dengan memposisikannya sebagai modbus master dan hasilnya penulis beberapa kali kesulitan untuk memperoleh library modbus master yang sesuai dengan keinginan. Ini dikarenakan ternyata akibat saking banyaknya standar yang harus diakomodir maka lebih mudah untuk membuat bridge sesuai dengan karakteristik dari masing-masing alat modbus. Pada penjelasan part1 dan part2 yang saya tulis sebelumnya, alat modbus yang saya buat memiliki deretan perintah dan respon serial sebagai berikut:


0x05 0x05 0x00 0x00 0xFF 0x00 0x8D 0xBE  ==> Ngidupin LED
0x05 0x05 0x00 0x00 0x00 0x00 0xCC 0x4E  ==> Matikan LED

0x05 0x02 0x00 0x00 0x00 0x01 0xB8 0x4E  ==> Baca TOMBOL

----Reply Tombol---
05 02 01 00 A0 B8   ==> LOW                                                    
05 02 01 01 61 78   ==> HIGH

0x05 0x04 0x00 0x00 0x00 0x03 0xB1 0x8F ==> Baca DHT11

---Reply DHT11----
05 04 06 00 1D 00 4F 00 5F CF BE

0x05 0x03 0x00 0x00 0x00 0x0F 0x04 0x4A ==> Baca REGISTER

---Reply----
05 03 1E 00 77 00 77 00 77 00 2E 00 61 00 69 00 73 00 69 00 35 00 35 00 
35 00 2E 00 63 00 6F 00 6D 0B ED 


Untuk perintah mode function 5 force coil / menghidupkan LED maka yang dikirim akan sama dengan apa yang di reply oleh alat modbus, sedangkan function lainnya memiliki karakteristik yang selalu sama. Sehingga jika kita ingin membuat master modbus pada arduino cukup mengirim 5 jenis perintah serial  seperti pada array berikut :



byte ledOn[] = {0x05, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x8D, 0xBE};//ngidupin Led
byte ledOff[] = {0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x4E};//matikan Led
byte tombol[] = {0x05, 0x02, 0x00, 0x00, 0x00, 0x01, 0xB8, 0x4E};//baca tombol
byte humitemp[] = {0x05, 0x04, 0x00, 0x00, 0x00, 0x03, 0xB1, 0x8F};//baca dht11
byte Hregister[] = {0x05, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x04, 0x4A};//baca hold reg


Sedangkan untuk reply responnya kita cukup membandingkan dengan pola seragam yang akan muncul.

byte tombolL[] = {0x05, 0x02, 0x01, 0x00, 0xa0, 0xB8}; // tombol Low 
byte tombolH[] = {0x05, 0x02, 0x01, 0x01, 0x61, 0x78}; // tombol High 

byte dhtOK[] = {0x05, 0x04, 0x06} ; //reply DHT11

byte aisiOK[] = {0x5, 0x03, 0x1E}; //reply Hold register

//simpan pada pada pointer
byte bufferDataModbus[50];
byte *ptr;
Perhatikan reply dari pembacaan DHT 11 seperti berikut :


05 04 06 00 1D 00 4F 00 5F CF BE

05     =  Alamat device id slave
04     =  Perintah baca input analog/ function 04
06     = 6 byte data berikut akan muncul (format 2 byte per data) 
00 1D  = 2 byte pertama adalah 001D = 29
00 4F  = 2 byte kedua adalah 004F =  79
00 5F  = 2 byte ketiga adalah 005F = 95
CF BE  = Checksum / CRC 16 modbus

Jadi butuh parsing pada byte ke-4 dan ke-6 untuk mendapatkan pembacaan suhu dan parsing byte ke-8 untuk mendapatkan kelembaban. Checksum tidak begitu critical sehingga mungkin untuk diabaikan, dan urutan script pembacaan DHT 11 yang kemudian akan dilempar ke serial monitor adalah seperti berikut ini :



void loop()
{

unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= 5000) {
    // timer baca dht11 tiap 5 detik 
    previousMillis = currentMillis;   
    //kirim perintah ke modbus baca dht 11
   mod.write(humitemp, sizeof(humitemp));
    
    }

  //check modbus timeout
  long millisResponModbus = millis() + 1000;
  while (!mod.available())
  {
    if (millisResponModbus < millis())
    {
      break;//timeout
    }
  }
 
 // baca data serial yang masuk dari modbus lalu simpan pada pointer
  while (mod.available())
  {
    byte b = mod.read();
    *ptr++ = b;
    Serial.print("0x");
    Serial.print(String(b, HEX));
    Serial.print(" ");
    delay(2);

  }

  //proses komparasi data yg masuk (DHT11) dengan array jawaban lalu parsing
  if (memcmp(bufferDataModbus, dhtOK, sizeof(dhtOK)) == 0) {
  ptr = bufferDataModbus;
  Serial.println("");
  Serial.print(F("SUHU :"));
  Serial.print(ptr[4]); //alamat byte ke 4
  Serial.print(F(","));
  Serial.print(ptr[6]); //alamat byte ke 6
  Serial.print(F(" C HUMI :"));
  Serial.print(ptr[8]); //alamat byte ke 8
  Serial.println(" %");
  memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus));
 }


}


Jadi jika ingin melihat visualisasinya anda bisa menontonnya pada video berikut ini :


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 (2) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (38) 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) sinyal (1) sms (6) software (18) tachometer (2) telepon (7) televisi (72) television (5) transistor (1) troubleshoot (3) tulisan (59) tutorial (78) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika