Komunikasi Modbus TCP antara ESP32 dan Raspberry Pi

Tujuan Praktikum

  1. Memahami prinsip dasar komunikasi Modbus TCP.
  2. Mengimplementasikan komunikasi Modbus TCP antara ESP32 sebagai client dan Raspberry Pi sebagai server.
  3. Menguji pengiriman dan penerimaan data antara kedua perangkat.

modbus tcp raspberrypi-esp32

Dasar Teori Modbus adalah protokol komunikasi yang dikembangkan untuk menghubungkan perangkat dalam sistem otomasi industri. Modbus TCP adalah varian Modbus yang menggunakan protokol TCP/IP sebagai media transportasi, memungkinkan komunikasi melalui jaringan Ethernet atau Wi-Fi.

Ads Jadwal Training bisaioti Offline
NoMateriTanggalWaktuHargaLokasiViewAction
1IOT PLC SCADA Siemens7-8 Juni 202508.00 - 16.002000000SurabayaSilabusDaftar Sekarang
2IOT PLC SCADA Omron14 - 15 Juni 202508.00 - 16.002000000SurabayaSilabusDaftar Sekarang
3IOT PLC SCADA Schneider21-22 Juni 202508.00 -16.002000000SurabayaSilabusDaftar Sekarang
4IOT PLC SCADA Allen Bradley28-29 Juni 202508.00-16.002000000SurabayaSilabusDaftar Sekarang
  • Client dan Server: Dalam komunikasi Modbus, client adalah perangkat yang mengirimkan permintaan (request) untuk membaca atau menulis data, sementara server adalah perangkat yang merespons permintaan tersebut.
  • Register Modbus: Data dalam Modbus disimpan dalam empat jenis register:
    • Discrete Inputs: Register baca-saja untuk input digital.
    • Coils: Register baca/tulis untuk output digital.
    • Input Registers: Register baca-saja untuk input analog.
    • Holding Registers: Register baca/tulis untuk menyimpan data analog.
  • Keunggulan Modbus TCP: Modbus TCP mendukung konektivitas jarak jauh, integrasi dengan jaringan modern, dan penggunaan protokol standar seperti TCP/IP, yang membuatnya ideal untuk aplikasi IoT.

Pada praktikum ini, ESP32 akan bertindak sebagai Modbus client, mengirimkan permintaan untuk membaca data dari holding register yang dikelola oleh server Modbus pada Raspberry Pi.

Peralatan dan Bahan

  1. ESP32
  2. Raspberry Pi (disarankan Raspberry Pi 3 atau lebih baru)
  3. Kabel USB untuk ESP32
  4. Kabel LAN atau Wi-Fi
  5. Breadboard dan jumper (opsional, jika menggunakan sensor tambahan)
  6. Software: Arduino IDE, Python, dan pustaka terkait

Langkah-Langkah Praktikum

  1. Persiapan Perangkat
  1. Konfigurasi ESP32
    • Hubungkan ESP32 ke komputer menggunakan kabel USB.
    • Buka Arduino IDE.
    • Instal pustaka Modbus TCP untuk Arduino dengan langkah berikut:
      • Klik Sketch > Include Library > Manage Libraries.
      • Cari dan instal pustaka ModbusMaster.
    • Pilih board ESP32 dan port yang sesuai.
  2. Konfigurasi Raspberry Pi
    • Pastikan Raspberry Pi terhubung ke jaringan Wi-Fi atau LAN yang sama dengan ESP32.
    • Update sistem dengan perintah berikut di terminal:
sudo apt update && sudo apt upgrade
    • Instal pustaka Python untuk Modbus TCP:
sudo apt install python3

python3 --version

sudo apt install python3-pip

pip3 --version

Seeting  Virtual Environment

  • Buat Virtual Environment:
sudo apt install python3-venv

(Ganti myenv dengan nama direktori yang Anda inginkan.)

  • Membuat Direktori:
mkdir project && cd project
  • Membuat environment:
python3 -m venv myenv

note: nama myenv bisa anda ganti sesuai dengan nama yang diinginkan

  • Cara mengaktifkan virtual environment
source myenv/bin/activate
  • Untuk menonaktifkan virtual environment
