Membaca Nilai Input Register pada Modbus RTU Menggunakan Raspberry Pi Pico W dan MicroPython
Dasar Teori:
- Modbus RTU:
Modbus adalah protokol komunikasi yang sering digunakan dalam industri untuk menghubungkan berbagai perangkat seperti PLC, sensor, dan aktuator. Modbus RTU (Remote Terminal Unit) adalah varian dari protokol Modbus yang berjalan di atas serial RS-485 atau RS-232. RTU menggunakan representasi biner yang lebih efisien dibandingkan Modbus ASCII, sehingga umum digunakan untuk aplikasi industri.
Modbus bekerja dengan model master-slave, di mana master (misalnya Raspberry Pi Pico W) mengirimkan permintaan ke satu atau lebih slave (misalnya sensor atau perangkat pengukuran) yang merespon dengan data atau melakukan tindakan. Dalam Modbus, ada berbagai tipe register:
- Input Register (Read-only): Register ini digunakan untuk membaca data seperti pengukuran dari perangkat slave.
- Holding Register (Read/Write): Digunakan untuk membaca atau menulis data kontrol atau konfigurasi.
- Raspberry Pi Pico W:
Raspberry Pi Pico W adalah versi dari Raspberry Pi Pico dengan dukungan konektivitas Wi-Fi. Pico W menggunakan mikroprosesor dual-core ARM Cortex-M0+ dan sangat cocok untuk aplikasi berbasis IoT. Dengan mengkombinasikan Raspberry Pi Pico W dengan Modbus RTU, kita bisa membaca nilai dari perangkat industri seperti sensor atau PLC melalui komunikasi serial.
- MicroPython:
MicroPython adalah implementasi dari bahasa pemrograman Python untuk mikrokontroler seperti Raspberry Pi Pico W. MicroPython memungkinkan pengguna untuk menulis kode Python yang ringan dan efisien, sehingga ideal untuk perangkat berdaya rendah dan aplikasi dengan resource terbatas.
Tujuan:
- Memahami cara kerja protokol Modbus RTU.
- Mengimplementasikan komunikasi Modbus RTU menggunakan Raspberry Pi Pico W dan MicroPython.
- Membaca nilai Input Register dari perangkat slave Modbus menggunakan Raspberry Pi Pico W.
Alat dan Bahan:
- Raspberry Pi Pico W
- Modbuspoll Slave
- Modbus RTU-to-USB Converter (jika menggunakan perangkat Modbus RS-485)
- Kabel jumper dan breadboard (untuk koneksi perangkat keras)
- Visual Studio Code (untuk coding MicroPython)
- Library pymodbus (untuk implementasi Modbus RTU)
Langkah-Langkah:
- Persiapan Raspberry Pi Pico W
- Install MicroPython di Raspberry Pi Pico W.
- Install Library Modbus pada Raspberry Pi Pico W.
- Buka Thonny IDE dan ketik perintah berikut di terminal untuk menginstal pustaka Modbus yang kompatibel:
micropython-modbus
- Koneksi Perangkat Modbus ke Raspberry Pi Pico W
- Jika perangkat slave menggunakan RS-485, gunakan Modbus RTU-to-USB Converter. Sambungkan converter ke Pico W melalui pin UART.
- Untuk koneksi fisik:
- TX dari converter ke RX pada Raspberry Pi Pico W.
- RX dari converter ke TX pada Raspberry Pi Pico W.
- GND dari converter ke GND pada Raspberry Pi Pico W.
- Program Membaca Input Register dengan Modbus RTU
Buat program MicroPython untuk membaca nilai input register dari perangkat slave Modbus.
import time from machine import Pin, UART from umodbus.serial import Serial as ModbusRTUMaster # Define the pins for Modbus communication rtu_pins = (Pin(0), Pin(1)) # Define the starting address to read from starting_address = 0 # Define the quantity of registers to read qty = 3 # Initialize Modbus RTU Master host = ModbusRTUMaster(baudrate=9600, data_bits=8, stop_bits=1, parity=None, pins=rtu_pins, ctrl_pin=None, uart_id=0) # Continuous reading loop while True: try: print('INPUT REGISTER request test.') print('Reading qty={} from starting address {}:'.format(qty, starting_address)) # Read input registers from the slave device values = host.read_input_registers(slave_addr=1, starting_addr=starting_address, register_qty=qty, signed=False) # Print the result print('Result: {}'.format(values)) except Exception as e: print('An error occurred:', e) # Wait for 5 seconds before the next reading time.sleep(5)
- Run dan Debug:
- Jalankan kode di Thonny IDE dan perhatikan output di konsol. Jika perangkat slave terhubung dengan benar, Anda akan melihat data yang dikirim dari perangkat melalui Modbus RTU.
Berikut penjelasan bagian-bagian dari program diatas:
- Import Libraries:
import time from machine import Pin, UART from umodbus.serial import Serial as ModbusRTUMaster
-
- time: Digunakan untuk memberi jeda antar proses pembacaan data.
- machine.Pin: Untuk mengatur pin GPIO pada Raspberry Pi Pico W.
- machine.UART: Digunakan untuk menginisialisasi komunikasi UART.
- umodbus.serial.Serial: Library untuk membuat master Modbus RTU.
- Definisi Pin Komunikasi Modbus:
rtu_pins = (Pin(0), Pin(1))
-
- Pin GPIO 0 dan GPIO 1 digunakan sebagai jalur komunikasi UART untuk komunikasi Modbus RTU.
- Definisi Alamat dan Jumlah Register:
starting_address = 0 qty = 3
-
- starting_address: Alamat register pertama yang akan dibaca dari perangkat slave (mulai dari 0).
- qty: Jumlah register yang akan dibaca dari slave (dalam hal ini 3 register).
- Inisialisasi Master Modbus RTU:
host = ModbusRTUMaster(baudrate=9600, data_bits=8, stop_bits=1, parity=None, pins=rtu_pins, ctrl_pin=None, uart_id=0)
-
- ModbusRTUMaster: Menginisialisasi master Modbus RTU dengan konfigurasi baudrate 9600, 8 data bits, 1 stop bit, tanpa parity, dan menggunakan UART 0 pada Raspberry Pi Pico.
- pins=rtu_pins: Mendefinisikan pin GPIO untuk jalur komunikasi UART.
- ctrl_pin=None: Tidak ada pin kontrol tambahan untuk aliran komunikasi.
- Loop Pembacaan Terus Menerus:
while True: try: print('INPUT REGISTER request test.') print('Reading qty={} from starting address {}:'.format(qty, starting_address))
-
- Program masuk ke dalam loop yang berjalan terus-menerus untuk membaca data dari slave Modbus secara periodik.
- Pembacaan Input Register dari Slave:
values = host.read_input_registers(slave_addr=1, starting_addr=starting_address, register_qty=qty, signed=False)
-
- read_input_registers(): Fungsi ini membaca input register dari perangkat slave dengan alamat slave_addr=1.
- starting_addr=starting_address: Alamat awal register yang dibaca.
- register_qty=qty: Jumlah register yang dibaca (3 register dalam hal ini).
- signed=False: Data register dibaca sebagai unsigned integer.
- Penanganan Error:
except Exception as e: print('An error occurred:', e)
-
- Jika terjadi kesalahan saat membaca register, pesan error akan dicetak di konsol.
- Jeda 5 Detik:
time.sleep(5)
-
- Setelah melakukan pembacaan data, program akan menunggu selama 5 detik sebelum melakukan pembacaan ulang.
Hasil yang Diharapkan:
- Raspberry Pi Pico W berhasil berkomunikasi dengan perangkat Modbus RTU melalui protokol serial.
- Data dari Input Register perangkat slave terbaca di Raspberry Pi Pico W dan ditampilkan di konsol Thonny IDE.
Kesimpulan:
Dalam jobsheet ini, Anda telah mempelajari bagaimana membaca Input Register menggunakan protokol Modbus RTU pada Raspberry Pi Pico W dengan MicroPython. Protokol Modbus RTU memungkinkan komunikasi yang andal antara perangkat slave dan master dalam lingkungan industri, dan dengan menggunakan Raspberry Pi Pico W, Anda dapat memantau atau mengontrol perangkat industri melalui komunikasi serial RS-485 atau RS-232.