Abstrak—Paper ini membahas tentang Cyclic Redundancy Check – 16, sebuah generator polynomial
untuk mendeteksi error, yang biasanya digunakan pada MODBUS Remote Terminal Unit. Diawali dengan
penjelasan tentang fenomena derau yang biasanya menyertai sebuah sinyal utama ketika sinyal tersebut
ditransmisikan melalui sebuah kanal berderau. Beberapa tipe error yang biasanya mempengaruhi bit bit
dari byte data yang ditransmisikan kemudian dijelaskan. Metode lengkap untuk mendesain sebuah
generator polynomial untuk mendeteksi error kemudian dipaparkan. Selanjutnya, Cyclic Redundancy
Check – 16 sebagai sebuah contoh generator polynomial dibahas. Pembahasan meliputi metode untuk
implemenrasi software dari CRC tersebut. Dua metode diperkenalkan yaitu metode loop – driven dan
metode table – driven. Pada bagian akhir, ditunjukkan hasil dari generator polynomial yang dirancang, yang
terdiri dari algoritma nya dan salah satu contoh rutin programnya. Rutin CRC – 16 tersebut kemudian dites
dengan menggunakan beberapa pesan MODBUS.
Kata Kunci - Noise, generator polynomial, Cyclic Redundancy Check, MODBUS Remote Terminal Unit,
lood – driven, table – driven, algorithm
Abstract—This paper presents about the Cyclic Redundancy Check – 16, a generator polynomial for error
detection, which is normally used in MODBUS Remote Terminal Unit. It starts with explaining the noise
phenomena that are often generated into a useful signal when it is transmitted through a noisy channel.
Some types of error which usually affects bits of a transmitted data bytes are introduced. The complete
method for designing a good generator polynomial for detecting the error is then presented. Next, Cyclic
Redundancy Check -16 as an example of generator polynimial is discussed. The explanation includes
method for software implementation of the CRC. Two methods are introduced which are loop – driven
method and table - driven method. Finally, result of designed generator polynomial is shown, which
consists of the algorithm and the routine example. The CRC -16 routine is then tested using some MODBUS
messages.
Keywords - Noise, generator polynomial, Cyclic Redundancy Check, MODBUS Remote Terminal Unit,
lood – driven, table – driven, algorithm
Durasi noise biasanya lebih panjang daripada mengirimkan kembali message nya. Pengiriman
durasi 1 bit, yang berarti bahwa ketika noise kembali message diulang sampai sebuah
mempengaruhi data, dia akan mempengaruhi message tiba dimana receiver percaya message
satu set bit (lebih dari satu bit). Jumlah bit yang tersebut adalah error – free (biasanya tidak
terkena efeknya tergantung pada data rate dan semua error bisa dideteksi).
durasi noise itu. Sebagai contoh, jika kita Tergantung dari sistem komunikasi nya,
mengirim data pada 1 Kbps, sebuah noise 11100 kita bisa saja menggunakan sebuah skema error
s bisa mempengaruhi 10 (sepuluh) bit; jika kita detection (yang bisa meminta re - transmission
mengirim data pada 1 Mbps, noise yang sama data dari transmitter) atau skema error –
bisa mempengaruhi 10000 (sepuluh ribu) bit. correction, atau kedua duanya skema error –
detection dan error correction.
2.2. Redundancy CRC – 16 merupakan skema error
Konsep utama dalam pendeteksian atau detection (yang bisa meminta re - transmission
pengkoreksian error adalah redundancy. Agar data dari transmitter).
bisa mendeteksi atau mengkoreksi error, kita
perlu untuk mengirimkan bit bit extra bersamaan 3. GENERATOR POLYNOMIAL DAN
dengan data kita. Bit bit redundant ini CRC – 16 [2][3][6]
ditambahkan oleh pengirim dan dibuang oleh
receiver. Keberadaan nya memungkinkan 3.1. Generator Polynomial [2][3]
receiver untuk mendeteksi atau mengkoreksi bit Parity, atau block sum check turunan nya,
terkorupsi. tidak menyediakan sebuah skema pendeteksian
yang handal terhadap error. Pada kasus seperti
2.3. Deteksi versus Koreksi itu, alternatif yang paling umum adalah berbasis
Koreksi error adalah lebih sulit daripada pada penggunaan polynomial codes. Polynomial
deteksi. Pada deteksi error, kita mencari hanya codes digunakan dengan skema transmisi frame
untuk melihat apakah error telah terjadi. (blok). Jonathan Stone et. al [6] dalam
Jawabannya adalah hanya ya atau tidak. Kita paparannya membandingkan performansi antara
bahkan tidak tertarik pada berapa jumlah error checksum dan CRC pada real data.
nya. Sebuah single – bit error adalah sama bagi Satu set digit digit pengecekan dihasilkan
kita seperti sebuah burst error. (dihitung) untuk setiap frame yang
Pada koreksi error, kita perlu untuk ditransmisikan, berdasar pada isi dari frame
mengetahui jumlah tepatnya bit yang terkorupsi tersebut, dan kemudian ditambahkan oleh
dan lebih penting lagi, lokasi bit tersebut di transmitter pada akhir dari frame. Receiver
dalam message. Jumlah error dan ukuran kemudian melakukan sebuah perhitungan yang
message adalah faktor penting. Apabila kita serupa pada frame dan check digit. Apabila tidak
ingin untuk mengkoreksi satu single – error di terjadi error, maka hasil yang sudah diketahui
dalam sebuah unit data 8 – bit, kita perlu untuk diperoleh. Apabila hasilnya berbeda,
mempertimbangkan delapan kemungkinan mengindikasikan kesalahan. Oleh H. Michael Ji
lokasi error; jika kita ingin mengkoreksi dua dan Earl Killian [5], dijelaskan tentang
error dalam sebuah unit data dengan ukuran alghoritma dan implementasi Fast Parallel CRC
yang sama, kita perlu untuk mempertimbangkan pada sebuah Configurable Processor.
28 kemungkinan. Jumlah check digit untuk setiap frame
dipilih untuk menyesuaikan dengan tipe error
2.4. Forward Error Corection versus Re- transmisi yang diantisipasi. Pada prakteknya,
transmission digunakan 16, 24, or 32-bit generator vectors
Ada dua metode utama unuk koreksi error. untuk menghasilkan bit bit check digit untuk
Koreksi forward error adalah proses dimana menaikkan secara signifikan error detection
receiver berusaha untuk memperkirakan rate, meskipun 16 dan 32 bit adalah yang paling
message dengan menggunakan redundant bit. umum. Hasil check digit yang dihitung
Ini dimungkinkan, apabila jumlah error kecil. dinamakan Frame Check Sequence (FCS) atau
Koreksi dengan re-transmisi adalah sebuah Cyclic Redundancy Check (CRC) [3]. Dinamakan
teknik dimana receiver mendeteksi adanya kode Cyclic Redundancy Check (CRCs) karena
sebuah error dan meminta sender untuk Check code (verifikasi data) nya adalah sebuah
Gambar 4. Proses menghasilkan CRC Gambar 5. Proses pengecekan – tidak ada error
𝑇(𝑥)+𝐸(𝑥) 𝑇(𝑥) 𝐸(𝑥) Jenis kedua adalah ada dua buah single – bit
= + (6)
𝐺(𝑥) 𝐺(𝑥) 𝐺(𝑥) error yang terisolasi satu sama lain. Dengan
kondisi bagaimana tipe error ini bisa terdeteksi
Pembagian T(x) / G(x) tidak menghasilkan ? Kita bisa menunjukkan tipe error ini sebagai
sisa. Sisa yang kita peroleh ketika membagi e(x) = xj + xi. Nilai i dan j mendefinisikan posisi
dengan G(x) hanyalah sisa yang didapatkan dari dari error, dan perbedaan j – i mendefinisikan
pembagian E(x) dengan G(x). Jadi, error hanya jarak antara kedua error tersebut, seperti yang
akan terdseteksi hanya jika E(x) / G(x) ditunjukkan di Gambar 7.
menghasilkan sebuah sisa.
Misalnya, semua G(x) mempunyai paling
| Difference j – i |
sedikit tiga term (bit bit 1) dan E(x) / G(x) akan
0 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1
menghasilkan sebuah sisa untuk semua error x n-1 xj xi x0
single – bit dan semua error double – bit dengan
modulo-2 arithmetic dan oleh karena nya error Gambar 7. Representasi dari dua single- bit
terdeteksi. Sebaliknya, sebuah error burst error yang terisolasi menggunakan polynomial
dengan panjang yang sama dengan G(x) bisa saja
merupakan sebuah kelipatan G(x) dan oleh Kita bisa menulis e(x) = xi (x j – i + 1). Jika
karenanya tidak menghasilkan sisa dan error g(x) mempunyai lebih dari satu term dan satu
tidak terdeteksi. term adalah x0, g(x) tidak bisa membagi xi,
Bisa ditunjukkan (dengan menganggap seperti yang kita lihat sub pada bagian
bahwa E(x) / G(x) akan mempunyai sebuah sisa) sebelumnya. Jadi agar g(x) bisa membagi e(x),
bahwa dengan sebuah FCS (atau CRC) n – bit, g(x) harus bisa membagi x j – i + 1. Dengan kata
kita bisa mendesain generator polynomial lain, g(x) harus tidak bisa membagi xt + 1,
sedemikian rupa sehingga mungkin untuk dimana t adalah antara 0 dan n-1. Tetapi, t = 0
mendeteksi single bit error, dua single – bit tidak ada artinya dan t = 1 diperlukan seperti
error yang terisolasi, sejumlah ganjil error, dan yang akan kita lihat nanti. Ini berarti t harus
burst error. berada di antara 2 dan n-1.
Dengan melihat kepada beberapa error Jadi, jika sebuah generator polynomial
spesifik seperti yang ditunjukkan di sub bab tipe tidak bisa membagi xt + 1 (t antara 0 dan n-1),
tipe error di atas, kita bisa melihat bagaimana maka semua isolated double error bisa
error tersebut bisa terdeteksi dengan sebuah terdeteksi.
polynomial generator g(x) yang terdesain secara
baik. Generator Polynomial untuk Odd Numbers of
Errors
Generator Polynomial untuk Single-Bit Error Sebuah generator polynomial dengan
Bagaimana seharusnya struktur g(x) untuk sebuah faktor x + 1 bisa menangkap semua error
menjamin terdeteksinya sebuah single – bit error berjumlah ganjil. Ini berarti bahwa kita perlu
? Sebuah single – bit error adalah E(x) = xi, untuk membuat x + 1 sebuah faktor dari
dimana i adalah posisi dari error bit tersebut. generator polynomial apapun. Perhatikan bahwa
Jika sebuah single – bit error terdeteksi, maka kita tidak mengatakan bahwa generator
xi tidak bisa terbagi dengan g(x). (Perhatikan polynomial itu sendiri yang harus x + 1; kita
bahwa ketika kita mengatakan tidak bisa terbagi, mengatakan bahwa generator polynomial
maksudnya adalah ada sebuah sisa). Jika g(x) tersebut harus mempunyai sebuah faktor x + 1.
mempunyai paling sedikit dua terms (seperti Jika dia hanya x + 1, dia tidak bisa mendeteksi
yang pada umumnya terjadi) dan koefisien x0 dua error terpisah yang berdampingan (lihat sub
nya tidak nol (bit paling kanan adalah 1), maka bagian sebelumnya)
e(x) tidak bisa dibagi dengan g(x) [2]. Sebagai contoh, x4 + x2 + x + 1 bisa
Jadi, jika generator polynomial mempunyai menangkap semua odd – number error karena
lebih dari satu term dan koefisien dari x0 adalah dia ditulis sebagai sebuah hasil perkalian dari
1, maka semua single - bit error terdeteksi. dua polynomial yaitu x + 1 dan x3 + x2 + 1.
Jadi, sebuah generator polynomial yang
Generator Polynomial untuk two Isolated berisi faktor x + 1 bisa mendeteksi semua odd -
Single-Bit Errors number error.
P(x) = x16 + x15 + x2 + 1 (7) byte data yang ketiga. Setelah itu, MSB dari
CRC_BUFF digeser ke dalam LSB dari
Polynomial di atas diterjemahkan ke dalam CRC_LOW dan MSB dari CRC_LOW digeser
sebuah nilai binary karena divisor dilihat ke dalam LSB dari CRC_HIGH. MSB dari
sebagai sebuah polynomial dengan koefisien CRC_HIGH, yang sekarang disimpan di Carry
binary. flag, dites untuk melihat apakah dia di set. Jika
Jadi, generator polynomial CRC-16 bit tersebut diset, register register, CRC_HIGH
diterjemahkan menjadi 1000000000000101b. dan CRC_LOW, akan di XOR kan dengan
Semua koefisien, misalnya x2 atau x15 generator polynomial CRC – 16. Jika bit
direpresentasikan sebagai logika 1 dalam nilai tersebut tidak diset, bit berikutnya dari
binary. CRC_BUFF akan digeser ke dalam LSB dari
CRC_LOW. Proses ini diulang sampai semua
4. IMPLEMENTASI SOFTWARE CRC - data dari CRC_BUFF digeser ke dalam
16 [1] CRC_LOW. Setelah ini, CRC_BUFF dimuati
dengan byte data yang berikutnya. Kemudian
Ada dua teknik yang berbeda untuk semua byte data diproses, dan 16 nol
mengimplementasikan sebuah CRC dalam ditambahkan ke message. Register register,
software. Satu adalah implementasi loop – CRC_HIGH dan CRC_LOW, berisi nilai CRC
driven dan yang satunya lagi adalah sebuah yang dihitung. Panjang message tidak
implementasi tabel – driven. Yuanhong Huo et. ditentukan.
al [11] menjelaskan pada publikasinya tentang
perhitungan CRC parallel ber arsitektur table – CRC Checking
based (table – driven). Pengecekan CRC menggunakan teknik yang
Implementasi loop – driven bekerja seperti sama seperti CRC generation, satu satunya
perhitungan yang ditunjukkan di gambar 8. perbedaannya adalah nol tidak ditambahkan ke
message.
Hasil dari look – up table dari high byte di Gambar 10. Algoritma perhitungan untuk
XOR kan dengan isi dari register CRC_HIGH. CRC - 16
Hasil untuk low byte di XOR kan dengan isi dari
CRC_LOW. Hasilnya disimpan kembali di Keterangan gambar 10 :
CRC_LOW. XOR = Exclusive OR
Langkah berikutnya adalah bahwa isi dari N = Jumlah bit informasi
CRC_HIGH digeser ke dalam CRC_BUFF dan POLY = Perhitungan polynomial dari
isi dari CRC_LOW digeser ke dalam register CRC 16 = 1010 0000 0000 0001
CRC_HIGH. Kemudian, register CRC_LOW (Generating polynomial = 1 + x2 + x15 + x16)
dimuati dengan byte data yang baru. Pada CRC 16, byte pertama yang ditransmisikan
Proses ini berulang untuk semua byte data. adalah low – order byte
Pada akhir CRC generation, message harus
ditambahi dengan 16 buah nol. Ke enambelas Di sini, dibuat sebuah implementasi
nol tersebut diperlakukan seperti byte data. software CRC-16 berbasis tabel (table – driven).
Setelah perhitungan selesai, isi dari register, Secara garis besar, algoritma perhitungan untuk
CRC_HIGH dan CRC_LOW ditambahkan ke CRC – 16 ditunjukkan di Gambar 10.
message. Dan Gambar 11 berikut ini adalah contoh
rutin CRC-16 berbasis tabel yang dihasilkan :
CRC Checking
CRC check menggunakan teknik yang sama // Fungsi CRC16 berbasis tabel
unsigned char calculate_CRC_Lo(unsigned char
seperti CRC generation, perbedaannya adalah *message, int length, unsigned char *CRC)
tidak ditambahkan nol ke message. {
unsigned char CRCHi, CRCLo, TempHi, TempLo;
5. HASIL DAN PEMBAHASAN static const unsigned char table[512] = {
0x00, 0x00, 0xC0, 0xC1, 0xC1, 0x81, 0x01, 0x40,
5.1. Rutin CRC – 16 0xC3, 0x01, 0x03, 0xC0, 0x02, 0x80, 0xC2, 0x41,
0xC6, 0x01, 0x06, 0xC0, 0x07, 0x80, 0xC7, 0x41,
Gambar 10 berikut menunjukkan sebuah 0x05, 0x00, 0xC5, 0xC1, 0xC4, 0x81, 0x04, 0x40,
algoritma umum untuk perhitungan CRC – 16. 0xCC, 0x01, 0x0C, 0xC0, 0x0D, 0x80, 0xCD, 0x41,
dalam sebuah array dimensi satu dengan nama Pada sisi receiver, message yang terdiri dari
tx_buffer_panas dengan jumlah elemen array 12 byte data informasi dan 2 byte terakhir CRC
sebesar variabel TX_BUFFER_SIZE . akan diterima via pin receiver (TX) pada fasilitas
Lengkapnya adalah seperti berikut : USART microcontroller unit. Receiver
selanjutnya secara software akan meghitung
unsigned char tx_buffer_panas kembali byte CRC_LOW dan byte CRC_HIGH
[TX_BUFFER_SIZE] = {0x41, '-', 'P', dari 12 byte data informasi yang telah diterima.
'a', 'n', 'a', 's', '-', 0x43, '-', 0x52, Lihat tabel 3 berikut.
'-' };
Tabel 3. Byte CRC_LOW dan byte
Message tersebut digunakan sebagai sebuah
CRC_HIGH yang dihitung kembali oleh
pesan oleh transmitter, yang pada protokol
receiver
MODBUS berupa master, yang ditujukan Messages yang diterima CRCLow CRCHigh
kepada receiver, yang pada protokol MODBUS 0x41, '-', 'P', 'a', 'n', 'a', 's', '-', 0x86 0xD6
berupa slave tertentu. Message tersebut memberi 0x43, '-', 0x52, '-'
command kepada receiver untuk meng ON kan 0x41, '-', 'P', 'a', 'n', 'a', 's', '-', 0x86 0x26
sebuah aplikasi yang dikendalikan oleh nya 0x43, '-', 0x51, '-'
sehubungan dengan keadaan 'P', 'a', 'n', 0x41, '-', 'D', 'i', 'n', 'g', 'i', 0x32 0xC3
'n', '-'
'a', 's', . Bisa terlihat, message tersebut 0x42, '-', 'P', 'a', 'n', 'a', 's', '-', 0x82 0xD2
terdiri dari 12 byte. 0x43, '-', 0x52, '-'
Transmitter, yang bentuk hardware nya 0x42, '-', 'P', 'a', 'n', 'a', 's', '-', 0x82 0x22
bisa berupa microcontroller based development 0x43, '-', 0x51, '-'
board, akan mengirimkan pesan tersebut kepada 0x42, '-', 'P', 'a', 'n', 'a', 's', '-', 0x82 0x1E
0x46, '-', 0x52, '-'
receiver, yang bentuk hardware nya juga berupa
0x42, '-', 'P', 'a', 'n', 'a', 's', '-', 0x82 0xEE
microcontroller based development board. 0x46, '-', 0x51, '-'
Pesan ditransmit via pin transmitter (TX) pada 0x42, '-', 'D', 'i', 'n', 'g', 'i', 0x26 0x33
fasilitas USART microcontroller unit. Sebelum 'n', '-'
transmisi dilakukan, software akan menghitung
terlebih dahulu Frame Check Sequence atau Apabila tidak ada error pada saat transmisi,
Cyclic Redundancy Check dari ke 12 byte di atas. nilai nilai CRC_LOW dan CRC_HIGH yang
Terdapat sebuah bagian pada software master dihitung oleh receiver akan sama dengan nilai
yang akan memanggil (memanfaatkan) rutin nilai byte CRC_LOW dan CRC_HIGH yang
CRC-16 contoh di atas. Seperti yang ditunjukkan telah diterima. Apabila error terjadi selama
pada potongan baris program berikut ini : transmisi data, nilai nilai CRC_LOW dan
CRC_HIGH yang dihitung oleh receiver akan
tx_buffer_panas[12]= berbeda dari nilai nilai byte CRC_LOW dan
calculate_CRC_Lo(tx_buffer_panas, 12,
CRC_HIGH yang telah diterima. Receiver
0x00);
selanjutnya akan meminta re-transmisi data.
Potongan baris program di atas menghitung Jadi, skema error detection (yang kemudian bisa
low order byte CRC_LOW dari message 12 byte diikuti dengan meminta re - transmission data
di atas. Hal yang sama dilakukan pada dari transmitter) terjadi di sini.
perhitungan high order byte CRC_HIGH.
Kedua variabel CRC, CRC_LOW dan 6. KESIMPULAN
CRC_HIGH selanjutnya ditambahkan ke Dari pembahasan di atas, dapat ditarik
message 12 byte di atas, dijadikan sebagai dua kesimpulan sebagai berikut.
elemen terakhir dari array yaitu Transmisi data bisa menimbulkan error
tx_buffer_panas[12] dan pada byte data yang dikirim disebabkan oleh
tx_buffer_panas[13]. Ketika CRC 16 – bit adanya noise pada kanal. Error bisa berupa
tersebut ditransmisikan, low – order byte akan single bit – error, double bit - error (dua single
ditransmisikan terlebih dahulu, diikuti dengan – bit error terisolasi satu sama lain), odd number
high – order byte. error, atau burst error.