Помощь по Arduino и Modbus

stepand
Offline
Зарегистрирован: 16.09.2018

Добрый день!

Уперся лбом в стенку которой по всей логике не может быть.

Прочитал статью с этого форума ModbusRTU, ModbusTCP Arduino собрал схему Arduino UNO+ китайский конвертер RS485 TTL+китайский конвертер USB RS485. DI подключил к ТХ, RO к RX. соеденил DE RE и посадил на вывод 2 UNO

скетч простой: чтение одного регистра №1 с устройства с адресом 1 и выводом полученного значения регистра на экран


#include <SimpleModbusMaster.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//////////////////// Port information ///////////////////
#define baud        9600
#define timeout     1000
#define polling     300 // скорость опроса по модбус
#define retry_count 100
#define TxEnablePin 2   // Tx/Rx пин RS485
//Общая сумма доступной памяти на ведущем устройстве, чтобы хранить данные
#define TOTAL_NO_OF_REGISTERS 4

// This is the easiest way to create new packets
// Add as many as you want. TOTAL_NO_OF_PACKETS
// is automatically updated.
enum
{
  PACKET1,
  TOTAL_NO_OF_PACKETS // leave this last entry
};
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Масив пакетов модбус
Packet packets[TOTAL_NO_OF_PACKETS];

// Массив хранения содержимого принятых и передающихся регистров
unsigned int regs[TOTAL_NO_OF_REGISTERS];

void setup()
{
  // Настраиваем пакеты
  // Шестой параметр - это индекс ячейки в массиве, размещенном в памяти ведущего устройства, в которую будет 
  // помещен результат или из которой будут браться данные для передачи в подчиненное устройство. В нашем коде - это массив reg
  // Пакет,SLAVE адрес,функция модбус,адрес регистра,количесво запрашиваемых регистров,локальный адрес регистра.
  modbus_construct(&packets[PACKET1], 1, READ_HOLDING_REGISTERS,    1, 1, 0);
  
  // инициализируем протокол модбус
  modbus_configure(&Serial, baud, SERIAL_8N1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
  
  // initialize the LCD
  lcd.begin();

  // Turn on the blacklight and print a message.
  lcd.backlight();

}

void loop()
{
  
  modbus_update();

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("BLOK_1:");
  lcd.print(regs[0]);
 
  
  delay(200);
}

в качестве слейва использовал программу Modbas Slave версии6.2 

Напрямую через USB порт ардуинки все работает.

Подключаю к ардуино  конвертер ТТЛ RS485 в комп втыкаю USB RS485 соединяю линии A-A B-B запускаю скетч, запитав ардуино от простого 5V блока питания. Смотрю монитор в Modbas Slave - запрос проходит и он корректно сформирован  Rx:01 03 00 01 00 01 D5 CA  ответ Tx:01 03 02 00 63 F8 6D Но в ардуино регистр 0 пустой. Я понимаю, что, если напрямую через порт USB ардуино все работает, значит проблемма в конвертерах сигналов.  Конвертер USB RS485 точно рабочий, я им тестю ПЧВ1-Овен. Конвертер RS485 TTL  у меня 5 штук, я перепробовал все. Потом пошел в магазин, купил просто MAX485 выпаял из модуля родную и впаял с магазина, результата нет.  Вообще я это делал для того чтобы частотники не таскать в лабораторию и не таскаться с ноутом по цехам, хотел на месте ардуинкой считывать и записывать нужные мне регистры. На запись это работает, т.е.  ардуино+ RS485 TTL  пишет регистры ПЧВ но ответа добиться не могу(((

stepand
Offline
Зарегистрирован: 16.09.2018

Всем спасибо за помощь! Очень отзывчивый форум! 

nik182
Offline
Зарегистрирован: 04.05.2015

Мне кажется надо попробывать другую библиотеку.

 

stepand
Offline
Зарегистрирован: 16.09.2018

дело было в MAX485, покупал на Али 10 модулей, оказалось ни один не работал, купил в магазине ADM483  впаял в эти китайские модули и все заработало.