Modbus mit meheren Slaves

Moin Allerseits,
versuche mit einen Mega 2 Slaves auszulesen.
Mit einem funktioniert es tatellos, habe aber keine Idee den 2. Slave einzubinden.
Die auszulesenen Register sind die gleichen.

/

/ FOR MEGA2560 with Modbus device #1 on Serial #1 @ 9600 baud.
#include <ModbusMaster.h> //Library for using ModbusMaster

#define MAX485_REDE_PIN 5


int sensor1;
int sensor2;
int sensor3;
int sensor4;
int sensor5;
int sensor6;
int sensor7;
int sensor8;

ModbusMaster node; //object node for class ModbusMaster
void preTransmission() //Function for setting stste of Pins DE & RE of RS-485
{
  digitalWrite(MAX485_REDE_PIN, 1);
}
void postTransmission()
{
  digitalWrite(MAX485_REDE_PIN, 0);
}

void setup()
{
  pinMode(MAX485_REDE_PIN, OUTPUT);

  digitalWrite(MAX485_REDE_PIN, 0);
  
  Serial.begin(9600); //Baud Rate as 9600
  Serial1.begin(9600); //Baud Rate as 9600
  node.begin(2, Serial1); //Slave ID as 1 on Serial #1

  node.preTransmission(preTransmission); //Callback for configuring RS-485 Transreceiver correctly
  node.postTransmission(postTransmission);
}

void loop()
{
  uint16_t result = node.readHoldingRegisters(0x0000,8); // Reads Holding Registers 40001 - 40008

  if (result == node.ku8MBSuccess)
  sensor1 = (node.getResponseBuffer(0));
  sensor2 = (node.getResponseBuffer(1));
  sensor3 = (node.getResponseBuffer(2));
  sensor4 = (node.getResponseBuffer(3));
  sensor5 = (node.getResponseBuffer(4));
  sensor6 = (node.getResponseBuffer(5));
  sensor7 = (node.getResponseBuffer(6));
  sensor8 = (node.getResponseBuffer(7));

  Serial.print(sensor1/10);
  Serial.print(",");
  Serial.print(sensor2/10.0);
  Serial.print(",");
  Serial.print(sensor3/10);
  Serial.print(",");
  Serial.print(sensor4/10);
  Serial.print(",");
  Serial.print(sensor5/10);
  Serial.print(",");
  Serial.print(sensor6/10);
  Serial.print(",");
  Serial.print(sensor7/10);
  Serial.print(",");
  Serial.println(sensor8/10);

  delay(1000);
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

du kannst ein zweites Objekt anlegen und dann dann deine operationen mit dem zweiten Objekt durchführen.

zum Ausprobieren ein einfaches

ModbusMaster nodeB; // second object for class ModbusMaster

und dann ein

nodeB.begin(42, Serial1); //Slave ID on Serial #1

bzw. die richtige Adresse und auch die gleichen Callbacks setzen.

Moin,
danke für den Hinweis, funktioniert.
Wichtig ist der delay zwischen den Slaves Abfragen,sonst verheddert sich der Modbus.

/

/ FOR MEGA2560 with Modbus device #1 on Serial #1 @ 9600 baud.
#include <ModbusMaster.h> //Library for using ModbusMaster

#define MAX485_REDE_PIN 5


int sensor1;
int sensor2;
int sensor3;
int sensor4;
int sensor5;
int sensor6;
int sensor7;
int sensor8;

int sensor9;
int sensor10;
int sensor11;
int sensor12;
int sensor13;
int sensor14;
int sensor15;
int sensor16;

ModbusMaster node1; //object node for class ModbusMaster
ModbusMaster node2; //object node for class ModbusMaster
void preTransmission() //Function for setting stste of Pins DE & RE of RS-485
{
  digitalWrite(MAX485_REDE_PIN, 1);
}
void postTransmission()
{
  digitalWrite(MAX485_REDE_PIN, 0);
}

void setup()
{
  pinMode(MAX485_REDE_PIN, OUTPUT);

  digitalWrite(MAX485_REDE_PIN, 0);
  
  Serial.begin(9600); //Baud Rate as 9600
  Serial1.begin(9600); //Baud Rate as 9600
}

void loop()
{
  
  node1.begin(1, Serial1); //Slave ID 1 on Serial #1
  node1.preTransmission(preTransmission); //Callback for configuring RS-485 Transreceiver correctly
  node1.postTransmission(postTransmission);
  uint16_t result1 = node1.readHoldingRegisters(0x0000,8); // Reads Holding Registers 40001 - 40008

  if (result1 == node1.ku8MBSuccess)
  sensor1 = (node1.getResponseBuffer(0));
  sensor2 = (node1.getResponseBuffer(1));
  sensor3 = (node1.getResponseBuffer(2));
  sensor4 = (node1.getResponseBuffer(3));
  sensor5 = (node1.getResponseBuffer(4));
  sensor6 = (node1.getResponseBuffer(5));
  sensor7 = (node1.getResponseBuffer(6));
  sensor8 = (node1.getResponseBuffer(7));

  delay(500);

  node2.begin(2, Serial1); //Slave ID 2 on Serial #1
  node2.preTransmission(preTransmission); //Callback for configuring RS-485 Transreceiver correctly
  node2.postTransmission(postTransmission);
  uint16_t result2 = node2.readHoldingRegisters(0x0000,8); // Reads Holding Registers 40001 - 40008

  if (result2 == node2.ku8MBSuccess)
  sensor9  = (node2.getResponseBuffer(0));
  sensor10 = (node2.getResponseBuffer(1));
  sensor11 = (node2.getResponseBuffer(2));
  sensor12 = (node2.getResponseBuffer(3));
  sensor13 = (node2.getResponseBuffer(4));
  sensor14 = (node2.getResponseBuffer(5));
  sensor15 = (node2.getResponseBuffer(6));
  sensor16 = (node2.getResponseBuffer(7));

  delay(500);
  
  Serial.print(sensor1/10);
  Serial.print(",");
  Serial.print(sensor2/10.0);
  Serial.print(",");
  Serial.print(sensor3/10);
  Serial.print(",");
  Serial.print(sensor4/10);
  Serial.print(",");
  Serial.print(sensor5/10);
  Serial.print(",");
  Serial.print(sensor6/10);
  Serial.print(",");
  Serial.print(sensor7/10);
  Serial.print(",");
  Serial.print(sensor8/10);
  Serial.print(",");
  Serial.print(sensor9/10);
  Serial.print(",");
  Serial.print(sensor10/10);
  Serial.print(",");
  Serial.print(sensor11/10);
  Serial.print(",");
  Serial.print(sensor12/10);
  Serial.print(",");
  Serial.print(sensor13/10);
  Serial.print(",");
  Serial.print(sensor14/10);
  Serial.print(",");
  Serial.print(sensor15/10);
  Serial.print(",");
  Serial.println(sensor16/10);

}

schaut eigenartig aus. Entweder {} Klammer setzen oder auf das If verzichten.

sowas auch

int sensor1;
int sensor2;
int sensor3;
int sensor4;
int sensor5;
int sensor6;
int sensor7;
int sensor8;

Freunde dich mit Arrays an.

So funktioniert der Code erstmal, die seltsame Formatierung von serial.print ist für
MakerPlot,da habe ich die Werte über Virtuelle Instrumente.
Kommen dann noch 16 dazu.
Mit Arrays wir der Code sicher erheblich kürzer, aber so gut binn ich noch nicht.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.