Konfigurasi Modbus TCP Antara ESP32 (Server) dan Modbus Client (ModbusPoll) dengan Panduan Step-by-Step.


Pendahuluan

Modbus TCP adalah protokol komunikasi berbasis Ethernet yang banyak digunakan dalam sistem automasi industri dan IoT. Berbeda dengan Modbus RTU yang menggunakan port serial, Modbus TCP memanfaatkan jaringan TCP/IP untuk mengirimkan data. Dalam praktikum ini, Anda akan mempelajari cara mengkonfigurasi ESP32 sebagai Modbus Server dan berkomunikasi dengan software ModbusPoll sebagai Modbus Client.


Teori Dasar Modbus TCP

Konfigurasi Modbus TCP antara ESP32 server dan client

1. Apa Itu Modbus TCP?

Modbus TCP adalah varian Modbus yang berjalan di atas protokol TCP/IP. Protokol ini menggunakan port 502 sebagai default dan tidak memerlukan checksum seperti Modbus RTU karena keutuhan data sudah diperiksa oleh checksum pada lapisan TCP/IP.

2. Komponen Modbus TCP

  • Client: Mengirim permintaan (request) untuk membaca/menulis data (contoh: ModbusPoll, PLC).
  • Server: Merespons permintaan client dengan mengirimkan data (contoh: ESP32, sensor).

3. Keunggulan Modbus TCP

  • Kompatibel dengan jaringan LAN/Wi-Fi.
  • Mendukung komunikasi multi-device.
  • Cocok untuk aplikasi IoT berbasis ESP32/ESP8266.

Alat dan Bahan

  1. ESP32 (dengan kabel USB).
  2. Software ModbusPoll (Modbus Client: Download di sini).
  3. Arduino IDE (terinstall library modbus-esp8266 karya Alexander Emelianov, mendukung ESP8266 dan ESP32).
  4. Jaringan Wi-Fi (untuk koneksi ESP32 dan PC).
  5. Kabel jumper (opsional untuk sensor tambahan).

Langkah Praktikum

1. Instalasi Library Modbus pada Arduino IDE

  • Buka Arduino IDE, lalu instal library:
    Sketch > Include Library > Manage Libraries > Cari “modbus-esp8266”

2. Konfigurasi ESP32 sebagai Modbus Server

  • Sambungkan ESP32 ke PC via USB.
  • Upload kode berikut ke ESP32:
    #include <WiFi.h>
    
    #include <ModbusIP_ESP8266.h>
    
    // Konfigurasi WiFi
    
    const char* ssid = "NAMA_WIFI";     // Ganti dengan SSID Wi-Fi
    
    const char* password = "PASSWORD"; // Ganti dengan password Wi-Fi
    
    // Inisialisasi Modbus
    
    ModbusIP mb;  
    
    void setup() {
    
        Serial.begin(115200);
    
       
    
        // Koneksi ke WiFi
    
        WiFi.begin(ssid, password);
    
        Serial.print("Menghubungkan ke WiFi");
    
        while (WiFi.status() != WL_CONNECTED) {
    
            delay(500);
    
            Serial.print(".");
    
        }
    
        Serial.println("\nTerhubung!");
    
        Serial.print("ESP32 Modbus Server IP: ");
    
        Serial.println(WiFi.localIP());
    
        mb.server(); // mulai server Modbus TCP (port 502)
    
        // Tambahkan Holding Register (Alamat 0-9)
    
        for (int i = 0; i < 10; i++) {
    
            mb.addHreg(i);
    
        }
    
    }
    
    void loop() {
    
        mb.task();  // Proses komunikasi Modbus TCP
    
       
    
        // Simulasi perubahan data pada Holding Register
    
        for (int i = 0; i < 10; i++) {
    
            mb.Hreg(i, random(100, 1000));
    
        }
    
       
    
        delay(1000);
    
    }

3. Konfigurasi ModbusPoll sebagai Client

  1. Buka ModbusPoll.
  2. Klik File > New dan pilih TCP/IP.
  3. Isi parameter:
    • IP Address: Masukkan alamat IP ESP32 (lihat di Serial Monitor).
    • Port: 502.
    • Function: 03 (Read Holding Registers).
    • Address: 0.
    • Quantity: 10.
  4. Klik OK dan mulai polling dengan menekan F2.

4. Verifikasi Komunikasi

  • Jika berhasil, ModbusPoll akan menampilkan data acak dari ESP32 di jendela register.
  • Pantau log komunikasi di View > Communication Traffic.

Tugas dan Evaluasi

  1. Ubah Function Code ke 06 (Write Single Register) dan coba tulis nilai ke holding register pertama (notasi 40001, di ModbusPoll diisi Address 0).
  2. Jelaskan perbedaan respon antara Function 03 dan 06!
  3. Apa yang terjadi jika alamat IP ESP32 dan PC tidak dalam jaringan yang sama?
  4. modifikasi program supaya modbus bisa saling write and read

Analisis Error & Troubleshooting

  • Timeout: Pastikan ESP32 dan PC terhubung ke Wi-Fi yang sama.
  • Connection Refused: Cek firewall atau pastikan port 502 tidak diblokir.
  • Data Tidak Terbaca: Verifikasi alamat register dan konfigurasi library Modbus.

