Daftar Isi:
=========================================================================================
- Aksesibilitas: Arduino IoT Cloud memungkinkan akses ke Outseal dari berbagai perangkat, seperti smartphone, tablet, atau komputer. Ini memberikan kemudahan dan kenyamanan dalam mengakses data Outseal.
- Pemantauan dan kontrol jarak jauh: Arduino IoT Cloud memungkinkan kita untuk memantau dan mengontrol Outseal dari jarak jauh, dari mana saja dan kapan saja, asalkan terhubung ke internet. Ini memberikan fleksibilitas dalam mengelola sistem dengan Outseal di dalamnya.
- Integrasi dengan berbagai perangkat: Arduino IoT Cloud dapat diintegrasikan dengan berbagai perangkat, seperti sensor dan perangkat lainnya. Ini dapat membantu kita dalam membuat sistem yang lebih terintegrasi dan efektif.
- Biaya yang gratis untuk banyak perangkat: Arduino IoT Cloud versi gratis bisa digunakan untuk memantau dan mengontrol banyak Outseal PLC, karena semua Outseal bisa terhubung dengan protokol Modbus RTU (secara riil bisa 30 Outseal).
- Mudah digunakan: Arduino IoT Cloud memiliki antarmuka yang mudah digunakan, sehingga memudahkan penggunaan dan mengurangi waktu yang dibutuhkan untuk mempelajari kode program.
- Pemrograman Outseal sebagai Modbus Slave
- Pembuatan Variabel Cloud di Arduino IoT Cloud dan Pemrograman NodeMCU
- Pembuatan Dashboard di Arduino IoT Cloud
- Pembuatan rangkaian Outseal Nano dengan NodeMCU
=========================================================================================
1. Pemrograman Outseal Nano sebagai Modbus Slave
- Untuk tipe Coil, program Ladder Diagram pada Gambar 4 di atas menggunakan 8 buah variabel Relay (R.1 - R.8) dan 16 buah variabel Binary (B.1 - B.16). Tipe variabel Relay dimulai dari alamat 0, sedangkan variabel Binary dimulai dari alamat 128.
- Untuk tipe Input Diskrit, program Ladder Diagram pada Gambar 4 di atas menggunakan 8 buah variabel Switch (S.1 - S.8).
- Untuk tipe Input Register, program Ladder Diagram pada Gambar 4 di atas, menggunakan 2 buah variabel Analog (A.1 dan A.2).
- Untuk tipe Holding Register, program Ladder Diagram pada Gambar 4 di atas menggunakan 4 buah variabel Integer (I.1 - I.4).
- Variabel tipe Switch (S.1 - S.8) adalah kaki Input Digital Outseal Nano. Variabel ini hanya bisa dibaca (Read Only).
- Variabel tipe Relay (R.1 - R.8) adalah kaki Output Digital Outseal Nano. Variabel ini hanya bisa dibaca (Read Only).
- Variabel tipe Analog (A.1 - A.2) adalah kaki Input Analog Outseal Nano. Variabel ini hanya bisa dibaca (Read Only).
- Variabel tipe Binary merupakan memori internal 1 bit Outseal Nano. Variabel ini bisa dibaca dan ditulis (Read & Write).
- Variabel tipe Integer merupakan memori internal 16 bit Outseal Nano. Variabel ini bisa dibaca dan ditulis (Read & Write).
=========================================================================================
2. Pembuatan Variabel Cloud dan Pemrograman NodeMCU
Variable |
Tipe Variable |
Permission |
Update |
data1 |
int (Basic | Integer Number) |
Read &
Write |
On Change |
data2 |
int (Basic | Integer Number) |
Read & Write |
On Change |
data3 |
int (Basic | Integer Number) |
Read &
Write |
On Change |
kirim |
bool (Basic | Boolean) |
Read & Write |
On Change |
out1 |
String
(Basic | Character String) |
Read &
Write |
On Change |
Tabel Keterangan Fungsi Variabel
Variable | Digunakan untuk |
data1 | Variabel data1 ini bertipe Integer. Karena jumlah widget yang diperbolehkan untuk versi gratis hanya 5, maka terpaksa dilakukan penggabungan. Jadi variabel data1 ini digunakan untuk menampung 2 buah data, yaitu no. ID Slave dan kode fungsi. No ID Slave ini mengikuti Alamat Modbus (slave address) yang diisikan di jendela Settings di Outseal Studio. Untuk Kode fungsi, rekan-rekan bisa melihat pada tabel di bawah ini. |
data2 | Variabel data2 ini bertipe Integer, digunakan untuk menampung alamat awal yang akan dibaca/ditulis |
data3 | Variabel data3 ini bertipe Integer, digunakan untuk menampung 1 dari 2 jenis data, mengikuti kode fungsi. Apabila kode fungsinya baca (1-4), maka data3 ini berisi jumlah data yang akan dibaca. Apabila kode fungsinya tulis (5-6), maka data3 ini berisi nilai yang akan ditulis. |
kirim | Variabel kirim ini bertipe Boolean, digunakan untuk mengirimkan data ke Outseal. |
out1 | Variabel out1 ini bertipe String. Dengan tipe String, banyak data bisa di-inputkan, dan juga ditampilkan. Variabel out1 ini bisa digunakan untuk menampung dan memasukkan data1, data2, data3, sekaligus mengirimkannya ke Outseal. Di samping itu, variabel out1 ini juga bisa digunakan untuk menampilkan data yang diterima dari Outseal. |
Tabel Kode Fungsi
Kode | Digunakan untuk | Data yang diperlukan |
1 | Baca Coil (bisa lebih dari 1) | Alamat awal dan banyaknya data yang dibaca |
2 | Baca Input Diskrit (bisa lebih dari 1) | Alamat awal dan banyaknya data yang dibaca |
3 | Baca Holding Register (bisa lebih dari 1) | Alamat awal dan banyaknya data yang dibaca |
4 | Baca Input Register (bisa lebih dari 1) | Alamat awal dan banyaknya data yang dibaca |
5 | Tulis/ubah data 1 Coil | Alamat dan nilai yang akan dituliskan |
6 | Tulis/ubah data 1 Holding Register | Alamat dan nilai yang akan dituliskan |
15 | Tulis/ubah data banyak Coil | Alamat awal dan nilai-nilai yang dituliskan |
16 | Tulis/ubah data banyak Holding Register | Alamat awal dan nilai-nilai yang dituliskan |
Catatan: untuk kode fungsi 15 dan 16, penulisan data ke banyak Coil dan banyak Holding Register, untuk saat ini, belum diimplementasikan. Dalam waktu ke depan, semoga bisa diimplementasikan.
- data1 = 11 (menggabungkan no ID Slave 1 dengan kode fungsi 1)
- data2 = 0
- data3 = 8
- data1 = 22 (menggabungkan no ID Slave 2 dengan kode fungsi 2)
- data2 = 0
- data3 = 8
- data1 = 13 (menggabungkan no ID Slave 1 dengan kode fungsi 3)
- data2 = 0
- data3 = 4
- data1 = 24 (menggabungkan no ID Slave 2 dengan kode fungsi 4)
- data2 = 0
- data3 = 2
- data1 = 15 (menggabungkan no ID Slave 1 dengan kode fungsi 5)
- data2 = 136
- data3 = 1
- data1 = 26 (menggabungkan no ID Slave 2 dengan kode fungsi 6)
- data2 = 1
- data3 = 123
- out1 = 1,1,0,8
- out1 = 2,2,0,8
- out1 = 1,3,0,4
- out1 = 2,4,0,2
- out1 = 1,5,136,1
- out1 = 2,6,1,123
- #include "arduino_secrets.h"
- #include "thingProperties.h"
- #include <ModbusRTU.h>
- #include <SoftwareSerial.h>
- SoftwareSerial S(D1, D2);
- ModbusRTU mb;
- String out2 = "";
- String inputString = "";
- bool stringComplete = false;
- bool case1 = false;
- bool case2 = false;
- bool case3 = false;
- bool case4 = false;
- bool coil[20];
- bool idis[20];
- uint16_t hreg[10];
- uint16_t ireg[10];
- void setup() {
- Serial.begin(9600);
- S.begin(9600, SWSERIAL_8N1);
- mb.begin(&S);
- mb.master();
- delay(1500);
- initProperties();
- ArduinoCloud.begin(ArduinoIoTPreferredConnection);
- setDebugMessageLevel(2);
- ArduinoCloud.printDebugInfo();
- }
- void loop() {
- ArduinoCloud.update();
- if (stringComplete) {
- String d1 = getValue(inputString, ',', 0);
- String d2 = getValue(inputString, ',', 1);
- String d3 = getValue(inputString, ',', 2);
- String d4 = getValue(inputString, ',', 3);
- uint8_t id = d1.toInt();
- uint8_t kode = d2.toInt();
- uint16_t alamat = d3.toInt();
- uint16_t nilai = d4.toInt();
- switch (kode) {
- case 1:
- mb.readCoil(id, alamat, coil, nilai);
- case1 = true;
- break;
- case 2:
- mb.readIsts(id, alamat, idis, nilai);
- case2 = true;
- break;
- case 3:
- mb.readHreg(id, alamat, hreg, nilai);
- case3 = true;
- break;
- case 4:
- mb.readIreg(id, alamat, ireg, nilai);
- case4 = true;
- break;
- case 5:
- mb.writeCoil(id, alamat, nilai > 0);
- break;
- case 6:
- mb.writeHreg(id, alamat, nilai);
- break;
- }
- while (mb.slave()) {
- mb.task();
- delay(10);
- }
- if (case1) {
- Serial.print("= ");
- for (int i = 0; i < nilai; i++) {
- Serial.print(coil[i]);
- out2 = out2 + String(coil[i]);
- }
- Serial.println();
- out1 = "= " + out2;
- case1 = false;
- }
- if (case2) {
- Serial.print("= ");
- for (int i = 0; i < nilai; i++) {
- Serial.print(idis[i]);
- out2 = out2 + String(idis[i]);
- }
- Serial.println();
- out1 = "= " + out2;
- case2 = false;
- }
- if (case3) {
- Serial.print("= ");
- for (int i = 0; i < (nilai - 1); i++) {
- Serial.print(hreg[i]);
- Serial.print(',');
- if (i == 0) out2 = String(hreg[i]);
- else out2 = out2 + "," + String(hreg[i]);
- }
- Serial.println(hreg[nilai - 1]);
- out1 = "= " + out2 + "," + String(hreg[nilai - 1]);
- case3 = false;
- }
- if (case4) {
- Serial.print("= ");
- for (int i = 0; i < (nilai - 1); i++) {
- Serial.print(ireg[i]);
- Serial.print(',');
- if (i == 0) out2 = String(ireg[i]);
- else out2 = out2 + "," + String(ireg[i]);
- }
- Serial.println(ireg[nilai - 1]);
- out1 = "= " + out2 + "," + String(ireg[nilai - 1]);
- case4 = false;
- }
- out2 = "";
- inputString = "";
- stringComplete = false;
- }
- yield();
- }
- void onData1Change() {
- }
- void onData2Change() {
- }
- void onData3Change() {
- }
- void onKirimChange() {
- if (kirim) {
- inputString = String(data1 / 10) + "," + String(data1 % 10);
- inputString = inputString + "," + String(data2) + "," + String(data3);
- stringComplete = true;
- out1 = "> " + inputString;
- }
- }
- void onOut1Change() {
- inputString = out1;
- stringComplete = true;
- }
- void serialEvent() {
- while (Serial.available()) {
- char inChar = (char)Serial.read();
- inputString += inChar;
- if (inChar == 13) {
- stringComplete = true;
- Serial.print("> ");
- Serial.println(inputString);
- }
- }
- }
- String getValue(String data, char separator, int index) {
- int found = 0;
- int strIndex[] = { 0, -1 };
- int maxIndex = data.length() - 1;
- for (int i = 0; i <= maxIndex && found <= index; i++) {
- if (data.charAt(i) == separator || i == maxIndex) {
- found++;
- strIndex[0] = strIndex[1] + 1;
- strIndex[1] = (i == maxIndex) ? i + 1 : i;
- }
- }
- return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
- }
- ArduinoIoTCloud (versi 1.8.0)
- Arduino_ConnectionHandler (versi 0.7.1)
- Arduino_DebugUtils-master
- ArduinoMqttClient-master
- modbus-esp8266
=========================================================================================
3. Pembuatan Dashboard
=========================================================================================
4. Pembuatan Rangkaian Outseal Nano dengan NodeMCU
=========================================================================================
Gambar 19. Data1=15 (slave 1, kode fungsi 5 = tulis coil), data2=136, data3=0, karena Modul Relay Aktif Low, ketika diberi 0, Relay1 yg terhubung dengan B.9 (alamat 136) = ON
Gambar 20. Data1=15 (slave 1, kode fungsi 5 = tulis coil), data2=143, data3=0, karena Modul Relay Aktif Low, ketika diberi 0, Relay8 yang terhubung dengan B.16 (alamat 143) = ON
Gambar 21. Data1=11 (slave 1, kode fungsi 1 = baca coil), data2=0, data3=8, instruksi ini berarti baca nilai R.1 - R.8, yang hasilnya = 01111110
Gambar 22. Widget Messenger diisi dengan data = 1,2,0,8, instruksi ini berarti baca nilai S.1 - S.8, yang terhubung dengan Dip Switch 8 jalur, diperoleh hasilnya = 01110001
Gambar 24. Widget Messenger diisi data = 1,4,0,4, yang merupakan instruksi baca Input Register dimulai dari alamat 0 sebanyak 4 data, maka hasilnya muncul 69,69,0,0
Gambar 25. Putar kedua potensio, kembali isi Widget Messenger dengan data = 1,4,0,4, maka hasilnya muncul 1020,123,0,0.
Gambar 26. Putar kedua potensio, kembali isi Widget Messenger dengan data = 1,4,0,4, maka hasilnya muncul 583,392,0,0.
Gambar 27. Isi Widget Messenger dengan data = 1,3,0,4, yang merupakan instruksi untuk membaca Holding Register, dimulai dari alamat 0 sebanyak 4 data, maka hasilnya muncul 1234,5678,1234,5678.
Gambar 28. Selain dari Widget Messenger, kode instruksi bisa juga diinputkan dari Serial Monitor. Di Serial Monitor, ketik data 1,2,0,8, yang merupakan instruksi untuk membaca Input Diskrit dari alamat 0 sebanyak 8 data, yaitu variabel S.1 - S.8, maka muncul hasilnya 01010101, di mana nilai ini sesuai dengan posisi ke-8 Switch.
Gambar 29. Untuk menunjukkan bahwa kontrol dari Dashboard Arduino IoT Cloud tidak hanya untuk 1 Outseal, tetapi bisa lebih dari 1 Outseal, maka di sini disimulasikan dengan software Proteus. Ketika widget Messenger diisi dengan data 1,5,136,1, maka LED pertama di Slave1 menyala.
Gambar 30. Ketika Widget Messenger diisi data 1,5,140,1, maka LED kelima di Slave1 menyala.
Gambar 31. Ketika Widget Messenger diisi data 1,1,0,8, maka muncul hasil pembacaan status kedelapan LED (R.1 - R.8) di Widget Messenger = 10001000, dan Virtual Terminal juga menampilkan nilai 10001000
Gambar 32. Ketika Widget Messenger diisi data 1,2,0,8, maka muncul hasil pembacaan status kedelapan tombol (S.1 - S.8) di Widget Messenger = 11010111, dan Virtual Terminal juga menampilkan nilai 11010111
Gambar 33. Ketika Widget Messenger diisi data 2,5,141,1, maka LED keenam di Slave2 menyala.
Gambar 34. Ketika Widget Messenger diisi data 2,5,143,1, maka LED kedelapan di Slave2 menyala.
Gambar 35. Ketika Widget Messenger diisi data 2,1,0,8, maka muncul hasil pembacaan nilai kedelapan LED di Slave2 = 00000101, yang juga ditampilkan di Virtual Terminal
Gambar 36. Ketika Widget Messenger diisi data 2,2,0,8, maka muncul hasil pembacaan status kedelapan tombol di Slave2 = 10101011, yang juga ditampilkan di Virtual Terminal
Gambar 37. Ketika Widget Messenger diisi data 1,4,0,4, maka muncul hasil pembacaan 4 buah data Input Register (termasuk nilai kedua potensio) di Slave1 = 952,768,0,0, yang juga ditampilkan di Virtual Terminal
Gambar 38. Ketika Widget Messenger diisi data 2,4,0,4, maka muncul hasil pembacaan 4 buah data Input Register (termasuk nilai kedua potensio) di Slave2 = 748,758,0,0, yang juga ditampilkan di Virtual Terminal
Gambar 39. Secara berturut-turut, isi Widget Messenger dengan data 1,6,0,987, yang dilanjutkan dengan data 1,6,1,654, dan kemudian data 1,3,0,4, maka akan muncul hasil pembacaan 4 buah data di Holding Register Slave1, dengan data dimulai dari alamat 0, yaitu = 987,654,987,654, yang juga ditampilkan di Virtual Terminal.
Gambar 40. Secara berturut-turut, isi Widget Messenger dengan data 2,6,0,123, yang dilanjutkan dengan data 2,6,1,567, dan kemudian data 2,3,0,4, maka akan muncul hasil pembacaan 4 buah data di Holding Register Slave2, dengan data dimulai dari alamat 0, yaitu = 123,567,123,567, yang juga ditampilkan di Virtual Terminal.
No comments:
Post a Comment