Arduino в качестве ведомого устройства Modbus RS485 отправляет сообщение ведущему - PullRequest
0 голосов
/ 09 апреля 2020

Я говорю по-французски, извините, мой бедный английский sh. Я работаю над Modbus RS485 между 2 Arduino Megas. Я хотел бы, чтобы раб послал, например, значение «10» мастеру. На ведомом устройстве я использую пример библиотеки https://github.com/yaacov/ArduinoModbusSlave:

    #include <ModbusSlave.h>


    // explicitly set stream to use the Serial serialport
    Modbus slave(Serial, 1); // stream = Serial, slave id = 1, rs485 control-pin = 8

    void setup() {
        // register handler functions
        slave.cbVector[CB_READ_INPUT_REGISTERS] = ReadAnalogIn;
     //   slave.cbVector[CB_READ_HOLDING_REGISTERS] = readMemory;

        // start slave at baud 9600 on Serial
        Serial.begin( 9600 ); // baud = 9600
        slave.begin( 9600 );
    }

    void loop() {
        // listen for modbus commands con serial port
        slave.poll();
    }

    // Handel Read Input Registers (FC=04)

    uint8_t ReadAnalogIn(uint8_t fc, uint16_t address, uint16_t length) {
        // write registers into the answer buffer
        for (int i = 0; i < length; i++) {
          uint16_t res;
          res = 221;
          //slave.writeRegisterToBuffer(i, analogRead(address + i));
          slave.writeRegisterToBuffer(i,10);


        }
        return STATUS_OK;
    }

на ведущем устройстве я использую пример из библиотеки https://github.com/4-20ma/ModbusMaster

´´´

#include <ModbusMaster.h>


// instantiate ModbusMaster object
ModbusMaster node;


void setup()
{
  // use Serial (port 0); initialize Modbus communication baud rate
  Serial.begin(9600);

  // communicate with Modbus slave ID 1 over Serial (port 0)
  node.begin(1, Serial);
}


void loop()
{
  static uint32_t i;
  uint8_t j, result;
  uint16_t data[6];

  i++;

  // set word 0 of TX buffer to least-significant word of counter (bits 15..0)
//  node.setTransmitBuffer(0, lowWord(i));

  // set word 1 of TX buffer to most-significant word of counter (bits 31..16)
//  node.setTransmitBuffer(1, highWord(i));

  // slave: write TX buffer to (2) 16-bit registers starting at register 0
//  result = node.writeMultipleRegisters(0, 2);

  // slave: read (6) 16-bit registers starting at register 2 to RX buffer
  result = node.readHoldingRegisters(2, 6);

  // do something with data if read is successful
  if (result == node.ku8MBSuccess)
  {
     Serial.println(result);

  }
}

´´´

но это не работает, похоже, между arduino нет связи. у кого-нибудь есть решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...