Contoh Code Master dan Slave modbus dalam sebuah Arduino

Contoh Berikut ini menjadikan sebuah arduino mega250 sebagai Master Nodbus RTU (pada pin serial RX2-TX2) sekaligus Slave modbus RTU (pada pin serial RX3-TX3) .

/**
 *  Modbus master & slave dlm 1 arduino
 */

#include <ModbusRtu.h>
//uint16_t au16data[16]; //!< data array for modbus network sharing
uint8_t u8state; //!< machine state
uint8_t u8query; //!< pointer to message query

/**
 *  Modbus object declaration
 *  u8id : node id = 0 for master, = 1..247 for slave
 *  u8serno : serial port (use 0 for Serial)
 *  u8txenpin : 0 for RS-232 and USB-FTDI 
 *               or any pin number > 1 for RS-485
 */

 uint16_t au16data[16] = {  0, 1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15 };


Modbus master(0,2,0); // RX2-TX2 sebagai Modbus Master
Modbus slave(1,3,0); // RX3-TX3 sebagai modbus Slave

/**
 * This is an structe which contains a query to an slave device
 */
modbus_t telegram[2];

unsigned long u32wait;
int  data=0;

void setup() {

Serial.begin(9000);
 Wire.begin();
 lcd.init();     // lcd.begin(16, 2);
 lcd.backlight();
  lcd.setCursor(0,0);
lcd.print("Modbus Master");
delay(1000);
  // telegram 0: read registers
  telegram[0].u8id = 1; // slave address
  telegram[0].u8fct = 3; // function code (this one is registers read)
  telegram[0].u16RegAdd = 0; // start address in slave
  telegram[0].u16CoilsNo = 4; // number of registers to read
  telegram[0].au16reg = au16data; // pointer to a memory array in the Arduino

  // telegram 1: write a single register
  telegram[1].u8id = 1; // slave address
  telegram[1].u8fct = 6; // function code (this one is write a single register)
  telegram[1].u16RegAdd = 3; // start address in slave
  telegram[1].u16CoilsNo = 1; // number of elements registers to read
  telegram[1].au16reg = au16data+4; // pointer to a memory array in the Arduino
	
  master.begin( 9600 ); // baud-rate at 19200
  slave.begin( 9600 ); // baud-rate at 19200
  master.setTimeOut( 5000 ); // if there is no answer in 5000 ms, roll over
  u32wait = millis() + 500;
  u8state = u8query = 0; 

}

void loop() {
//=================Modbus Slave==============================
  slave.poll( au16data, 16 );  //modbus slave 
  
//===============================MOdbus Master============
  switch( u8state )
   {
  case 0: 
    if (millis() > u32wait) u8state++; // wait state
    break;
  case 1: // 
    master.query( telegram[u8query] ); // send query (only once)
    u8state++;
  	u8query++;
	if (u8query > 1) u8query = 0;
    break;
  case 2:
    master.poll(); // check incoming messages
    if (master.getState() == COM_IDLE) {
      u8state = 0;
      u32wait = millis() + 1000; 
      lcd.setCursor(0,1);
lcd.print("Val :"); lcd.print(au16data[1]);// hasil baca reg 40002
Serial.print("data=");Serial.println(data);
data++;
  if(data>=9999)data=0;
     lcd.setCursor(8,1);
     lcd.print("dat:"); lcd.print(data);
    }
    break;
  }
//delay(100);
  au16data[3] =  data;
// bacaDataDariAndon();

}

About pccontrol

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

Posted on 17/06/2023, in Modbus and tagged , . Bookmark the permalink. Comments Off on Contoh Code Master dan Slave modbus dalam sebuah Arduino.

Comments are closed.