Modbus: Оригиналният индустриален протокол за полева шина
Modbus remains widely deployed because its data model is simple, not because every implementation is simple. This guide explains frames, register mapping, ti...
Полевата шина е комуникационен протокол, използван в промишлени мрежи за свързване на полеви устройства към промишлени контролери. Полевата шина намалява необходимото окабеляване между контролерите и устройствата, тъй като множество устройства могат да бъдат свързани към една и съща двойка проводници.
Съществуват редица популярни технологии за полеви шини, сред които Modbus, Profibus, Foundation Fieldbus, ControlNet, DeviceNet и много други.
През 1979 г. Modicon представя нов протокол, използващ приложния слой на OSI модела, специално за своите PLC. Този протокол е наречен Modbus и става първата широко използвана полева шина в историята на автоматизацията.

Фигура 1. PLC, свързан с полеви устройства
Въведение в Modbus
Modbus е създаден за свързване на полеви устройства към промишлени контролери. По време на създаването му повечето устройства използваха представяне чрез напрежение или ток като средство за предаване на състоянието на устройството. Modbus може ефективно да обработва дискретни битове, отразяващи състоянията високо/ниско на сензори и изпълнителни механизми, както и регистри, съдържащи целочислени стойности, съответстващи на аналогови стойности на процеса.
Бавният преход към технологиите за полеви шини доведе до това Modbus да се превърне в един от най-простите протоколи, като през годините бяха добавени и нови версии.
Първоначално Modbus е реализиран върху серийна комуникационна връзка, т.е. RS-232/RS-485. Тези варианти все още се използват широко под наименованията Modbus RTU и ASCII. Впоследствие протоколът е адаптиран за работа върху TCP/IP и Ethernet. Това обикновено се нарича Modbus TCP и е най-разпространената реализация на Modbus в съвременните инсталации.
Комуникационен модел
Modbus използва модел „главен/подчинен“ за комуникация (клиент/сървър при Modbus TCP). Главният Modbus изпраща заявка до подчинен Modbus, който изпълнява действията и отговаря на главния. В този сценарий главният често е PLC, а полевите устройства изпълняват ролята на подчинени.
Кадърът на съобщението в Modbus се състои от единица за приложни данни (ADU) и единица за протоколни данни (PDU). ADU се различава в зависимост от използвания тип Modbus, докато PDU не зависи от метода на комуникация.
PDU обикновено се състои от функционален код и определени данни. В ADU те са капсулирани чрез адрес и код за проверка на грешки. Modbus TCP използва заглавка MBAP (Modbus Application Protocol) в ADU.

Фигура 2. ADU и PDU на Modbus за Modbus ASCII/RTU (горе) и Modbus TCP (долу). Изображението е адаптирано от Modbus.org
За да остане независим от комуникационния слой, на който се основава, PDU трябва да спазва ограниченията за размера на първоначалната серийна спецификация. Този размер е 256 байта за ADU през RS-485. Следователно трябва да отчетем ADU – 1 байт за адреса и 2 байта за проверка на грешки – което означава, че PDU е ограничен до общо 253 байта. Имайте предвид, че адресът в ADU всъщност е идентификаторът на подчиненото устройство в мрежата на Modbus.
Частта с данните на PDU ще съдържа полета, специфични за кода на функцията, заедно с действителните данни, които се предават. Тези полета ще бъдат разгледани подробно по-късно в статията.
Представяне на данните
Класическият Modbus има два режима на предаване: ASCII и RTU.
В режим ASCII данните се изпращат като ASCII знаци 0–9 и A–F, докато в режим RTU данните се представят в 8-битов двоичен формат. Данните и адресите се кодират в ред big-endian, при което най-значимият байт се предава първи.
Данните в Modbus са разделени на четири основни типа:
- Дискретни входове
- Бобини (изходи)
- Входни регистри
- Регистри за задържане
Дискретните входове представляват един бит данни и са само за четене. Бобините също представляват един бит, но могат да бъдат както четени, така и записвани. Входните регистри представляват 16-битови данни само за четене, докато регистрите за задържане са 16-битови данни за четене и запис.

Фигура 3. Взето от Спецификацията на протокола Modbus
За всеки тип в паметта на дадено устройство могат да се намират максимум 2^16 (65536) елемента от данни. За достъп до всеки от различните типове данни съществуват специфични кодове на функциите, като всеки тип често разполага със собствен специален блок памет.
За адресиране на елемент от данни главното устройство просто използва диапазона от 0 до 65535. Елементът от данни 1 се намира на адрес 0x0000. Елементът от данни 2 е на адрес 0x0001. Елементът от данни 65536 се намира на адрес 0xFFFF. Имайте предвид, че устройствата не са длъжни да разполагат с всичките 65536 елемента от данни; всъщност повечето терминали за отдалечен вход/изход, които използват Modbus, са далеч под този максимален лимит.
Транзакции на Modbus
След като разбрахме как се представят данните в Modbus, можем да разгледаме транзакциите в детайли. Това ще бъде направено от гледна точка на PDU, тъй като PDU не зависи от комуникационния слой.
Транзакциите на Modbus използват инструкции с шестнадесетични знаци, при които един 8-битов байт е във формат 0x00, с диапазон от 0 до F за всеки знак. Следователно 16-битов регистър е равен на два байта, представени във формат 0x0000.
Спецификацията на Modbus определя три типа PDU:
- Заявка към Modbus
- Отговор на Modbus
- Отговор на Modbus при изключение
Главното устройство инициира заявка, като използва функционалния код, а подчиненото устройство изпраща отговор в резултат на тази заявка. Успешният отговор повтаря функционалния код, изпратен от главното устройство. Отговорът с изключение използва същия функционален код, но с установен в единица MSB (най-значимия бит), за да покаже, че е възникнал проблем.
Спецификацията на Modbus определя редица функционални кодове. Функционален код 0x01 е функцията за четене на бобини.
Фигура 4 показва пример как може да изглежда заявка и отговор за четене на бобини. Главното устройство Modbus изпраща заявка с функционален код 0x01 (четене на бобини), започвайки от първия елемент от данни (адрес 0x0000) и прочитайки само една бобина. Функцията за четене на бобини може да се използва за едновременно прочитане на до 2000 (0x7D0) бобини.

Фигура 4. Транзакция за четене на бобини
При успех подчиненото устройство отговаря със същия функционален код и брой на бобините, за които изпраща отговор. Състоянието на бобините ще заема n байта, като всеки бит показва дали съответната бобина е ВКЛЮЧЕНА (1) или ИЗКЛЮЧЕНА (0).
В този случай бобината на адрес 0x0000 е ВКЛЮЧЕНА. Ако заявката не е била успешна, отговорът с изключение щеше да съдържа функционалния код с установен в единица MSB (0x81), заедно с код за изключение, обясняващ какво се е объркало. Кодът за изключение 0x02 означава, че е използван невалиден адрес на данни, т.е. в паметта на това подчинено устройство няма бобина на адрес 0x0000.
Следващият пример илюстрира транзакция за запис в единичен регистър (функционален код 0x06). Тук главното устройство заявява запис на данните 0xA0A0 на адрес 0x00FF. Отговорът на подчиненото устройство представлява просто ехо на заявката.
Примерът за отговор с изключение тук показва функционалния код с установен в единица MSB, заедно с код за изключение 0x04. Този код означава, че е възникнала непоправима грешка, докато подчиненото устройство е изпълнявало заявката.

Фигура 5. Транзакция за запис в единичен регистър
Всички функционални кодове на Modbus следват сходен модел с двата примера, показани по-горе.
Фигура 6 показва списък на обичайните функционални кодове заедно с кодовете за изключения при отговори с изключение. За повече информация направете справка със спецификацията на Modbus.

Фигура 6. Функционални кодове и кодове за изключения
Заключение
Modbus позволява на PLC контролерите да комуникират с всякакви отдалечени устройства, включително входно-изходни модули, терминални устройства и други контролери, като използва стандартен метод за четене и запис както на дискретна, така и на целочислена информация, обхващайки почти всеки сценарий, включващ пренос на цифрови данни.
Днес Modbus е индустриален стандарт и представлява най-разпространеният безплатен за използване индустриален протокол до момента, въпреки че предхожда повечето съвременни системи за управление. Той се използва в заводи и фабрики по целия свят и въпреки дългия си живот със сигурност ще остане актуален индустриален протокол още много години.