Home > Communication, Instrument & Automation, Interface Engineering > Modbus Protokol dan Serial Standard

Modbus Protokol dan Serial Standard

December 6th, 2010 Leave a comment Go to comments

Setelah saya mempelajari sistem SCADA secara umum maka kemudian saya mempelajari dari masing-masing subsistemnya. dimulai dari bagaimana cara kerjanya, bagaimana cara berkomunikasinya, bagaimana cara mengambil data dan lainnya. Sampai akhirnya saya mempelajari Komunikasi Serial pada PLC dan bertemu dengan jenis-jenis standard industri komunikasi serial dan juga standar industri protokol untuk komunikasi data.

Untuk komunikasi serial ada beberapa yang sering digunakan di Industri, yaitu RS232, RS485,  dan RS422. RS adalah singkatan dari Recommended Standard (klo di kaskus Recommended Seller kali ya :p).  Ketiga jenis RS tersebut merupakan physical layer (Hardware) dari Layer pertama di OSI Model (Wikipedia: OSI Model) yang pada intinya pada phisycal layer bagaimana hardware tersebut mengubah data menjadi sinyal elektrik dan juga sebaliknya mengubah sinyal elektrik menjadi data. Setiap standard komunikasi serial masing masing memiliki spesifikasi yang berbeda pada RS232 sinyal electric diayunkan pada tegangan +/- 12 Volt, +/- 5Volt, dan +/- 3 Volt. pengkabelan memiliki minimal 3 kabel yaitu RX, TX, dan ground. dan panjang maksimum kabel adalah 15 meter.  Sedangkan pada RS485 tegangan yang digunakan adalah +/- 5Volt dimana sinyal di konversikan pada dua kabel + (A) dan kabel – (B). Pada RS485 tidak menggunakan ground maka dari itu RS485 dapat digunakan dengan kabel hingga 1200meter (1,2Km) karena loss daya yang terjadi lebih kecil dan tidak terlalu berpengaruh karena tetap dapat terkonversi sinyalnya. kemudian pada RS485 dapat multidrop atau dapat dicabangkan dengan beberapa hardware. untuk melihat perbedaan RS232 dengan RS485 dapat dilihat di http://en.wikipedia.org/wiki/RS-485 dan http://en.wikipedia.org/wiki/RS-232

Pada komunikasi serial yang digunakan pada PLC terdapat cara berkomunikasi / bahasa komunikasi yang disebut protokol. protokol merupakan bahasa untuk saling berkomunikasi antar hardware pada kasus ini  PLC. Protokol standard yang sering digunakan pada PLC dalam berkomunikasi adalah Modbus. sebuah protokol yang berada di layer ke 7 (Application Layer) dalam OSI model. Modbus merupakan standar komunikasi bus yang dibuat oleh modicon yang memiliki open license yaitu boleh digunakan oleh siapa saja.  untuk penjelasan lebih lengkap mengenai modbus dapat dilihat di www.Modbus.org.

nah sekarang bagaimana modbus itu bekerja?
Kita bahas untuk modbus serial dulu. jadi modbus serial adalah komunikasi serial yang menggunakan protokol modbus.
pada komunikasi serial pengiriman data besarnya adalah 8 byte data atau istilah kasarnya adalah 8 frame data dalam 1x pengiriman.

[byte0] [byte1] [byte2] [byte3] [byte4] [byte5] [byte6] [byte7]

besarnya nilai data dalam 1 framenya adalah 2^8 = 256 (0-255). maka nilai terbesarnya adalah 256. jika kita mengirimkan ASCII misalkan huruf “A” maka nilai yang digunakan sesuai ASCII table adalah 65.

pada modbus frame-frame tersebut diisi dengan kesepakatan tertentu. modbus Frame untuk request dari master ke slave adalah:

[address RTU] [Function Code] [Reg] [Reg] [Lenght][Lenght] [CRC1] [CRC2]

keterangan:

Address RTU:  merupakan address dari setiap RTU, jika alamat RTU yang direquest masuk ke RTU sesuai maka RTU tersebut akan meresponnya dengan memberikan pesan balasan.

Function Code: merupakan jenis-jenis fungsi yang dapat digunakan yaitu,

  • 01 Read Coil Status
  • 02 Read Input Status
  • 03 Read Holding Registers
  • 04 Read Input Registers
  • 05 Force Single Coil
  • 06 Preset Single Register
  • 07 Read Exception Status
  • 08 Diagnostics
  • 09 Program 484
  • 10 Poll 484
  • 11 Fetch Communication Event Counter
  • 12 Fetch Communication Event Log
  • 13 Program Controller
  • 14 Poll Controller
  • 15 Force Multiple Coils
  • 16 Preset Multiple Registers
  • 17 Report Slave ID
  • 18 Program 884/M84
  • 19 Reset Comm. Link
  • 20 Read General Reference
  • 21 Write General Reference
  • 22 Mask Write 4X Register
  • 23 Read/Write 4X Registers
  • 24 Read FIFO Queue

Namun yang paling sering digunakan hanya yang saya tebalkan tulisannya diatas.

Reg: merupakan register yang ingin diambil nilainya..frame ini menggunakan 2 byte data. maka dari itu nilai register bisa sampai 256*256 namun dibatasi dengan jumlah register yang tersedia.

Lenght:  Merupakan jumlah register yang ingin direquest. ini juga menggunaka 2 byte frame seperti register.

CRC1 dan CRC2: CRC adalah Cyclic Redundancy Check yaitu sebuah metode untuk pengecekan error. CRC ini menggunakan 2 byte frame juga. untuk menghitung dan mengetahui lebih jelas CRC dapat dilihat di CRC

[code language=”csharp”]
contoh fungsi untuk menghitung CRC
public static void GetCRC(byte[] message, ref byte[] CRC)
{
//Function expects a modbus message of any length as well as a 2 byte CRC array in which to
//return the CRC values:
ushort CRCFull = 0xFFFF;
byte CRCHigh = 0xFF, CRCLow = 0xFF;
char CRCLSB;

for (int i = 0; i < (message.Length) - 2; i++) { CRCFull = (ushort)(CRCFull ^ message[i]);

for (int j = 0; j < 8; j++) { CRCLSB = (char)(CRCFull  &amp;amp; 0x0001); CRCFull = (ushort)((CRCFull >> 1) &amp;amp; 0x7FFF);

if (CRCLSB == 1)
CRCFull = (ushort)(CRCFull ^ 0xA001);
}
}
CRC[1] = CRCHigh = (byte)((CRCFull >> 8 )  &amp;amp; 0xFF);
CRC[0] = CRCLow = (byte)(CRCFull  &amp;amp; 0xFF);
}
[/code]

Modbus Message Respon

Pesan respon dari slave ke RTU memiliki sedikit perbedaan dengan request. untuk pesan Modbus dari slave memiliki frame yang menyesuaikan jumlah data yang dikirimkan dimana setiap 1 data menggunaka 2 byte frame. susunan nya adalah:

[RTU Address] [Function Code] [2*panjang data] [data] [data][data…] [data…] [CRC1] [CRC2]

Contoh:

[MASTER] dimisalkan kita akan me-request ke slave dengan id 5, mengambil holding register di slave dengan register 40001 sampai dengan 40004. maka bentuk pesannya:

dalam HEX

[05] [03] [00] [00] [00][04] [CRC1] [CRC2]

Penjelasan:

[05] : karena slave ID nya adalah 5

[03] : Karena me-request holding register (lihat di table function)

[00] [00] : karena 40001 adalah register pertama maka dimulai dari 0.

[00] [04] : karena ada 4 data yang akan di request 40001 – 40004

[CRC1] [CRC2] : Hasil CRC

dan kemudian Slave akan membalasnya dimisalkan register 40001 bernilai 7, 40002 bernilai 6, 40003 bernilai 5, dan 40004 bernilai 4. maka respon slave adalah:

[05] [03] [08] [00] [07][00] [06][00] [05] [00] [04] [CRC1] [CRC2]

Penjelasan:

[05]: Slave ID

[03] : Function (Read Holding Register)

[08] : 2 x jumlah data (2 x 4)

[00] [07]: nilai data di register pertama yang di request

[00] [06]:nilai data di register kedua yang di request

[00] [05]:nilai data di register ketiga yang di request

[00] [04]:nilai data di register keempat yang di request

[CRC1] [CRC2]: Hasil CRC nya



  1. wimayudie
    February 8th, 2011 at 11:58 | #1

    asem,, lengkap bgt pnjlasanmu huks huks

    kebetulan urusan sama modbus, tp HMI sini bawaan vendor mas, ABB, jd mau blajar syusah,,, KP asem heuheu

  2. tommy
    March 1st, 2011 at 13:25 | #2

    keren… sephh

  3. March 2nd, 2011 at 17:38 | #3

    @tommy
    thanks 🙂

  4. fajar
    April 29th, 2011 at 22:55 | #4

    mas rif makasih atas infonya…..

  5. herieza
    July 19th, 2011 at 11:22 | #5

    nais inpoh…. materi yg kompleks dibalut dengan penjelasan yg ruaarrrr biasa simple dan menyenangkan…..
    tapi BTW saya punya keanehan sedikit nih…. yg saya pernah baca ,modbus kan mendefinisikan adress si slave dengan notasi N+1 kaann…. nah di software PLC GL*FA (demi etika mau tak mau kusensor sdkt)… waktu saya mau write holding register si inverter dari vendor yg sm jg, yg beralamatkan 0h0005 misalkan,,,nah di Comm Funct Block kita harus mengisi dengan adress 0004….. tak pakai Func code 04 modbus karena MUNGKIN telah diurus si commFB tsb…. lha kenapa itu???? masa dy diiisi dengan notasi N-1???? apakah si modbus yg abnormal??? ataukah sepertinya si FB yg kg normal…… nahhh pendapat e sampeyan kira2 bagaimana… ditunggu ya jwbnnya… mathur nuwon

  6. July 20th, 2011 at 14:24 | #6

    @herieza
    hmm..susah juga nih pertanyaannya soalnya saya blom nemuin..hehe
    maksudnya mendefiniskan address slave dengan N+1 gimana ya?

    kalau untuk tidak menggunakan function code (04 dsb) memang banyak yang seperti itu..jadi disitu tinggal mendefinisikan address tersbut terletak di mana (holding, input, atau lainnnya)

  7. herieza gunn
    September 12th, 2011 at 18:15 | #7

    @Rifqi-oncom
    sorry telat sekali sy membalasnya….. maksud kulo niki,,,,klo kt mw read/write register inverter tg di alamat 0h0012 misalkan…tentunya kan di PLC kita mesti definisikan 0h0012 td dgn 0h0013 alias 40013,,,,krn mengikuti aturan modbus kannn……nah di PLCku beda….malahan 0h0012 didefinisikan dgn 0h0011…. apakah yg terjadi adalah…….apakah mungkn didefinisiakn modbus sebagai 40011….kan menyalahi aturan N+1….ngoten mas Rif….mathur nuwonn

  8. September 28th, 2011 at 16:50 | #8

    mantap mas tanks

  9. September 29th, 2011 at 20:11 | #9

    @herieza gunn
    oo begitu..
    berarti PLC nya menggunakan nilai awal(First Register) dari 40000(0h0000) bukan di 40001 (0h0001). -sepertinya

  10. reksoprodjos
    May 31st, 2012 at 10:02 | #10

    mantabs penjelasannya gan, ane yang nubie and idiota langsung faham . .

  11. ayue
    June 6th, 2012 at 10:48 | #11

    masuk ke otak saya :p

  12. iis
    June 13th, 2012 at 18:32 | #12

    kalo pake arduino gimana bang?

  13. Riyanto
    May 5th, 2014 at 22:22 | #14

    Salam kenal,.saya sedang belajar mengoneksi display ada rs 232,ke plc,diteruskan ke HMI,mohon saya di bantu dan di bagi ilmunya bagaimana supaya nilai displaynya muncul di HMI..maturnuwun sederenge.

  14. May 10th, 2014 at 21:49 | #15

    @Riyanto
    Kalau boleh tau, PLC nya apa? Menggunakan protokol apa? Dan HMI nya apa?
    Saat ini sampai tahap apa? Apa display yg ada rs232 nya sudah bisa terbaca di PLC?

  15. Riyanto
    May 11th, 2014 at 17:26 | #16

    Trima kasih pa,saya pakai PLC OMRON CP1L,HMI WEINTEK MT 6056i,KLU PROTOKOL SAYA BLM PAHAM,.belajar saya udh sampai tombol,lamp,timer,counter dan move udh di HMI dan PLC udh bisa.

  16. nanang 08562755534
    September 10th, 2014 at 18:46 | #17

    Saya jual plc omron beberapa tipe’ seperti cp1e dan hmi omron dgn harga murah.. Toko alat2 listrik saya d semarang.
    Silahkan call 0856 27 555 34
    Untuk yg pny web ini, saya kasih harga reseller.. 🙂
    Mohon bantuan dipromosikan mas rif….

  17. hahahihi
    September 14th, 2014 at 21:16 | #18

    yg punya web ini jualan PLC Schndeider…wkwkwk

  18. September 25th, 2014 at 11:51 | #19

    salam kenal pa?..saya mohon di bantu bagaimana cara membuat halaman pada HMI weintek mt 6056i.

  19. Lutfi
    October 20th, 2014 at 12:46 | #20

    minta contoh program modbus rtu untuk PIC 16f877A dong, bodoh bgt saya nih blm ngerti2…

  20. December 25th, 2014 at 09:06 | #21

    @riyanto
    saya belum pernah menggunakan wintek.

    @Lutfi
    prinsip dasarnya bisa dilihat contoh program saya untuk membaca modbus. tinggal diterapkan di microcontroller. untuk seri ATMEL banyak yang buat librarynya tinggal pake. misalkan arduino juga sudah ada library modbus.

  21. 50n1
    May 11th, 2015 at 05:09 | #22

    Kewren dan jelas…

  22. Amirul Aziz P TF 12
    February 12th, 2016 at 11:16 | #23

    Terima kasih mas penjelasanya, sangat membantu saat KP di Pratiwi. Semoga sukses selalu mas, salam peserta training haha.

  23. December 21st, 2017 at 11:02 | #24

    Ok Terima kasis atas pencerahannya
    Semoga tetap semngat berkarya
    Salam Buat Keluarga

  24. Sulthon
    December 22nd, 2017 at 22:44 | #25

    Mantap penjelasannya mas rifqi, terima kasih pencerahannya..

    Oiya bila berkenan mohon pencerahannya dong mas, saya lagi belajar bikin sistem data akuisisi dari sensor proximity switch ke analog DAQ Card modbus RS485, sudah bisa konek portnya ke modbus poll software, cara membaca datanya bagaimana yah mas? Masih belum ngerti penentuan ID Slave dan address nya.. Terima kasih sebelumnya

  25. March 11th, 2018 at 00:34 | #26

    Wah keren mas penjelasannya, saya langsung ngerti Modbus. Kalau Modbus TCP apakah sama byte-byte / paket data nya? Bisa menjelaskan juga untuk package byte pada protocol Ethernet/IP ga mas?
    Terima kasih, sukses terus.

*