Помощь по Arduino и Modbus
- Войдите на сайт для отправки комментариев
Добрый день!
Уперся лбом в стенку которой по всей логике не может быть.
Прочитал статью с этого форума 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 пишет регистры ПЧВ но ответа добиться не могу(((

Всем спасибо за помощь! Очень отзывчивый форум!
Мне кажется надо попробывать другую библиотеку.
дело было в MAX485, покупал на Али 10 модулей, оказалось ни один не работал, купил в магазине ADM483 впаял в эти китайские модули и все заработало.