5.Modbus Slave TCP

Pembuatan Modbus Slave TCP di sini menggunakan hardware NodeMCU atau ESP8266. NodeMCU dipilih karena harganya yang sangat murah, bahkan lebih murah daripada Arduino Uno, padahal kemampuannya menurut saya lebih baik dari Arduino Uno, dengan prosesor yang lebih cepat, dan bisa diprogram dengan software Arduino IDE, serta hal yang paling menarik adalah, NodeMCU memiliki koneksi Wi-Fi. 

Berikut ini langkah-langkah pembuatan Modbus Slave TCP (Modbus Server) menggunakan NodeMCU:
1. Sebelum memprogram NodeMCU, rekan-rekan perlu mengetahui kaki IO NodeMCU, yang dapat ditunjukkan sebagai berikut:

Gambar 1. Kaki IO NodeMCU

2. Dari gambar di atas, total ada 17 kaki IO digital NodeMCU, dengan 12 di antaranya merupakan kaki PWM (ditandai dengan simbol sinus di atas garis), yang dapat menghasilkan tegangan 0 - 3,3V. Terdapat juga sebuah kaki input analog (ADC0), dan 3 buah kaki sumber tegangan 3,3V serta sebuah kaki sumber tegangan 5V di VOUT.

3. Untuk menghemat penggunaan kaki IO NodeMCU, dan juga untuk memudahkan pengawatan rangkaian, maka dalam contoh pembuatan hardware Modbus Server di sini menggunakan modul LED&KEY, yang berisi 8 buah tombol, 8 buah LED dan 8 buah 7-segmen, seperti ditunjukkan pada gambar berikut ini. Modul LED&KEY ini menggunakan IC TM1638 yang membuat pengoperasian modul ini hanya membutuhkan 3 kaki IO NodeMCU saja. Dengan 3 kaki IO tersebut, kedelapan tombol dapat dibaca, juga kedelapan LED serta kedelapan 7-segmen dapat dikontrol. 

Gambar 2. Modul LED&KEY membutuhkan 3 kaki IO untuk kaki STB, CLK, DIO

4. Berikut ini contoh program dengan library modbus-esp8266 dan library TM1638plus, untuk membaca kondisi kedelapan tombol dan mengisikan datanya ke alamat Coil (00001 - 00008), dan mengendalikan kedelapan LED yang datanya ditempatkan di alamat Coil (00009 - 00016), serta menyalakan kedelapan 7-segmen yang datanya ditempatkan di alamat Holding Register (40001).

Catatan
Library modbus-esp8266 dapat diunduh di: https://github.com/emelianov/modbus-esp8266
Library TM1638plus dapat diunduh di: https://github.com/gavinlyonsrepo/TM1638plus.

  1. #include <ESP8266WiFi.h>
  2. #include <ModbusIP_ESP8266.h>
  3. #include <TM1638plus.h>
  4. ModbusIP mb;
  5. TM1638plus tm(D5, D6, D7, false);
  6. int alamat_keadaan = 0;  //Holding register 400001
  7. int alamat_s1 = 0;       //Coil 000001
  8. int alamat_s2 = 1;       //Coil 000002
  9. int alamat_s3 = 2;       //Coil 000003
  10. int alamat_s4 = 3;       //Coil 000004
  11. int alamat_s5 = 4;       //Coil 000005
  12. int alamat_s6 = 5;       //Coil 000006
  13. int alamat_s7 = 6;       //Coil 000007
  14. int alamat_s8 = 7;       //Coil 000008
  15. int alamat_led1 = 8;     //Coil 000009
  16. int alamat_led2 = 9;     //Coil 000010
  17. int alamat_led3 = 10;    //Coil 000011
  18. int alamat_led4 = 11;    //Coil 000012
  19. int alamat_led5 = 12;    //Coil 000013
  20. int alamat_led6 = 13;    //Coil 000014
  21. int alamat_led7 = 14;    //Coil 000015
  22. int alamat_led8 = 15;    //Coil 000016
  23. uint8_t tombol = 0;
  24. unsigned long waktusekarang = 0;
  25. void setup() {
  26.   Serial.begin(9600);
  27.   tm.displayBegin();
  28.   WiFi.begin("FALCONJR", "08251027");
  29.   while (WiFi.status() != WL_CONNECTED) {
  30.     delay(500);
  31.     Serial.print(".");
  32.   }
  33.   Serial.println("");
  34.   Serial.println("WiFi connected");
  35.   Serial.println("IP address: ");
  36.   Serial.println(WiFi.localIP());
  37.   mb.server();
  38.   mb.addCoil(alamat_s1);
  39.   mb.addCoil(alamat_s2);
  40.   mb.addCoil(alamat_s3);
  41.   mb.addCoil(alamat_s4);
  42.   mb.addCoil(alamat_s5);
  43.   mb.addCoil(alamat_s6);
  44.   mb.addCoil(alamat_s7);
  45.   mb.addCoil(alamat_s8);
  46.   mb.addCoil(alamat_led1);
  47.   mb.addCoil(alamat_led2);
  48.   mb.addCoil(alamat_led3);
  49.   mb.addCoil(alamat_led4);
  50.   mb.addCoil(alamat_led5);
  51.   mb.addCoil(alamat_led6);
  52.   mb.addCoil(alamat_led7);
  53.   mb.addCoil(alamat_led8);
  54.   mb.addHreg(alamat_keadaan);
  55.   delay(1000);
  56.   waktusekarang = millis();
  57.   tm.reset();
  58. }
  59. void loop() {
  60.   mb.task();
  61.   tombol = tm.readButtons();
  62.   switch (tombol) {
  63.     case 1:
  64.       mb.Coil(alamat_s1, 1);
  65.       break;
  66.     case 2:
  67.       mb.Coil(alamat_s2, 1);
  68.       break;
  69.     case 4:
  70.       mb.Coil(alamat_s3, 1);
  71.       break;
  72.     case 8:
  73.       mb.Coil(alamat_s4, 1);
  74.       break;
  75.     case 16:
  76.       mb.Coil(alamat_s5, 1);
  77.       break;
  78.     case 32:
  79.       mb.Coil(alamat_s6, 1);
  80.       break;
  81.     case 64:
  82.       mb.Coil(alamat_s7, 1);
  83.       break;
  84.     case 128:
  85.       mb.Coil(alamat_s8, 1);
  86.       tm.reset();
  87.       break;
  88.     default:
  89.       mb.Coil(alamat_s1, 0);
  90.       mb.Coil(alamat_s2, 0);
  91.       mb.Coil(alamat_s3, 0);
  92.       mb.Coil(alamat_s4, 0);
  93.       mb.Coil(alamat_s5, 0);
  94.       mb.Coil(alamat_s6, 0);
  95.       mb.Coil(alamat_s7, 0);
  96.       mb.Coil(alamat_s8, 0);
  97.       break;
  98.   }
  99.   if (millis() - waktusekarang > 100) {
  100.     waktusekarang = millis();
  101.     if(mb.Hreg(alamat_keadaan)>7) tm.reset();
  102.     else tm.displayASCII(mb.Hreg(alamat_keadaan), char(mb.Hreg(alamat_keadaan) + 48));
  103.     tm.setLED(0, mb.Coil(alamat_led1));
  104.     tm.setLED(1, mb.Coil(alamat_led2));
  105.     tm.setLED(2, mb.Coil(alamat_led3));
  106.     tm.setLED(3, mb.Coil(alamat_led4));
  107.     tm.setLED(4, mb.Coil(alamat_led5));
  108.     tm.setLED(5, mb.Coil(alamat_led6));
  109.     tm.setLED(6, mb.Coil(alamat_led7));
  110.     tm.setLED(7, mb.Coil(alamat_led8));
  111.   }
  112. } 

 

Keterangan program di atas:
  • Baris 1-3: memasukkan library modbus-esp8266 dan TM1638plus.
  • Baris 4-5: membuat objek modbus dan objek TM1638
  • Baris 6-22: menentukan alamat modbus yang digunakan, dimulai dari indeks 0
  • Baris 23-24: membuat variable untuk tombol dan waktu 
  • Baris 25-58: membuat instruksi di void setup yang hanya sekali berjalan di awal program, yang terdiri dari pengaturan komunikasi serial, hardware TM1638, dan Wi-Fi, apabila berhasil terhubung, tampilkan alamat IP yang digunakan oleh NodeMCU, dilanjutkan penambahan objek modbus dan alamat-alamatnya.
  • Baris 59-111: berisi program utama yang berjalan terus-menerus, yang dikhususkan untuk menjalankan protokol komunikasi modbus. Agar dapat berjalan di latar belakang, di program utama ini delay dihilangkan, sebagai gantinya menggunakan fungsi millis (timer), yang akan menjalankan program di dalamnya setiap 100 milidetik sekali. Program di dalam blok fungsi millis ini termasuk pembacaan tombol, yang apabila ditekan, maka data di alamat modbus untuk tombol tersebut akan bernilai 1, bila tidak ditekan akan bernilai 0. Di samping pembacaan tombol, baris 101 digunakan untuk menyalakan 8 buah 7 segmen berdasarkan isi data Holding Register (40001), dan baris 102-109 digunakan untuk menyalakan 8 buah LED berdasarkan isi data Coil di alamat 00008-00015.
  • Pada baris ke-28, ganti tulisan yang diwarnai merah dengan nama dan password hotspot Wi-Fi.

5. Unduh program Arduino di atas. Upload program tersebut ke NodeMCU. Untuk membuat program di atas dapat di-upload ke NodeMCU, rekan-rekan harus memilih Port dan Board yang benar. Port COM dapat dilihat dari port USB yang digunakan di daftar COM (jangan lupa untuk menghubungkan NodeMCU ke port USB komputer). Untuk Board, pilih esp8266, pilih NodeMCU 1.0 (ESP-12E Module). 

Catatan: Apabila pilihan esp8266 tidak muncul di pilihan Board, instal Board esp8266 ini dengan menggunakan Boards Manager. Namun sebelum membuka Board Manager, buka dulu Preferences yang ada di menu File. Di kolom Additional Boards Manager URLs, beri link berikut ini: https://arduino.esp8266.com/stable/package_esp8266com_index.json seperti terlihat pada Gambar 3. Setelah itu buka Boards Manager. Pada kolom pencarian, ketik esp8266, tekan Enter, maka akan muncul nama esp8266 beserta dengan keterangannya seperti terlihat pada Gambar 4. Tekan tombol install untuk menginstal ESP8266 Boards. 

Gambar 3. Isi https://arduino.esp8266.com/stable/package_esp8266com_index.json di kolom Additional Boards Manager URLs

Gambar 4. Buka Board Manager, cari esp8266, kemudian tekan tombol Install

6. Setelah Board esp8266 terinstal, pilih esp8266, kemudian pilih NodeMCU 1.0. Jangan lupa menginstal library modbus-esp8266 dan Library TM1638plus (link download ada di catatan di atas program). Setelah semua terinstal, upload program ke NodeMCU. 

7. Setelah upload selesai, muncul pesan Done Uploading, buka Serial Monitor. Seharusnya muncul alamat IP yang digunakan NodeMCU, seperti terlihat pada Gambar 5 berikut.

Gambar 5. Muncul alamat IP yang digunakan NodeMCU di Serial Monitor

8. Catat alamat IP yang muncul di Serial Monitor tersebut. Alamat IP tersebut akan menjadi alamat Slave atau alamat Server Modbus TCP, yang nantinya perlu diisikan di KEPServerEX. 

9. Berikutnya, buat pengawatan rangkaian NodeMCU dengan modul LED&KEY seperti Gambar 6. Hubungkan kaki VCC, GND, STB, CLK dan DIO modul LED&KEY secara berturut-turut ke kaki 3V, GND, D5, D6 dan D7 NodeMCU.

Gambar 6. Hubungkan D5, D6, D7 NodeMCU dengan STB, CLK, DIO modul LED&KEY (TM1638)

10. Berikutnya, buka program LabVIEW dan konfigurasi KEPServerEX yang sudah dibuat di bagian ke 4 (Modbus Master TCP). Apabila rekan-rekan belum membuatnya, rekan-rekan dapat mengunduh file program dan konfigurasi tersebut di sini:

11. Buka software KEPServerEX Configuration, dan kemudian buka file modbus tcp.opf yang ada di unduhan file langkah no. 10 di atas. Klik 2 kali pada Device1, kemudian ganti isi ID dengan IP NodeMCU, yang muncul di Serial Monitor, seperti terlihat pada Gambar 5 di atas. Klik OK.

Gambar 7. Buka KEPServerEX, buka modbus tcp.opf, klik 2 kali pada Device1, ganti isi ID dengan IP NodeMCU, yang dimunculkan di Serial Monitor, kemudian klik Apply, klik OK

12. Berikutnya, untuk mengetahui kualitas koneksi, klik tombol Quick Client di KEPServerEx, dan buka Channel1.Device1 di jendela Quick Client, pastikan kualitas koneksi dari ke-17 buah Tag bernilai Good, seperti terlihat pada Gambar 8 berikut ini:

Gambar 8. Kualitas koneksi ke-17 Tag di NodeMCU bernilai Good

Catatan: Apabila kualitas koneksi bernilai Bad, kemungkinan disebabkan 2 hal berikut ini:
  1. Kemungkinan pertama adalah waktu runtime sudah habis. Apabila rekan-rekan menggunakan software Demo, maka waktu runtime ini dibatasi hanya 2 jam. Agar bisa berjalan lagi, reset waktu runtime dengan membuka KEPServerEX Administration, hingga muncul icon KEPServerEX di System Tray. Klik kanan icon bersimbol ex tersebut, pilih Stop Runtime Service, kemudian dilanjutkan dengan Start Runtime Service. Pilih Yes untuk semua pertanyaan yang muncul. Tutup jendela Quick Client, kemudian tekan tombol QC untuk membuka jendela Quick Client yang baru, maka seharusnya kualitas koneksi sudah menjadi Good.
  2. Kemungkinan kedua adalah alamat IP Modbus Slave salah. Pastikan alamat IP yang ditulis di ID Device sudah sama dengan alamat IP yang muncul di Serial Monitor.

13. Apabila kualitas koneksi sudah bernilai Good, berikutnya jalankan program LabVIEW. Kemudian tekan tombol di Modul LED&KEY secara berurutan dari kiri ke kanan, dan perhatikan tampilan program LabVIEW, dan juga nilai ke-17 Tag di Quick Client. Gambar berikut ini menunjukkan tampilan ketiganya, ketika tombol pertama hingga kedelapan ditekan secara berurutan. 

(a). Saat awal

(b). Saat tombol pertama ditekan

(c). Saat tombol kedua ditekan

(d). Saat tombol ketiga ditekan

(e). Saat tombol keempat ditekan

(f). Saat tombol kelima ditekan

(g). Saat tombol keenam ditekan

(h). Saat tombol ketujuh ditekan

(i). Saat tombol kedelapan ditekan

Gambar 9. Tampilan program LabVIEW, Quick Client dan NodeMCU dengan Modul LED&kEY, saat tombol pertama hingga kedelapan ditekan secara berurutan

14. Agar lebih jelas, rekan-rekan dapat melihat video pembuatan Modbus Slave TCP dengan NodeMCU berikut ini:

Video pembuatan Modbus Slave TCP dengan NodeMCU dan Modul LED&KEY

15. Sampai di sini, pembuatan Modbus Slave TCP atau Modbus Server selesai. Di bagian ke-6 akan dijelaskan penggunaan HMI Modbus untuk mengontrol dan memonitor Modbus Server NodeMCU dari HP. Silahkan klik Tab 6. Penggunaan HMI Modbus.

No comments:

Post a Comment