Modbus — комунікаційний протокол, заснований на технології ведучий-ведений (англ. master-slave). Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP).
Типове використання полягає в тому, що пристрій-майстер посилає запити пристроям-слейвам. Кожен слейв має свій номер, і може містити чотири типи пам'яті. В запиті майстер вказує який тип пам'яті і за якою адресою він хоче прочитати.
Історія
Modbus був розроблений компанією (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році.
Це був відкритий стандарт, що описував формат повідомлень і способи їх передачі в мережі, яка складається з різних електронних пристроїв.
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232.
Пізніше став застосовуватися інтерфейс RS-485, оскільки він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні виробів, що його використовували. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів
.
Вступ
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.
Контролери на шині Modbus взаємодіють, використовуючи master-slave модель, засновану на транзакціях, що складаються із запиту і відповіді.
Зазвичай в мережі є тільки один клієнт, так званий «головний» () пристрій, і кілька серверів — «підлеглих» () пристроїв. Головний пристрій ініціює транзакції (передає запити). Підлеглі пристрої передають запитувані головним пристроєм дані, або виконують запитувані дії. «Головний» може звертатися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв. Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому. При отриманні широкомовного запиту відповідь не формується.
Специфікація Modbus описує структуру запитів і відповідей. Їх основа — елементарний пакет протоколу, так званий PDU (Protocol Data Unit). Структура PDU не залежить від типу лінії зв'язку і містить у собі код функції і поле даних. Код функції кодується однобайтовим полем і може приймати значення в діапазоні 1 … 127. Діапазон значень 128 … 255 зарезервований для кодів помилок. Поле даних може бути змінної довжини. Розмір пакета PDU обмежений 253 байтами.
+ Modbus PDU номер функції дані1 байтN <253 (байт)
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так і оптичним і радіо: Modbus ASCII — для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм . Повідомлення поділяється на стовпці за допомогою символу ": " і закінчується символами нового рядка CR / LF. Modbus і для передачі даних по мережах Ethernet поверх TCP/IP: Modbus TCP.
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні): адреса підлеглого пристрою код функції дані блок виявлення помилок
де Адреса підлеглого пристрою — адреса підлеглого пристрою, до якого адресовано запит. Підлеглі пристрої відповідають тільки на запити, що надійшли на їх адресу. Відповідь також починається з адреси відповідного підлеглого пристрою, який може змінюватися від 1 до 247. Адреса 0 використовується для широкомовної передачі, її розпізнає кожен пристрій, адреси в діапазоні 248 … 255 — зарезервовані;. Номер функції — це наступне однобайтне поле кадру. Воно говорить підлеглому пристрою, які дані або виконання якої дії вимагає від нього ведучий пристрій; Дані — поле містить інформацію, необхідну підлеглому пристрою для виконання заданої майстром функції або містить дані, що передаються підлеглим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції; Блок виявлення помилок — контрольна сума для перевірки відсутності помилок в кадрі.
Максимальний розмір ADU для послідовних мереж RS232/RS485 — 256 байт, для мереж TCP — 260 байт.
Для Modbus TCP ADU виглядає наступним чином: ід транзакції ід протоколу довжина пакету адреса підлеглого пристрою код функції дані
де Ід транзакції — два байти, зазвичай нулі Ід протоколу — два байти, нулі Довжина пакету — два байти, старший потім молодший, довжина наступної за цим полем частини пакета Адресу відомого пристрою — адреса підлеглого пристрою, до якого адресовано запит. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з мостом, який виводить нас, наприклад, в мережу RS485.
Поле контрольної суми в Modbus TCP відсутнє.
Категорії кодів функцій
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій: Стандартні команди Їх опис має бути опубліковано та затверджено Modbus-IDA. Ця категорія містить як вже існуючі, так і вільні в наш час коди. Користувацькі команди Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції. Зарезервовані У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.
Модель даних
Одне з типових застосувань протоколу — читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:
Таблиця Тип елемента Тип доступу Дискретні входи () Один біт тільки читання Регістри прапорів () Один біт читання і запис Регістри вводу () 16-бітне слово тільки читання Регістри зберігання () 16-бітне слово читання і запис
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітної адреси, першій комірці відповідає адреса 0. Таким чином, кожна таблиця може містити до 65536 елементів. Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яких внутрішніх адресах пристрою вони повинні бути доступні. Наприклад, припустимо організувати таблиці з перекриттям, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина. Modbus був спочатку розроблений для контролерів Modicon. У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація. Наприклад, першому регістру вводу відповідав номер комірки 30001, а першому регістру зберігання — 40001. Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера. Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» введені користувачем адреси, наприклад, віднімаючи 40001 від адреси регістра зберігання.
Стандартні функції протоколу Modbus
<div class="tright thumb">
<div class="thumbinner">
+ PDU запиту і відповіді для стандартних функцій номер функціїзапит / відповідь1 (0x01) A 1 A 0 Q 1 Q 0 N D (N байт)2 (0x02) A 1 A 0 Q 1 Q 0 N D (N байт)3 (0x03) A 1 A 0 Q 1 Q 0 N D (N байт)4 (0x04) A 1 A 0 Q 1 Q 0 N D (N байт)5 (0x05) A 1 A 0 D 1 D 0 A 1 A 0 D 1 D 06 (0x06) A 1 A 0 D 1 D 0 A 1 A 0 D 1 D 015 (0x0F) A 1 A 0 Q 1 Q 0 N D (N байт) A 1 A 0 Q 1 Q 016 (0x10) A 1 A 0 Q 1 Q 0 N D (N байт) A 1 A 0 Q 1 Q 0
<small> A <sub>1</sub> іA <sub>0</sub> — адреса елемента, Q <sub>1</sub> іQ <sub>0</sub> — кількість елементів, N — кількість байт даних D — дані </small> </div> </div>
Читання даних
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 (шістнадцяткові значення 0x01-0x04):
1 (0x01)- читання значень з декількох регістрів прапорів(Read Coil Status) 2 (0x02)- читання значень з декількох дискретних входів(Read Discrete Inputs) 3 (0x03)- читання значень з декількох регістрів зберігання(Read Holding Registers) 4 (0x04)- читання значень з декількох регістрів вводу(Read Input Registers)
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитуваних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.
Значення регістрів зберігання і регістрів вводу передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:
байт 1 байт 2 байт 3 байт 4 … байт N-1 байт N R A, 1 R A, 0 R A +1,1 R A +1,0 … R A + Q-1, 1 R A + Q-1, 0
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор. Одиниця означає включений стан, нуль — вимкнений. Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших. Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адреса». Якщо запитано кількість прапорів, не кратне восьми, то значення додаткових бітів заповнюються нулями:.
байт 1 …байт N F A +7 F A +6 F A +5 F A +4 F A +3 F A +2 F A +1 F A … 0 … 0 F A + Q-1 F A + Q-2 …
Запис одного значення
5 (0x05)- запис значення одного прапора(Force Single Coil) 6 (0x06)- запис значення в один регістр зберігання(Preset Single Register)
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).
Для регістру зберігання значення є просто 16-бітним словом.
Для прапорів значення 0xFF00 означає включений стан, 0x0000 — вимкнений, інші значення неприпустимі.
Якщо команда виконана успішно, підлеглий пристрій повертає копію запиту.
Запис декількох значень
15 (0x0F)- запис значень в кілька регістрів прапорів(Force Multiple Coils) 16 (0x10)- запис значень в кілька регістрів зберігання(Preset Multiple Registers)
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.
Відповідь складається з початкової адреси і кількості змінених елементів.
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).
Напрямок передачі 00 адреса підлеглого пристрою 01 номер функції 02 Адреса ст. байт 03 Адреса мол. байт 04 Кількість прапорів ст. байт 05 Кількість прапорів мол. байт 06 Кількість байт даних 07 Дані (значення для прапорів біти 0-7) 08 Дані (значення для прапорів біти 8-15) 09 CRC мол. байт 0A CRC ст. байтMaster → Slave 0x01 0x0F 0x00 0x13 0x00 0x0A 0x02 0xCD 0x01 0x72 0xCB
Напрямок передачі 00 адреса підлеглого пристрою 01 номер функції 02 Адреса ст. байт 03 Адреса мол. байт 04 Кількість прапорів ст. байт 05 Кількість прапорів мол. байт 05 CRC мол. байт 06 CRC ст. байтSlave → Master 0x01 0x0F 0x00 0x13 0x00 0x0A 0x24 0x09
Контроль помилок у протоколі Modbus RTU
Під час обміну даними можуть виникати помилки двох типів: Помилки, пов'язані з спотвореннями при передачі даних; Логічні помилки.
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми CRC-16-IBM (використовується число-поліном = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU
RTU фрейм