С момента своего создания, протокол передачи данных Modbus является фактически стандартом в системах передачи данных. Наверное, нет смысла подробно рассматривать здесь структуру этого протокола, он и так уже очень подробно описан в различных источниках. Остановимся только на ключевых моментах.
Существует два режима работы Modbus, применяемых для интерфейсов RS232/ RS485 – это Modbus ASCII и Modbus RTU. В Modbus ASCII режима каждый байт сообщения передается как два ASCII символа. Для передачи применяются ASCII-символы 0-9, A-F.
Достоинство этого режима заключается в том, что время между передачей символов может быть до 1 секунды без возникновения ошибок при передаче. Похожий принцип передачи данных с некоторыми изменениями и дополнениями применяется для подключения Raspberry Pi к контроллерам по интерфейсу RS485 в нашей системе домашней автоматизации.
Однако, режим протокола Modbus ASCII не так популярен и распространен, как другой режим этого протокола – Modbus RTU. Именно Modbus RTU используется в подавляющем большинстве промышленных и бытовых контроллерных устройств. Поэтому, с целью дальнейшей популяризации нашей системы домашней автоматизации и применения в ней готовых контроллеров, поддерживающих стандартные протоколы, было решено постепенно перевести работу сервера Raspberry Pi на режим работы Modbus RTU
В RTU режиме сообщение начинается с интервала, равного времени передачи 3,5 символов при заданной скорости передачи данных. Вслед за последним передаваемым символом также следует интервал продолжительностью не менее 3,5 символов. Новое сообщение начинается только после этого интервала. Другими словами, в режиме RTU сообщения разделяются между собой временными интервалами тишины. Типичный вид (фрейм) сообщения Modbus RTU показан на рис.1.
Рис.1
В первом поле передается адрес устройства. Т.к. адрес занимает один байт, то значения этого поля находятся в диапазоне значений 1-256.
Второе поле – код функции. Для режима RTU принята спецификация номера каждой функции. Например, 02 – это получение дискретных значений входов, а 03 – чтение значений регистров.
Третье это поле – передаваемые данные. Количество байт этого поля может иметь произвольное значение.
Четвертое поле – это два байта контрольной суммы (CRC-16). Контрольная сумма необходима для проверки целостности и правильности передаваемых данных. Контрольная сумма является результатом вычисления Cyclical Redundancy Check (CRC) сделанного над содержанием сообщения (адреса, кода функции, данных) и передается в этом сообщении младшим байтом вперед.
Теперь, когда мы разобрались, что представляет собой режим Modbus RTU, приступим к его реализации на Raspberry Pi. Для этого воспользуемся готовым пакетом minimalmodbus. Скачиваем архив:
sudo python setup.py install или sudo python3 setup.py install
Далее рассмотрим скрипт на Python, посредством которого minimalmodbus будет включаться в работу (рис.2).
Рис.2
Скрипт оформлен в виде макроса, вызываемого с html страницы. Но никто не запрещает использовать его и в «фоновом» режиме – т.е. без загрузки html страницы в браузер.
Надеюсь, что из комментариев данного скрипта вам понятен принцип его работы. После инициализации по команде с html страницы вызывается макрос getData, с помощь которого считываются данные регистров, состояния дискретных входов и устанавливаются уровни выходов подчиненного устройства. Полученные данные возвращается на html страницу для их визуализации. Пример тестовой страницы для получения данных со скрипта getData приведен на рис.3
Рис.3
P.S. В настоящее время все контроллеры, работающие по интерфейсу RS485 в системе домашней автоматизации поддерживают режим Modbus RTU.
Знание принципов легко компенсирует незнание деталей (с) Дьявол прячется в мелочах (с) Вопросы: 1)Как Вы узнали, что есть ModBus для Малины? 2)Где искать файл, если команда wget говорит, что нет pypi.python.org или файл не найден 404?
Indarik, спасибо. Я уже нашел и сделал. Ваш совет не полный, поэтому замечу, что если скачали архив НЕ командой wget из Raspberry, а потом tar, а скопировали из Windows, используя winscp, то стоило указать 1)в какое место на Малине и 2)Какие подать команды. В какое место копировать я не знаю, а вот прежде чем дать команду на выполнение файла setup.sh (sudo ./setup.sh), надо сделать его выполняемым командой chmod +x setup.sh Мне показалось, что Вы с Линуксом на "ты". Не могли бы Вы рассказать как скопировать всё что надо в Windows, а потом запустить установку WebIOPi и других программ, о которых пишет админ, на Малине без доступа в интернет. Гугл подсказал, что такая возможность есть и даже есть подсказки на эту тему, но у меня не хватает знаний, что бы ими воспользоваться.