Kode yang Diperbarui: Server Tidak Diblok delay()

Pada kode di atas, delay(1000) di dalam loop() membuat mb.task() hanya diproses sekali per detik, sehingga ModbusPoll sering mengalami timeout. Selain itu, nilai register selalu ditimpa angka acak, sehingga nilai yang ditulis dari ModbusPoll (FC06) langsung hilang. Versi berikut memperbaiki keduanya: register 0–4 berisi data simulasi, register 5–9 bebas ditulis dari ModbusPoll.

#include <WiFi.h>
#include <ModbusIP_ESP8266.h>

const char* ssid = "NAMA_WIFI";
const char* password = "PASSWORD";

ModbusIP mb;
unsigned long tTerakhir = 0;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
  Serial.print("\nIP ESP32: ");
  Serial.println(WiFi.localIP());

  mb.server();                      // WAJIB: mulai mendengarkan di port 502
  for (int i = 0; i < 10; i++) mb.addHreg(i, 0);
  mb.addIreg(0, 0);                 // contoh input register untuk FC04
}

void loop() {
  mb.task();                        // dipanggil secepat mungkin, tanpa delay
  if (millis() - tTerakhir >= 1000) {
    tTerakhir = millis();
    for (int i = 0; i < 5; i++) mb.Hreg(i, random(100, 1000));
    mb.Ireg(0, analogRead(34));     // contoh: nilai ADC GPIO34
    Serial.printf("Hreg5 dari ModbusPoll = %d\n", mb.Hreg(5));
  }
}

Penulisan Alamat: 40001 atau 0?

Dokumentasi Modbus sering memakai notasi gaya Modicon: 40001 berarti holding register pertama, 30001 input register pertama. Di dalam paket data, alamat tersebut dikirim sebagai 0. Di ModbusPoll (pengaturan default, tidak memakai PLC addresses base 1), isi Address = 0 untuk register pertama, yang sama dengan mb.addHreg(0) di ESP32.

Function codeJenis dataNotasi ModiconFungsi di library
01 / 05Coil (bit baca/tulis)0xxxxaddCoil(), Coil()
02Discrete input (bit baca)1xxxxaddIsts(), Ists()
04Input register (baca)3xxxxaddIreg(), Ireg()
03 / 06 / 16Holding register (baca/tulis)4xxxxaddHreg(), Hreg()

Pembahasan Tugas

  • FC03 vs FC06: FC03 membaca satu blok register dan responsnya berisi nilai-nilai register; FC06 menulis satu register dan responsnya berupa “gema” (echo) alamat dan nilai yang ditulis sebagai konfirmasi.
  • Beda jaringan: jika PC dan ESP32 berada di subnet berbeda tanpa routing, koneksi TCP ke port 502 tidak pernah terbentuk dan ModbusPoll menampilkan Connection timeout.
  • Read dan write sekaligus: pakai kode yang diperbarui di atas; baca register 0–4 dengan FC03, tulis register 5–9 dengan FC06 atau FC16, lalu lihat nilainya di Serial Monitor.

ESP32 sebagai Modbus TCP Client

Library yang sama juga bisa membaca perangkat lain (mis. PLC atau ModbusPoll Slave). Intinya:

IPAddress server(192, 168, 1, 50);
uint16_t nilai[2];

// di loop():
if (!mb.isConnected(server)) {
  mb.connect(server);                    // port 502
} else {
  mb.readHreg(server, 0, nilai, 2);      // baca 2 holding register mulai alamat 0
}
mb.task();

Kesimpulan

Modbus TCP memungkinkan ESP32 berintegrasi dengan sistem industri berbasis Ethernet/Wi-Fi. Dengan library ModbusServer, ESP32 dapat berperan sebagai server yang efisien untuk aplikasi IoT seperti monitoring sensor atau kontrol perangkat.


FAQ (Pertanyaan Umum)

Q: Apa perbedaan Modbus TCP dan RTU?
A: Modbus RTU menggunakan port serial (RS485/RS232) dengan checksum CRC, sedangkan Modbus TCP menggunakan jaringan TCP/IP tanpa CRC Modbus (pemeriksaan error ditangani TCP).

Q: Bisakah ESP32 menjadi Modbus Client?
A: Ya, gunakan library ModbusClient dan konfigurasi alamat IP server.

Q: Bagaimana cara membaca input register di ESP32?
A: Tambahkan mb.addIreg(alamat) lalu isi nilainya dengan mb.Ireg(alamat, nilai) pada kode dan gunakan Function 04 di ModbusPoll.

Baca juga: ESP32: Panduan Komprehensif untuk Pemula hingga Ahli (IoT, Pemrograman, & Proyek) untuk memahami roadmap lengkap belajar ESP32 dari dasar hingga proyek IoT.

Related Articles

Tinggalkan Balasan

Chat Langsung dengan Kami
Staff bisaioti 1 — +62 823-3306-4821 E-Course, Offline Course, Hardware & Teknis IoT/OT Staff bisaioti 2 — +62 823-3306-4821 Training Korporat & Toko Hardware