Thursday 16 January 2014

Modbus RTU Sample VB6

Menurut Wikipedia, Modbus RTU (Remote Terminal Unit) merupakan varian Modbus yang ringkas dan digunakan pada komunikasi serial. Format RTU dilengkapi dengan mekanisme cyclic redundancy error (CRC) untuk memastikan keandalan data. Modbus RTU merupakan implementasi protokol Modbus yang paling umum digunakan. Setiap frame data dipisahkan dengan periode idle (silent).

Kami cukup banyak pengalaman dengan protokol Modbus RTU. Aplikasi yang kami buat dulu (dengan VB6) diantaranya komunikasi ke Power Meter, Power Supply, Alat Ukur dan Sensor.

Pada kesempatan kali ini, kami akan bagikan sample projek VB6 untuk aplikasi komunikasi Modbus RTU. Projek ini sangat sederhana. Fungsinya hanya membaca dan menulis ke satu register Modbus RTU via port serial.

Berikut adalah tampilan Form dari projek Modbus RTU:


Perhatikan properties dari objek MSComm1. Ubahlah CommPort dengan port serial yang Anda hubungkan ke device Modbus. Sesuaikan juga Settings.

Pada properties objek timer TimerAuto, ubah Interval dengan nilai yang diinginkan (dalam milisecond).


Jalankan projek. Isilah alamat register yang akan dibaca kemudian klik tombol Read, maka nilainya akan ditampilkan pada textbox. Untuk menulis nilai ke register, isilah alamat register yang akan ditulis lalu isi nilai (value) yang diinginkan kemudian tekan tombol Write. Tombol Auto berfungsi untuk menjalankan timer, dimana nilai register akan ditulis dengan nilai yang bertambah satu (1) setiap siklus waktu tertentu.

Demikianlah projek Modbus RTU Sample VB6, sangat sederhana kan? Namanya juga sample, hehe.. Tapi kami harap bisa bermanfaat untuk Anda.

Silahkan download source projeknya disini.


45 komentar:

  1. ada sample projek lain yang lebih canggih, silahkan download disini:
    http://www.modbus.pl/download/zxy66/v19/mbus.zip

    ReplyDelete
  2. Bagi yang mau versi VB.net nya, kami buat projek Modbus RTU dengan VS 2010 express. Silahkan unduh disini:
    http://goo.gl/NvAOhu

    Semoga bermanfaat.

    ReplyDelete
  3. mas hadi, kalau protokol modbus pakai kabel serial rs232 atau pun modbus tcp untuk jenis dikomunikasikan misal ke PLC Omron kira-kira ribet ga ya? Kemudia untuk analog bisa ga?
    Saya pengen belajar buat HMI dari VB kira2 mulai dari mana ya?

    Thx

    ReplyDelete
    Replies
    1. maaf, kami belum berpengalaman untuk PLC Omron. Kalau Omron sudah punya modul komunikasi yang support protokol Modbus, saya pikir tidak akan ribet.
      kami senang dengan keinginan mas Aan, silahkan mulai dari perangkat yang ada. misal ada PLC Omron ya mulai buat aplikasi VB yang bisa komunikasi dg PLC tersebut.
      Semangat ya.. :)

      Delete
  4. mas hadi, saya menggunakan temperature controller autonics tzn4m, apakah komunikasi nya sama dengan program vb yg anda buat?

    saya mencoba menggunakan program di atas untuk membaca temperature controller tetapi error di bagian

    Index = CRC_High Xor Asc(Mid(DataCRC, i, 1))

    bagian mana kah yg salah mas? saya menginputkan nilai desimal pada textbox txtReg.. terima kasih atas perhatiannya ^^

    ReplyDelete
    Replies
    1. kami belum pernah mencoba/menggunakan Temperature controller Autonics tzn4m tersebut jadi kami belum tahu secara pasti apakah alat tersebut bisa berkomunikasi via Modbus RS232 atau tidak.
      Namun, kami mencari manualnya di internet. Dari manual yg kami dapat, tidak ada informasi bahwa alat tersebut support Modbus. Jadi tidak bisa dikomunikasikan dengan aplikasi Modbus RTU ini.

      Demikian dan terima kasih.

      Delete
    2. This comment has been removed by the author.

      Delete
  5. terima kasih atas balasannya..

    saya melihat dari datasheet temperature controller Autonics tzn4m ini dilengkapi komunikasi sub-output dengan rs485.. bukannya rs485 support dengan modbus?

    terima kasih atas perhatiannya.. ^^

    ReplyDelete
    Replies
    1. maaf, mungkin manual yg kami baca tidak lengkap informasinya. Kalau memang support RS485 seharusnya bisa pakai aplikasi ini (Modbus RTU).
      apakah pada datasheet tersebut disebutkan address mana saja yang bisa dibaca? karena (IMHO) biasanya untuk device seperti ini tidak semua address bisa dibaca. ada link ke file dtasheet tersebut?

      Delete
  6. maaf mas baru balas..

    ini mas link datasheetnya untuk autonics temperature controller tzn4m http://www.2shared.com/document/lGOBDlG2/TZN_datasheet.html

    kalau menurut saya, ini autonics punya communication protocol sendiri..

    mohon bantuannya.. thx

    ReplyDelete
    Replies
    1. terima kasih. kami sudah download dan baca datasheet nya. tapi kami mohon maaf, kami belum punya pengalaman dengan device tersebut, dan setelah kami baca, memang interface komunikasi nya RS485, tapi protokol nya bukan Modbus. kami setuju dengan anda, device ini punya protokol sendiri. sepertinya anda harus pelajari lebih lanjut protokolnya dulu.
      demikian.

      Delete
  7. This comment has been removed by the author.

    ReplyDelete
  8. This comment has been removed by the author.

    ReplyDelete
  9. Semua device Autonics menggunakan protokol komunikasi Modbus RTU, kecuali Temperatur control type Tz/TZN dan Pulse meteter type MP5W. Anda bisa mengunakan temperatur control typeTK4 series yg sudah menggunakan rotokol Modbus RTU. Bila anda perlu bantuan bisa hub saya via email : sbycs-ind@autonics.com. Anda juga bisa download Communication Manual nya di link berikut : http://www.autonics.com/products/products_detail_down.php?catecode=&db_uid=205

    ReplyDelete
  10. Apabila menggunakan Protokol Modbus RTU dan memerlukan Fungsi Checksum Error -CRC16 , Function ini bisa anda gunakan, functin ini biasa saya masukan dalam Modul Class (VB6) , Semoga bermanfaat :

    Function CekCRC(Data) As String
    Dim CRC, Poly As Long
    Dim terima As String
    terima = ""
    For i = 1 To Len(Data) Step 2
    terima = terima & Chr(Val("&h" & Mid(Data, i, 2) & "&"))
    Next i
    CRC = &HFFFF& '0
    Poly = &HA001&
    For i = 1 To Len(terima)
    CRC = CRC Xor Asc(Mid(terima, i, 1))
    For j = 1 To 8
    Cek = CRC And 1
    CRC = (CRC \ 2) 'And &H7FFF
    If Cek = 1 Then
    CRC = CRC Xor Poly
    End If
    Next
    Next
    CekCRC = Right("0000" & Hex(CRC), 4)
    End Function

    ReplyDelete
    Replies
    1. terimakasih atas masukkannya..

      saya mau tanya.. apakah komunikasi tersebut menggunakan komponen MSComm saja? atau menggunakan komponen yang lain?

      mohon bantuannya..

      Delete
    2. Ya....saya hanya menggunakan MsComm saja.

      Delete
  11. Berikut Contoh Metode Poling yg biasa saya pakai dengan Interval 250 milisecond.


    Private Sub Timer1_Timer()
    ' "Proses pengambilan Data sedang berlangsung, Tekan Tombol 'Change/Read Data untuk merubah Id,Function,Address, Number/Data"

    On Error GoTo errhand
    Dim yh(1000), j, i, k, l As Integer
    Dim dataterima, datahex, ceker, ncrc, requestdata, datarequestdata As String

    dataterima = MSComm1.Input
    If dataterima <> "" Then
    datahex = ""
    For j = 1 To Len(dataterima)
    datahex = datahex & IIf(Len(Hex(Asc(Mid(dataterima, j, 1)))) = 1, "0" & Hex(Asc(Mid(dataterima, j, 1))), Hex(Asc(Mid(dataterima, j, 1))))
    Next
    Text2.Text = CStr(datahex)
    ceker = Mid(datahex, Len(datahex) - 3, 4)
    ncrc = CekCRC(Mid(datahex, 1, Len(datahex) - 4))
    If Right(ncrc, 2) & Left(ncrc, 2) = ceker Then
    For k = 1 To Len(datahex)
    yh(k) = Val("&h" & Mid(datahex, 7 + (k - 1) * 4, 4))
    Text1(k - 1).Text = yh(k)

    Next
    For l = 1 To 96

    uw(k - 1).Caption = "UW" & Val(alamat.Text)
    Next
    End If

    End If
    requestdata = Right("00" & Hex(slave.Text), 2) 'id
    requestdata = requestdata & Right("00" & Hex(fungsi.Text), 2) 'function 4
    requestdata = requestdata & Right("0000" & (Hex(alamat.Text)), 4) 'alamat
    requestdata = requestdata & Right("0000" & Hex(jumlah.Text), 4) 'jumlah data
    ncrc = CekCRC(requestdata)
    requestdata = requestdata & Right(ncrc, 2) & Left(ncrc, 2)
    For i = 1 To Len(requestdata) Step 2
    datarequestdata = datarequestdata & Chr(Val("&h" & Mid(requestdata, i, 2) & "&"))
    Next i
    StatusBar1.Panels("Value").Text = "UW:" & alamat.Text & "-UW:" & (Val(alamat.Text) + Val(jumlah.Text - 1))
    MSComm1.Output = datarequestdata

    ReplyDelete
    Replies
    1. Terimakasih atas source codenya.. saya sudah jalankan untuk mengambil data digital counter type CT6Y, dan berhasil.. sekali lagi terimakasih mas.
      Namun ada yang ingin saya tanyakan, bagaimana kita mengirimkan perintah melalui program kita ke digital counter tersebut untuk me-reset nilainya menjadi 0? Mohon bantuannya mas..

      Salam,

      Endang

      Delete
    2. Kami belum tahu spesifikasi device tersebut, tapi kami mengira, mungkin ada address di register tertentu yang difungsikan untuk mereset counter. Atau cara lain yaitu, jika register nilai count nya adalah tipe Read-write, bisa dicoba dg menulis register tsb dg nilai nol.
      Tapi itu hanya perkiraan kami, silahkan anda pastikan dg membaca datasheet dr device tersebut. Terima kasih.

      Delete
    3. Terimakasih atas respon-nya pak Hadi, spesifikasi device yang saya gunakan adalah DIGITAL COUNTER AUTONICS tipe CT6Y, saya ingin mereset nilai pada DIGITAL COUNTER tersebut menjadi 0.
      namun cara mengirimkan nilainya, saya belum bisa,

      Delete
    4. RALAT..
      Barusan udah bisa reset, dengan mengirim ke address = 1, function = 5, poin = -256
      Terimakasih atas bantuannya..

      Delete
    5. Ok, sip. Terima kasih juga sudah berbagi. Sukses selalu.

      Delete
  12. bs share contoh program buat baca modbus temperature control TK Series autonics. cz untuk tugas kuliah.
    tolong kirim ke fun_joe89@yahoo.co.id
    trima kasih mas....

    ReplyDelete
  13. @ Autonics Surabaya , terima kasih banyak Pak atas komentar dan penjelasannya serta bantuan Source Code-nya. Kami sangat senang.

    ReplyDelete
  14. pak, sy coba komunikasi power meter ION 6200 pake software bapak via Konverter RS485 to USB di windows 8.1 ga bisa ya pak..?

    ReplyDelete
    Replies
    1. Mas Hery,
      saya belum pernah nyoba di Windows 8.1, juga belum nyoba power meter ION 6200, tapi ada beberapa hal yang saya sarankan untuk dicek/ditest:
      - apakah instalasi driver RS485 ke USB sudah berhasil, ditandai dengan adanya port COM baru.
      - apakah komunikasi ke Power meter sudah OK, coba cek di datasheet nya.
      - apakah address yang dibaca sudah benar, cek juga di datasheet nya.
      - apakah dicoba baca dengan software lain bisa.

      Terima kasih.

      Delete
  15. COM port terbaca dan sy pakai modbus poll bisa connect tapi time out, jadi address yang dibaca "0" (nol) semua

    ReplyDelete
    Replies
    1. Mas Hery,

      jika memakai software lain juga bermasalah, berarti ada yang salah dengan Modbus server nya atau dengan Address nya..

      Apakah address nya sudah benar? karena biasanya kalau salah address memang suka Time out.

      Sepengalaman saya, addresnya harus ditambah 1. misal dari datasheet, KWH di addres 400000, maka dari software bacanya ke address 400001. coba saja Mas..

      Salam.

      Delete
  16. I try to understand the Modbus & master-slave rs-485 & VB.net. But friends my head blown when I go for it. Can you give me some simple knowledge so I can carry ...

    ReplyDelete
    Replies
    1. Please read this article, i think it is very helpful to understand Modbus, here:
      http://www.simplymodbus.ca/FAQ.htm

      Delete
  17. gan, apakah ada file sample yg sudah exe nya seperti gabar diatas?

    ReplyDelete
    Replies
    1. ada, silahkan unduh disini:
      https://www.4shared.com/file/pqAnQC_Qca/vb6_modRtu.html

      Delete
  18. Gan kalo kita mau menghitung jumlah pulse dari sensor proximity dalam setiap detik bisa dijelaskan caranya?
    dari proximity sensor kalo didekatkan logam nilainya 12, kalo dijauhkan nilainya 382. Misal kita mau menghitung/counting pulse berdasarkan perbedaan nilai tersebut dalam setiap detik bagaimana yah? apakah bisa langsung di modbus poll nya atau memang di programming VB nya? Terima kasih banyak :D

    ReplyDelete
    Replies
    1. enaknya sih di VB nya, mas, bisa kita custom sesuai kebutuhan kita. kalau pake Modbus Poll kayaknya gak bisa.

      Delete
  19. Permisi Gan, saya mau baca value di power meter Shihlin SPM-8 pake VB.net ini. Commportnya sudah benar setting sudah benar, cuma saat saya masukin adressnya (register(modicon format = 34107 Hex format 100A), begitu saya read tidak keluar valuenya?..problemnya dimana ya gan?

    terimakasih

    ReplyDelete
    Replies
    1. sepertinya alamat registernya yg kurang tepat.. cek lagi address itu masuk tipe Holding Register atau Analog Input register.. coba juga projek2 Modbus RTU lain di blog ini.
      terima kasih.

      Delete
  20. Maaf , Saya maau baca data tegangan METSEPM5330 dengan VB6 # dari tabel Register
    Voltage A-N 3028
    Voltage B-N 3030
    Voltage C-N 3032
    Voltage N-G 3034

    data yg keluar 37569 padahal fasa R sudah saya isi tegangan 220 Volt , mohon pencerahan

    ReplyDelete
    Replies
    1. tipe datanya mungkin salah, harusnya Float

      Delete
  21. iya pak setelah saya coba di projeck bapak yang lain , bisa berjalan lancar # terimakasih pak tutorialnya sangat membantu # sukses untuk bapak

    ReplyDelete
    Replies
    1. alhamduliLLAAH.. aamiin.. semoga sukses juga. terima kasih.

      Delete
  22. Terimakasih sharing ilmunya, sangat bermanfaat

    ReplyDelete
  23. terima kasih postingannya sangat bermanfaat mas.
    mas hadi punten apakah punya contoh program modbus rs485 vb6 yg berkomunikasi dengan mikrokontroler atmega 16 pakai program BASCOM AVR?

    ReplyDelete
    Replies
    1. klo program VB nya ya sama saja dg program Modbus RTU yg lain, tinggal program di sisi mikro nya saja

      Delete
  24. mas mau tanya saya mau membaca input registers tapi saat dijalankan aplikasi modbus rtu diatas tidak bisa ada error nya, itu kenapa ya mas?

    ReplyDelete

 
Copyright © . HadiSCADA - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger