@mrkovalchuk
Junior developer

RS485, MODBUS, почему могут не доходить сообщения до slave устройства?

Доброго времени суток.

Есть два Ардуино, Нано (слейв) и Мега (мастер). Мастер что-то отправляет (RX мигает как положено), слейв ничего не принимает (tx,rx молчат).

Вот скетчи.
Мастер.
#include <ModbusRtu.h>

// data array for modbus network sharing
uint16_t au16data[10];
uint8_t u8state;
#define TXEN  10 

/**
 *  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
 */
Modbus master(0,0,TXEN); // this is master and RS-232 or USB-FTDI

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

unsigned long u32wait;

void setup() {
  master.begin( 19200 ); // baud-rate at 19200
  master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll over
  u32wait = millis() + 1000;
  u8state = 0; 
}

void loop() {
  switch( u8state ) {
  case 0: 
    if (millis() > u32wait) u8state++; // wait state
    break;
  case 1: 
    telegram.u8id = 1; // slave address
    telegram.u8fct = 3; // function code (this one is registers read)
    telegram.u16RegAdd = 4; // start address in slave
    telegram.u16CoilsNo = 1; // number of elements (coils or registers) to read
    telegram.au16reg = au16data; // pointer to a memory array in the Arduino

    master.query( telegram ); // send query (only once)
    u8state++;
    break;
  case 2:
    master.poll(); // check incoming messages
    if (master.getState() == COM_IDLE) {
      u8state = 0;
      u32wait = millis() + 100; 
      
    }
    break;
  }
}


Слейв.
#include <ModbusRtu.h>
#define ID   1
#define TXEN  10

Modbus slave(ID, 0, TXEN); // this is slave ID and RS-232 or USB-FTDI
boolean led;
int8_t state = 0;
unsigned long tempus;

// data array for modbus network sharing
uint16_t au16data[9];

/**
 *  Setup procedure
 */
void setup() {
  io_setup(); // I/O settings

  // start communication
  slave.begin( 19200 );
  tempus = millis() + 100;
  digitalWrite(13, HIGH );
}

/**
 *  Loop procedure
 */
void loop() {
  // poll messages
  // blink led pin on each valid message
  
  
  state = slave.poll(au16data,9);
  if (state != 0) {
    digitalWrite(6,LOW);
    delay(500);
    digitalWrite(6,HIGH);
  }
  
  if (state > 4) {
    tempus = millis() + 50;
    digitalWrite(13, HIGH);
  }
  if (millis() > tempus) digitalWrite(13, LOW );

  
  io_poll();
} 


void io_setup() {
  // define i/o
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(13, OUTPUT);

  digitalWrite(6, LOW );
 
  digitalWrite(13, LOW ); // this is for the UNO led pin
  
}


void io_poll() {

  // read analog inputs
  au16data[4] = analogRead( 4 );
  //au16data[5] = analogRead( 1 );

  // diagnose communication
  au16data[6] = slave.getInCnt();
  au16data[7] = slave.getOutCnt();
  au16data[8] = slave.getErrCnt();
}


Что могло пойти не так? Схема собрана с использованием модулей Max485

XVmJT1jMYQM.jpg6d6b773d547e4eb18dd179a35669d6df.pngБонус
1MxSO0S2Crg.jpg
  • Вопрос задан
  • 2129 просмотров
Решения вопроса 1
Ocelot
@Ocelot
У слейва перепутаны местами TXD и RXD.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@LiguidCool
Если у слейва молчит приём, а у мастера передача мигает ... "Дядя, я знаю что у вас сломалось".
Либо подключили неправильно, либо адаптеры не исправны.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы