Tuesday, 2 July 2013

Modbus TCP Sample VB

Modbus Sample VB
Ini adalah sebuah projek VB.Net untuk membaca dan menulis register Modbus TCP.

Awalnya saya mencari contoh program VB.Net untuk komunikasi Modbus TCP. Kemudian saya menemukan contoh projek di situs CodeProject.com tepatnya disini :
sebuah projek VB.Net untuk komunikasi Modbus TCP dengan bahasa C#, karya Stephan Stricker.

Yang jadi masalah adalah saya terbiasa dengan bahasa VB, sehingga saat melihat source code dari projek tersebut saya jadi bingung. Ini sangat penting karena dari projek sample ini akan saya kembangkan lebih lanjut untuk projek yang lain, dan saya terbiasa dengan bahasa VB.

Maka dengan alasan itulah saya ingin melakukan konversi projek ini dari bahasa C# ke VB.
Saya kemudian mencari translator dari C# ke VB di Google dan mendapatkan tool yang bagus di situs DeveloperFusion.com tepatnya disini :

Di projek Modbus asli terdapat 2 projek. Saya buka satu persatu dan ubah source code-nya dengan tool diatas.

Kemudian saya buat projek baru dengan bahasa VB, framework saya pilih .NET 2.0. Projek baru ini saya kasih nama Modbus Sample VB.

Di projek baru ini saya buat satu projek saja yang terdiri dari satu form dan satu modul. Class ModbusTCP saya pindahkan ke module ModbusTCP, dan semua objek di frmStart saya copy dan paste di form frmStart di projek baru saya.

Source code untuk projek baru ini saya ambil dari hasil translasi tool diatas. Hebat sekali dari banyak baris code hanya beberapa yang error.

Gambar dibawah ini menunjukan baris code yang bermasalah di module ModbusTCP, event OnReceive, pada code ElseIf…. Saya belum tahu karena apa dan harus diapakan. Untuk sementara ini saya ubah menjadi Else saja.

 Di form frmStart ada banyak yang diperbaiki. Imports yang tidak perlu saya jadikan remark, dan Imports ModbusTCP saya ganti dengan Imports Modbus_Sample_VB.ModbusTCP.

Namespace dan End Namespace saya remark dan semua baris code diantara deklarasi variable data dan even frmStart_Load saya remark. Seperti pada gambar dibawah.

Di event button btnConnect juga ada yang diperbaiki.

Ada satu warning, yang menurut saya bisa diabaikan.

Dan jadilah aplikasi Modbus TCP client dengan bahasa VB.

Saya Run dan coba konek ke Modbus Simulator dengan IP local 127.0.0.1. berhasil melakukan Read dan Write.

Ini adalah tampilan software Modbus Simulator

Dan ini adalah tampilan Modbus Sample VB


File EXE dari projek ini bisa diunduh disini..
yang butuh source project ini silahkan klik disini..


32 komentar:

  1. Siang mas,,,

    Saya ingin belajar Sistem SCADA mas,ya ingin belajar cara untuk men design system SCADA,

    yang harus saya pelajari apa ya mas,?

    Kalau saya baca dari artikel2 di internet termasuk Blog mas juga,
    banyak sekali istilah2 yang saya belum begitu paham, seperti:
    1. Modbus
    2. OPC
    3. TCP/IP
    4. VB & C#

    itu masing2 kegunaannya bagaimana mas,?
    kalau secara garis besar saya sudah mengerti,
    hanya secara khusus masih bingung,

    Contoh, ada komunikasi pakai Modbus, Profibus, Ethernet, FO, TCP/IP
    itu perbedaannya dimana ya mas,

    bisa minta tolong dijelaskan?


    Terimaksih,

    ReplyDelete
    Replies
    1. Mas Deni,

      saya senang dengan keinginan Mas untuk mempelajari sistem SCADA.

      ada penjelasan bagus disini :
      http://mokoraden.blogdetik.com/2009/09/05/teknik-automasi-apa-sih-sebenarnya/

      juga disini :
      http://id.wikipedia.org/wiki/Elektronika_dan_instrumentasi

      juga ada forum untuk saling bertanya tentang dunia automasi, disini :
      http://www.kaskus.co.id/post/000000000000000032741372#post000000000000000032741372


      untuk lebih mendalami dunia automation sebaiknya terjun langsung (bekerja) di dunia tersebut, biasanya sebagai Automation Engineer. karena kita akan dihadapkan langsung dengan perangkat-perangkat dan proses automasi.


      semoga membantu.. :)

      Delete
    2. terimakasih link nya mas,,

      Btw, emang sih harus terjun langsung kedalam dunia Autoamsi, sayang nya saya hanya sebagai maintenance di pabrik mas, jadi jarang sekali berhubungan dengan automasi, hanya maintenance nya saja,

      skrng sedang cari2 loncatan ke automation or instrumetn sih,

      oh iya mas, kalau dalam pemrograman PLC,
      itu ada bilangan Bool, int, real, word, double word, dll,
      itu fungsi dari setiap masing2 bilangan apa ya mas,???

      kapan kita menggunakan bool, kapan menggunakan int, dll,
      mohon pencerahannya mas,


      terimakasih,

      Delete
    3. Mas Deni,
      yang ditanyakan itu adalah Tipe Data. Jenis2 tipe data ada banyak berdasarkan jumlah bit dan formatnya.

      > BOOL (Boolean atau BIT) : 1 bit. rentang nilai: 1 atau 0.
      > BYTE : 8 bit. rentang nilai: 0 - FF hexa ( 0 - 255 decimal).
      > WORD : 16 bit atau 2 Byte. nilai: 0 - 65535 dec.
      > INT (integer signed) : 16 bit. nilai: -32768 - +32767 dec.
      > UINT (unsigned integer) : 16 bit. nilai: 0 - 65535 dec.
      > DINT (double integer) : 32 bit.
      > DWORD (Double Word) : 32 bit atau 2 Word atau 4 byte.
      > REAL (floating, berkoma) : 32 bit.

      penggunaannya disesuaikan dengan kebutuhan. Jika kita hanya butuh 1 bit (nilainya 1 dan 0 saja) maka pakailah tipe data BOOL. Jika kita butuh 8 bit pakailah BYTE. Jika butuh angka desimal dengan tanda (negatif posistif) maka gunakan INT. Kalau nilainya lebih dari batas INT maka pakai UINT atau WORD jika tak perlu pakai tanda, jika perlu pakai tanda gunakan tipe DINT. Jika bilangan berkoma (floating), gunakan tipe REAL.

      untuk lebih jelas, silahkan baca di sumber ini:
      http://faisalaahamad.blogspot.com/2013/06/tipe-data-plc.html

      Delete
  2. there is a problem when trying to Read and Write address more than Integer limit (32767).

    On function CreateReadHeader and CreateWriteHeader There is a problem when convert Start Address to byte, in this line of code :

    Dim _adr As Byte() = BitConverter.GetBytes(CShort(IPAddress.HostToNetworkOrder(CShort(startAddress))))
    data(8) = _adr(0)
    ' Start address
    data(9) = _adr(1)
    ' Start address


    I solved my problem with this edited code :


    'Dim _adr As Byte() = BitConverter.GetBytes(CShort(IPAddress.HostToNetworkOrder(CShort(startAddress))))
    data(8) = startAddress \ 256 ' _adr(0)
    ' Start address
    data(9) = startAddress Mod 256 ' _adr(1)
    ' Start address



    Thanks..

    ReplyDelete
  3. i found a bug,
    everytime i connect to Modbus Server (in my case is simulator Mod RS Sim), its build double connection.
    after i check the code, there is a double connect request. So I remove this one:
    Connect synchronous client

    other bug is when change data type. in example from Word to Byte. It is not directly change the displayed data in register.
    So edit som code and this problem solved.

    I convert this project to VS Express.
    and the download link has been updated to latest project.

    Regards.

    ReplyDelete
  4. Please see here for Modbus TCP with VB6 project :
    http://hadiscada.blogspot.com/2013/12/modbus-tcp-dengan-vb6.html

    ReplyDelete
  5. mas, kelihatannya script ini hanya bisa dipakai untuk baca data byte ya, hanya 8 bit saja yg bisa dibaca. sedangkan saya perlu read/write data word (16 bit). Ada solusi?

    ReplyDelete
    Replies
    1. pada Modbus, Each register is 1 word = 16 bits = 2 bytes.
      mungkin maksud Mas mau Double Word (DWORD) ya?

      semoga link berikut bisa berguna:
      http://www.freevbcode.com/ShowCode.asp?ID=8271

      http://modbus.control.com/thread/1026194580

      Delete
  6. Mas, gmn kalau modbus rtu, bukan modbus tcp? Thanks

    ReplyDelete
    Replies
    1. silahkan baca disini:
      http://hadiscada.blogspot.co.id/2016/06/modbus-rtu-client.html

      Delete
  7. iya Mas, kalau menggunakan protokol Modbus TCP, port 502 harus di-open dulu agar bisa berkomunikasi.
    caranya bisa lewat Windows Firewall. atau coba saja di-matikan dulu Windows Firewall nya.

    ReplyDelete
  8. siang mas, saya coba download programnya tapi bingung cara pakainya, caranya baca register gmn ya? seperti 400001, apa di data exchange start address itu diisi 400001, atau gmn?

    ReplyDelete
    Replies
    1. kalau address yg ingin dibaca adalah 400001 maka cukup isi 1 pada Start Address.

      Delete
    2. Kalau addressnya 50011 start addressnya brp mas? Cara menentukan start address dimulai dari brp bagaimana mas? terus jumlah size itu maksudnya jml register atau apa yah?

      Misalnya saya mau baca nilai pd address :
      50011 dan 50013 yg msg-msg memiliki 2 register caranya bagaimana mas?

      Delete
    3. maaf koreksi, di aplikasi ini sy pakai index register bukan address register, jadi dimulai dari 0 bukan 1. pada Holding register index 0 berarti/sama dengan 40001.

      Delete
    4. address 50011 aneh, karena tidak ada alamat dengan awalan 5xxx, Holding register pake awalan 4xxx. coba cek lagi alamat nya.

      Delete
  9. Sebelumnya terima kasih telah share semua tutorial ini mas, tapi saya punya pertanyaan..

    saya kalau pakai tcp yang dari situs http://www.windmill.co.uk/serial.html di bagian gambar ada bagian prompt itu saya isi spt ini mas
    01 03 00 00 00 4C 44 3F dan akan di respon dengan jawaban >50 textbox, nah software ini biar bisa baca support kayak gitu gimana ya? mengingat di tutor ini hanya support 3 textbox inputan aja..

    btw ini project untuk baca modbus tcp kwh meter, kalo software bawaannya ada tapi saya pngn bikin versi saya sendiri dengan beberapa pengembangan.. sebelumnya terima kasih mas. ditunggu :)

    ReplyDelete
    Replies
    1. textbox2 itu sepertinya untuk menunjukkan byte2 data yang dikirim da diterima. klo di project kami diatas tidak ditampilkan byte2 komunikasinya, langsung ditampilkan saja nilainya.

      sebenarnya mau dibuat seperti apapun bisa mas, terserah programmer nya, yg penting cara komunikasinya sdh bisa.

      terima kasih.

      Delete
  10. mas hadi, kalau Slave adress / RTU adress nya = 10 gimana ya ?

    ReplyDelete
  11. Mas Hadi, ini saya sudah download program dari mas, nah saya mau nyambung kan ke PLC S7 1200 kira" gmna ya

    ReplyDelete
    Replies
    1. setting PLC nya agar menjadi Modbus TCP server. caranya gimana? itu bagian programming PLC, bukan disisi VB nya. coba saja cari di internet, sy pikir banyak.
      klo PLC sudah menjadi Modbus Server, baru bisa diakses oleh aplikasi ini.

      Delete
  12. Mas, kalau saya ingin modifikasi ketika tombol ditekan dia sudah mengirimkan data ke plc untuk menghidupkan output. kira kira code mana yang harus saya rubah ya?

    ReplyDelete
    Replies
    1. coba lihat script pada tombol Write Single Coil..

      Delete
  13. Untuk mengambil angka tertentu dari sebuah PLC konsep dasarnya spt apa Pak? Di manual yang saya miliki structurnya spt ini :
    Address(byte) Function Code (Byte) data (n byte) dan CRC (2 bytes). Model komunikasinya modbus TCP/IP. Ketika saya menggunakan aplikasi yang Bapak buat, terus koneksi ke IP addressnya sudah berhasil. Namun di aplikasi tsb kan kita diminta untuk memasukkan unit,start address dan size. Lalu pertanyaannya adalah bagaimana cara saya menentukan unit,start address dan size tsb Pak? Karena saya masih bingung ketika membaca manual dari PLC tsb.

    ReplyDelete
    Replies
    1. Unit adl slave id dari alatnya, biasanya 0 atau 1 atau 255.
      Start address adl index alamat register yang ingin dibaca. mulai dari 0.
      Size itu adl banyaknya register yang ingin dibaca.

      Delete
  14. Hi, do you a sample using 2 slaves?

    ReplyDelete
    Replies
    1. Hi, sorry i dont have.
      you can modify by yourself.

      Delete
    2. maybe you can see here:
      https://hadiscada.blogspot.com/2021/04/sharing-sourcecode-modbus-tcp-multi.html

      Delete
  15. Maaf mas adakah sampel untuk Modbus TCP yg bisa baca data float , terimakasih bantuanya # huda.swd@gmail.com

    ReplyDelete
    Replies
    1. mungkin bisa lihat2 disini pak:
      https://hadiscada.blogspot.com/2021/08/sharing-sourcecode-modbus-float.html

      Delete

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