Rabu, 06 Maret 2019

membuat arduino memiliki protocol modbus RTU yang simpel, praktis dan efisien




assalamu'alaikum
Modbuser


sudah lama gak update artikel, puaks akan mencoba meluangkan waktu sebentar untuk menuliskan tentang cara membuat arduino memiliki protocol modbus RTU yang simpel, praktis dan efisien.
hanya butuh waktu 1menit.

adapun yang dibutuhkan :
1. board arduino uno (terserah mau pakai arduino apa)
2. kabel data
3. pc/laptop (kalo gak punya pinjam di warnet terdekat)

software:

library modbus

langsung aja kita menuju tahap 
1. colokin kabel data to arduino dan PC
2. masukkan library C:\Program Files (x86)\Arduino\libraries
3. run software arduino IDE
4. ketik sketch dibwah ini:
#include <ModbusRtu.h>
#define ID   1 //slave ID modbus RTU

Modbus slave(ID, 0, 0); // this is slave ID and RS-232 or USB-FTDI
// jumlah register addres modbus RTU
uint16_t au16data[9];
int8_t state = 0;

void setup() {
  io_setup(); // I/O settings

  // start communication
  slave.begin( 19200 );
 
}


void loop() {
  
   state = slave.poll( au16data, 9 );

 
    io_poll();

/**
 * pin maping:
 * 2 - digital input
 * 3 - digital input
 * 4 - digital input
 * 5 - digital input
 * 6 - digital output
 * 7 - digital output
 * 8 - digital output
 * 9 - digital output
 * 10 - analog output
 * 11 - analog output
 * 14 - analog input
 * 15 - analog input
 *
 * pin 13 is reserved to show a successful query
 */
void io_setup() {
  // define i/o
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  digitalWrite(6, LOW );
  digitalWrite(7, LOW );
  digitalWrite(8, LOW );
  digitalWrite(9, LOW );
  analogWrite(10, 0 );
  analogWrite(11, 0 );
}

/**
 *  Link between the Arduino pins and the Modbus array
 */
void io_poll() {
  // get digital inputs -> au16data[0]
  bitWrite( au16data[0], 0, digitalRead( 2 ));
  bitWrite( au16data[0], 1, digitalRead( 3 ));
  bitWrite( au16data[0], 2, digitalRead( 4 ));
  bitWrite( au16data[0], 3, digitalRead( 5 ));

  // set digital outputs -> au16data[1]
  digitalWrite( 6, bitRead( au16data[1], 0 ));
  digitalWrite( 7, bitRead( au16data[1], 1 ));
  digitalWrite( 8, bitRead( au16data[1], 2 ));
  digitalWrite( 9, bitRead( au16data[1], 3 ));

  // set analog outputs
  analogWrite( 10, au16data[2] );
  analogWrite( 11, au16data[3] );

  // read analog inputs
  au16data[4] = analogRead( 0 );
  au16data[5] = analogRead( 1 );

  // diagnose communication
  au16data[6] = slave.getInCnt();
  au16data[7] = slave.getOutCnt();
  au16data[8] = slave.getErrCnt();
}

5. run software modscan: untuk mengecek apakah arduino sudah ada protocol modbusnya

dikoding tadi addresnya dibikin 9. maka di modscan untuk lenghtnya gak boleh lebih dari 9.
dan juga perhatikan modbus point type; itu ikut holding register. jika lenghtnya di isi 10 apa yang terjadi?



device ID juga samakan dengan koding, isi angka 1. jika di isi angka 2 apa yang terjadi???




experiment ini di sponsori oleh SIMOR sebagai medianya:



selamat berinovasi dengan modbus.

wassalam


fuad hasan
(SIMOR)

5 komentar:

  1. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  2. kalo wiring antara arduino dan SIMORnya bagaimana mas?

    BalasHapus
  3. Pak kalau aku pingin baca analog input dengan data float gimana ya codingnya?

    BalasHapus
    Balasan
    1. saya biasanya di kalikan dulu..

      contoh data temperatur 30.40
      data tetep integer kemudian x 100

      setelah itu main scaling di software scadanya

      Hapus

signal gsm sim800l

Value RSSI dBm Condition 2 -109 Marginal 3 -107 Marginal 4 -105 Marginal 5 -103 Marginal 6 -101 Marginal 7 -99 Marginal 8 -97 Marginal 9 -95...