Pengertian
Modbus adalah salah satu protokol serial yang dikembangkan oleh modicon (Sekarang Schneider Electric) dan dipublikasikan pada tahun 1974 untuk digunakan untuk Programmable Logic Controllers (PLC). Gampangnya, ini adalah metode yang digunakan untuk mengirimkan informasi antar alat elektronik atau instrument melalui serial. Protokol modbus ini digunkan secara luas karena kesederhanaannya dan robust atau kuat. Selain itu, protokol ini terbuka, bebas royalti, mudah untuk dikembangkan serta mudah dalam pemeliharaannya.
Struktur
Dalam perkembangannya, modbus dibagi menjadi dua. Ada modbus RTU dan satunya lagi adalah modbus TCP/IP
a) Modbus RTU
Modbus didefinisikan sebagai komunikasi antara mastter dan slave. Pesan yang dikirimkan mengikuti format seperti di bawah ini.
- Slave adderss bernilai 1 -255. Dalam satu sistem tidak bole ada nilai yang sama
- Crc 16 adalah 2 byte (16 bit) yang pasti ada pada modbus. MSB adalah Most Significat Byte dan LSB adalah Least Significant Byte. Kedua Byte tersebut digunkan sebagai mngecek error pengiriman. Byte ini menghitung setiap data yang dikirim dan diterima untuk memastikan tidak ada kesalahan yang terjadi selama pengiriman data.
b) Modbus TCP/IP
Pada sekitar tahun 1999, modbus RTU yang media transmisinya adalah TCP/IP dipublikasikan. Setelah peluncuran itu, banyak device yang menggunakan modbus TCP/IP, modbus RTU mulai ditinggalkan. Spesifikasi modbus tCP ini adalah menambahkan enam byte header di depan frame pesan modbus RTU standar. Crc 16 tidak dikenal lagi di modbus TCP/IP ini, karena TCP/IP sendiri merupakan protokol juga yang sudah mempunyai error correction sendiri. Defaultnya, modbus TCP/IP ini menggunakan port 502 TCP/IP
Di bawah ini rangkaian frame pesan modbus TCP/IP antara master dan slave
- Transaction ID adalah dua byte yang dicopy oleh slave untuk membalas pesan. Jika master sedang meminta banyak transaksi activ yang simultan, maka slave tidak akan pernah salah memberikan informasi.
- Protocol adalah dua byte yang harus diisi dengan nol
- Byte count adalah dua Byte data yang menghitung total Byte pesan setelahnya (Unit ID, Function Code dan data yang dikirmkan). Panjang dari Byte tersebut selalu kurang dari 256 dan Byte awal selalu bernilai nol.
- Satu Byte Unit ID ini seperti Slave Adderss kalau di modbus RTU.
Error Messages
Jika pesan yang dikirmkan oleh master bisa dimengerti oleh slave maka slave akan mengirmkan apa yang diminta oleh master. Tetapi jika salve mersepon tidak sesuai apa yang diminta master ada kemungkinan terjadi error. Misal jika pesan 01h dan dibalas 81h berarti ada error yang disampaikan. Beberapa pesan error sebagai berikut
- 01h Illegal Function, Slave tidak support function code yang diminta
- 02h Illegal data adderss, address yang diminta tidak valid atau tidak ada
- 03h Illegal data value
- 04h Slave device failure, Slave rusak
- 05h Menjawab, slave telah menerima request, tetapi masih memprosesnya
- 06h Slave device busy
- 07h Jawaban negativ
- 08h Memory Parity Error
Jika slave menerima request dari master tetapi crc tidak sesuai dan telah terjadi corrupt request, maka slave tidak merespon apapun dan master akan mengirimkan ulang requestnya.
Address (Reference Number)
Data dapat dibagi menjadi empat kategori
- Holding Coils. Data logic (true/false) format biner, bisa dibaca tapi tidak bisa ditulis ((0xxxxx)
- Input Coils. Data logic (true.flase) dapat dibaca tapi tidak bisa ditulis (1xxxxx)
- Holding Register Data. 16-bit data yang bisa dibaca dan ditulis (4xxxxx)
- Input Register Data. 16-bit data yang bisa dibaca tapi tidak bisa ditulis (3xxxxx)
Modbus Adderss (reference number) diexpresikan dengan bilangan decimal yang dimulai dari 1.
Detail Function Code
Pada frame di atas ada slot yang bernama function code. Untuk lebih jelasnya lihat tabel berikut
Funcion Code
|
Deskripsi
|
Format
|
1
|
Read Holding Coils
|
0xxxx
|
2
|
Read Input Coils
|
1xxxx
|
3
|
Read Holding Registers
|
4xxxx
|
4
|
Read Input Registers
|
3xxxx
|
5
|
Force Single Holding Coil
|
0xxxx
|
6
|
Preset Single Holding Register
|
4xxxx
|
15
|
Force Multiple Holding Coils
|
0xxxx
|
16
|
Preset Multiple Holding Register
|
4xxxx
|
a) Read Holding Coils
Function Code 1 digunakan untuk read holding coil. Format pesan ditampilkan seperti di bawah ini
Format pesan dari modbus master (hexadecimal)
- Slave adderss 0 tidak bisa. Slave Address anatar 1 -255
- Coil dimulai dari 0
- Modbus dapat mengirim 1-2000 coil dalam pesan standar
Format pesan balasan dari slave (hexadecimal)
- Byte count adalah binary antara 1-255
- Data dipacking holding data coil. Setiap data Byte bernilai delapan value holding coil. Least significant byte pertama berisi holding coil yang sama dengan coil awal ditambah satu. Jika jumlah coil bukan kelipatan delapan, maka data Byte terakhir berisi 0.
b) Read Input Coils
Function Code 2 digunakan untuk read input coil. Format pesannya seperti di bawah ini.
Format pesan dari modbus master (hexadecimal)
- Slave adderss 0 tidak bisa. Slave Address antara 1 - 255
- Modbus dapat mengirim 1-2000 coil dalam pesan standar
Format Balasan dari Slave (hexadecimal)
- Byte count adalah binary antara 1 - 250
- Data dipacking holding data coil. Setiap data Byte bernilai delapan value holding coil. Least significant byte pertama berisi holding coil yang sama dengan coil awal ditambah satu. Jika jumlah coil bukan kelipatan delapan, maka data Byte terakhir berisi 0.
c) Read Holding Registers
Function Code 3 digunakan untuk read holding register. Format pesannya seperti di bawah ini.
Format pesan dari modbus master (hexadecimal)
- Slave adderss 0 tidak bisa. Slave Address antara 1 - 255
- Modbus standar support 1 - 125 reguster pada transaksi tungal
Format Balasan dari Slave (hexadecimal)
- Byte count adalah angka biner genap dari 2 - 250. Byte count menghitung total byte pada pesan tanpa crc-16
d) Read Input Registers
Function Code 4 digunakan untuk read input register. Format pesannya seperti di bawah ini.
Format pesan dari modbus master (hexadecimal)
- Slave adderss 0 tidak bisa. Slave Address antara 1 - 255
- Modbus standar support 1 - 125 reguster pada transaksi tungal
Format Balasan dari Slave (hexadecimal)
- Byte count adalah angka biner genap dari 2 - 250. Byte count menghitung total byte pada pesan tanpa crc-16
e) Force Single Holding Coils
Function Code 5 digunakan untuk menulis (force) single holding coils. Format pesannya seperti di bawah ini.
Format pesan dari modbus master (hexadecimal)
- Slave address range antara 1 - 255. Slave akan merespon dengan menulis apa yang diminta ke coil milik slave
f) Preset Single Holding Registers
Function Code 6 digunakan untuk write single holding registers. Format pesannya seperti di bawah ini.
Format pesan dari modbus master (hexadecimal)
- Slave address range antara 1 - 255. Slave akan merespon dengan menulis apa yang diminta ke register milik slave
g) Force Multiple Holding Coils
Function Code 15 digunakan untuk menulis banyak holding coil. Format pesannya seperti di bawah ini.
Format pesan dari modbus master (hexadecimal)
- Slave address range antara 1 - 255. Slave akan merespon dengan menulis apa yang diminta ke coil milik slave
- Walaupun protokol mengijinkan untuk menulis 1 - 2000 coil, implementasinya kurang dari 2000 coil
h) Preset Multiple Holding Registers
Function Code 16 digunakan untuk menulis banyak holding register. Format pesannya seperti di bawah ini.
Format pesan dari modbus master (hexadecimal)
- Slave address range antara 1 - 255. Slave akan merespon dengan menulis apa yang diminta ke coil milik slave
- Walaupun protokol mengijinkan untuk menulis 1 - 2000 coil, implementasinya kurang dari 2000 coil