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();
}
Posted on 17/06/2023, in Modbus and tagged arduino, modbus master dan Slave. Bookmark the permalink. Comments Off on Contoh Code Master dan Slave modbus dalam sebuah Arduino.