Прикладной уровень
Прикладной уровень обеспечивает обмен данными между устройствами ведущий-ведомый. Он основан на обращении с помощью кодов функций к регистрам данных для чтения/записи значений.
Протокол Modbus определяет четыре типа данных:
Тип данных | Размер | Доступ | Номер регистра | Диапазон адресов |
Discrete Inputs Дискретные входы | 1 бит | только чтение | 10001…19999 | 0 — 65535 |
Coils Регистры флагов | 1 бит | чтение и запись | 00001…09999 | 0 — 65535 |
Input Registers Регистры ввода | 16-битное слово | только чтение | 30001…39999 | 0 — 65535 |
Holding Registers Регистры хранения | 16-битное слово | чтение и запись | 40001…49999 | 0 — 65535 |
Дискретные входы (Discrete Inputs) – представляют однобитовые регистры (0 или 1), хранящие состояние дискретных входов устройства. Эти регистры поддерживают только чтение.
Регистры флагов (Coils) также представляют собой однобитовые регистры, но хранящие состояние дискретных выходов устройств. Допускают как чтение, так и запись.
Регистры ввода (Input Registers) представлены 16-битовым знаковым или беззнаковым типом. Используются для работы с входными данными, например аналоговыми значениями входов. Поддерживают только чтение.
Регистры хранения (Holding Registers) представлены 16-битовым знаковым или беззнаковым типом. Поддерживают как чтение, так и запись данных.
Схема проекта
Схема для последовательной связи по протоколу Modbus RS-485 с платой Arduino представлена на следующем рисунке.
В следующей таблице представлены необходимые соединения между платой Arduino Uno (ведомой) и модулем MAX485 TTL to RS485.
Arduino Uno | Модуль MAX485 TTL to RS485 |
0(RX) | RO |
1(TX) | DI |
4 | DE & RE |
+5V | VCC |
GND | GND |
В следующей таблице представлены необходимые соединения между модулями MAX485 TTL to RS485 и USB to RS-485.
MAX485 TTL to RS485 | USB to RS-485 |
A | A |
B | B |
В следующей таблице представлены необходимые соединения между платой Arduino Uno и ЖК дисплеем 16х2.
ЖК дисплей 16х2 | Плата Arduino Uno |
VSS | GND |
VDD | +5V |
V0 | к потенциометру для управления яркостью/контрастностью дисплея |
RS | 8 |
RW | GND |
E | 9 |
D4 | 10 |
D5 | 11 |
D6 | 12 |
D7 | 13 |
A | +5V |
K | GND |
В следующей таблице представлены необходимые соединения между платой Arduino Uno, светодиодами и сервомотором.
Arduino Uno | 1-й светодиод | 2-й светодиод | сервомотор |
2 | Anode через 1k resistor | – | – |
5 | – | Anode через 1k resistor | – |
6 | – | – | PWM pin (Orange) |
+5V | – | – | +5V (RED) |
GND | Cathode GND | Cathode GND | GND (Brown) |
Со схемой разобрались, можно переходить к написанию программы.
Начало
На предприятии нужно было автоматизировать сбор показаний с электросчетчиков, порядка двадцати штук. Сделать это требовалось быстро и максимально дешево. Поэтому приняли решение собирать данные с помощью уже развернутого Zabbix, а вот для подключения к счетчику потребовалось написать небольшой скрипт, об этом ниже. Так вышло, что сбор показаний, это лишь один из параметров, который нужно собирать, за остальные отвечает ПК с Debian на борту, поэтому не было сложности подключиться к счетчику через COM-порт. Конечно, для большинства, будет удобнее использовать локальную сеть и получить информацию с промышленного коммутатора или конвертера интерфейсов. Из вариантов подключения также можно рассматривать оптопорт, правда потребуется приобретать дополнительный девайс, с другой стороны — не нужно снимать пломбу.
Коды ошибок
Вместо корректного ответа, содержащего запрошенные данные, ведомое устройство может переслать ответ с ошибкой. При этом к коду функции в ответе добавляется код 0×80 в формате hex, то есть в данном случае к коду функции 03 добавляется 80 и признак ошибки будет иметь значение 83.
Кроме того отсылается код ошибки:
- 01 — функция не поддерживается. Это значит, что, возможно, функция не стандартная или просто не реализована конкретно в этом устройстве.
- 02 — запрошенная область памяти не доступна. Каждое устройство содержит определённое количество данных определённого типа. Например, в устройстве доступно 100 регистров общего назначения. Если при этом запросить чтение 101 регистров, то возникнет ошибка 02.
- 03 — функция не поддерживает запрошенное количество данных. Например, функция Read Holding Registers позволяет считывать от 1 до 2000 регистров общего назначения. Поэтому, даже если в подчинённом устройстве доступно для чтения 10 000 регистров, при запросе более 2000 с помощью данной функции возникает эта ошибка.
- 04 — функция выполнена с ошибкой. Этот код отсылается в случае, если ошибка не относится к трем предыдущим кодам.
Пример запроса
Предположим, нам надо обратиться к устройству с адресом 17 и получить значение аналогового выхода с помощью Holding Register из регистров 40108 до 40110, то есть значение 3-х регистров. В этом случае, запрос от ведущего устройства к ведомому будет представлен в следующем виде:
11 03 006B 0003 7687
- 11 — Адрес ведомого устройства в формате HEX (17=11 hex)
- 03 — Функция Read Holding Registers, считываем значение нескольких регистров хранения
- 006B — Адрес первого регистра (40108-40001 = 107 = 6B hex, смещение регистра)
- 0003 — Количество считываемых регистров ( 3 регистра с 40108 до 40110)
- 7687 — Контрольная сумма CRC
Ведомое устройство должно переслать следующий ответ:
11 03 06 AE41 5652 4340 49AD
- 11 — Адрес устройства
- 03 — Функция Read Holding Registers
- 06 — Количество байт (6 байтов идут следом)
- AE — Значение старшего разряда регистра в hex (Register value Hi-AO0)
- 41 — Значение младшего разряда регистра в hex (Register value Lo-AO0)
- 56 — Значение старшего разряда регистра в hex (Register value Hi-AO1)
- 52 — Значение младшего разряда регистра в hex (Register value Lo-AO1)
- 43 — Значение старшего разряда регистра в hex (Register value Hi-AO2)
- 40 — Значение младшего разряда регистра в hex (Register value Lo-AO2)
- 49 — Контрольная сумма (CRC value Lo)
- AD — Контрольная сумма (CRC value Hi)
Использование интерфейса RS-485 в Arduino
Для использования интерфейса RS-485 в плате Arduino мы будем использовать модуль 5V MAX485 TTL to RS485, в основе которого лежит микросхема Maxim MAX485. Модуль является двунаправленным и обеспечивает последовательную связь на расстояние до 1200 метров. В полудуплексном режиме он обеспечивает скорость передачи данных 2,5 Мбит/с.
Модуль 5V MAX485 TTL to RS485 использует питающее напряжение 5V и логический уровень напряжения также 5V, что позволяет без проблем подключать его к платам Arduino.
Данный модуль имеет следующие особенности:
- работает с напряжениями 5V;
- имеет в своем составе чип MAX485;
- отличается низким энергопотреблением;
- всеми его контактами можно управлять с помощью микроконтроллера;
- размеры платы модуля: 44 x 14mm.
Внешний вид модуля RS-485 показан на следующем рисунке.
Назначение контактов (распиновка) модуля RS-485 приведена в следующей таблице.
Название контакта | Назначение контакта |
VCC | 5V |
A | вход/выход линии RS-485 |
B | вход/выход линии RS-485 |
GND | GND (0V) |
R0 | выход приемника (RX pin) |
RE | разрешение работы приемника |
DE | разрешение работы передатчика |
DI | вход передатчика (TX pin) |
Как видите, контакты на модуле RS-485 расположены очень логично – с одной стороны к модулю подключается устройство, а с другой – линия.
Что такое RS-485
RS-485 — это стандарт физического уровня. Что это означает? Он определяет следующие параметры общения устройств:
- связь кабелем «витая пара» по двум жилам
- максимальная длина кабеля 1200 метров
- дискретные сигналы (либо 1, либо 0)
- если напряжение жилы А больше напряжения жилы В более, чем на 200 милливольт, то сигнал считается единицей. Если наоборот, то нулем
- скорость общения может быть до 1 мегабита в секунду по одной витой паре и до 10 мегабит по двум витым парам
- максимальный ток в шине 250 миллиампер
- напряжение от -7 до +12 вольт постоянного тока
- в один момент времени может передавать информацию только одно устройство в сети
То есть, стандарт подразумевает, что на 2-проводную шину (одну витую пару) можно подключить множество устройств. Он не описывает никакой язык общения оборудования.
Пошаговая инструкция по установке электросчетчика Меркурий 201
В далеком прошлом остались те времена, когда начисление платы за электроэнергию осуществлялось на основании мощности осветительной техники и прочего электрооборудования, находящегося в помещении. В настоящее время наличие прибора учета электрической энергии является обязательным условием для подключения потребителя к общим сетям электроснабжения. Современные электросчетчики позволяют с высокой точностью определять количество израсходованной электроэнергии и рассчитывать плату за ее использование.
Но иногда эти надежные устройства полностью выходят из строя и подлежат замене. В этом случае вам необходимо подключить новый прибор, регистрирующий количество израсходованных кВт/часов электроэнергии. Замена электросчетчика не очень сложная операция, но если вы ничего не понимаете в электротехнике, то обратитесь к специалисту-электрику, чтобы избежать непоправимых ошибок. В том случае, если вы все же решились установить электросчетчик собственными руками, то следует подобрать надежное устройство и тщательно изучить схему подключения прибора в электрощите.
Самыми популярными приборами учета электроэнергии на рынке являются устройства от . К ним относятся однофазные электросчетчики Меркурий 201 и трехфазные Меркурий 230. Они обладают высокой точностью, надежностью, устойчивостью к перегрузкам, низким энергопотреблением и длительным сроком эксплуатации. В этой статье мы рассмотрим следующие вопросы: схема подключения счетчика Меркурий как однофазного, так и трехфазного, а также как подключить счетчик Меркурий 201.
Режим RS485
В этом режиме контроллер сам вычисляет контрольную сумму (CRC16 Modbus) запроса, а также проверяет контрольную сумму ответа.
Пример команды для запроса у счетчика DDS238-1 ZN значения текущего напряжения в сети.
http://192.168.0.14/sec/?uart_tx=0103000C0001&mode=rs485
Команду можно “расшифровать” следующим образом:
, где
– адрес устройства SlaveID. По умолчанию 01.
– функциональный код чтения AO (Analog Output)
– адрес регистра, который следует считать со счетчика. Указывается в документации к счетчику или другому устройству
– количество запрашиваемых регистров (каждый регистр может возвражать 2 байта)
Как уже было сказано, CRC считается автоматически.
Теперь необходимо получить результат.
http://192.168.0.14/sec/?uart_rx=1&mode=rs485
Контроллер возвращает результат также 16-ричном формате в символьном представлении. Но для удобства разбора данных на стороне сервера, каждый байт разделяется символом “|”.
01|03|02|08|a1
Ответ стоит интерпретировать так:
– адрес устройства SlaveID
– функциональный код
– количество возвращаемых байт
– в данном случае значение напряжения 0x08a1 или в десятичном представлении 2209 (220,9В)
Если контроллер выявил сбой в передаче данных (контрольная сумма не совпала), то он возвращает сообщение: CRC Error.
Учитывая все вышесказанное, можно разработать простейшую программу, для считывания данных со счетчика с помощью контроллера MegaD-2561.
Пример кода на языке PHP.
while (true) { $res = file_get_contents("http://192.168.0.14/sec/?uart_tx=0103000C0001&mode=rs485"); usleep(100000); $res = file_get_contents("http://192.168.0.14/sec/?uart_rx=1&mode=rs485"); if ( $res != 'CRC Error' ) { $data = explode("|", $res); $voltage = number_format(hexdec($data.$data) / 10, 1); echo "Текущее напряжение: ".$voltage."В"; } else echo "Ошибка CRC"; sleep(1); }
Программа в бесконечном цикле раз в секунду считывает и выводит на экран значение напряжения сети.
Важно обратить внимание, что между отправкой команды и запросом ответа установлена пауза в 0,1с. Эта небольшая пауза необходима, чтобы сеанс связи между контроллером и счетчиком успел завершиться, так как скорость RS-485 существенно ниже, чем скорость Ethernet
Таким образом можно считывать любые другие регистры из счетчика электроэнергии:
- Общее потребление электроэнергии (Регистры 0x00-0x01)
- Текущее напряжение, В (0x0C)
- Текущее значение тока, А (0x0D)
- Текущая активная мощность, Вт (0x0E)
- Текущая реактивная мощность, ВА (0x0F)
- CosF (0x10)
- Частота, Гц (0x11)
Стоит отметить, что к шине RS-485 можно подключить несколько различных или однотипных устройств, имеющих разные адреса.
Для смены адреса в устройства необходимо отправить соответствующие команды.
Например, для смены адреса (SlaveID) счетчика DDS238-1 ZN необходимо отправить команду: 011000150001020301
Здесь предпоследний байт – новый SlaveID. Был 01, станет 03.
Таким образом к одному контроллеру на шину RS-485 можно подключить 248 устройств (0-247), адреса (248-255) зарезервированы.
Тестирование работы проекта
После того, как все необходимые соединения в проекте сделаны, программа загружена в плату Arduino и на компьютере установлена программа Simple Modbus Master, откройте диспетчер устройств на вашем компьютере и посмотрите там к какому COM порту подключен модуль преобразования USB в RS-485. После этого запустите программу Simply Modbus Master 8.1.1. Затем выполните следующую последовательность шагов.
1. В программе Simply Modbus откройте опции записи (Write option).
2. После этого установите параметры записи в программе Simply Modbus Master: режим RTU, COM порт к которому подключен модуль преобразования USB в RS-485 (в нашем случае это COM6), скорость 9600 бод, 8 бит данных, 1 стоповый бит, отсутствие бита четности (Parity None) и идентификатор ведомого (Slave ID) равный 1.
3. После этого установите в первом регистре (first register) значение 40001, число передаваемых значений (values) равное 3 и функциональный код (function code) равный 16 (Write Holding Register).
После этого запишите 1 в 40001 (для включения первого светодиода), 1 в 40002 (для включения второго светодиода) и 90 в 40003 (для задания угла поворота оси сервомотора), затем нажмите кнопку SEND (передать) – см. рисунок.
После этого вы увидите как загорятся оба светодиода, а сервомотор повернется на 90 градусов.
4. После этого запишите 1 в 40001, 0 в 40002 и 180 в 40003.
В результате этой операции первый светодиод включится, второй – выключится, а сервомотор повернется на угол 180 градусов.
5. Теперь запишите 135 в 40003, 0 в 40001 и 1 в 40002.
Вы увидите что сервомотор повернется на угол 135 градусов, первый светодиод выключится, а второй – включится.
Коды функций
Для доступа к данным области памяти используются коды функций. Несмотря на то, что стандартных кодов существует довольно много, в основном используются следующие коды функций:
Код функции | HEX | Название | Действие |
1 | 0×01 | Read Coils | Чтение значений нескольких регистров флагов |
2 | 0×02 | Read Discrete Inputs | Чтение значений нескольких дискретных входов |
3 | 0×03 | Read Holding Registers | Чтение значений нескольких регистров хранения |
4 | 0×04 | Read Input Registers | Чтение значений нескольких регистров ввода |
5 | 0×05 | Write Single Coil | Запись одного регистра флагов |
6 | 0×06 | Write Single Register | Запись одного регистра хранения |
15 | 0x0F | Write Multiple Coils | Запись нескольких регистров флагов |
16 | 0×10 | Write Multiple Register | Запись нескольких регистров хранения |
Из таблицы понятно, что например для Discrete Inputs используется только функция 02, для Coils уже можно использовать либо 01 функцию для чтения, либо 05 для записи одного регистра, либо 15 для записи группы регистров и т.д.
Адреса регистров
Доступ к регистрам данных из таблицы осуществляется при помощи 16-ти битного адреса. Первому элементу соответствует адрес 0. Таким образом, каждая из этих 4-х таблиц может включать в себя до 65536 регистров (адреса 0…65535 – 16 бит).
Нумерация регистров представлена в виде десятичных значений. Для обращения к адресу требуемого регистра необходимо указать так называемое смещение (offset) — убрать первую цифру из номера регистра и вычесть единицу. Например в Holding Registers нумерация начинается с 40001. Отбросим значение 4 и вычтем из единицы единицу. Таким образом адрес регистра будет равен 0.
Что такое RS-232
Другой стандарт, тоже по кабелю «витая пара». Не буду перечислять все параметры стандарта, он используется достаточно мало сейчас. В частности, все помнят мышки, которые подключались к компьютеру через широкий COM-порт, вот это как раз была связь по RS-232. К контроллерам EasyHomePLC и Beckhoff подключается GSM модем для приёма и отправки смс как раз через порт RS-232. Длина кабеля совсем небольшая.
Существуют переходники с RS-232 на RS-485 и обратно. Мы получаем возможность подключить на порт RS-232 что-то, что подключается по RS-485 или сделать длинную линию связи для устройств RS-232, поставив в начале линии переходник на 485, а в конце обратно.
Канальный уровень
Канальный уровень отвечает за создание, прием и передачу пакетов данных в сети. Запросы по Modbus RTU поступают от устройства-мастера к подчиненным устройствам в виде пакетов данных (фреймов, кадров), состоящих из адреса подчиненного устройства, кода функции, данных и контрольной суммы.
Адрес устройства — это имя идентификатор, благодаря которому ведущее устройство может определить, от какого модуля пришел ответ на запрос, а подчиненные устройства отвечают только на те запросы, которые поступили в их адрес. Благодаря этому в сети не возникает конфликтов при передаче данных. Каждое устройство должно иметь свой уникальный адрес с 1 по 247, с 248 по 255 адреса зарезервированы. В сети не должно быть устройств с одинаковыми адресами. Адрес 0 является широковещательным и предназначен для передачи информации всем устройствам в сети. Запрос с нулевым адресом устройства не предполагает ответа.
Код функции передает команду, которую должно выполнить устройство. Стандартом предусмотрено три категории кодов функций: стандартные, задаваемые пользователем и зарезервированные.
Данные содержат необходимую информацию для выполнения заданной функции или значения данных, передаваемые ведомым устройством в ответ на запрос ведущего.
Контрольная сумма служит для проверки отсутствия ошибок в передаваемых данных. В Мodbus RTU используется 2 байта контрольной суммы. Проверка осуществляется на основе алгоритма CRC16 (циклический избыточный код), который проверяет целостность данных пакетов.
Передача сообщений в Мodbus RTU представлена в следующем формате:
Посылка сообщения всегда начинается со стартового бита — бита с нулевым уровнем. Затем идут 8 бит данных младшим битом вперед, бит четности, служащий для проверки общей чётности двоичного числа и заканчивается сообщение битом с единичным уровнем — стоповым битом. Бит четности (parity bit) обеспечивает контроль целостности передаваемых данных. При контроле по чётности (even parity) к данным добавляется бит чётности, значение которого делает полученную сумму чётной, при контроле по нечётности (odd parity) полученная сумма должна стать нечётной. Бит четности не является обязательным и может вообще отсутствовать в сообщении. В этом случае вместо бита четности используется второй стоповый бит.
Физический уровень
На физическом уровне на базе последовательных интерфейсов связи RS-232, RS-485 реализованы протоколы Modbus RTU и Modbus ASCII. Передача данных по протоколу Modbus TCP осуществляется на основе сетей Ethernet через TCP/IP соединение. Далее рассмотрим структуру протокола Modbus RTU, как наиболее часто используемого.
Остановимся немного подробнее на этих терминах — интерфейс, протокол.
Интерфейсы передачи данных обеспечивают физическое подключение устройств в сети, то есть в данном случае они обеспечивают необходимые электрические параметры линии связи и другие параметры, связанные с передачей сигнала от одного устройства к другому, но при этом ничего не сообщают о том, как устройства должны обмениваться данными. За это отвечает протокол передачи данных, который определяет правила пересылки пакетов данных в сети.
На практике наиболее часто встречаются сети на основе интерфейса RS-485, для которых характерны следующие особенности построения:
- Шинная топология сети — сетевая архитектура, предусматривающая последовательное подключение устройств к линии.
Согласно спецификации, на линию с максимальным расстоянием 1200 м можно подключить до 32 устройств. Если протяженность линии превышает это значение, либо необходимо подключение большего количества устройств, то применяются повторители интерфейса (репитеры). Благодаря этому количество опрашиваемых устройств в сети может увеличиться до 247 и протяженность линии увеличиться еще на 1200 м. - Двухпроводная линия передачи данных. Интерфейс RS-485 подразумевает дифференциальный способ передачи данных, то есть по одному проводу передается оригинальный сигнал, а по второму- инвертированный, то есть если на одном проводе единица, то на другом ноль и наоборот. Таким образом между ними всегда присутствует разность потенциалов. При разности напряжений более 200мВ, до +12В считается, что на линии установлено значение логической единицы, при значении напряжения менее -200мВ до -7В — логического нуля.
- Для соединения шины стандарт предписывает применение экранированной витой пары с волновым сопротивлением 120 Ом, где два провода используются для передачи данных, а третий в качестве общего GND, для выравнивания потенциалов устройств. Общий провод и экран должны заземляться в одной точке. Особенно эти требования актуальны для линий с большой протяженностью.
- Установка согласующих (терминальных) резисторов, примерно такого же номинала, как волновое сопротивление кабеля, на концах линии. В некоторых случаях терминальные резисторы уже встроены в само устройство и их включение в линию и выключение осуществляется джамперами.
Termite
Следующим в нашем списке будет терминал Termite от S2-Team. Termite является специализированный Modbus терминалом. Это означает, что он сам будет считать за вас CRC, распознавать сообщения об ошибках в ответах и т.д., ваша задача заключается в том, чтобы ввести корректное тело запроса в поле команды.
Функция | Наличие | Комментарий |
---|---|---|
Поддержка настроек COM-порта | + | |
Настройка таймаутов | + | Доступны: время ожидания ответа, время между символами и кадрами |
Поддержка стандартного Modbus | + | |
Поддержка нестандартного Modbus | + | |
Авто-опрос одного / нескольких устройств | + / + | |
Настройка авто-опроса | + | Доступно: время между запросами |
Логирование сессии / настройка логирования | + / – | |
Создание профилей для быстрого переключения между настройками порта | + | |
Работа в режиме сниффер | – | |
Лицензия продукта | Есть платная и бесплатная версии | Бесплатная версия обладает ограниченным функционалом (на количество каналов, одновременно ведомых лог файлов и количество разных запросов в авто-опросе) |
Сопровождение продукта | + |
Достоинства: поддержка всех Modbus-функций, работа с нестандартным Modbus, удобная система подсказок, возможность настройки внешнего вида ПО, поддержка профилей для быстрого переключения между настройками порта.
Недостатки: PRO версия платная (одна лицензия $ 10), в текущем релизе нет возможности гибко настраивать логирование.
Версии Modbus — TCP и RTU
Ещё раз обозначим разницу между версиями связи по ModBus.
Modbus RTU, он же Modbus Serial — работа по RS-485 или RS-232. Подключение устройств по витой паре, где контроллер мастер, а остальные устройства — слейвы, которые не могут сами инициировать связь. Самый распространённый вариант связи.
Modbus TCP или Modbus TCP/IP — общение устройств происходит по обычной компьютерной сети TCP/IP, включающей работу через интернет и через Wi-Fi. То есть, возможна связь между устройствами на любом расстоянии, когда оба подключены к интернет.
Есть ещё несколько разновидностей: Modbus RTU/IP (отличается от TCP наличием контрольной суммы), Modbus over UDP, Modbus Plus (собственный протокол фирмы Schneider Electric, в сети могут быть несколько мастеров).
Ещё небольшая статья про работу устройств по протоколу Modbus в системах Умный Дом: RS-485 Modbus в системах Умного Дома.
23,512 просмотров всего, 24 просмотров сегодня
Я занимаюсь проектированием систем Умный Дом, электроснабжения и слаботочных систем для квартир и загородных домов. Любые вопросы высылайте, пожалуйста, на адрес mail@home-matic.ru.
Нашли в тексте орфографическую ошибку? Выделите кусок текста с ошибкой и нажмите Ctrl+Enter, я исправлю. Спасибо!
Похожие посты:
- Входы и выходы контроллера (ПЛК)6+ Входы и выходы — это базовое понятие любого контроллера.
- Контроллер EasyHomePLC для недорогого Умного Дома1+ Я несколько раз уже упоминал контроллер EasyHomePLC, на базе.
- Умный Дом на центральном контроллере (ПЛК)4+ Небольшой ликбез про построение системы Умный Дом на центральном.
- Что можно установить из Умного Дома1+ Поскольку далеко не все разбираются в том, что умеет.
- Ещё раз о диммировании освещения с Умного Дома4+ Ещё раз коснёмся актуального вопроса диммирования светильников, особенно светодиодных.
- EasyHome и голосовое управление + OpenHAB1+ Произошёл достаточно серьёзный прорыв в развитии программного обеспечения EasyHome.
- Что такое ШИМ — максимально просто1+ Принцип ШИМ часто встречается в системе Умный Дом, поэтому.
Что такое Modbus
Modbus – протокол, работающий по принципу «клиент-сервер». Широко применяется в промышленности для межмашинного взаимодействия и не только. Протокол Modbus был разработан в 1979 году. Modbus может использоваться для передачи данных через последовательные линии связи RS-485, RS-422, RS-232, а также через сети TCP/IP. В данной статье мы рассмотрим его использование на примере линии RS-485. Достаточно подробно протокол Modbus описан в соответствующей статье Википедии. Также неплохое описание протокола Modbus есть в этом документе (уже не помню откуда его скачал но его автору отдельное спасибо).
Modbus RS-485 использует линию последовательной связи RS-485 для передачи данных. Modbus является программным (не аппаратным) протоколом и состоит из двух частей: Modbus Master (ведущий) и Modbus Slave (ведомый). В сети Modbus RS-485 может быть один ведущий и 127 ведомых устройств, каждое из которых имеет уникальный адрес от 1 до 127. Master адреса не имеет – он в сети может быть только один.
Modbus чаще всего используется в программируемых логических контроллерах (PLCs – Programmable Logic Controllers). Но также он широко применяется в медицине, транспорте, проектах автоматизации дома и т.п. Modbus имеет 255 функциональных кодов. Наиболее распространены 3 версии данного протокола:
- MODBUS RTU;
- MODBUS ASCII;
- MODBUS/TCP.
Какая разница между протоколами Modbus ASCII и Modbus RTU? По сути, это практически одинаковые протоколы. Только в протоколе Modbus RTU данные передаются последовательно в двоичном коде, а в Modbus ASCII – в ASCII кодах. В этом проекте мы будем использовать Modbus RTU. Структура пакета в проколе Modbus RTU выглядит следующим образом:
Назначение элементов данного пакета рассмотрено далее в статье.
В данной статье мы будем использовать последовательную связь по протоколу Modbus RS-485 используя плату Arduino Uno в качестве ведомого устройства (Slave). Мы установим программное обеспечение Simply Modbus Master Software на компьютер и будем управлять двумя светодиодами и сервомотором, подключенными к ведомой плате Arduino. Управлять ими мы будем при помощи передачи специальных значений от Master Modbus Software.