- Последовательная связь RS-485
- Подключение RS-485 к Arduino
- Модуль преобразования USB в RS-485
- Программное обеспечение Simply Modbus Master
- Необходимые инструменты
- Принципиальная электрическая схема
- Программирование Arduino UNO для RS-485 MODBUS Slave
- Тестирование Arduino UNO в качестве ведомого устройства RS485 Modbus
Modbus - это протокол последовательной связи, который был открыт Modicon в 1979 году и используется для передачи данных по последовательным линиям между промышленными электронными устройствами. RS-485 Modbus использует RS-485 для линий передачи. Следует отметить, что Modbus - это программный протокол, а не аппаратный. Он разделен на две части, такие как Modbus Master и Modbus Slave. В сети RS-485 Modbus есть один мастер и 127 подчиненных, каждый с уникальным адресом от 1 до 127. В этом проекте MAX485 Arduino мы будем использовать Arduino Uno в качестве подчиненного устройства для последовательной связи.
Modbus в основном используется в ПЛК (программируемых логических контроллерах). Помимо этого, Modbus также используется в здравоохранении, транспорте, домашней автоматизации и т. Д. Modbus имеет 255 функциональных кодов, и в основном существуют три популярные версии Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
В чем разница между Modbus ASCII и Modbus RTU?
Modbus RTU и Modbus ASCII используют один и тот же протокол. Единственное отличие состоит в том, что байты, передаваемые по сети, представлены как двоичные с RTU и как читаемые ASCII с Modbus RTU. В этом руководстве будет использоваться Modbus RTU.
Это руководство посвящено использованию связи RS-485 Modbus с Arduino UNO в качестве ведомого устройства. Здесь мы устанавливаем программное обеспечение Simply Modbus Master на ПК и контролируем два светодиода и серводвигатель, используя RS-485 в качестве линии передачи. Эти светодиоды и серводвигатель подключены к Slave Arduino и управляются путем отправки значений с помощью программного обеспечения Master Modbus. Поскольку в этом руководстве используется RS-485, рекомендуется сначала пройти через последовательную связь RS485 между Arduino Uno и Arduino Nano. RS485 также может использоваться с другими контроллерами для последовательной связи:
- Последовательная связь RS-485 между Raspberry Pi и Arduino UNO
- Последовательная связь между STM32F103C8 и Arduino UNO с использованием RS-485
Начнем с знакомства с RS-485 и Modbus. Также узнайте больше о различных протоколах последовательной связи здесь.
Последовательная связь RS-485
RS-485 - это протокол асинхронной последовательной связи, не требующий часов. Он использует технику, называемую дифференциальным сигналом, для передачи двоичных данных от одного устройства к другому.
Так что же это за метод передачи дифференциального сигнала ??
Метод дифференциального сигнала работает путем создания дифференциального напряжения с использованием положительного и отрицательного напряжения 5 В. Он обеспечивает полудуплексную связь при использовании двух проводов, а для полудуплексного режима требуется 4 четверти провода.
Используя этот метод:
- RS-485 поддерживает более высокую скорость передачи данных до 30 Мбит / с.
- Он также обеспечивает максимальное расстояние передачи данных по сравнению с протоколом RS-232. Он передает данные на расстояние до 1200 метров.
- Основным преимуществом RS-485 перед RS-232 является наличие нескольких ведомых устройств с одним ведущим устройством, в то время как RS-232 поддерживает только одно ведомое устройство.
- Может иметь до 32 устройств, подключенных к протоколу RS-485.
- Еще одно преимущество RS-485 - невосприимчивость к шуму, поскольку для передачи используется метод дифференциального сигнала.
- RS-485 быстрее по сравнению с протоколом I2C.
Подключение RS-485 к Arduino
Модуль RS-485 может быть подключен к любому микроконтроллеру, имеющему последовательный порт. Для использования модуля RS-485 с микроконтроллерами необходим модуль 5V MAX485 TTL to RS485, основанный на микросхеме Maxim MAX485, поскольку он обеспечивает последовательную связь на большом расстоянии до 1200 метров. Он двунаправленный и полудуплексный со скоростью передачи данных 2,5 Мбит / с. Для этого модуля требуется напряжение 5 В.
Распиновка RS-485:
Имя контакта |
Описание контакта |
VCC |
5В |
А |
Неинвертирующий вход приемника Выходной сигнал неинвертирующего драйвера |
B |
Инвертирование входа приемника Инвертирование выхода драйвера |
GND |
GND (0 В) |
R0 |
Выход приемника (вывод RX) |
RE |
Выход приемника (LOW-Enable) |
DE |
Выход драйвера (HIGH-Enable) |
DI |
Вход драйвера (вывод TX) |
Модуль преобразования USB в RS-485
Это модуль адаптера преобразователя USB в RS485, который поддерживает WIN7, XP, Vista, Linux, Mac OS и обеспечивает простой в использовании интерфейс RS485 за счет использования COM-порта на компьютере . Этот модуль является устройством plug-and-play . Командных структур нет, все, что отправляется на виртуальный COM-порт, автоматически преобразуется в RS485 и наоборот. Модуль полностью автономен от шины USB. Таким образом, для работы нет необходимости во внешнем источнике питания.
Он отображается как последовательный / COM-порт и доступен из приложений или гипер-терминала. Этот преобразователь обеспечивает полудуплексную связь RS-485. Диапазон скорости передачи составляет от 75 до 115200 бит / с, максимум до 6 Мбит / с.
Для использования этого устройства в Интернете доступно различное программное обеспечение Modbus. В этом руководстве используется программное обеспечение под названием Simply Modbus Software.
Программное обеспечение Simply Modbus Master
Приложение Modbus Master Software необходимо для отправки данных на подчиненное устройство Modbus RS-485 Arduino через COM.
Simply Modbus Master - это программа для тестирования передачи данных. Вы можете загрузить Simply Modbus Master по указанной ссылке и узнать о нем больше, обратившись к Руководству по программному обеспечению.
Перед использованием программного обеспечения важно ознакомиться со следующей терминологией.
ID ведомого:
Каждому ведомому устройству в сети назначается уникальный адрес устройства от 1 до 127. Когда ведущее устройство запрашивает данные, первый байт, который он отправляет, является адресом ведомого. Таким образом, каждое ведомое устройство после первого байта знает, игнорировать сообщение или нет.
Код функции:
Второй байт, посланный мастером, - это код функции. Этот номер сообщает ведомому устройству, к какой таблице получить доступ и следует ли читать из таблицы или писать в нее.
Поддерживаемые коды функций регистра:
Код функции |
Действие |
Имя таблицы |
04 (04 шестн.) |
Читать |
Регистры аналогового ввода |
03 (03 шестнадцатеричный) |
Читать |
Регистры хранения аналогового вывода |
06 (06 шестн.) |
Написать сингл |
Регистр хранения аналогового выхода |
16 (10 шестн.) |
Написать несколько |
Регистры хранения аналогового вывода |
Поддерживаемые коды функций катушки:
Код функции |
Действие |
Имя таблицы |
02 (02 шестн.) |
Читать |
Дискретные входные контакты |
01 (01 шестнадцатеричный) |
Читать |
Катушки с дискретным выходом |
05 (05 шестн.) |
Написать сингл |
Катушка дискретного выхода |
15 (0F шестнадцатеричный) |
Написать несколько |
Катушки с дискретным выходом |
CRC:
CRC расшифровывается как Cyclic Redundancy check. Это два байта, добавляемых в конец каждого сообщения Modbus для обнаружения ошибок.
Необходимые инструменты
Оборудование
- Arduino UNO
- Модуль преобразователя MAX-485 TTL в RS-485
- Модуль преобразования USB в RS-485
- Светодиод (2)
- Резистор 1k (2)
- ЖК-дисплей 16x2
- Потенциометр 10k
- Серводвигатель SG-90
Программного обеспечения
- Просто Modbus Master
Принципиальная электрическая схема
Схема соединения между модулем преобразователя MAX-485 TTL в RS-485 и Arduino UNO:
Arduino UNO |
Модуль преобразователя MAX-485 TTL в RS-485 |
0 (RX) |
RO |
1 (Техас) |
DI |
4 |
DE и RE |
+ 5В |
VCC |
GND |
GND |
Схема подключения между MAX-485 TTL и модулем RS-485 и преобразователем USB в RS-485:
MAX-485 TTL в RS-485 Модуль преобразователя |
Модуль USB для RS-485 Подключен к ПК |
А |
А |
B |
B |
Схема соединений между Arduino UNO и ЖК-дисплеем 16x2:
ЖК-дисплей 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5В |
V0 |
Для управления контактом потенциометра для регулировки контрастности / яркости ЖК-дисплея 16x2 |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
А |
+ 5В |
K |
GND |
Цепное соединение между 2 светодиодами, серводвигателем и Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Серводвигатель |
2 |
Анод через резистор 1к |
- |
- |
5 |
- |
Анод через резистор 1к |
- |
6 |
- |
- |
Штифт ШИМ (оранжевый) |
+ 5В |
- |
- |
+ 5В (КРАСНЫЙ) |
GND |
Катод GND |
Катод GND |
GND (коричневый) |
Программирование Arduino UNO для RS-485 MODBUS Slave
Arduino UNO настроен как ведомый Modbus. Также к Arduino UNO прилагаются два светодиода и один серводвигатель. Таким образом, подчиненный Arduino управляется с помощью главного программного обеспечения Modbus. Связь между Arduino UNO и программным обеспечением Modbus Master осуществляется с помощью модуля RS-485. Для подключения к ПК используется модуль преобразователя USB в RS-485. И для Arduino UNO с модулем преобразователя MAX-485 TTL в RS-485 вся установка будет выглядеть следующим образом:
Для использования Modbus в Arduino UNO, библиотека
Первоначально включите необходимую библиотеку. Библиотека ModbusRTU предназначена для использования связи RS-485 Modbus, жидкокристаллическая библиотека предназначена для использования ЖК-дисплея с Arduino UNO, а библиотека сервомотора предназначена для использования серводвигателя с Arduino UNO.
#включают
Теперь выводы анода светодиода, которые соединены с выводами 2 и 5 Arduino, определены как LED1 и LED2.
#define led1 2 #define led2 5
Затем объявляется объект для доступа к классу Liquid Crystal с выводами ЖК-дисплея (RS, E, D4, D5, D6, D7), которые подключены к Arduino UNO.
ЖК-дисплей LiquidCrystal (8,9,10,11,12,13);
Когда ЖК-дисплей готов, инициализируйте объект серво для класса Servo. Также инициализируйте объект шины для класса Modbus.
Серво сервопривод; Шина Modbus;
Затем для хранения значений для связи Modbus объявляется массив с тремя значениями, инициализированными нулем.
uint16_t modbus_array = {0,0,0};
В функции настройки сначала ЖК-дисплей устанавливается в режим 16x2, а приветственное сообщение отображается и очищается.
lcd.begin (16,2); // ЖК- дисплей установлен в режим 16x2 lcd.print ("RS-485 Modbus"); // Приветственное сообщение lcd.setCursor (0,1); lcd.print («Подчиненное устройство Arduino»); задержка (5000); lcd.clear ();
После этого выводы LED1 и LED2 устанавливаются как выходные выводы.
pinMode (led1, ВЫХОД); pinMode (светодиод2, ВЫХОД);
Вывод сервоимпульса, подключенный к выводу 6 PWM Arduino, прикреплен.
сервопривод (6);
Теперь для связи Modbus установлены следующие параметры. Первая цифра «1» представляет собой идентификатор ведомого устройства, вторая цифра «1» означает, что он использует RS-485 для передачи данных, а «4» представляет собой вывод RS-485 DE&RE, подключенный к Arduino UNO.
шина = Modbus (1,1,4);
Ведомое устройство Modbus настроено на скорость 9600 бод.
Цикл начинается с определения опроса шины, а bus.poll () используется для записи и получения значения от ведущего Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Этот метод используется для проверки наличия каких-либо данных через последовательный порт.
Если в последовательном порту есть какие-либо данные, библиотека Modbus RTU проверит сообщение (проверьте адрес устройства, длину данных и CRC) и выполнит необходимое действие.
Например, чтобы записать или прочитать любое значение от ведущего устройства, ModbusRTU должен получить массив беззнаковых 16-битных целых чисел и его длину от ведущего Modbus. Этот массив содержит данные, записанные мастером.
В этом руководстве есть три массива для LED1, LED2 и угла серводвигателя.
Сначала для включения или выключения используется LED1 modbus_array.
if (modbus_array == 0) // Зависит от значения в modubus_array, записанного ведущим Modbus { digitalWrite (led1, LOW); // светодиод не горит, если 0 lcd.setCursor (0,0); lcd.print ("L1: ВЫКЛ"); } else { digitalWrite (led1, HIGH); // светодиод горит, если значение отличается от 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Затем для включения или выключения используется LED2 modbus_array.
if (modbus_array == 0) // Зависит от значения в modbus_array, записанного мастером Modbus { digitalWrite (led2, LOW); // светодиод не горит, если 0 lcd.setCursor (8,0); lcd.print ("L2: ВЫКЛ"); } else { digitalWrite (led2, HIGH); // Светодиод горит, если значение отличается от 0 lcd.setCursor (9,0); lcd.print ("L2: ВКЛ"); }
Затем, чтобы установить угол серводвигателя, используется modbus_array, и значение печатается на ЖК-дисплее 16x2.
int pwm = modbus_array; серво. запись (ШИМ); lcd.setCursor (0,1); lcd.print ("Угол сервопривода:"); lcd.print (ШИМ); задержка (200); lcd.clear ();
На этом завершается программирование Arduino UNO для работы в качестве ведомого устройства MODBUS. Следующим шагом будет тестирование его как Modbus Slave.
Тестирование Arduino UNO в качестве ведомого устройства RS485 Modbus
После того, как соединения схемы завершены и код загружен в Arduino UNO, самое время подключить модуль USB к RS-485 с ПК, на котором установлено программное обеспечение Simple Modbus Master.
Откройте диспетчер устройств и проверьте COM-порт в соответствии с вашим ПК, к которому подключен модуль USB к RS-485, а затем откройте программное обеспечение Simply Modbus Master 8.1.1.
1. После открытия программного обеспечения Simply Modbus откройте опцию записи.
2. После открытия окна Simply Modbus Master Write. Установите параметры
Режим в RTU, COM-порт в соответствии с вашим ПК (у меня был COM6), скорость в бодах 9600, биты данных 8, стоповый бит 1, четность нет и идентификатор ведомого как 1.
3. После этого установите для первого регистра значение 40001, значение для записи - 3, а код функции - 16 (запись в регистр временного хранения).
После этого запишите от 1 до 40001 (если LED1 включен), от 1 до 40002 (если LED2 включен) и от 90 до 40003 (для угла серводвигателя), а затем нажмите кнопку SEND.
Вы можете видеть, что светодиодный индикатор горит, а угол сервопривода составляет 90 градусов.
4. После этого введите 40001 как 1 и 40002 как 0 и 40003 как 180 и нажмите кнопку ОТПРАВИТЬ.
5. Теперь записываем 135 в 40003 и 40001 как 0 и 40002 как 1.
Вот как можно использовать RS-485 Modbus для последовательной связи с Arduino UNO в качестве ведомого устройства. В следующем уроке мы будем использовать Arduino Uno в качестве ведущего в соединении MODBUS.
Найдите полный код и демонстрационное видео ниже.