3. Kirim Terima Serial

Setelah di halaman sebelumnya, kita membuat Serial Monitor hanya bekerja menampilkan data, maka di halaman ini, kita membuat agar Serial Monitor bisa digunakan untuk mengirimkan data. Dengan memasukkan dan mengirimkan data lewat Serial Monitor, memudahkan kita untuk mendapatkan lebih banyak informasi dan memungkinkan lebih banyak kontrol dibandingkan dengan alat input lainnya. 

Agar berkaitan dengan tema blog ini, yaitu "berkawan" dengan Outseal, maka di sini akan ditunjukkan bagaimana membuat ke-6 hal berikut ini (Kirim & Terima) dengan Serial Monitor: 
  1. Meminta (baca) data Coil Outseal dari Serial Monitor
  2. Meminta (baca) data Input Diskrit Outseal dari Serial Monitor
  3. Meminta (baca) data Input Register Outseal dari Serial Monitor
  4. Meminta (baca) data Holding Register Outseal dari Serial Monitor
  5. Mengubah (tulis) data Coil Outseal dari Serial Monitor
  6. Mengubah (tulis) data Holding Register Outseal dari Serial Monitor
Untuk bisa melakukan ke-6 hal di atas, berikut ini hal-hal yang perlu diketahui:

1. Format Permintaan Data

Seperti telah dituliskan di halaman sebelumnya, ada 4 data yang diperlukan dalam komunikasi dengan protokol Modbus, yaitu:
  1. No ID Slave
  2. Kode fungsi
  3. Alamat awal data
  4. Jumlah data/Nilai data
Sedangkan kode fungsi yang diperlukan dapat dilihat dari tabel berikut ini:

Tabel 1. Kode Fungsi

Catatan:
Untuk data no. 4, apabila kode fungsinya 1 - 4, maka isinya adalah jumlah data yang akan dibaca. Apabila kode fungsinya 5 - 16, maka isinya adalah nilai data yang akan dituliskan.

2. Rangkaian Simulasi

Agar bisa menunjukkan hasilnya, dan memudahkan pembuatannya, maka saya menggunakan software Proteus, dengan rangkaian seperti gambar berikut, yang dapat digunakan untuk men-simulasikan ke-6 hal di atas.

Gambar 1. Rangkaian untuk penerapan 6 hal dalam Kirim Terima Serial menggunakan sambungan RS485 antara Master (Arduino Nano) dengan 2 Slave (Outseal Nano dan Outseal Mega)

Catatan Perbaikan Gambar Skematik: kaki T.12 di Outseal Mega seharusnya tidak terhubung ke kaki PE6 (8), tetapi harusnya terhubung ke kaki PG0 (33), hal itu yang menyebabkan mengapa ketika Switch T12 ditekan, tidak membuat output LED U12 menyala.

File Proteus gambar rangkaian di atas dapat diunduh di bagian bawah dari halaman ini.

3. Contoh Program

Program di sini hanya sebagai contoh, karena tentunya ada banyak alternatif program untuk membuat ke-6 hal di atas. Silahkan rekan-rekan bisa memberikan masukan, komentar atau kritik atas contoh program yang ada di halaman ini. 

3.1 Contoh Ladder Diagram Outseal Nano (Slave 1)

Berikut ini contoh Ladder Diagram untuk Outseal Nano sebagai Slave1, yang dapat digunakan untuk menunjukkan penerapan dari ke-6 hal di atas. Jangan lupa sebelum menekan tombol Test (kompilasi program),  atur di jendela Settings: Hardware = Nano V5, Baudrate = 9600, Alamat Modbus (ID Slave) = 1. Ladder Diagram Outseal Nano ini dapat diunduh di bagian bawah dari halaman ini.
.
Gambar 2. Ladder Diagram Outseal Nano, Settings = Nano V5, Baudrate = 9600, Alamat modbus = 1 

3.2 Contoh Ladder Diagram Outseal Mega (Slave 2)

Berikut ini contoh Ladder Diagram untuk Outseal Mega sebagai Slave2, yang dapat digunakan untuk menunjukkan penerapan dari ke-6 hal di atas. Jangan lupa sebelum menekan tombol Test (kompilasi program),  atur di jendela Settings: Hardware = Mega V3, Baudrate = 9600, Alamat Modbus (ID Slave) = 2. Ladder Diagram Outseal Mega ini dapat diunduh di bagian bawah dari halaman ini.

Gambar 3. Ladder Diagram Outseal Mega, Settings = Mega V3, Baudrate = 9600, Alamat modbus = 2

