ModBus один из самых простых протоколов взаимодействия устройств между собой который я встречал. Он одновременно прост в реализации для производителей оборудования, что является первопричиной его распространенности, и в то же время сложен для инженера, программиста, пусконаладчика потому что перекладывает на его плечи все сложности внедрения в конечном решении, требуя выполнить работу с многостраничными таблицами регистров и переменных, их адресами, различными функциями записи и чтения и преобразованием данных.
В этой статье я хочу рассмотреть практические аспекты конфигурирования и программирования взаимодействия ModBus устройств между собой на простейших примерах. Для этого я выбрал ModBus индикатор СМИ2, Российской компании Овен. Устройство предназначено для индикации аналогового значения получаемого от контроллера. Не буду описывать все возможные сферы его применения, с этой задачей отлично справился сам производитель.
Конфигурация устройства
Давайте для начала разберемся с конфигурированием самого устройства, а потом перейдем к примерам его подключения к различным контроллерам.
Для связи с устройством я использовал двух портовый асинхронный преобразователь Moxa NPort 5230.
Устройство может предоставлять доступ к последовательным портам как инкапсулируя UART в TCP, так и более привычным способом — эмуляция последовательных портов (port mapping). Я «промапил» RS485 преобразователя на COM4.
Для конфигурования индикатора служит поставляемая вместе с ним программа «Конфигуратор СМИ2», ее так же без труда можно найти на сайте производителя. Перед тем как подключаться к СМИ2 необходимо «вогнать» его в режим «заводские настройки», для этого предназначена единственная кнопка на устройстве. Нажатие ее в течении трех секунд переключает устройство к заводским настройкам связи, которые также прописаны по умолчанию в утилите конфигурации. Порт естественно необходимо выбрать.
После подключения к устройству жмем кнопку «считать» и редактируем параметры связи, адрес устройства и используемый протокол в соответствии с возможностями контроллеров, линий связи между ними и личными предпочтениями. После чего не забываем нажать «записать».
Для проверки правильности настроек, корректности работы устройства и нюансов типа порядка расположения данных, полезно проверить работу устройства чем нибудь вроде этого:
В результате всех проделанных действий имеем следующую таблицу параметров устройства.
Параметры связи:
Speed — 115200
Parity — NON
Data Bits — 8
Stop Bits — 1
Параметры устройства и регистра:
Protocol — ModBus RTU
Slave Address — 20
Register Type — FLOAT
Register Address — 27
CoDeSys v2
Теперь давайте подключим его к контроллеру ПЛК150 фирмы Овен, программируемому из среды CoDeSys 2.3.9.40 . Будем считать что вы обладаете базовыми навыками работы в среде CoDeSys, поэтому опустим процесс установки target файлов, создания нового проекта и выбора целевой платформы, перейдем сразу к конфигурированию ModBus. Для этого в разделе «Конфигурация ПЛК» добавим подэлемент «Modbus Master» c интерфейсом «RS-485» и зададим его параметры связи в соответствии с параметрами заданными нами при конфигурировании СМИ2.
После чего добавим подэлемент «Universal Modbus device» где зададим адрес Slave устройства, т.е. нашего СМИ2.
После чего добавим переменную типа REAL ( «Real output module» ) где зададим адрес регистра в котором она хранится.
Ну и наконец, дадим некоторое осмысленное имя переменной.
После этого к данной переменной уже можно обращаться из программы. Вроде ничего сложного, но представьте что Slave устройство имеет не один регистр, как в данном примере а, например, пятьдесят. При этом сорок из них доступны только на чтение, а десять на чтение и запись. Каждый регистр надо явно объявить, верно указать его размерность, адрес и так далее.
Honeywell Care
Еще один пример, как реализована работа с ModBus устройствами в среде программирования Honeywell Care 10.03 .
Создадим новый проект и в нем новый контроллер, в данном примере я буду использовать контроллер серии Excel Web 2 — XL2026B2A. При создании контроллера в проекте сразу можно задать какие протоколы будут использоваться его интерфейсами. Я «повесил» ModBus на первый порт RS485.
Сразу же сконфигурируем параметры связи интерфейса.
После этого откроем «Device Library» и создадим новое устройство.
В новом устройстве создаем «Holding Register» типа Float с нужным адресом, именем и разрешением на запись.
После чего просто «перетащим» устройство на наш канал связи.
Зададим адрес устройства.
Создадим «точку» — переменную типа «аналоговый выход» и «перетащим» ее на нужный вход устройства.
Отредактируем «точку» — напишем описание и зададим единицы измерения.
Для этого примера я вывел на индикатор значение температуры измеряемое датчиком подключенным к первому универсальному входу.
Как по мне так наиболее логичное решение поставленной задачи. Может быть это связано с тем что работа с устройствами в данной среде изначально была построена через библиотеку устройств, причем подход унифицирован как для ModBus, так и для BACNet (есть импорт из EDE), LonWorks (есть импорт из XIF или онлайн из самого устройства) и M-Bus — все через библиотеку. К тому же один раз создав или импортировав устройство в библиотеку вы можете использовать его неоднократно, без необходимости каждый раз заново описывать в новом проекте.