Hi I am using Arduino mega2560 with RS485 module (max485). Library link that I used for modbusRTU: ModbusRTUSlave/README.md at main · CMB27/ModbusRTUSlave · GitHub.
My problem is when I send the data from master for specific slave ID all slaves take the data. I couldnt handle how I can take the data for specified slave . I mean if the master sends data for slave 1 ,only slave 1 should use the message, others should be ignore. But in the code, it doesnt work as implemented so all slaves take same data.
Here is Master Code:
from pymodbus.client import ModbusSerialClient
import time
# Modbus RTU cihazı oluştur
client = ModbusSerialClient(method='rtu', port='/dev/ttyUSB0', baudrate=115200)
client.connect()
# Veri yazma işlemi
def write_data():
slave_address = 1 # Slave adresi
register_start_address = 2 # Başlangıç register adresi
register_count = 15 # Kayıt sayısı
# data = list(range(register_count)) # 0'dan 14'e kadar olan değerleri içeren bir liste oluştur
data = [1,5,5,5,5,5,5,5,5,5,5,5,5]
try:
# Holding register'lara (0'dan başlayarak) veri yaz
client.write_registers(register_start_address, data, unit=slave_address)
print("Data sent successfully:", data)
except Exception as e:
print("Error:", e)
# Ana döngü
while True:
# Veriyi gönder
write_data()
# Bekleme süresi
time.sleep(1)
Here is Slave 1 Code:
#include <ModbusRTUSlave.h>
const byte dePin = 4; // RS485 DE/RE pin
const int REGISTER_COUNT = 15; // Kayıt sayısı
ModbusRTUSlave modbus(Serial3, dePin); // Serial3 kullanarak Modbus RTU slave oluştur
uint16_t holdingRegisters[REGISTER_COUNT]; // Tutma registerları
void setup() {
Serial.begin(115200); // Seri bağlantı başlat, baud rate: 19200
modbus.configureHoldingRegisters(holdingRegisters, 1); // Tutma registerlarını yapılandır
modbus.begin(1, 115200); // Slave cihazı başlat (ID: 1, Baud rate: 19200)
}
void loop() {
modbus.poll(); // Modbus isteklerini işle
// Tutma registerlarını yazdır
for (int i = 0; i < REGISTER_COUNT; ++i) {
Serial.print("Holding Register ");
Serial.print(i);
Serial.print(": ");
Serial.println(holdingRegisters[i]);
}
Serial.println("********");
}
Here is Slave 2 Code:
#include <ModbusRTUSlave.h>
const byte dePin = 4; // RS485 DE/RE pin
const int REGISTER_COUNT = 15; // Kayıt sayısı
ModbusRTUSlave modbus(Serial3, dePin); // Serial3 kullanarak Modbus RTU slave oluştur
uint16_t holdingRegisters[REGISTER_COUNT]; // Tutma registerları
void setup() {
Serial.begin(115200); // Seri bağlantı başlat, baud rate: 19200
modbus.configureHoldingRegisters(holdingRegisters, 1); // Tutma registerlarını yapılandır
modbus.begin(2, 115200); // Slave cihazı başlat (ID: 2, Baud rate: 19200)
}
void loop() {
modbus.poll(); // Modbus isteklerini işle
// Tutma registerlarını yazdır
for (int i = 0; i < REGISTER_COUNT; ++i) {
Serial.print("Holding Register ");
Serial.print(i);
Serial.print(": ");
Serial.println(holdingRegisters[i]);
}
Serial.println("********");
}