3.3 Contoh Program Arduino Nano (Master)

Berikut ini contoh program Arduino Nano sebagai Master. Program Arduino ini dapat diunduh di bagian bawah dari halaman ini. Agar program Arduino ini bisa dikompilasi (Verify atau Compile), jangan lupa untuk memasang library modbus-esp8266. Library modbus-esp8266 ini dapat diunduh di link ini: https://github.com/emelianov/modbus-esp8266/archive/refs/heads/master.zip. File library modbus ini juga saya lampirkan bersama dengan kode program Arduino, dan juga Ladder Diagram, serta file Proteus, di lampiran yang ada di bagian bawah materi ini.
  1. #include <ModbusRTU.h>
  2. #include <SoftwareSerial.h>
  3. SoftwareSerial S(2, 3);
  4. ModbusRTU mb;
  5. String inputString = "";
  6. bool stringComplete = false;
  7. bool case1 = false;
  8. bool case2 = false;
  9. bool case3 = false;
  10. bool case4 = false;
  11. bool case5 = false;
  12. bool case6 = false;
  13. bool coil[20];
  14. bool idis[20];
  15. uint16_t hreg[10];
  16. uint16_t ireg[10];
  17. void setup() {
  18.   Serial.begin(9600);
  19.   S.begin(9600);
  20.   mb.begin(&S);
  21.   mb.master();
  22.   mb.readCoil(1, 0, coil, 8);  //hanya untuk trigger
  23.   while (mb.slave()) {
  24.     mb.task();
  25.     delay(10);
  26.   }
  27.   delay(1000);
  28.   Serial.println("Silahkan ketik data");
  29.   Serial.print("> ");
  30. }
  31. void loop() {
  32.   if (stringComplete) {
  33.     String d1 = getValue(inputString, ',', 0);
  34.     String d2 = getValue(inputString, ',', 1);
  35.     String d3 = getValue(inputString, ',', 2);
  36.     String d4 = getValue(inputString, ',', 3);
  37.     uint8_t id = d1.toInt();
  38.     uint8_t kode = d2.toInt();
  39.     uint16_t alamat = d3.toInt();
  40.     uint16_t nilai = d4.toInt();
  41.     switch (kode) {
  42.       case 1:
  43.         mb.readCoil(id, alamat, coil, nilai);
  44.         case1 = true;
  45.         break;
  46.       case 2:
  47.         mb.readIsts(id, alamat, idis, nilai);
  48.         case2 = true;
  49.         break;
  50.       case 3:
  51.         mb.readHreg(id, alamat, hreg, nilai);
  52.         case3 = true;
  53.         break;
  54.       case 4:
  55.         mb.readIreg(id, alamat, ireg, nilai);
  56.         case4 = true;
  57.         break;
  58.       case 5:
  59.         mb.writeCoil(id, alamat, nilai > 0);
  60.         case5 = true;
  61.         break;
  62.       case 6:
  63.         mb.writeHreg(id, alamat, nilai);
  64.         case6 = true;
  65.         break;
  66.     }
  67.     while (mb.slave()) {
  68.       mb.task();
  69.       delay(10);
  70.     }
  71.     if (case1) {
  72.       Serial.print("= ");
  73.       for (int i = 0; i < nilai; i++) {
  74.         Serial.print(coil[i]);
  75.       }
  76.       Serial.println();
  77.       case1 = false;
  78.     }
  79.     if (case2) {
  80.       Serial.print("= ");
  81.       for (int i = 0; i < nilai; i++) {
  82.         Serial.print(idis[i]);
  83.       }
  84.       Serial.println();
  85.       case2 = false;
  86.     }
  87.     if (case3) {
  88.       Serial.print("= ");
  89.       for (int i = 0; i < (nilai - 1); i++) {
  90.         Serial.print(hreg[i]);
  91.         Serial.print(',');
  92.       }
  93.       Serial.println(hreg[nilai - 1]);
  94.       case3 = false;
  95.     }
  96.     if (case4) {
  97.       Serial.print("= ");
  98.       for (int i = 0; i < (nilai - 1); i++) {
  99.         Serial.print(ireg[i]);
  100.         Serial.print(',');
  101.       }
  102.       Serial.println(ireg[nilai - 1]);
  103.       case4 = false;
  104.     }
  105.     if (case5) {
  106.       mb.readCoil(id, alamat, coil, 1);
  107.       while (mb.slave()) {
  108.         mb.task();
  109.         delay(10);
  110.       }
  111.       Serial.print("= ");
  112.       Serial.println(coil[0]);
  113.       case5 = false;
  114.     }
  115.     if (case6) {
  116.       mb.readHreg(id, alamat, hreg, 1);
  117.       while (mb.slave()) {
  118.         mb.task();
  119.         delay(10);
  120.       }
  121.       Serial.print("= ");
  122.       Serial.println(hreg[0]);
  123.       case6 = false;
  124.     }
  125.     inputString = "";
  126.     stringComplete = false;
  127.     Serial.print("> ");
  128.   }
  129. }
  130. void serialEvent() {
  131.   while (Serial.available()) {
  132.     char inChar = (char)Serial.read();
  133.     inputString += inChar;
  134.     if (inChar == 13) {
  135.       stringComplete = true;
  136.     }
  137.   }
  138. }
  139. String getValue(String data, char separator, int index) {
  140.   int found = 0;
  141.   int strIndex[] = { 0, -1 };
  142.   int maxIndex = data.length() - 1;
  143.   for (int i = 0; i <= maxIndex && found <= index; i++) {
  144.     if (data.charAt(i) == separator || i == maxIndex) {
  145.       found++;
  146.       strIndex[0] = strIndex[1] + 1;
  147.       strIndex[1] = (i == maxIndex) ? i + 1 : i;
  148.     }
  149.   }
  150.   return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
  151. }

4. Penerapan Program

Setelah rangkaian sudah tersusun, dan masing-masing kode program sudah dimasukkan ke Outseal Nano, Outseal Mega dan Arduino Nano, maka langkah terakhir adalah menjalankan simulasi Proteus. Agar simulasi bisa berjalan dengan baik, ada 3 hal yang perlu dilakukan:
  1. Tekan tombol Run di Proteus.
  2. Tunggu hingga Virtual Terminal menampilkan tulisan "Silahkan ketik data".
  3. Setelah tulisan tersebut muncul, agar apa yang diketik bisa muncul di Serial Monitor, klik/centang pilihan "Echo Typed Characters", seperti ditunjukkan pada gambar berikut.

Gambar 4. Jalankan simulasi, tunggu hingga muncul "Silahkan ketik data", kemudian klik kanan Virtual Terminal tersebut, centang pada pilihan "Echo Typed Characters" 

Berikut ini berturut-turut penerapan simulasi pada ke-6 hal di atas.

1. Meminta data Coil dari Serial Monitor 

Dengan berdasarkan format permintaan data di atas, maka untuk membaca data Coil yang ada di Outseal Nano dengan ID Slave = 1, di alamat mulai dari 0, sebanyak 8 data (variabel R.1 - R.8), kode permintaannya bisa ditulis di Serial Monitor:

1,1,0,8 (diikuti Enter)

Berikut ini hasil simulasi di Proteus:

Gambar 5. Hasil penerapan permintaan data Coil Outseal Nano dari Serial Monitor


Berikutnya untuk membaca data Coil yang ada di Outseal Mega dengan ID Slave = 2, di alamat mulai dari 0, sebanyak 16 data (variabel R.1 - R.16), kode permintaannya bisa ditulis:

2,1,0,16 (diikuti Enter)

Berikut ini hasil simulasi di Proteus:

Gambar 6. Hasil penerapan permintaan data Coil Outseal Mega dari Serial Monitor

2. Meminta data Input Diskrit dari Serial Monitor 

Dengan berdasarkan format permintaan data di atas, maka untuk membaca data Input Diskrit yang ada di Outseal Nano dengan ID Slave = 1, di alamat mulai dari 0, sebanyak 8 data (variabel S.1 - S.8), kode permintaannya bisa ditulis:

1,2,0,8

Berikut ini hasil simulasi di Proteus:

Gambar 7. Hasil penerapan permintaan data Input Diskrit Outseal Nano dari Serial Monitor

Berikutnya untuk membaca data Input Diskrit yang ada di Outseal Mega dengan ID Slave = 2, di alamat mulai dari 0, sebanyak 16 data (variabel S.1 - S.16), kode permintaannya bisa ditulis:

2,2,0,16

Berikut ini hasil simulasi di Proteus:

Gambar 8. Hasil penerapan permintaan data Input Diskrit Outseal Mega dari Serial Monitor

3. Meminta data Input Register dari Serial Monitor 

Dengan berdasarkan format permintaan data di atas, maka untuk membaca data Input Register yang ada di Outseal Nano dengan ID Slave = 1, di alamat mulai dari 0, sebanyak 2 data (variabel A.1 - A.2), kode permintaannya bisa ditulis:

