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:
1. arduino IDE
2. modscan
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)
Komentar ini telah dihapus oleh pengarang.
BalasHapuskalo wiring antara arduino dan SIMORnya bagaimana mas?
BalasHapusvia rs485 kah?
HapusPak kalau aku pingin baca analog input dengan data float gimana ya codingnya?
BalasHapussaya biasanya di kalikan dulu..
Hapuscontoh data temperatur 30.40
data tetep integer kemudian x 100
setelah itu main scaling di software scadanya