Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Rabu, 22 Juli 2020

Cara Mudah Belajar MODBUS - Komunikasi Industri Jaman dulu [part 5 -End] Modbus vs Antares.id



Belum lengkap rasanya kalau saya belum mencoba praktek modbus yang telah lengkap piramida IOT nya kedalam platform IOT lokal yaitu ANTARES by telkomiot. Tentunya pembaca yang ingin mengikuti pembahasan kali ini diharapkan membaca penelusuran saya dengan Antares vs ESP 8266 disini dan disini. Masih dengan rangkaian yang sama kita akan mencoba mengirim data pembacaan sensor modbus dan juga menunggu perintah dikirimkan dari antares ke sensor modbus yang saya buat menggunakan arduino.


Dari standar OneM2M yang digunakan antares maka ada ketentuan data MQTT yang di publish dan subscribe hanya terbatas pada 2 topik berikut :


PUBLISH  TOPIC :
/oneM2M/req/access:key/antares-cse/json

SUBSCRIBE TOPIC :
/oneM2M/resp/antares-cse/access:key/json



Data yang dikirim / PUBLISH berupa JSON dimana polanya harus sesuai dimana data apapun yang akan dikirim ke Antares merupakan isi dari dalam "con" :

{
  "m2m:rqp": {
    "fr": "access:key",
    "to": "/antares-cse/antares-id/project-name/device-name",
    "op": 1,
    "rqi": 123456,
    "pc": {
      "m2m:cin": {
        "cnf": "message",
        "con": "{\"data\":\"value\"}"
      }
    },
    "ty": 4
  }
}

Jadi script publish mqtt menggunakan function atau routine sebagai berikut :


   void kirim(String tombol, String suhu, String humi) // kirim 3 item sekaligus
{
    Serial.println("publish to antares topik: " );
    Serial.print(TOPIKPUB);
    Serial.print(" : ");
    Serial.println(tombol + " - " + suhu + " - " + humi );
    
    String pubString ;  //isi json pub message yg super panjang
    pubString += F("{");
    pubString += F("\"m2m:rqp\": {");
    pubString += F("\"fr\": \"");
    pubString += String(accessKey) ;
    pubString += F("\",");
    pubString += F("\"to\": \"/antares-cse/antares-id/");
    pubString += String(projDev);
    pubString += F("\",");
    pubString += F("\"op\": 1,");
    pubString += F("\"rqi\": 123456,");
    pubString += F("\"pc\": {");
    pubString += F("\"m2m:cin\": {");
    pubString += F("\"cnf\": \"message\",");
    pubString += F("\"con\": \"{\\\"tombol\\\":");
    pubString += tombol;
    pubString += F(",\\\"suhu\\\":");
    pubString += suhu;
    pubString += F(",\\\"humidity\\\":");
    pubString += humi;
    pubString += F("}\"");
    pubString += F("}");
    pubString += F("},");
    pubString += F("\"ty\": 4");
    pubString += F("}");
    pubString += F("}");

   // kirim ke topik TOPIKPUB
   char message_buff[pubString.length() + 1];
   pubString.toCharArray(message_buff, pubString.length() + 1);
   client.publish(TOPIKPUB,message_buff);
  
}

    




Untuk menunggu request dari antares harus diperhatikan yang diterima melalui callback merupakan JSON juga lhooo...jadi kalau mumet sebaiknya dihentikan segera melanjutkan membaca blog ini!

 {
   "m2m:rsp" : {
      "rsc" : 2001,
      "rqi" : "123456",
      "pc" : {
         "m2m:cin" : {
            "rn" : "cin_63068886",
            "ty" : 4,
            "ri" : "/antares-cse/cin-63068886",
            "pi" : "/antares-cse/cnt-682859183",
            "ct" : "20200707T152502",
            "lt" : "20200707T152502",
            "st" : 0,
            "cnf" : "message",
            "cs" : 35,
            "con" : "{\"led\":\"on\"}"
         }
      },
      "to" : "access:key",
      "fr" : "/antares-cse"
   }
}


Untuk mengolah data request dari antares maka ESP8266 akan melakukan parsing JSON dari payload MQTT dengan menggunakan library ARDUINO JSON


    DynamicJsonDocument doc(512);
    deserializeJson(doc, message);
    String parsedString = doc["m2m:rsp"]["pc"]["m2m:cin"]["con"]; //pertama cari isi con
    deserializeJson(doc, parsedString);
    String lednya = doc["led"]; //kedua cari isi led on apa off
    Serial.println("lednya : " + lednya);
    

Jadi untuk mendapatkan isi dari message led "on" atau "off" maka diperlukan 2 kali parsing json karena isi dalam "con" juga di syaratkan sebagai JSON. Kenapa begitu? Ya karena itulah standar onem2m yang digunakan jadi harus diikuti saja.




Selengkapnya bisa dilihat pada video berikut ini 



Script lengkap :


// by www.aisi55.com please attach our credential if you using our script
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

SoftwareSerial mod(4, 5); // RX, TX

const char *ssid =  "nama wifi";  
const char *pass =  "password";

const char *mqtt_server = "mqtt.antares.id";
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "ahocool1265352";  
//sesuaikan dengan parameter akun antares kamu
#define TOPIKPUB "/oneM2M/req/access:key/antares-cse/json"
#define TOPIKSUB "/oneM2M/resp/antares-cse/access:key/json"
#define accessKey "access:key"
#define projDev "Project_name/Device_name" WiFiClient wclient; PubSubClient client(wclient); 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};//tombol byte tombolL[] = {0x05, 0x02, 0x01, 0x00, 0xa0, 0xB8}; // tombol Low byte tombolH[] = {0x05, 0x02, 0x01, 0x01, 0x61, 0x78}; // tombol High byte humitemp[] = {0x05, 0x04, 0x00, 0x00, 0x00, 0x03, 0xB1, 0x8F};//baca dht11 byte dhtOK[] = {0x05, 0x04, 0x06} ; byte bufferDataModbus[50]; byte *ptr; bool urut= false; bool led= false; unsigned long previousMillis = 0; String suhunya ="0"; String huminya ="0"; String tomb ="0"; void setup() { Serial.begin(9600); Serial.println(F("ESP8266 Modbus Bridge to ANTARES")); Serial.println(F("http://www.aisi555.com")); Serial.println(); if (WiFi.status() != WL_CONNECTED) { Serial.print("Connecting to Wifi: "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } mod.begin(9600); ptr = bufferDataModbus; client.setServer(mqtt_server, mqtt_port); client.setCallback(mqtt_callback); } void reconnectmqtt() { Serial.println("Connecting to MQTT server.."); if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) { Serial.println("Connected to MQTT server"); } else { Serial.println("Could not connect to MQTT server"); } if (client.connected()){ Serial.println("subscribe to topic: "); Serial.println(TOPIKSUB); client.subscribe(TOPIKSUB); } } void kirim(String tombol, String suhu, String humi) { Serial.println("publish to antares topik: " ); Serial.print(TOPIKPUB); Serial.print(" : "); Serial.println(tombol + " - " + suhu + " - " + humi ); String pubString ; pubString += F("{"); pubString += F("\"m2m:rqp\": {"); pubString += F("\"fr\": \""); pubString += String(accessKey) ; pubString += F("\","); pubString += F("\"to\": \"/antares-cse/antares-id/"); pubString += String(projDev); pubString += F("\","); pubString += F("\"op\": 1,"); pubString += F("\"rqi\": 123456,"); pubString += F("\"pc\": {"); pubString += F("\"m2m:cin\": {"); pubString += F("\"cnf\": \"message\","); pubString += F("\"con\": \"{\\\"tombol\\\":"); pubString += tombol; pubString += F(",\\\"suhu\\\":"); pubString += suhu; pubString += F(",\\\"humidity\\\":"); pubString += humi; pubString += F("}\""); pubString += F("}"); pubString += F("},"); pubString += F("\"ty\": 4"); pubString += F("}"); pubString += F("}"); char message_buff[pubString.length() + 1]; pubString.toCharArray(message_buff, pubString.length() + 1); client.publish(TOPIKPUB,message_buff); } void loop() { if (!client.connected()) { reconnectmqtt(); } else client.loop(); //cek terus kalau ada data masuk unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= 5000) { // save the last time you read the sensor previousMillis = currentMillis; if(!urut )mod.write(tombol, sizeof(tombol)); else mod.write(humitemp, sizeof(humitemp)); urut =!urut; } long millisResponModbus = millis() + 1000; while (!mod.available()) { if (millisResponModbus < millis()) { break;//timeout } } while (mod.available()) { byte b = mod.read(); *ptr++ = b; Serial.print("0x"); Serial.print(String(b, HEX)); Serial.print(" "); delay(2); } if (memcmp(bufferDataModbus, ledOn, sizeof(ledOn)) == 0) { ptr = bufferDataModbus; memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else if (memcmp(bufferDataModbus, ledOff, sizeof(ledOff)) == 0) { ptr = bufferDataModbus; memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else if (memcmp(bufferDataModbus, tombolL, sizeof(tombolL)) == 0) { ptr = bufferDataModbus; tomb="0"; kirim(tomb,suhunya,huminya); memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else if (memcmp(bufferDataModbus, tombolH, sizeof(tombolH)) == 0) { ptr = bufferDataModbus; tomb="1"; kirim(tomb,suhunya,huminya); memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else if (memcmp(bufferDataModbus, dhtOK, sizeof(dhtOK)) == 0) { ptr = bufferDataModbus; suhunya = String(ptr[4]) + '.' +String(ptr[6]) ; huminya = String(ptr[8]); kirim(tomb,suhunya,huminya) ; memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else { ptr = bufferDataModbus; //Serial.println(""); memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } } void mqtt_callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived in topic: "); Serial.println(topic); //Serial.print("Message:"); String message; for (int i = 0; i < length; i++) { message = message + (char)payload[i]; //Conver *byte to String } // Serial.print(message); //kepanjangan makanya di tutup DynamicJsonDocument doc(512); deserializeJson(doc, message); String parsedString = doc["m2m:rsp"]["pc"]["m2m:cin"]["con"]; deserializeJson(doc, parsedString); String lednya = doc["led"]; Serial.println("lednya : " + lednya); if(lednya == "on") { mod.write(ledOn, sizeof(ledOn)); Serial.println("lednya hidup"); } if(lednya == "off") { mod.write(ledOff, sizeof(ledOff)); Serial.println("lednya mati "); } Serial.println(); Serial.println("-----------------------"); }

Share:

Cara Mudah Belajar MODBUS - Komunikasi Industri Jaman dulu [part 4] Arduino MQTT Bridge




Setelah berhasil memposisikan arduino menjadi modbus master, kita akan butuh sedikit usaha lagi untuk melengkapi piramida IOT nya. Untuk itu perlu penggabungan dari beberapa tulisan sebelumnya yaitu dasar MQTT pada ESP8266 disini dengan tulisan seri modbus part 3 disini. Ada dua mode mqtt yang ingin saya gunakan yaitu mode request-reply dan mode periodic. Perhatikan rangkaian dasar yang telah kita bahas sebelumnya.


Skematik arduino mqtt bridge


Dengan asumsi pembaca telah memahami pembahasan sebelumnya, mode request-reply memiliki 5 type perintah yang akan dikirim ke perangkat modbus dan jika di tuliskan dalam script seperti berikut  :


if (Serial.available() > 0) { //perintah dari serial port monitor/putty
    // read the incoming byte:
    incomingByte = Serial.read();

    if (incomingByte == '1') {  //toggle led mati hidup
       if (!led) mod.write(ledOn, sizeof(ledOn)); //modbus led on
       else mod.write(ledOff, sizeof(ledOff)); //modbus led off

       led=!led;
      }
    else if (incomingByte == '2')  mod.write(tombol, sizeof(tombol));  //cek tombol
    else if (incomingByte == '3')  mod.write(humitemp, sizeof(humitemp)); //baca dht11
    else if (incomingByte == '4')  mod.write(aisi, sizeof(aisi)); //baca holding register

    }
Pada script diatas merupakan perintah atau request yang dikirimkan oleh Terminal Serial semisal putty atau serial monitor sketch arduino dimana terjemahan perintah nya seperti berikut :

  • '1'  : Togle led On atau Off
  • '2'  : Baca penekanan tombol
  • '3'  : Baca sensor DHT11
  • '4'  : Baca Holding Register

Kita dapat  merubah request dari terminal serial menjadi perintah yg  dikirim melalui SUBSCRIBE TOPIK  MQTT,  jadi esp8266 akan menunggu apakah ada request dari server/broker yang masuk dan membandingkan isi payloadnya sesuai script berikut :

void mqtt_callback(char* topic, byte* payload, unsigned int length) {
 
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
 
  Serial.print("Message:");
 
  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  //Convert *byte to String
  }
   Serial.print(message);
   if(message == "1"){  //bandingkan payload yang masuk dan kirim modbus
       if (!led) mod.write(ledOn, sizeof(ledOn));
       else mod.write(ledOff, sizeof(ledOff));

       led=!led;
      }
   if(message == "2")mod.write(tombol, sizeof(tombol));
   if(message == "3")mod.write(humitemp, sizeof(humitemp));
   if(message == "4")mod.write(aisi, sizeof(aisi));


 }
Untuk memahaminya tidaklah begitu sulit jika anda rajin membaca blog ini dari seri tulisan mengenai mqtt yang sering saya bahas sebelumnya. 

Setelah modbus me-reply request maka esp8266 akan membandingkan reply modbus dan selanjutnya melakukan PUBLISH MQTT ke topik yang telah ditentukan ke broker mqtt. Anda juga bisa menggunakan Smartphone dengan aplikasi IOT MQTT PANEL untuk menerima data yang di PUBLISH oleh bridge mqtt esp8266 dan tentunya juga bisa mengirimkan perintah/request ke modbus.




Untuk mode periodic cukup menambahkan timer pada loop utama yang akan mengirimkan perintah modbus untuk pengecekan tombol dan pembacaan DHT11 setiap jeda waktu tertentu. Selengkapnya ikuti penjelasan pada video berikut ini :



Share:

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:

Selasa, 21 Juli 2020

Cara Mudah Belajar MODBUS - Komunikasi Industri Jaman dulu [part 2] Membedah Isi Pesan Modbus




Pada bagian kedua kita akan membedah standar protokol modbus melalui pembedahan perintah yang dikirim dan terima dari master menuju slave. Dari software sniffer serial port  yg menyadap komunikasi serial pada komunikasi antara PC sebagai master modbus dan arduino sebagai modbus slave, didapatkan pola pengiriman data seperti ini saat menghidupkan LED:

05 05 00 00 FF 00 8D BE

Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar pada beberapa tulisan yang saya baca di beberapa artikel di internet adalah seperti berikut:

05     =  Alamat device id slave
05     =  Perintah force coil / function 05
00 00  = 2 byte alamat address memori (mulai 0)
FF 00  = 2 byte force coil ON
8D BE  = Checksum / CRC 16 modbus

Ada pola khusus yaitu alamat address register dan data perintah berupa 2 byte. Register / alamat memory modbus selalu dimulai dari nol walaupun sejatinya alamat yang dituju merupakan register yg diawali angka 1, contoh kita akan megakses register 40001, tetap saja perintah nya akses ke reg 0 karena sudah diwakili oleh byte perintah function sebagai penanda jenis register yg akan diakses. Check sum ini didapat dengan rumus tertentu dan daripada pusing langsung aja gunakan website https://www.scadacore.com/tools/programming-calculators/online-checksum-calculator/ untuk menjadi crosscheck. Pada terminal realterm sudah terdapat penghitung checksum otomatis sehingga sangat gampang.



Jadi untuk mematikan led perintahnya adalah :


05 05 00 00 00 00 CC 4E

Untuk mengecek checksumnya (CC 4E) dapat menggunakan website yang telah saya berikan sebelumnya. Untuk mengecek penekanan tombol perintahnya adalah :


05 02 00 00 00 01 B8 4E

05     =  Alamat device id slave
02     =  Perintah baca input digital / function 02
00 00  = 2 byte alamat address memori (mulai 0)
00 01  = 2 byte panjang data yg diharapkan
B8 4E  = Checksum / CRC 16 modbus



Jawaban yg diterima untuk kondisi tombol dilepas / LOW :

05 02 01 00 A0 B8

Untuk kondisi tombol ditekan / HIGH
05 02 01 01 61 78

Dimana yang berwarna merah artinya  bisa dilihat pada website  parsing data RTU berikut  http://rapidscada.net/modbus/ModbusParser.aspx


Untuk membaca DHT11 dilakukan dengan function 04 dan 3 buah data akan diminta ke modbus yaitu  suhu didepan koma, suhu di belakang koma dan terakhir angka kelembaban. Perintahnya sebagai berikut :

05 04 00 00 00 03 B1 8F

05     =  Alamat device id slave
04     =  Perintah baca input analog/ function 04
00 00  = 2 byte alamat address memori (mulai 0)
00 03  = 2 byte panjang data yg diharapkan (3 buah data)
B1 8F  = Checksum / CRC 16 modbus

sedangkan replynya seperti ini formatnya : 

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 hasil pembacaan dari DHT 11 adalah 29,79 derajat Celcius dengan kelembaban 95%. Untuk lebih jelasnya bisa dilihat pada video https://www.youtube.com/watch?v=cOmQoyfORtg&t=34m30s



Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (6) arduino (23) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (46) digital (11) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (50) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (4) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (7) mqtt (3) ninmedia (4) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (86) pcb (2) power (1) praktek (2) project (33) proyek (1) python (5) radio (15) 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) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (166) television (28) transistor (2) troubleshoot (3) tulisan (90) tutorial (96) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika