Работа с Modbus RTU
- Войдите на сайт для отправки комментариев
Здравствуйте. Имеется частотный преобразователь, подключаемый по интерфейсу RS485 и работающий по протоколу Modbus RTU. Так же имеется USB to RS485 Converter. С помощью программы QModbus, мне удалось прочитать нужный мне регистр и получить значение.
Так же имеется Arduino Uno и преобразователь MAX 485, RS485 TTL.
Подключал по вот такой вот схеме:
Только у меня не задействованы провода на VCC и GND, так как когда я их подключаю, перестает работать соединение с ПЧ.
Вот фото подключения:
Можно ли вообще с помощью Arduino, считать нужный мне регистр и вывести его через Serial.Print в мониторе порта Arduino?
Подключение RS485 в ПЧ подключается 2 проводами виой пары, на A+ и B-, так же там имеются входа под 5V и GND, но они не задействованы.
Что значит "имеются входа под 5V и GND, но они не задействованы."? Как без них передача будет работать?
А считать можно с помощью библиотеки modbusrtu.
Это значит что к ПЧ подключено 2 провода + и - и этого достаточно, чтобы работал RS 485 интерфейс. Возможно я что то не так делаю)
Нет не достаточно. + - или А В это сигнальные. Питание на том же разёме крайние пины. Микросхему интерфейса запитать надо. Как на схеме.
Вот так сейчас выглядит моё подключение.
Но когда я подсоединяю VCC и GND к Arduino, перестает работать USB конвертер и больше не передает данные.
Можете подсказать, как правильно подключить? Я так понял нужно из самого ПЧ брать 5V и GND, присоединять к MAX485 и уже от него на ардуину?
Плату USB to RS485 Converter питать необходимо. Связывать её землю и питание с соответствующими ПЧ ненужно. Первая схема в #1 верная. Назначение разема USB с зеленым раземчиком какое? Если для запитки USB to RS485 Converter то чего подключили на A и B?
...
Вот какой парадокс. Когда я не питаю USB to RS485 и он подключен как на схеме, всё работает. Как только я даю питание на ардуино, USB to RS485 перестает работать.
В общем запитал 5V и GND ПЧ с MAX485, всё заработало. Работает как USB to RS485, так и сам Arduino.
А если питаю MAX485 от питания Arduino, USB to RS485 перестает работать)
Вроде бы разобрался. Теперь нужен скетч для теста. Никто не подскажет, где можно найти пример, опроса допустим 29 регистра Modbus?
В примерах библиотеки есть чтение регистра. Достаточно свой номер подставить.
А можно ссылочку на библиотеку? (:
https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
simple_master.ino
Еще глупый вопрос, как вывести в монитор порта Arduino, то что он принимает? :)
И что нужно здесь указывать? :)
В общем попытаюсь описать всё подробно.
У меня ПЧ висит на 4 COM порте, ардуино висит на 3 COM порте.
Всё соеднинено через MAX485, как на фото которые выше.
ПЧ имеет BUS адрес #2.
Как мне правильно обратиться к ПЧ через Arduino, считать 29 регистр и вывести его в мониторе порта Arduino?
У меня ПЧ висит на 4 COM порте, ардуино висит на 3 COM порте.
В каком смысле?)))
В общем вот что получилось:
Скетч:
Терминал Termite:
Терминал Arduino:
Я так понимаю, приём идет, так как и RX на Arduino мигает.
Но как перевести эту T, в значение? Должно быть не T, а 1,500.
У вас в программе нет вывода в терминал ардуины. Откуда там что берётся? С линии 485? Так там живут не буквы а двоичные данные. В инициализации третий параметр - номер ноги разрешения передачи модуля 485. На схеме провод есть в инициализации 0. Подключить модуль 485 к ардуине и одновременно к компьютеру можно при условии установки 1к резисторов между модулем и ардуиной. Иначе будет конфликт. Но и потом будет конфликт передачи. 485 надо вешать на софтком, если хотите получать с него данные на ардуину и выводить их в буквенном виде на компьютер.
Вот смотрите:
Что я делаю неправильно?
Вот что пишет в Termite:
Я так понимаю это запрос который отправляется на мой ПЧ, а как увидеть ответ самого ПЧ?
Подключал и через резистор на 1кОм и на 120 Ом. Толку нет.
Да. Это ваш запрос. Если нет ответа, то скорее всего ваш запрос не доходит до устройства. Может быть по тому, что у него адрес 2 , а у вас в запросе 1?
Раньше был 2, сейчас 1.
предлагаю мой вариант как считать из модбаса и отправить на сериал. Только зачем тут конвертер usb to RS485?
Подключаем по схеме
Скетч мастера
почитайте тему может поможет вам, я долго сам ковырялся с модбас пока до меня дошло что и к чему
http://arduino.ru/forum/programmirovanie/modbus-rtu
Я его не использую в подключении. Я имею ввиду, что на прямую, он работает. А ардуино нет. Вот моя схема подключения.
всё же попробуйте по моей схеме и скетч. Должно заработать
Сейчас попробую и отпишусь.
Подключил по Вашей схеме, залил скетч.
Вот подключил к USB to RS485 на А+ и B- без питания и земли. Работает и показывает значение.
Если я считываю регистр №29, здесь в скобках тоже его прописывать?
В ардуине мало памяти, поэтому в скобках прописываются не номера регитров, а количество, которое будет в обработке. У вас два регистра. Т.е.достаточно [2]. При этом 29 регистр будет иметь индекс массива [0], 1500 будет лежать в [1]. Во всех приведённых вами скечах я ни разу не видел вывода из ардуины в компьютер данных. Как вы собираетесь понять - получила ардуина что то или нет? И как отправлять дальше в комп?
Вот подключил к USB to RS485 на А+ и B- без питания и земли. Работает и показывает значение.
Мне кажется или там у вас на картинке 0 показывает в регистре 29? Дак что же вам не нравится в моем варианте? 0 и должен быть. Считайте по моему методу регистр 30 и получите свои 1500
вот тебе скетч твоего мастера
Всё подключил по схеме, результата нет.
Я не знаю почему оно показывает данные в 30 регистре. Вообще по даташиту, должны храниться в 29 регистре. Если через QModBus я указываю считать 30 регистр, выбивает ошибку. Если указываю считать 29 регистр и выставляю 2 Coils, оно показывает.
В строке 41 попробуй выставить скорость сериала порта 9600 бод. Сюдя по картинке у тебя 9600. Незнаю почему я 19200 поставил.
Вот так надо
041
Serial100.begin(9600);
// софтсериал для модбаса
И еще у тебя точно адрес слейва "1" ?
Да. Тут проблема с самим регистром.
Вот твой код, и мой другой регистр. Считало без проблем. Спасибо огромное за это тебе, кстати.
Подскажите пожалуйста, вот попытался считать 2 регистра сразу. Вроде бы делал всё как у Вас, но оно читает только один, во втором пишет: 0. Если по одному, тогда считывает норм.
Вот код:
Попробуй этот код
в твоем скетче ошибка в строке 115, у тебя там temp=1, а должно быть temp=2
Не помогло. Скетч считывает всё нужные мне регистры. Но по одному, если добавляю еще какой то, не работает.
а ты скетч из сообщения #40 тоже попробовал?
Ну да, скрин из него и сделал.
Вот допустим когда вот так, оно работает, если вывожу в терминал другин переменные, нули пишет.
дак как так то? у тебя опять в строке 111 temp =1, ты точно скетч из сообщения #40 взял? Там у меня temp=2. Это число должно быть равно числу считываемых регистров. Т.е. для последнего выложенного тобой скетча должно быть temp =3
Вот смотри сам.
Щас последний раз скетч выложу для трех регистров, если не поможет, я пас.
Хорошо)
код для 3 регистров
Я так понимаю, Вы пас?)))