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..


15 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. mas saya ada kebingungan ni tentang modbus.. saya akan melakukan komunikasi data...antara S+ operation (dcs abb) ke wonderware.. keduanya sudah bisa di ping dengan jarak kurang lebih 1 km melalui kabel fiber optik. yang jadi masalah saya ketika saya coba scan alamat modbus menggunakan modbuspoll/modscan koneksi tidak bisa / failed. saya coba scan port 502 menggunakan nmap hasilnya port 502 statusnya closed.. apa harus port 502nya open dulu mas. agar bisa di scan alamat modbusnya.??

    ReplyDelete
    Replies
    1. 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.

      Delete
  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

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