Программная Эмуляция Сети Modbus Rtu

Введение

Если в качестве инструмента у вас есть только молоток, любая проблема начинает напоминать гвоздь.

Авраам Маслоу

Протокол Modbus широко известен как читателям Хабра, так и читателям Giktimes. Его использованию посвящено множество публикаций, которые сложно перечислить из-за того, что их так много, и время от времени то тут, то там появляются новые статьи.



Программная эмуляция сети Modbus RTU

Популярность этого протокола обусловлена его открытостью и простотой.

Область применения довольно широка: от профессиональных систем промышленной автоматизации до любительских DIY-проектов распределенных систем управления, умных домов и так далее.

Этот протокол я также выбрал, когда моя команда создавала программное обеспечение для симулятора электропоезда.

Протокол Modbus RTU на физическом интерфейсе RS485 используется в этом симуляторе для обеспечения ввода в управляющий компьютер данных от органов управления, установленных на пульте машиниста (не думайте, что Modbus используется на реальном подвижном составе!).

Само собой разумеется, какие трудности связаны с настройкой программного обеспечения, взаимодействующего с сетью контроллеров, управляющих оборудованием.

Особенно когда часть устройств уже существует в аппаратном обеспечении, а другая часть находится в процессе разработки и производства.

При этом программное обеспечение верхнего уровня должно быть написано с учетом его взаимодействия с этим оборудованием.

И желательно писать так, чтобы сразу создать рабочую версию системы, не используя «костыли», которые всегда сложно вычистить из кода.

«Надо писать ПО тогда, когда готовы рабочие прототипы всего железа», — скажете вы, и будете правы, но… ха-ха-ха, в реальном мире такое случается редко.

И здесь нам на помощь приходят программные эмуляторы.

1. Коротко о Modbus RTU Я не буду подробно останавливаться на протоколе.

Кому интересны подробности, могут воспользоваться поиском — протокол открытый, его официальная спецификация и масса информации доступны в Интернете.

Скажу лишь, что Modbus RTU описывает двоичный формат передаваемых данных и в качестве среды передачи использует дифференциальную витую пару стандарта RS485. RS232 также можно использовать, если в сети один передатчик и один приемник, или RS422 для однонаправленной передачи данных.

Нас будет интересовать RS485, который представляет собой полудуплексный интерфейс, позволяющий одновременно передавать данные только одному устройству.

Арбитраж шины в Modbus осуществляется путем поддержания обязательного интервала молчания в 3,5 символа при заданной скорости передачи.

Каждое сообщение должно начинаться и заканчиваться паузой молчания.

В сети имеется одно ведущее устройство и несколько ведомых устройств (до 31 в одном сегменте сети, без использования повторителей).

Каждое подчиненное устройство имеет уникальный идентификатор (от 1 до 31).

Данные передаются слейвам только в том случае, если мастер отправил запрос на получение данных от этого устройства.

Типичный запрос мастера выглядит так

ИДЕНТИФИКАТОР Код функции Адрес данных Объем данных (2 байта) Данные CRC16
CRC16 используется для контроля целостности передаваемых данных.

Modus использует нотацию Big Endian для представления данных: для значений размером 2 байта первым идет самый старший байт в сообщении).

Протокол использует четыре типа данных:

  1. Катушки – дискретные выходы (1 бит), доступные для чтения/записи.

  2. Дискретные входы – дискретные входы (1 бит), доступные для чтения
  3. Регистры хранения — выходные регистры (2 байта), доступные для чтения/записи.

  4. Входные регистры — входные регистры (2 байта), доступные для чтения
В ответ на запрос ведомое устройство отправляет данные в следующем формате
ИДЕНТИФИКАТОР Код функции Количество данных в байтах Данные CRC16
Сообщение, полученное от мастера, попадает в приемный буфер всех устройств.

Однако если первый байт буфера приема не соответствует идентификатору устройства, он игнорирует полученные данные, очищая буфер приема.

Если сообщение предназначено этому устройству, то оно формирует ответ и после выдерживания интервала молчания отправляет его мастеру.

Как говорится, просто, но со вкусом.

Подробнее обо всем этом вы можете прочитать в официальная спецификация протокола .

О методах реализации протокола на последовательном интерфейсе читай здесь .

Мы собрались здесь не для этого.

При разработке программного обеспечения верхнего уровня (например, мастера, реализованного на ПК) для такой сети было бы неплохо иметь набор программных средств, позволяющих реализовать такую концепцию.



Программная эмуляция сети Modbus RTU

Смысл этой схемы следующий.

Допустим, у нас есть некоторые устройства, включенные в будущую сеть.

Или такого устройства пока нет. Но есть жгучее желание написать ПО для верхнего уровня управления, отладить его, чтобы, когда сеть наконец-то будет реализована аппаратно, нам не пришлось ничего переписывать.

Для этого вам придется использовать физическую среду передачи, для чего мы используем такое устройство

Программная эмуляция сети Modbus RTU

Один из адаптеров используется для подключения программного обеспечения разрабатываемого мастера.

Другой — для подключения эмулятора будущей сети слейвов.

Подключаем к розетке белым разъемом ту часть сети, которая уже реализована аппаратно.

Таким образом, мы получаем возможность спокойно работать со стандартным протоколом связи, постепенно вводя в работу реальное оборудование.

Кроме того, отдавая объект заказчику, мы не теряем возможность модифицировать его программное обеспечение в комфортных условиях лаборатории без доступа к объекту.

QSlave на схеме — это всего лишь часть сети, эмулируемая программным обеспечением.

Естественно, вам придется написать соответствующее программное обеспечение, что и сделал автор.

2. QSlave - эмуляция подчиненной сети QПодчиненный — открытый кроссплатформенный эмулятор сети Modbus RTU. Вы можете получить его по лицензии GPL v2.0 на Github, используя ссылку выше.



Программная эмуляция сети Modbus RTU

Приложение разработано на C++ с использованием фреймворка Qt. Qt, вообще говоря, имеет библиотеки для работы с Modbus , но специфика задачи — моделирование сети слейвов, а не одного слейва, привела к тому, что встроенные библиотеки Qt для Modbus здесь не использовались.

Для обработки данных, полученных из виртуального последовательного порта, была создана самописная библиотека modbus. Код этой библиотеки реализован как отдельный проект, полностью независим от пользовательского интерфейса и может использоваться для создания программных симуляций с более расширенным функционалом.

Благодаря тому, что эмуляция Modbus отделена от пользовательского интерфейса, настройка сети происходит с помощью файлов конфигурации.

Был выбран формат XML (мы часто используем его в своих проектах).

Пример конфигурации доступен в коде проекта .

Набор конфигов состоит из основного файла с расширением *.

net, который выглядит вот так example.net

   

<Эxml version="1.0" encoding="UTF-8" ?> <Config>

Теги: #Программное обеспечение #с открытым исходным кодом #rs485 #промышленные сети #Modbus #modbus rtu #linux. окна
Вместе с данным постом часто просматривают: