Modbus Protokol dan Serial Standard
Modbus adalah sebuah open protocol yang menggunakan Layer Application atau Layer ke tujuh pada OSI Model (OSI: Open Systems Interconnection). Modbus di transmissikan melalui komunikasi Serial (Modbus RTU / Modbus Serial) dan juga Ethernet (Modbus TCP). Modbus pertama kali dikembangkan oleh Modicon (Saat ini Modicon dimiliki oleh Schneider Electric), yang juga merupakan PLC Pertama didunia yang ditemukan oleh Dick Morley. kemudian Modbus dikembangkan secara open oleh organisasi Modbus.org Modbus merupakan protocol yang paling umum digunakan dibanyak Device di brand apapun saat ini karena kemudahannya dan sifatnya yang open menjadikannnya Protocol favorite di Industrial Automation.
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; 0x0001); CRCFull = (ushort)((CRCFull >> 1) &amp; 0x7FFF);
if (CRCLSB == 1)
CRCFull = (ushort)(CRCFull ^ 0xA001);
}
}
CRC[1] = CRCHigh = (byte)((CRCFull >> 8 ) &amp; 0xFF);
CRC[0] = CRCLow = (byte)(CRCFull &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
asem,, lengkap bgt pnjlasanmu huks huks
kebetulan urusan sama modbus, tp HMI sini bawaan vendor mas, ABB, jd mau blajar syusah,,, KP asem heuheu
keren… sephh
@tommy
thanks 🙂
mas rif makasih atas infonya…..
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
@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)
@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
mantap mas tanks
@herieza gunn
oo begitu..
berarti PLC nya menggunakan nilai awal(First Register) dari 40000(0h0000) bukan di 40001 (0h0001). -sepertinya
mantabs penjelasannya gan, ane yang nubie and idiota langsung faham . .
masuk ke otak saya :p
kalo pake arduino gimana bang?
@iis bisa tinggal dibikin rule algoritmanya aja…
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.
@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?
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.
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….
yg punya web ini jualan PLC Schndeider…wkwkwk
salam kenal pa?..saya mohon di bantu bagaimana cara membuat halaman pada HMI weintek mt 6056i.
minta contoh program modbus rtu untuk PIC 16f877A dong, bodoh bgt saya nih blm ngerti2…
@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.
Kewren dan jelas…
Terima kasih mas penjelasanya, sangat membantu saat KP di Pratiwi. Semoga sukses selalu mas, salam peserta training haha.
Ok Terima kasis atas pencerahannya
Semoga tetap semngat berkarya
Salam Buat Keluarga
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
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.
makasih mas atas penjelasannya, sangat membantu saya dalam magang kuliah. matur suwun
mas sy doni wa sy 085779686686 sy ada pengalaman rumit di tempat sy komputer ke mesin mati akhirnya sy ganti pc yg berbeda kemudian hardisknya sy cloning yg ada software mesinnya ( movicon 11,2) pc ada 2 port serial yg 1 rs232 dan yg 1 lagi rs232 juga yag di konvert jd rs458 di konverter phonix plc pakai panasonix yg jd masalah setelah sy konek rs232 konek tapi yg port 1 lagi gak konek jadi ada pesan auxelery not inserted. apakah setingan modbus atau apanya ya …bisa minta pencerahaan?
maaf saya mau bertanya, cara komunikasiin antara PLC merk schneider dengan Inverter merk schneider gimana ya kak?apakah harus make SoMove juga atau cukup setting di plc nya saja?kalau bisa diseting di plcnya saja itu cara setting nya gimana ya kak? mohon jawab ya kak soalnya saya baru mempelajari modbus ini 🙂 terimakasih
tergantung kebutuhan, jika yg dibutuhkan untuk baca parameter saja, cukup plc saja yg di setting, kalau ada perintah dari PLC, berarti VSD juga perlu disetting, bisa pakai somove atau langsung di screen vsd.
setting di plc nya sangat mudah kalau pakai M221 sudah ada pilihan vsd nya
maaf , saya ingin bertanya mas, apa kah mas pernah mencoba trial komunikasi Arduino dengan PLC Mitsubishi dengan menggunakan modbus RS232 ? jika iya , apakah ada link atau pencerahan yang bisa di sharing mas ?
Terima Kasih Sebelumnya mas
Mas saya mau tanya nilai CRC itu apa terisi secara otomatis atau tidak ya ?
Terima Kasih
Nilai CRC harus dihitung dari byte ke byte. ada contoh programnya di sini.
Punten bang mau nanya. Saya kan ada project data logger buat kwh meter satu fasa pake modbus rs485. Di manual user kwh itu ada intruksi 0x03 RO untuk pengalamatanya. Andaikan saya mau ambil data dari 40001-40004 saya coba masukan alamat 0x03001 tetapi error. Itu kenapa ya?
Atau gimana ya formulanya untuk di codingan gitu?
Mohon pencerahanya.
Makasih
0x03 itu untuk function code nya… kalo registernya tetap di 40001-40004 atau kalau penulisannya pakai index di program jadi 0 sampai 3
Kalau untuk mengambil data Sentron PAC3200, slave id nya 1 atau brp mas? Kemudian untuk mengambil register primary current dan secondary current di
50011-50014 bentuknya jadi seperti apa ya mas? Tolong dilengkapi dan dikoreksi ya mas :
[01] [03] [??] [??] [00][04] [CRC1] [CRC2]
Penjelasan:
[01] : karena slave ID nya adalah 1
[03] : Karena me-request holding register
[??] [??] : ?
[00] [04] : karena ada 4 data yang akan di request 50011 – 50014
? : untuk start register nya di register berapa….
misal mau langsung baca ke register 50011: jadi C3 5B
Izin bantu jawab Mas,
Saya pernah coba PAC3100 dikoneksikan dengan PLC melalui Modbus. Saya coba jawab sesuai pemahaman saya. Untuk slave id tergantung settingan mas pada PAC3100. Untuk registernya sepemahaman saya dimulai dari 40001. Untuk primary current/current A sesuai data sheet ada pada offset : 13 = 40014 (register : 2) dan untuk current B ada pada offset : 15 = 40016 (register:2). Saya pernah nulis di blog saya :
https://frankyphs.blogspot.com/2021/05/modbus-memang-gilaaaa.html
Mohon koreksi jika saya salah mas. Terimakasih