deactivate
  1. Pemrograman ESP32
  1. Buat program untuk ESP32 agar berfungsi sebagai Modbus client.
  2. Contoh kode ESP32:
#include <WiFi.h>

#include <ModbusIP_ESP8266.h>

const int REG = 0;               // Modbus Hreg Offset

IPAddress IP_ModbusSERVER(192, 168, 69, 176);  // Address of Modbus Slave device

const int number_REG = 8;

uint8_t UNIT_ID = 1;

ModbusIP mbClient;

void setup() {

  Serial.begin(115200);

  WiFi.begin("bisaioti", "wasiswa123");  

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.println("WiFi connected");  

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

  mbClient.client();

}

uint16_t res[5];

void loop() {  

  if (mbClient.isConnected(IP_ModbusSERVER)) {  

    mbClient.readHreg(IP_ModbusSERVER, REG, res, number_REG,nullptr, UNIT_ID);  

    for (int i=REG+number_REG; i<=REG+number_REG+2; i++){

      uint16_t send_data =random(20,100) ;

      mbClient.writeHreg(IP_ModbusSERVER, i, send_data, nullptr, UNIT_ID);

      delay(500);

    }    

  } else {

    mbClient.connect(IP_ModbusSERVER);          

  }

  mbClient.task();                      

  delay(1000);                    

  for (int j=0; j<=number_REG-1; j++){

      Serial.print(res[j]);      

    }

  Serial.println();

}
    • Ubah ssid, password, dan IP address sesuai kebutuhan.
    • Upload program ke ESP32.
  1. Pemrograman Raspberry Pi
  • Buat script Python untuk Raspberry Pi agar berfungsi sebagai Modbus server.
  • Contoh script Python:
from pymodbus.server.sync import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
import logging

# Konfigurasi logging
logging.basicConfig(level=logging.INFO)

# Konfigurasi data awal untuk Holding Register (mulai alamat 0)
#random_values = [random.randint(0, 100) for _ in range(100)] # 100 register dengan nilai acak antara 0-100
#store = ModbusSequentialDataBlock(0, random_values)
store = ModbusSequentialDataBlock(0, [10]*100) # 100 register dengan nilai awal 10
slave_context = ModbusSlaveContext(hr=store, di=None, co=None, ir=None)
context = ModbusServerContext(slaves=slave_context, single=True)

# Identitas perangkat (opsional)
identity = ModbusDeviceIdentification()
identity.VendorName = 'MyCompany'
identity.ProductCode = 'MP001'
identity.VendorUrl = 'http://mycompany.com'
identity.ProductName = 'ModbusServer'
identity.ModelName = 'ModbusServer v1'
identity.MajorMinorRevision = '1.0'

# Jalankan server Modbus TCP di IP 192.168.69.176 dan port 502
if __name__ == "__main__":
print("Starting Modbus TCP Server on 192.168.69.176:502")
StartTcpServer(context, identity=identity, address=("192.168.69.176", 502))
  • Simpan script dengan nama modbus_server.py.
  • Jalankan script:
python modbus_server.py / sudo /home/wasiswa/project/myenv/bin/python3 modbus_server.py
  1. Pengujian
  1. Pastikan Raspberry Pi dan ESP32 berada di jaringan yang sama.
  2. Periksa log di serial monitor ESP32 untuk memastikan data diterima dari server.
  3. Modifikasi data yang dikirim oleh server Raspberry Pi dengan mengganti nilai di register holding di script Python:
store.setValues(3, 1, [25])

Jalankan ulang server untuk melihat perubahan.

  1. Dokumentasi dan Analisis
  1. Catat hasil pembacaan data dari ESP32.
  2. Analisis jika ada masalah koneksi atau kesalahan data.
  3. Diskusikan penggunaan Modbus TCP dalam sistem IoT.

Tugas Akhir Praktikum

  1. Ubah script sehingga ESP32 dapat menulis data ke server Modbus di Raspberry Pi.
  2. Tambahkan sensor pada ESP32 dan kirimkan datanya ke Raspberry Pi melalui Modbus TCP.

Referensi

  1. Dokumentasi pustaka ModbusMaster: https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
  2. Dokumentasi pymodbus: https://pymodbus.readthedocs.io

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Sekarang