Anda di halaman 1dari 11

1.

Modbus
Modbus merupakan sebuah protokol komunikasi serial yang digunakan untuk membentuk suatu bentuk
komunikasi antara client-server maupun master-slave antara perangkat pintar. Perangkat pintar disini
mempunyai artian perangkat yang digunakan dalam suatu industri, seperti peralatan control. Modbus
pertama kali dikembangkan oleh modicon, namun sekarang modbus dapat dipergunakan secara terbuka dan
menjadi standart komunikasi serial antar devices pada suatu industri. Seiring dengan perkembangan
modbus, banyak vendor-vendor yang memiliki ribuan devices telah menggunakan modbus sebagai media
transfer discrete/analog I/O dan register data antara control devices. Modbus dapat digunakan untuk
melakukan monitoring dan programming pada suatu devices yang digunakan sebagai media komunikasi
antara intelligent devices dan field devices dengan menggunakan PC maupun HMI. Berikut ini merupakan
hal-hal yang membuat Modbus menjadi populer sebagai protokol komunikasi kontrol pada industri:
Dikembangkan berdasar kebutuhan industri
Open source
Mudah di implementasi dan perawatannya
Memindahkan bit-bit maupun words tanpa memberatkan sisi vendor


Gambar 4.1 Modbus Layer

1.1. Modbus Register Map
Register pada Modbus berkaitan dengan function codes dari protokol modbus itu sendiri. Karena
perkembangan PLC yang semakin kompleks akhirnya munculah I/O range dari 16 bit register . dan
pembagian dari register itu dimualai dari 00001 10000 untuk read/write discrete output yang
disebut sebagai coils. Sedangkan discrete input dimulai dari 10001 20000, selanjutanya 30001
40000 digunakan sebagai analong input register, dan tidak ada pembatasan untuk register diatas
40001. Untuk lebih jelasnya silahkan peerhatikan gambar 4.2.

Gambar 4.2 Modbus Regiter Map Secara Umum

Sedangkan organisasi data pada modbus yaitu terdiri dari memory dan juga register tempat dari input
discrete, coils, input registers,dan juga holding registers berada.

Gambar 4.3 Organsisasi Data Pada Modbus

1.2. Modbus Function Codes
Function code berguna untuk mendefinisikan jenis Message dan jenis respon yang harus dilakukan
oleh slave, contohnya untuk membaca isi data dari sebuah kumpulan register, untuk mendiagnosa
status dari slave, dan lain sebagainya. Parameter ini mengandung satu byte informasi. Pada
Modbus/ASCII parameter ini menjadi dua karakter hexadesimal, tetapi pada Modbus/RTU hanya
digunakan satu byte. Function code yang digunakan secara umum pada device Modbus mempunyai
jangkauan antara 1 sampai dengan 255, tetapi tidak semua code akan digunakan pada modul dan
beberapa code disiapkan untuk kebutuhan yang akan datang. Ketika slave dari Modbus merespon,
slave ini pasti akan menggunakan Function code yang sama seperti yang diminta dari master dimana
untuk menunjukkan sebuah respon normal atau telah terjadi kesalahan (error). Akan tetapi, ketika
terjadi kesalahan (error), maka bit paling tinggi (MSB-most significant bit) dari Function code akan
menyala (bernilai logik 1), sedangkan jika slave/device merespon tanpa error, maka slave tersebut
akan mengembalikan sama seperti code yang dikirim. Hal ini sangat berguna dimana master dapat
melihat perbedaan antara respon yang sukses dan yang gagal. Perintah Report Slave ID dan Reset
Slave tidak dioperasikan pada peta register


Gambar 4.4 Data Access Function Codes
Pada mulanya coil merupakan jenis data yang digunakan untuk mengaktifkan coil relay. Nilai jenis
data ini ON atau OFF. Coil mempunyai panjang 16 bit, sehingga untuk mengaktifkan (ON) dengan
cara memberi nilai FF00H dan 0000H untuk OFF. Data FF00 dan 00 disimpan di register 00000
sampai 09999. Sedangkan Holding register digunakan untuk menyimpan nilai dgn range 0~65535.
Register ini mempunyai alamat register 40001 sampai 49999

Setelah memahami istilah- istilah yang ada pada modbus, untuk menggunakan fungsi-fungsi tersebut
master harus memberikan instruksi yang jelas pada slave dengan menyebutkan function code-nya
seperti yang ada pada gambar 4.5.

Gambar 4.5 Register Map dan Function Codes yang Digunakan

1.2.1. Read Coil Status
Perintah ini berguna untuk membaca status ON/OFF output diskrit atau coil pada slave. Mode
pengalaman broadcast tidak dapat digunakan hanya menggunakan struktur query untuk satu
device/slave dalam suatu waktu. Fuction Code digunakan untuk membaca 1 sampai dengan
2000 status coil pada slave. Permintaan PDU (Protocol Data Unit) menetapkan alamat awal,
contohnaya alamat pada coil pertama ditetapkan. Pada PDU, coil mulai dialamatkan dari 0. Oleh
karena itu, coil dengan nomor 1-16 dialamatkan pada 0-15. Coils pada message respon
dipaketkan sebagai satu coil tiap bit data. Status ditandai dengan 1 untuk ON dan 0 untuk OFF.
LSB pada byte data pertama berisi alamat output pada query. Coils yang lain mengikuti secara
berurutan menuju ke tujuan akhir yang paling tinggi dari urutan bawah ke urutan yang paling
tinggi pada byte-byte yang berurutan. Jika output dikembalikan bukan merupakan kelipatan 8,
maka sisa bit pada byte data akan diisi dengan nilai 0 (nol).
Ketika menerima sebuah message dalam fungsi 01, maka slave akan mengumpulkan semua nilai
output yang dibutuhkan dan menyusun sebuah message jawaban. Panjang dari message ini
tergantung dari besaran nilai yang harus dikembalikan. Pada umumnya, ketika N diminta, maka
sejumlah ((N+7)MOD 8) byte hatus tersimpan
Table 4.1 Request Read Coil Status
Function Code 1 Byte 0x01
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Coils 2 Bytes 1 to 2000 (0x7D0)
Table 4.2 Response Read Coil Status
Function Code 1 Byte 0x01
Starting Address 1 Byte N*
Coil Status n Byte N atau N+1
*N = jumlah output / 8, jika sisanya beda 0 N = N+1
Table 4.3 Error Read Coil Status
Function Code 1 Byte Function Code + 0x80
Exception Code 1 Byte 01 atau 02 atau 03 atau 04

Table 4.5 Contoh Request dan Respon Read Discrete Outputs 20 38
Request Response
Field Name Hex Field Name Hex
Function 01 Function 01
Starting Address Hi 00 Byte Count 03
Starting Address Lo 13 Output Status 27-20 CD
Quantity of Outputs Hi 00 Output Status 25-28 6B
Quantity of Outputs Lo 13 Output Status 38-36 05

1.2.2. Read Discrete Input
Pembacaan nilai input dengan Modbus sama saja dengan pembacaan pada status coil.
Perbedaanya hanya terletak pada fungsi 02 yang diguanakan mode pengalamatan broadcast tidak
dapat digunakan, hanya dapat menggunakan struktur query untuk satu device/slave dalam suatu
waktu. Jumlah dari input-input harus diletakkan dalam data-field dari pernyataan message.
Setelah menerima message dengan fungsi 02, slave meletakkan input yang diminta pada struktur
message dan mengirim kembali ke master Modbus.panjang dari message bergantung pada jumlah
nilai input yang dikembalikan.
Table 4.6 Request Read Discrete Input
Function Code 1 Byte 0x01
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Inputs 2 Bytes 1 to 2000 (0x7D0)
Table 4.7 Response Read Discrete Input
Function Code 1 Byte 0x02
Byte Count 1 Byte N*
Input Status N* x 1 Byte
*N = jumlah output / 8, jika sisanya beda 0 N = N+1
Table 4.8 Error Read Discrete Input
Error Code 1 Byte 0x82
Exception Code 1 Byte 01 atau 02 atau 03 atau 04

Table 4.9 Contoh Request dan Response Read Discrete Input 197 218
Request Response
Field Name Hex Field Name Hex
Function 02 Function 02
Starting Address Hi 00 Byte Count 03
Starting Address Lo C4 Inputs Status 27-20 AC
Quantity of Inputs Hi 00 Inputs Status 25-28 DB
Quantity of Inputs Lo 16 Inputs Status 38-36 35

1.2.3. Read Holding Register
Function code ini digunakan untuk membaca isi dari blok register pada device. Permintaan PDU
menetapkan awal, contohnya alamat pada coil pertama ditetapkan. Pada PDU, coil mulai
dialamtakan dari 0. Oleh karena itu, coil dengan nomor 1-16 dialamatkan pad 0-15. Data register
pada message respon dipaketkan sebagai dua byte tiap register dengan isi biner rata kanan pada
setiap byte. Untuk setiap register, byte pertama mengandung urutan byte yang tinggi dan byte
kedua mengandung byte yang rendah.
Table 4.10 Request Read Holding Register
Function Code 1 Byte 0x03
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Registers 2 Bytes 1 to 2000 (0x7D0)
Table 4.7 Response Read Holding Register
Function Code 1 Byte 0x02
Byte Count 1 Byte 2 x N*
Register Value N* x 2 Bytes
*N = jumlah Register
Table 4.11 Error Read Holding Register
Error Code 1 Byte 0x83
Exception Code 1 Byte 01 atau 02 atau 03 atau 04

Table 4.12 Contoh Request dan Response Read Holding Register 108 110
Request Response
Field Name Hex Field Name Hex
Function 03 Function 03
Starting Address Hi 00 Byte Count 06
Starting Address Lo 6B Register Value Hi (108) 02
No. of Registers Hi 00 Register Value Lo (108) 2B
No. of Registers Lo 03 Register Value Hi (109) 00
Register Value Lo (109) 00
Register Value Hi (110) 00
Register Value Lo (110) 64

Sebagai contoh, isi register 108 ditunjukkan sebagai nilai 2 byte dari 02 2B dalam bilangan
HEX atau 555 dalam desimal. Sedangakan isi register 109-110 adalah 00 00 dan 00 64 dalam
HEX atau 0 dan 100 dalam desimal. Function code 01-03 memiliki struktur query dan struktur
jawaban yang sama.
Table 4.13 Struktur Query
Byte Value Keterangan
1 1..247 Slave Device Address
2 3 Function Code
3 0..255 Starting Adresss, Hi
4 0..255 Starting Address, Lo
5 0..255 Number of Registers, Hi
6 0..255 Number of Registers, Lo
7(..8) LRC/CRC Error Check Value

Table 4.14 Jawaban
Byte Value Keterangan
1 1..247 Slave Device Address
2 1 Function Code
3 0..255 Number of Data Bytes N
4..N+3 0..255 Bit Pattern of Coil Status
7(..8) LRC/CRC Error Check Value

1.2.4. Read Input Register
Function code ini digunakan untuk membaca dari 1 sampai 125 register input pada sebuah
device. PDU yang diminta menetapkan alamat coil untuk ditekan. Coils tersebut dimulai dari
nol. Oleh karena itu, register input mempunyai nomor 1-16 dialamatkan 0-15. Data register pada
Response Message dipaketkan menjadi dua byte tiap register dengan isi biner rata kanan pada
setiap byte. Untuk setiap register, byte pertama mengandung urutan bit yang tinggi dan byte
kedua mengandung urutan
Table 4.15 Request Read Input Register
Function Code 1 Byte 0x04
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Inputs Registers 2 Bytes 1 to 2000 (0x007D)
Table 4.16 Response Read Input Register
Function Code 1 Byte 0x04
Byte Count 1 Byte 2 x N*
Input Registers N* x 2 Bytes
*N = jumlah Register
Table 4.17 Error Read Input Register
Error Code 1 Byte 0x84
Exception Code 1 Byte 01 atau 02 atau 03 atau 04

Table 4.18 Contoh Request dan Response Read Input Register
Request Response
Field Name Hex Field Name Hex
Function 04 Function 04
Starting Address Hi 00 Byte Count 02
Starting Address Lo 08 Input Register 9, Hi 00
Quantity of Inputs Hi 00 Input Register 9, Lo 0A
Quantity of Inputs Lo 01

1.2.5. Write Single Coil
Function code ini digunakan untuk menulis output tunggal ke ON/OFF pada device. Keadaan
ON/OFF yang diminta ditetapkan oleh data request yang tetap. Nilai FF00 hexadesimal
meminta output pada posisi ON. Nilai 0000 Hexadesimal meminta pada posisi OFF. Semua nilai
yang lain tidak akan mempengaruhi output. PDU yang diminta menetapkan alamat coil untuk
ditekan. Coils tersebut dimulai dari nol. Oleh karena itu, coil nomor 1 dialamatkan sebagai 0.
Keadaan ON/OFF yang diminta ditetapkan oleh permintaan nilai coil yang tetap. Nilai 0xFF00
meminta coil untuk ON. Nilai 0x0000 meminta coil OFF. Semua nilai yang lain tidak akan
mempengaruhi coil.
Table 4.19 Request Write Single Coil
Function Code 1 Byte 0x05
Output Address 2 Bytes 0x0000 to 0xFFFF
Output Value 2 Bytes 0x0000 to 0xFF00
Table 4.20 Response Write Single Coil
Function Code 1 Byte 0x05
Output Address 2 Bytes 0x0000 to 0xFFFF
Output Value 2 Bytes 0x0000 to 0xFF00
Table 4.21 Error Write Single Coil
Error Code 1 Byte 0x85
Exception Code 1 Byte 01 atau 02 atau 03 atau 04

Table 4.22 Contoh Request dan Response Write Single Coil 173 ON
Request Response
Field Name Hex Field Name Hex
Function 05 Function 05
Output Address Hi 00 Output Address Hi 00
Output Address Lo AC Output Address Lo AC
Output Value Hi FF Output Value Hi FF
Output Value Lo 00 Output Value Lo 00

1.2.6. Write Single Register
Function code ini digunakan untuk sebuah single holding register pada device. PDU yang
diminta menetapkan alamat coil untuk ditekan. Coils tersebut dimulai dari nol. Oleh karena itu,
coil nomor 1 dialamatkan sebagai 0.
Table 4.23 Request Write Single Register
Function Code 1 Byte 0x06
Register Address 2 Bytes 0x0000 to 0xFFFF
Register Value 2 Bytes 0x0000 to 0xFFFF
Table 4.24 Response Write Single Register
Function Code 1 Byte 0x05
Register Address 2 Bytes 0x0000 to 0xFFFF
Register Value 2 Bytes 0x0000 to 0xFFFF
Table 4.25 Error Write Single Register
Error Code 1 Byte 0x86
Exception Code 1 Byte 01 atau 02 atau 03 atau 04

Table 4.26 Contoh Request dan Write Single Coil 173 ON
Request Response
Field Name Hex Field Name Hex
Function 06 Function 06
Register Address Hi 00 Register Address Hi 00
Register Address Lo 01 Register Address Lo 01
Register Value Hi 00 Register Value Hi 00
Register Value Lo 03 Register Value Lo 03

1.2.7. Write Multiple Coils
Function code ini digunakan untuk memaksa setiap coil pada sebuah urutan coil ke posisi ON
atau OFF pada device. PDU yang diminta menetapkan alamat coil untuk ditekan. Coils tersebut
dimulai dari nol. Oleh karena itu, coil nomor 1 dialamatkan sebagai 0. Keadaan ON/OFF yang
diminta ditetapkan oleh permintaan nilai coil yang tetap. Sebuah logika 1 pada posisi bit
berhubungan dengan output untuk menjadi ON. Sebuah logik 0 meminta output untuk menjadi
OFF
Table 4.23 Request PDU
Function Code 1 Byte 0x0F
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Outputs 2 Bytes 0x0001 to 0x07B0
Byte Count 2 Bytes N*
Output Value N*
*N = jumlah output / 8, jika sisanya beda 0 N = N+1
Table 4.24 Response PDU
Function Code 1 Byte 0x0F
Register Address 2 Bytes 0x0000 to 0xFFFF
Register Value 2 Bytes 0x0001 to 0x07B0
Table 4.25 Error
Error Code 1 Byte 0x8F
Exception Code 1 Byte 01 atau 02 atau 03 atau 04

Table 4.26 Contoh
Request Response
Field Name Hex Field Name Hex
Function 0F Function 0F
Starting Address Hi 00 Starting Address Hi 00
Starting Address Lo 13 Starting Address Lo 13
Quantity of Outputs Hi 00 Quantity of Outputs Hi 00
Quantity of Outputs Lo 0A Quantity of Outputs Lo 0A
Byte Count 02
Outputs Value Hi CD
Outputs Value Lo 01

1.2.8. Write Multiple Registers
Function code ini digunakan untuk menuliskan sebuah blok register kontinu ( 1 sampai 120
register ) pada device. Nilai permintaan yang ditulis, dikhususkan pada permintaan data. Data
dipaketkan menjadi 2 byte tiap register
Table 4.27 Request PDU
Function Code 1 Byte 0x10
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Registers 2 Bytes 0x0001 to 0x0078
Byte Count 1 Byte 2 x N*
Register Value N* x 2 Bytes Value
*N = jumlah oRegister
Table 4.28 Response PDU
Function Code 1 Byte 0x10
Starting Address 2 Bytes 0x0000 to 0xFFFF
Quantity of Registers 2 Bytes 0x0001 to 0x07B
Table 4.25 Error
Error Code 1 Byte 0x90
Exception Code 1 Byte 01 atau 02 atau 03 atau 04

Table 4.29 Contoh Request dan Response PDU
Request Response
Field Name Hex Field Name Hex
Function 10 Function 10
Starting Address Hi 00 Starting Address Hi 00
Starting Address Lo 01 Starting Address Lo 01
Quantity of Registers Hi 00 Quantity of Registers Hi 00
Quantity of Registers Lo 02 Quantity of Registers Lo 02
Byte Count 04
Registers Value Hi 00
Registers Value Lo 0A
Registers Value Hi 01
Registers Value Lo 02

1.2.9. Report Slave ID
Function code ini digunakan untuk membaca penjelasan dari tipe, status arus, dan informasi
spesifik lainnya ke master device
Table 4.30 Request Report Slave ID
Function Code 1 Byte 0x11
Table 4.31 Response Report Slave ID
Function Code 1 Byte 0x11
Byte Count 1 Byte
Slave ID Device Specific
Run Indicator Status 1 Byte 0x00 = OFF, 0xFF = ON
Additional Data
Table 4.25 Error
Error Code 1 Byte 0x91
Exception Code 1 Byte C1 atau C4

Table 4.32 Contoh Request dan Response Report Slave ID
Request Response
Field Name Hex Field Name Hex
Function 11 Function 11
Byte Count Device
Specific
Slave ID Device
Specific
Run Indicator Status 0x00 atau
0xFF
Additional Data Device
Specific



1.3. Modbus ASCII
Modbus ASCII (American Standart Code for information Interchange), merupakan komunikasi
protokol dimana pesannya di encode dengan ascii dan juga mengalami eror checking dengan LRC.
Pada bagian LSB-nya terdapat bit fungsi CR LF yang merupakan perintah agar data ditulis pada line
baru dan dimulai dari awal kembali. Untuk lebih mudahnya CR LF dapat dianalogikan seperti fungsi
ENTER pada tombol keyboard komputer. Sedangkan pada bagian MSB-nya diberi penanda start
dengan menuliskan tanda colon :. Berikut ini merupakan framming yang ada pada protokol Modbus
ASCII

Gambar 4.6 Modbus ASCII Framing
Agar lebih mudah memahami mengenai framing pada protokol ASCII berikut ini merupakan contoh
penggunaanya:
Baca nilai keluaran analog pada holding register 40108 sampai 40110 dari slave device 17, maka:
11 03 006B 0003
Keterangan :
11 : Slave ID Address (17 = 11 hex)
03 : Function Code (read analog output on holding registers)
006B : Data address pertama pada register yang diminta (40108 40001 =
107= 6B hex)
0003 : Jumlah Data Address yang diminta oleh register (40108 sampai 40110)
Selanjutnya hitung nilai LRC dengan cara:
Decimal Hex Binary
17 11 0001 0001
3 03 0000 0011
0 00 0000 0000
107 6B 0110 1011
0 00 0000 0000
3 03 0000 0011
Total:
130 82 1000 0010
Gunakan Metode 2s complement:
-130 7E 0111 11110

Sehingga menjadi : 11 03 00 6B 00 03 7E
Tambahkan colon pada MSB dan CR LF pada LSB :
: 11 03 00 6B 00 03 7E CR LF
Lalu konversikan semua menjadi kode ASCII :
3A 3131 3033 3030 3642 3030 3033 3745 0D 0A

1.4. Modbus RTU
Modbus RTU (Retmote Terminal Unit), merupakan komunikasi protokol dimana pesannya di encode
dengan binary. Ketika menggnakan protokol RTU masalah waktu (timing) menjadi sangat penting.
Sehingga start frame tidak ada melainkan diberi jeda 4 character times pada start dan end frame,
dimana end frame harus sama dengan start frame. Proses pengiriman protokol RTU berjalan secara
continous sehingga bila ada gap yang cukup besar akan mengakibatkan data error dan tidak bisa
terbaca dengan baik pada sisi penerima. Dengan menggunakan prtokol RTU maka data yang
dikirimkan lebih compact dan efisien untuk proses pengiriman. Metode pengecekan error pada
protokol RTU menggunakan CRC (Cyclic Redudancy Check). Berikut ini merupakan RTU framing.

Gambar 4.3 Modbus RTU Framing
Agar lebih mudah memahami mengenai framing pada protokol RTU berikut ini merupakan contoh
penggunaanya:
Baca nilai keluaran analog pada holding register 40108 sampai 40110 dari slave device 17, maka:
11 03 006B 0003 7687
Keterangan :
11 : Slave ID Address (17 = 11 hex)
03 : Function Code (read analog output on holding registers)
006B : Data address pertama pada register yang diminta (40108 40001 =
107= 6B hex)
0003 : Jumlah Data Address yang diminta oleh register (40108 sampai 40110)
7687 : Hasil perhitungan error dengan metode CRC


1.5. Modbus TCP/IP
Pada protokol ini akan membawa function code dan data di enkapsulasi menuju ke tingkatan protokol
yang lebih lanjut dari sebelumnya (Modbus RTU, Modbus ASCII). Client and Server digunakan
sebagai ganti dari master and slave. Selain itu framing yang digunakan juga berbeda dengan protokol
modbus RTU.

Gambar 4.7 Modbus TCP/IP framing
Pada MBAP Header memiliki bagian-bagian seperti berikut :
Transaction ID : terdidiri dari 2 byte dan mempunyai byte yang unik. Byte tersebut di set
oleh cilent untuk menandai maupun mengetahui setiap permintaan
Protocol ID: terdiri dari 2 byte yang diset oleh cilent dan selalu bernilai 00 00
Length: terdiri dari 2 byte yang menunjukan jumlag byte pada data yang dikirim
Unit ID : terdiri dari 1 byte yang diset oleh client untuk identifikasi dari remote slave
Untuk lebih jelasnya dapat perhatikan contoh kasus berikut ini:
Baca nilai keluaran analog pada holding register 40108 sampai 40110 dari slave device 17, maka:
0001 0000 0006 11 03 006B 0003
Keterangan :
00001 : Transaction ID
0000 : Protocol ID
0006 : Panjang Pesan (berisi 6 byte)
11 : Slave ID Address (17 = 11 hex)
03 : Function Code (read analog output on holding registers)
006B : Data address pertama pada register yang diminta (40108 40001 =
107= 6B hex)
0003 : Jumlah Data Address yang diminta oleh register (40108 sampai 40110)
7687 : Hasil perhitungan error dengan metode CRC


2. asd
2.1. qawd
2.2. qwd