1,4,0,2

Berikut ini hasil simulasi di Proteus:

Gambar 9. Hasil penerapan permintaan data Input Register Outseal Nano dari Serial Monitor

Berikutnya untuk membaca data Input Register yang ada di Outseal Mega dengan ID Slave = 2, di alamat mulai dari 0, sebanyak 2 data (variabel A.1 - A.2), kode permintaannya bisa ditulis:

2,4,0,2

Berikut ini hasil simulasi di Proteus:

Gambar 10. Hasil penerapan permintaan data Input Register Outseal Mega dari Serial Monitor

4. Meminta data Holding Register dari Serial Monitor 

Dengan berdasarkan format permintaan data di atas, maka untuk membaca data Holding Register yang ada di Outseal Nano dengan ID Slave = 1, di alamat mulai dari 0, sebanyak 8 data (variabel I.1 - I.2), kode permintaannya bisa ditulis:

1,3,0,2

Berikut ini hasil simulasi di Proteus:

Gambar 11. Hasil penerapan permintaan data Holding Register Outseal Nano dari Serial Monitor

Berikutnya untuk membaca data Holding Register yang ada di Outseal Mega dengan ID Slave = 2, di alamat mulai dari 0, sebanyak 16 data (variabel I.1 - I.2), kode permintaannya bisa ditulis:

2,3,0,2

Berikut ini hasil simulasi di Proteus:

Gambar 12. Hasil penerapan permintaan data Holding Register Outseal Mega dari Serial Monitor


5. Menulis sebuah data Coil dari Serial Monitor 

Dengan berdasarkan format permintaan data di atas, maka untuk menulis sebuah data Coil dari Serial Monitor ke Outseal Nano dengan ID Slave = 1, di alamat 128 (variabel B.1), dengan nilai data = 1, kode permintaannya bisa ditulis:

1,5,128,1

Berikut ini hasil simulasi di Proteus:

Gambar 13. Hasil penerapan permintaan pengubahan sebuah data Coil Outseal Nano dari Serial Monitor

Berikutnya untuk menulis sebuah data Coil dari Serial Monitor ke Outseal Mega dengan ID Slave = 2, di alamat 128 (variabel B.1), dengan nilai data = 1, kode permintaannya bisa ditulis:

2,5,128,1

Berikut ini hasil simulasi di Proteus:

Gambar 14. Hasil penerapan permintaan pengubahan sebuah data Coil Outseal Mega dari Serial Monitor

6. Menulis sebuah data Holding Register dari Serial Monitor 

Dengan berdasarkan format permintaan data di atas, maka untuk menulis sebuah data Holding Register dari Serial Monitor ke Outseal Nano dengan ID Slave = 1, di alamat 0 (variabel I.1), dengan nilai data = 1000, kode permintaannya bisa ditulis:

1,6,0,1000

Berikut ini hasil simulasi di Proteus:

Gambar 15. Hasil penerapan permintaan pengubahan sebuah data Holding Register Outseal Nano dari Serial Monitor

Berikutnya untuk menulis sebuah data Holding Register dari Serial Monitor ke Outseal Mega dengan ID Slave = 2, di alamat 0 (variabel I.1), dengan nilai data = 1000, kode permintaannya bisa ditulis:

2,6,0,1000

Berikut ini hasil simulasi di Proteus:

Gambar 16. Hasil penerapan permintaan pengubahan sebuah data Holding Register Outseal Mega dari Serial Monitor

Catatan:
Untuk penulisan data Coil dan Holding Register yang lebih dari 1 data, untuk sementara ini belum bisa saya tunjukkan. Semoga dalam waktu ke depan bisa segera saya tambahkan.

Untuk memudahkan rekan-rekan dalam mempelajari materi di halaman ini, rekan-rekan bisa mengunduh semua file yang diperlukan dalam pembuatan aplikasi di halaman ini, termasuk file rangkaian Proteus, Ladder Diagram Outseal Nano, Outseal Mega dan kode program Arduino di link berikut ini: 

Agar lebih jelas, berikut ini video pembuatan tampilan data Outseal di Serial Monitor yang dibuat mengikuti materi di halaman ini. 

Video pembuatan pengiriman data dari Serial Monitor

Catatan Perbaikan Gambar Skematik: kaki T.12 di Outseal Mega seharusnya tidak terhubung ke kaki PE6 (8), tetapi harusnya terhubung ke kaki PG0 (33), hal itu yang menyebabkan mengapa ketika Switch T12 ditekan, tidak membuat output LED U12 menyala.

2 comments: