- RS-485 серийна комуникация
- Свързване на RS-485 с Arduino
- Модул за конвертор от USB към RS-485
- Просто Modbus Master софтуер
- Необходими инструменти
- Електрическа схема
- Програмиране на Arduino UNO за RS-485 MODBUS Slave
- Тестване на Arduino UNO като Rs485 Modbus Slave
Modbus е протокол за серийна комуникация, който е открит от Modicon през 1979 г. и се използва за предаване на данни по серийни линии между индустриалните електронни устройства. RS-485 Modbus използва RS-485 за далекопроводи. Трябва да се отбележи, че Modbus е софтуерен протокол, а не хардуерен протокол. Той е разделен на две части като Modbus Master и Modbus Slave. В мрежата RS-485 Modbus има един Master и 127 Slaves, всеки с уникален адрес от 1 до 127. В този проект MAX485 Arduino, ние ще използваме Arduino Uno като Slave за серийна комуникация.
Modbus се използват най-вече в PLC (програмируеми логически контролери). И освен това, 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 като Slave. Тук инсталираме Simply Modbus Master Software в компютър и контролираме два светодиода и серво мотор, като използваме RS-485 като преносна линия. Тези светодиоди и серво мотор са свързани със Slave Arduino и се управляват чрез изпращане на стойности с помощта на Master Modbus Software. Тъй като този урок използва 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 е асинхронен сериен комуникационен протокол, който не изисква часовник. Той използва техника, наречена диференциален сигнал за прехвърляне на двоични данни от едно устройство на друго.
И така, какъв е този метод за диференциално предаване на сигнал ??
Методът на диференциалния сигнал работи чрез създаване на диференциално напрежение чрез използване на положителни и отрицателни 5V. Той осигурява Half-Duplex комуникация, когато се използват два проводника, а Full-Duplex изисква 4 проводника.
Като използвате този метод:
- RS-485 поддържа по-висока скорост на трансфер на данни от максимум 30Mbps.
- Той също така осигурява максимално разстояние за трансфер на данни в сравнение с протокола RS-232. Той прехвърля данни до максимум 1200 метра.
- Основното предимство на RS-485 пред RS-232 е множественото подчинено устройство с единичен Master, докато RS-232 поддържа само един подчинен.
- Може да има максимум 32 устройства, свързани към протокол RS-485.
- Друго предимство на RS-485 е имунитетът срещу шума, тъй като те използват метод на диференциален сигнал за трансфер.
- RS-485 е по-бърз в сравнение с протокола I2C.
Свързване на RS-485 с Arduino
Модулът RS-485 може да бъде свързан към всеки микроконтролер със сериен порт. За използване на RS-485 модул с микроконтролери е необходим модул, наречен 5V MAX485 TTL до RS485, който се основава на Maxim MAX485 IC, тъй като позволява серийна комуникация на дълги разстояния от 1200 метра. Той е двупосочен и полудуплекс и има скорост на трансфер на данни от 2,5 Mbps. Този модул изисква напрежение 5V.
Pin-Out на RS-485:
Име на ПИН |
Описание на щифта |
VCC |
5V |
A |
Неинвертиращ вход на приемника Неинвертиращ изход на драйвера |
Б. |
Обръщане на входа на приемника Обръщане на изхода на драйвера |
GND |
GND (0V) |
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 bps до 115200 bps, максимум до 6 Mbps.
За да използвате това устройство, в Интернет има различен софтуер Modbus. В този урок се използва софтуер, наречен Simply Modbus Software.
Просто Modbus Master софтуер
Приложението Modbus Master Software е необходимо за изпращане на данни към подчинено устройство Modbus RS-485 Arduino чрез COM.
Просто Modbus Master е софтуер за тестване на комуникация на данни. Можете да изтеглите Simply Modbus Master от дадената връзка и да научите повече за него, като се обърнете към Ръководство за софтуер.
Преди да използвате софтуера, важно е да се запознаете със следните терминологии.
Идентификатор на роб:
На всеки роб в мрежата се присвоява уникален адрес на единица от 1 до 127. Когато главното устройство изиска данни, първият байт, който той изпраща, е адресът на подчиненото устройство. По този начин всеки роб знае след първия байт дали да пренебрегне съобщението или не.
Код на функцията:
Вторият байт, изпратен от Master, е кодът на функцията. Този номер казва на подчиненото устройство до коя таблица да има достъп и дали да чете от нея или да записва в нея.
Поддържани кодове на регистрационните функции:
Код на функцията |
Действие |
Име на таблицата |
04 (04 шестнадесетичен) |
Прочети |
Регистри за аналогов вход |
03 (03 шестнадесетичен) |
Прочети |
Регистри за съхранение на аналогови изходи |
06 (06 шестнадесетичен) |
Пишете сингъл |
Регистър за задържане на аналогови изходи |
16 (10 шестнадесетични) |
Пишете множество |
Регистри за съхранение на аналогови изходи |
Поддържани кодове за функция на бобина:
Код на функцията |
Действие |
Име на таблицата |
02 (02 шестнадесетичен) |
Прочети |
Дискретни входни контакти |
01 (01 шестнадесетичен) |
Прочети |
Дискретни изходни бобини |
05 (05 шестнадесетичен) |
Пишете сингъл |
Дискретна изходна бобина |
15 (0F шестнадесетичен) |
Пишете множество |
Дискретни изходни бобини |
CRC:
CRC е съкращение от проверка за циклично излишък. Това са два байта, добавени в края на всяко съобщение на Modbus за откриване на грешки.
Необходими инструменти
Хардуер
- Arduino UNO
- Преобразуващ модул MAX-485 TTL към RS-485
- Модул за конвертор от USB към RS-485
- LED (2)
- 1k-резистор (2)
- 16x2 LCD дисплей
- 10k потенциометър
- Серво мотор SG-90
Софтуер
- Просто Modbus Master
Електрическа схема
Схема на връзка между конверторния модул MAX-485 TTL към RS-485 и Arduino UNO:
Arduino UNO |
Преобразуващ модул MAX-485 TTL към RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Връзка на веригата между MAX-485 TTL към RS-485 модул и USB към RS-485 конвертор:
MAX-485 TTL до RS-485 Модул на конвертора |
Модул USB към RS-485 Свързан с компютър |
A |
A |
Б. |
Б. |
Верижни връзки между Arduino UNO и 16x2 LCD дисплей:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
За управление на щифт на потенциометър за контрол на контраст / яркост на LCD 16x2 |
RS |
8 |
RW |
GND |
Е. |
9 |
D4 |
10 |
D5 |
11. |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
К |
GND |
Свързване на веригата между 2 светодиода, серво мотор и Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Серво мотор |
2 |
Анод през 1k резистор |
- |
- |
5 |
- |
Анод през 1k резистор |
- |
6 |
- |
- |
ШИМ щифт (оранжев) |
+ 5V |
- |
- |
+ 5V (ЧЕРВЕН) |
GND |
Катод GND |
Катод GND |
GND (кафяв) |
Програмиране на Arduino UNO за RS-485 MODBUS Slave
Arduino UNO е конфигуриран като Modbus Slave. Също така, Arduino UNO е прикрепен с два светодиода и един серво мотор. Така подчиненият Arduino се управлява от главния софтуер Modbus. Комуникацията между Arduino UNO и Modbus Master Software се осъществява с помощта на модула RS-485. За свързването му с компютър се използва конверторният модул USB към RS-485. И Arduino UNO с конверторния модул MAX-485 TTL към RS-485, цялата настройка ще изглежда като файл:
За използване на Modbus в Arduino UNO, библиотека
Първоначално включете необходимата библиотека. Библиотеката ModbusRTU е за използване на RS-485 Modbus комуникация, а библиотеката с течни кристали е за използване на LCD с Arduino UNO, а серво библиотеката е за използване на серво мотор с Arduino UNO.
#include
Сега LED анодните щифтове, които са свързани с Arduino щифтове 2 и 5, се определят като LED1 и LED2.
#define led1 2 #define led2 5
След това обектът за достъп до клас Liquid Crystal се декларира с LCD щифтовете (RS, E, D4, D5, D6, D7), които са свързани с Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
Когато LCD завърши, инициализирайте серво обект за клас Servo. Също така инициализирайте обект на шина за клас Modbus.
Серво серво; Шина Modbus;
След това за съхранение на стойности за Modbus комуникация се декларира масив с трите стойности, инициализирани с нула.
uint16_t modbus_array = {0,0,0};
При функцията за настройка първо LCD е настроен в режим 16x2 и се показва и изчиства приветствено съобщение.
lcd.begin (16,2); // Lcd настроен в режим 16x2 lcd.print ("RS-485 Modbus"); // Приветствено съобщение lcd.setCursor (0,1); lcd.print ("Arduino Slave"); забавяне (5000); lcd.clear ();
След това щифтовете LED1 и LED2 се задават като изходни щифтове.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Серво импулсният щифт, свързан към PWM щифт 6 на Arduino, е прикрепен.
servo.attach (6);
Сега за комуникацията Modbus са зададени следните параметри. Първият '1' представлява Slave ID, вторият '1' представлява, че използва RS-485 за прехвърляне на данни, а '4' представлява RS-485 DE&RE щифт, свързан с Arduino UNO.
шина = Modbus (1,1,4);
Подчиненото устройство Modbus е настроено на 9600 бод.
Цикълът започва с дефиницията на bus poll и bus.poll () се използва за записване и получаване на стойност от главния Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Този метод се използва за проверка дали има данни на серийния порт.
Ако има данни на серийния порт, библиотеката на Modbus RTU ще провери съобщението (проверете адреса на устройството, дължината на данните и CRC) и ще извърши необходимото действие.
Например, за да напише или прочете каквато и да е стойност от master, ModbusRTU трябва да получи неподписан 16-битов целочислен масив и дължината му от Master Modbus. Този масив носи данните, които са записани от главния.
В този урок има три масива за LED1, LED2 и ъгъл на серво мотора.
Първо за включване или изключване се използва LED1 modbus_array.
if (modbus_array == 0) // Зависи от стойността в modubus_array, написана от Master Modbus { digitalWrite (led1, LOW); // LED ИЗКЛЮЧЕН, ако 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED включен, ако стойност е различна от 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
След това за включване или изключване се използва LED2 modbus_array.
if (modbus_array == 0) // Зависи от стойността в modbus_array, написана от Master Modbus { digitalWrite (led2, LOW); // LED ИЗКЛЮЧЕН, ако 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED включен, ако стойност е различна от 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
След това, за да зададете ъгъла на серво мотора, използваният modbus_array и стойността се отпечатва на LCD дисплея 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Серво ъгъл:"); lcd.print (pwm); забавяне (200); lcd.clear ();
Това завършва програмирането на Arduino UNO за работа като MODBUS Slave. Следващата стъпка ще бъде тестването му като Modbus Slave.
Тестване на Arduino UNO като Rs485 Modbus Slave
След като верижните връзки са завършени и кодът е качен в Arduino UNO, е време да свържете USB към RS-485 модула с компютъра, където е инсталиран софтуерът Simple Modbus Master.
Отворете диспечера на устройствата и проверете COM порта според вашия компютър, където е свързан модулът USB към RS-485 и след това отворете софтуера Simply Modbus Master 8.1.1.
1. След отварянето на Simply Modbus Software отворете опцията Write.
2. След като се отвори Simply Modbus Master Write. Задайте параметрите
Режим в RTU, COM порт според вашия компютър (моят е COM6), Baud при 9600, битове за данни 8, стоп бит 1, паритет Няма и Slave ID като 1.
3. След това задайте първия регистър като 40001 и стойностите за записване са 3, а кодът на функцията - 16 (Write Holding Register).
След това напишете 1 до 40001 (за включен LED1) и 1 до 40002 (за включен LED2) и 90 до 40003 (за ъгъл на серво мотора) и след това щракнете върху бутона ИЗПРАТИ.
Можете да видите както състоянието на LED е ВКЛЮЧЕНО, така и ъгъл на серво при 90 градуса.
4. След това въведете 40001 като 1 и 40002 като 0 и 40003 като 180 и щракнете върху бутона ИЗПРАТИ.
5. Сега записваме 135 на 40003 и 40001 като 0 и 40002 като 1.
Ето как RS-485 Modbus може да се използва в серийната комуникация с Arduino UNO като Slave. В следващия урок ще използваме Arduino Uno като главен в комбинирането на MODBUS.
Намерете пълния код и демонстрационно видео по-долу.