Mengirim Data berbentuk Array Byte pada Komunikasi Serial RS232 / RS-485 dgn C#

Pada komunikasi serial Rs232 atau rs485 data dapat dikirim dalam 2 type data yaitu:

  1.  Text (karakter ASCII) .  contoh  mengirim  13, data aktual yg dikirim 31H,33H (lihat tabel ASCII)
  2.  Byte ( hexa).  contoh   mengirim   13 ,  data aktual yg dikirim   0DH

Pada penggunaan umum( yang lebih mudah)  kita mengirim data  menggunakan bentuk text ASCII. Tapi pada penggunaan tertentu lebih diutamakan pengiriman dalam bentuk byte.

Dalam komunikasi protokol modbus  terdapat 2 buah tipe pengiriman data yaitu

  1.  Pengiriman data dalam bentuk  text atau disebut modbus ASCII.
  2.  Pengiriman data dalam bentuk byte atau disebut modbus RTU.
Pada kesempatan ini saya akan menjelaskan pengiriman data melalui PC ke microcontroller via RS232 dalam bentuk array type data Byte /hex menggunakan bahasa pemrograman  C#.
Tahapannya:
  1. Jika data lebih kecil dari 256 rubah ke byte langsung, jika  data text  > 255   rubah data text ke ke   Integer
  2. Konversi type Integer ke type byte
  3. Simpan ke dlm array
  4. Kirim data ke rs232 (TX buffer)
Karena type data   byte hanya 8 bit :  0 sampai 255 (0xFFH) maka jika data integer 16 bit disimpan ke dalam 2 byte contoh:
misal txtRegister.text = 4000 (0F A0 Hexa) ,  MSB nya = 0x0F
LSB nya = 0xA0
Cara merubah text ASCII ke integer:
ushort start = Convert.ToUInt16(txtRegister.Text);
Cara merubah data integer 16 bit ke byte dan menyimpan ke dlm array message:
message[i] = (byte)(start >> 8);    // MSB
message[i+1] = (byte) start;          //   LSB
Contoh : mengirim nilai  register pada modbus function code 16 (FC 16)
Format data pengiriman modbus function 16 menulis ke beberapa register 16 bit :
Contoh Kode Program mengirim perintah Function Code-16 pd Modbus RTU:

{
byte address = Convert.ToByte(txtSlaveID.Text);
ushort start = Convert.ToUInt16(txtWriteRegister.Text);
short[] value = new short[1];
value[0] = Convert.ToInt16(txtWriteValue.Text);
ushort registers = 1;
//Array untuk  byte CRC :
byte[] CRC = new byte[2];
//Message = 1 byte alamat slave + 1 function code + 2 byte  start register
//          2 byte register +  2 byte * nilai reg  + 2 byte CRC
byte[] message = new byte[9 + 2 * registers]; // 1 register 2 byte
byte jenisFC = 16;

 //============================================================================

SerialPort Rs232_ku = new SerialPort();      
message[0] = address;                //
message[1] = jenisFC;                   //
message[2] = (byte)(start >> 8);     // alamat reg awal msb
message[3] = (byte) start;           // alamat reg awal lsb
message[4] = (byte)(registers >> 8); // jumlah reg  msb
message[5] = (byte) registers;       // jumlah reg  lsb
message[6] = (byte)(registers * 2);   //n byte mengikuti (jumlah byte total dari register , 1 register) = 2byte

//nilai yg akan di kirim
for (int i = 0; i < registers; i++)
{                                               // i =     0      1      2
message[7 + 2 * i] = (byte)(values[i] >> 8);    // message[7]    [9 ]   [11]
message[8 + 2 * i] = (byte)(values[i]) ;        // message[8]    [10]   [12]
}

GetCRC(message, ref CRC);
message[message.Length - 2] = CRC[0];
message[message.Length - 1] = CRC[1];

//kirim message ke Serial Port:
Rs232_ku.Write(message, 0, message.Length);
}

private void GetCRC(byte[] message, ref byte[] CRC)
        {

            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 & 0x0001);
                    CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);

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

Referensi :

  • Modbus.pl
  • Modbus.org

About pccontrol

Berisi Tutorial Menggunakan PC untuk mengontrol Peralatan dengan cara mudah & praktis.

Posted on 12/07/2011, in Menengah-3. Bookmark the permalink. 4 Comments.

  1. nah bentuk variabel data yang dimasukkan dalam fungsi CRC seperti apa?

  2. mas mohon dijelaskan bagaimana membuat fungsi CRC, misalkan ada 2 data dimasukkan pada cek tersebut.nuwun

Komentar ,Saran atau Pertanyaan

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: